Satura rādītājs:
- 1. solis: IR sensora pārklāšana
- 2. darbība: pievienojiet grozu
- 3. darbība: lejupielādējiet avota kodu
Video: Kā izveidot Robo-Bellhop: 3 soļi
2024 Autors: John Day | [email protected]. Pēdējoreiz modificēts: 2024-01-30 10:58
Sekojiet vairāk autora:
Par: Man patīk izjaukt lietas un izdomāt, kā tās darbojas. Pēc tam es vispār zaudēju interesi. Vairāk par Džefriju »
Šajā pamācībā ir parādīts, kā izmantot iRobot Create, lai izveidotu kustīgu zvanu. Tas tika pilnībā atcelts ar CarolDancer norādījumu atļauju, un es to ievietoju kā paraugu mūsu konkursam. Robo-BellHop var būt jūsu personīgais asistents somu, pārtikas preču, veļas utt. Nēsāšanai, tāpēc jums nav uz. Pamata Create ir augšpusē piestiprināta tvertne, un tā izmanto divus iebūvētus IR detektorus, lai sekotu tā īpašnieka IR raidītājam. Izmantojot ļoti vienkāršu C programmatūras kodu, lietotājs var uzlikt Robo -BellHop smagus pārtikas produktus, lielu veļas kravu vai jūsu naktssomu un likt robotam sekot jums pa ielu, pa tirdzniecības centru, gaiteni vai lidostu - - lai kur lietotājam būtu jādodas. Pamata darbība robots atrodas ļoti tuvu2) nospiediet mīksto mīksto pogu, lai palaistu Robo-BellHop rutīnu3) pievienojiet infrasarkano staru raidītāju potītei un pārliecinieties, vai tas ir ieslēgts. Tad ielieciet grozu un dodieties! 4) Robo-BellHop loģika ir šāda: 4a) Staigājot apkārt, ja tiek uztverts IR signāls, robots brauks ar maksimālo ātrumu4b) Ja IR signāls iziet no diapazonā (pārāk tālu vai pārāk asu leņķi), robots lēnā ātrumā veiks nelielu attālumu, ja signāls tiks atkal uztverts 4c) Ja IR signāls netiek atklāts, robots pagriezīsies pa kreisi un pa labi mēģiniet vēlreiz atrast signālu4d) Ja tiek uztverts IR signāls, bet robots ietriecas šķērslī, robots mēģinās apbraukt šķērsli4e) Ja robots nokļūst ļoti tuvu IR signālam, robots apstāsies, lai izvairītos no sitiena. īpašnieka potītes Hardware1 iRobot virtuālā sienas iekārta - 301 USD IR detektors no RadioShack - 31 USD DB -9 vīriešu savienotājs no Radio Shack - 44 USD 6-32 skrūves no Home Depot - 2,502 USD 3V baterijas, es izmantoju D1 veļas grozu no Target - 51 USD papildu ritenis uz elektriskā lente, vads un lodēt
1. solis: IR sensora pārklāšana
Pievienojiet elektrisko lenti, lai pārklātu visu, izņemot nelielu, IR sensora spraugu Create robota priekšpusē. Demontējiet virtuālo sienas bloku un izņemiet mazo shēmas plati ierīces priekšpusē. Tas ir nedaudz sarežģīti, jo ir daudz slēptu skrūvju un plastmasas stiprinājumu. IR raidītājs atrodas uz shēmas plates. Pārklājiet IS raidītāju ar salvetes papīru, lai izvairītos no IR atstarošanas. Piestipriniet shēmas plati pie siksnas vai elastīgās joslas, kas var aptīt jūsu potīti. Pievienojiet baterijas pie shēmas plates, lai tās varētu novietot ērtā vietā (es to izveidoju tā, lai varētu ievietot baterijas kabatā).
Pievienojiet otro IR detektoru pie DB-9 savienotāja un ievietojiet Cargo Bay ePort tapā 3 (signāls) un tapā 5 (zemējums). Pievienojiet 2. IR detektoru esošā IR sensora augšpusē vietnē Create un pārklājiet to ar pāris salvešpapīra slāņiem, līdz 2. IR detektors neredz izstarotāju tādā attālumā, kādā vēlaties, lai Create robot apstātos. no sitiena tev. To var pārbaudīt pēc tam, kad esat nospiedis pogu Atiestatīt, un noskatīties, kā iedegas LED, lai iedegtos, kad esat apstāšanās attālumā.
2. darbība: pievienojiet grozu
Piestipriniet grozu, izmantojot 6-32 skrūves. Es tikko uzstādīju grozu Create robota augšpusē. Bīdiet arī aizmugurējo riteni, lai jūs novietotu svaru uz izveides robota aizmugures.
Piezīmes: - Robots var pārvadāt diezgan lielu slodzi, vismaz 30 mārciņas. - Mazais izmērs šķita visgrūtākais, lai tas varētu pārvadāt jebkuru bagāžu - IR ir ļoti temperamentīgs. Varbūt attēlveidošana ir labāka, taču tā ir daudz dārgāka
3. darbība: lejupielādējiet avota kodu
Avota kods ir pievienots teksta failā:
/************************************************ ******************** follow.c ** -------- ** darbojas uz Izveidot komandu moduli ** aptver visu, izņemot nelielu atveri priekšpusē no IS sensora ** Izveide sekos virtuālai sienai (vai jebkurai infrasarkanai ierīcei, kas izsūta ** spēka lauka signālu) un cerams izvairīsies no šķēršļiem procesā ***************** ************************************************* **/#include interrupt.h> #include io.h>#include#include "oi.h" #define TRUE 1#define FALSE 0#define FullSpeed 0x7FFF#define SlowSpeed 0x0100#define SearchSpeed 0x0100#define ExtraAngle 10#define SearchLeftAngle 125#define SearchRightAngle (SearchLeftAngle - 1000) #define CoastDistance 150#define TraceDistance 250#define TraceAngle 30#define BackDistance 25#definēt IRDetected (~ PINB & 0x01) // valstis#definēt Gatavs 0#definēt Pēc 1#definēt WasFollowing 2 #define SearchingLeft 3#define SearchingRight 4#define TracingLeft 5#define TracingRight 6#define BackingTraceLeft 7#define BackingTraceRight 8 // Globālie mainīgie v gaistošais uint16_t timer_cnt = 0; gaistošais uint8_t timer_on = 0; gaistošais uint8_t sensors_flag = 0; gaistošais uint8_t sensors_indekss = 0; gaistošais uint8_t sensors_in [Sen6Size]; gaistošais uint8_t sensors [Sen6Size 0t; = gaistošais volatile uint8_t inRange = 0; // Funkcijasvoid byteTx (uint8_t vērtība); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (neparakstīts int time_ms); void void; void; void void; void baud (uint8_t baud_code); void drive (int16_t ātrums, int16_t rādiuss); uint16_t randomAngle (void); void defineSongs (void); int main (void) {// state variableuint8_t state = Gatavs; int atrasts = 0; int gaidīšanas_skaitītājs = 0; // Iestatīt Izveidot un modificēt (); LEDBothOff; powerOnRobot (); baitsTx (CmdStart); baud (Baud28800); baitsTx (CmdControl); baitsTx (CmdFull); // iestatīt i/o otrajam IR sensoramDDRB & = ~ 0x01; // iestatiet kravas nodalījuma ePort tapu 3 par ievadiPORTB | = 0x01; // iestatīt kravas ePort pin3 pullup iespējošanu // programmas cilpa (TRUE) {// Apturēt tikai kā piesardzību brauciet (0, RadStraight); // iestatiet LEDsbyteTx (CmdLeds); byteTx (((sensori [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); baitsTx (sensori [SenCharge1]); baitsTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // meklē lietotāja pogu, pārbaudiet oftendelayAndUpdateSensors (10); delay 10 sensori [SenCliffR])) {byteTx (CmdLeds); byteTx (((sensori [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); baitsTx (sensori [SenCharge1]); baitsTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; slēdzis (stāvoklis) {case Ready: if (sensors [SenVWall]) {// pārbaudīt tuvumu līderim (inRange) {disks (0, RadStraight);} cits {// braukt taisni (SlowSpeed, RadStraight); state = Follow;}} else {// meklēt staru stūri = 0; distance = 0; wait_counter = 0; atrasts = FALSE; disks (SearchSpeed, RadCCW); state = SearchingLeft;} pārtraukums; gadījums Pēc: if (sensori [SenBumpDrop] & BumpRight) {distance = 0; leņķis = 0; disks (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (sensori [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (sensors [SenVWall]) {// pārbaudīt tuvums līderim (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = Follow;}} else {// tikko zaudējis signālu, turpiniet lēnām cycledistance = 0; drive (SlowSpeed, RadStraight); state = WasFollowing;} pārtraukums; case WasFollowing: if (sensori [SenBumpDrop] & BumpRight) {distance = 0; leņķis = 0; piedziņa (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (sensori [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (sensors [SenVWall]) {// pārbaudīt tuvumu līderim (inRange) {disks (0, RadStraight); valsts = R eady;} else {// brauc taisni (pilns ātrums, RadStraight); valsts = seko;}} cits if (distance> = CoastDistance) {drive (0, RadStraight); state = Ready;} else {drive (SlowSpeed, RadStraight);} pārtraukums; gadījums SearchingLeft: ja (atrasts) {if (leņķis> = ExtraAngle) {disks (SlowSpeed, RadStraight); state = Follow;} else {drive (SearchSpeed, RadCCW);}} else if (sensori [SenVWall]) {found = TRUE; leņķis = 0; if (inRange) {drive (0, RadStraight); state = Ready;} else {drive (SearchSpeed, RadCCW);}} else if (angle> = SearchLeftAngle) {drive (SearchSpeed, RadCW); wait_counter = 0; state = SearchingRight;} else {drive (SearchSpeed, RadCCW);} break; case SearchingRight: if (found) {if (-angle> = ExtraAngle) {drive (SlowSpeed, RadStraight); state = Seko;} else {drive (SearchSpeed, RadCW);}} else if (sensors [SenVWall]) {found = TRUE; leņķis = 0; if (inRange) {drive (0, RadStraight); state = Ready;} else {disks (SearchSpeed, RadCCW);}} else if (wait_counter> 0) {wait_counter -= 20; drive (0, RadStraight);} else if (angle = Search RightAngle) {drive (0, RadStraight); wait_counter = 5000; angle = 0;} else {drive (SearchSpeed, RadCW);} break; case TracingLeft: if (sensors [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; disks (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (sensors [SenBumpDrop] & BumpLeft) {drive (0, RadStraight); state = Ready;} else if (sensors [SenVWall]) {// check priekš tuvuma līderim (inRange) {disks (0, RadStraight); valsts = gatavs;} cits {// brauc taisni (SlowSpeed, RadStraight); state = Follow;}} else if (! (distance> = TraceDistance)) { disks (SlowSpeed, RadStraight);} else if (! (-angle> = TraceAngle)) {drive (SearchSpeed, RadCW);} else {distance = 0; angle = 0; drive (SlowSpeed, RadStraight); state = Ready; } pārtraukums; gadījums TracingRight: ja (sensori [SenBumpDrop] & BumpRight) {disks (0, RadStraight); valsts = Gatavs;} cits, ja (sensori [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (- SlowSpeed, RadStraight); state = BackingTraceRight;} else if (sensori [SenVWall]) {// pārbaudiet, vai tuvums līderim (inRang e) {drive (0, RadStraight); state = Ready;} else {// brauc taisni (SlowSpeed, RadStraight); state = Follow;}} else if (! (distance> = TraceDistance)) {drive (SlowSpeed, RadStraight);} else if (! (angle> = TraceAngle)) {drive (SearchSpeed, RadCCW);} else {distance = 0; angle = 0; drive (SlowSpeed, RadStraight); state = Ready;} break; case BackingTraceLeft: if (sensori [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} else if (leņķis> = TraceAngle) {distance = 0; angle = 0; drive (SlowSpeed, RadStraight); state = TracingLeft; } else if (-distance> = BackDistance) {drive (SearchSpeed, RadCCW);} else {drive (-SlowSpeed, RadStraight);} break; case BackingTraceRight: if (sensors [SenVWall] && inRange) {drive (0, RadStraight)); stāvoklis = gatavs;} cits, ja (-stūris> = TraceAngle) {distance = 0; leņķis = 0; disks (SlowSpeed, RadStraight); state = TracingRight;} else if (-distance> = BackDistance) {drive (SearchSpeed, RadCW);} else {drive (-SlowSpeed, RadStraight);} break; default: // stopdrive (0, RadStraight); state = Re ady; break;} delayAndCheckIR (10); delayAndUpdateSensors (10);} // konstatēta klints vai lietotāja poga, ļaujiet nosacījumam stabilizēties (piemēram, poga jāatbrīvo) disks (0, RadStraight); delayAndUpdateSensors (2000);}}} // Sērijas saņemšanas pārtraukšana, lai saglabātu sensora vērtības uz laika aizkavi msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // Pārsūtīt baitu pa seriālo portvoid byteTx (uint8_t vērtība) {while (! (UCSR0A & _BV (UDRE0))) UDR0 = vērtība;} // Kavēšanās norādītajā laikā ms, neatjauninot sensora vērtības; nav kavēšanāsMs (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; while (timer_on);} // Kavēšanās norādītajā laikā ms un pārbaudiet sekundi IR detektoram nav kavēšanāsAndCheckIR (uint16_t time_ms) {uint8_t timer_val = 0; inRange = 0; timer_on = 1; timer_cnt = time_ms; while (timer_on) {if (! (Timer_val == timer_cnt)) {inRange + = IRDetected; timer_val = timer_cnt;}} inRange = (inRange> = (time_ms >> 1));} // Kavēšanās norādītajā laikā ms un atjaunināt sensora vērtībasvoid delayAndUpdateSensors (uint16_t time_ms) {uint8_t temp; timer_on = 1; timer_cnt = time_ms; while (timer_on) {if (! sensors_flag) {for (temp = 0; temp Sen6Size; temp ++) sensori [temp] = sensors_in [temp]; // Atjaunināt distances un leņķiskās distances skriešanas kopsummas += (int) ((sensori [SenDist1] 8) | sensori [SenDist0]); leņķis += (int) ((sensori [SenAng1] 8) | sensori [SenAng0]); baitsTx (CmdSensors); baitsTx (6); sensors_indekss = 0; sensors_flag = 1;}}} // Inicializēt prāta kontroli & aposs ATmega168 mikrokontrolleru inicializēšana (anulēts) {cli (); // Iestatīt I/O tapasDDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Iestatiet taimeri 1, lai radītu pārtraukumu ik pēc 1 msTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Iestatiet seriālo portu ar rx interruptUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0)); UCSR0C = (_BV (UCSZ00) | _BV (UCSZ01)); // Ieslēgt interruptssei ();} void powerOnRobot (void) {// Ja Izveides un atlaišanas barošana ir izslēgta, ieslēdziet to onif (! RobotIsOn) {while (! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Kavēšanās šajā stāvoklīRobotPwrToggleHigh; // No zemas uz augstu pāreju uz pārslēgšanas powerdelayMs (100); // Kavēšanās šajā stāvoklīRobotPwrToggleLow;} delayMs (3500); // Palaišanas aizkave}} // Ieslēdziet datu pārraides ātrumu gan izveidei, gan modulim nederīgam baudam (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); baitsTx (baud_code);/ / Pagaidiet, kamēr pārraide ir pabeigta (! (UCSR0A & _BV (TXC0))); cli (); // Pārslēdziet pārraides ātruma reģistru (baud_code == Baud115200) UBRR0 = Ubrr115200; citādi, ja (baud_code == Baud57600) UBRR0 = Ubrr57600; else if (baud_code == Baud38400) UBRR0 = Ubrr38400; else if (baud_code == Baud28800) UBRR0 = Ubrr28800; else if (baud_code == Baud19200) UBRR0 = Ubrr19200; else if (baud_code == BaR14400) if (baud_code == Baud9600) UBRR0 = Ubrr9600; else if (baud_code == Baud4800) UBRR0 = Ubrr4800; else if (baud_code == Baud2400) UBRR0 = Ubrr2400; else if (baud_code == Baud1200) if UBR00; baud_code == Baud600) UBRR0 = Ubrr600; else if (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Sūtīt Izveidot diska komandas ātruma un rādiusveida diska izteiksmē (int16_t ātrums, int16_t rādiuss) {baitsTx (CmdDrive); baitsTx ((uint 8_t) ((ātrums >> 8) & 0x00FF)); baitsTx ((uint8_t) (ātrums & 0x00FF)); baitsTx ((uint8_t) ((rādiuss >> 8) un 0x00FF)); baitsTx ((uint8_t) (rādiuss & 0x00FF));}
Ieteicams:
Kā izveidot shēmas un izveidot PCB, izmantojot Autodesk EAGLE: 9 soļi
Kā izveidot shēmas un izveidot PCB, izmantojot Autodesk EAGLE. Ir daudz dažādu CAD (datorizēta dizaina) programmatūras veidu, kas var palīdzēt jums izveidot un izgatavot PCB (iespiedshēmas plates), vienīgā problēma ir tā, ka lielākā daļa no tām nav īsti nepaskaidrojiet, kā tos izmantot un ko viņi var darīt. Esmu izmantojis daudzas t
Kā izveidot autonomu basketbola spēles robotu, izmantojot IRobot, izveidot kā pamatu: 7 soļi (ar attēliem)
Kā izveidot autonomu basketbola spēles robotu, izmantojot IRobot Izveidot kā pamatu: Šis ir mans ieraksts izaicinājumam iRobot Create. Visa šī procesa grūtākā daļa man bija izlemt, ko robots darīs. Es gribēju demonstrēt lieliskās Create funkcijas, vienlaikus pievienojot robo noskaņu. Visas manas
Kā izveidot un izveidot kaujas robotu: 11 soļi (ar attēliem)
Kā izveidot un veidot kaujas robotu: *PIEZĪME: Tā kā kaujas roboti atkal ir ēterā, šī pamācība ir ieguvusi lielu vilci. Lai gan liela daļa informācijas šeit joprojām ir laba, lūdzu, ņemiet vērā, ka pēdējo 15 gadu laikā sportā ir notikušas dažas izmaiņas*Kaujas roboti ir bijuši
Kā izveidot vecvecāku kalendāru & Īss paziņojumu albums (pat ja jūs nezināt, kā izveidot albumu): 8 soļi (ar attēliem)
Kā izveidot vecvecāku kalendāru & Īss paziņojumu albums (pat ja jūs nezināt, kā izgriezt albumu): šī ir ļoti ekonomiska (un ļoti novērtēta!) Svētku dāvana vecvecākiem. Šogad es izveidoju 5 kalendārus par mazāk nekā 7 ASV dolāriem. Materiāli: 12 lieliskas jūsu bērna, bērnu, brāļameitu, brāļadēlu, suņu, kaķu vai citu radinieku fotogrāfijas12 dažādi gabali
Kā izveidot ģitāras skaļruņu kasti vai izveidot divus stereoiekārtām: 17 soļi (ar attēliem)
Kā izveidot ģitāras skaļruņu kasti vai izveidot divus stereoiekārtām: Es gribēju, lai jauns ģitāras skaļrunis tiktu pievienots manis veidotajam caurules pastiprinātājam. Skaļrunis paliks ārpus manas veikala, tāpēc tam nav jābūt pārāk īpašam. Tolex pārklājums var būt pārāk viegli sabojājams, tāpēc es vienkārši izsmidzināju ārpusi melnu pēc vieglām smiltīm