Kazalo:

Kako narediti Robo-Bellhop: 3 koraki
Kako narediti Robo-Bellhop: 3 koraki

Video: Kako narediti Robo-Bellhop: 3 koraki

Video: Kako narediti Robo-Bellhop: 3 koraki
Video: Карл Фристон: «Мета» принцип свободной энергии [ЧАСТЬ 1!] 2024, November
Anonim

Avtor jeffreyfSledi še avtorja:

Kako se prijaviti na mini natečaj iRobot Create Scholarship
Kako se prijaviti na mini natečaj iRobot Create Scholarship
Kako se prijaviti na mini natečaj iRobot Create Scholarship
Kako se prijaviti na mini natečaj iRobot Create Scholarship
Kako narediti slike LOLCats, Meme mačke, mačke mačk ali mačke s smešnimi napisi
Kako narediti slike LOLCats, Meme mačke, mačke mačk ali mačke s smešnimi napisi
Kako narediti slike LOLCats, Meme mačke, mačke mačk ali mačke s smešnimi napisi
Kako narediti slike LOLCats, Meme mačke, mačke mačk ali mačke s smešnimi napisi

O: Rad ločim stvari in ugotavljam, kako delujejo. Na splošno sem po tem izgubil zanimanje. Več o jeffreyfu »

Ta Instructable prikazuje, kako z iRobot Create ustvarite premikajoč se zvonec. To je bilo v celoti odpravljeno z dovoljenjem navodil carolDancerja in postavil sem ga kot vzorčni prispevek za naše tekmovanje. Robo-BellHop je lahko vaš osebni pomočnik za nošenje torb, živil, perila itd., Tako da nimate do. Osnovni Create ima na vrhu pritrjen koš in uporablja dva vgrajena IR detektorja za sledenje IR oddajniku svojega lastnika. Z zelo osnovno programsko kodo C lahko uporabnik na Robo -BellHop zavaruje težka živila, veliko obremenitev perila ali vašo torbo za noč in naj vas robot spremlja po ulici, skozi nakupovalno središče, po hodniku ali skozi letališče - - kamor koli mora uporabnik iti. Osnovno delovanje1) Pritisnite gumb za ponastavitev, da vklopite ukazni modul in preverite, ali so senzorji vklopljeni1a) LED za predvajanje naj zasveti, ko vidi, da vam oddajnik IR sledi, 1b) LED za napredovanje naj zasveti, ko robot je zelo blizu2) Pritisnite črni mehki gumb za zagon Robo-BellHop rutine3) IR oddajnik pritrdite na gleženj in se prepričajte, da je vklopljen. Nato naložite košaro in pojdite! 4) Logika Robo-BellHopa je naslednja: 4a) Ko se sprehajate, če zazna IR signal, bo robot vozil z največjo hitrostjo 4b) Če signal IR izgine dosegu (zaradi predaleč ali preostrega kota) bo robot prehodil kratko razdaljo pri počasni hitrosti, če se signal ponovno pobere4c) Če IR signala ne zazna, bo robot zavil levo in desno v poskusi znova najti signal 4d) Če se zazna IR signal, vendar robot zadene oviro, bo robot poskušal zaobiti oviro 4e) Če se robot zelo približa IR signalu, se bo robot ustavil, da ne bi zadel lastniški gležnji Hardware1 iRobot virtualna stenska enota - 301 USD IR detektor iz RadioShacka - 31 USD moški konektor DB -9 iz Radio Shacka - 44 USD 6-32 vijaki iz Home Depota - 2,502 USD 3V baterije, uporabil sem košaro za perilo D1 iz Targeta - 51 USD dodatnega kolesa za namestitev na na zadnji strani ustvarjanja robotaElektrični trak, žica in spajkanje

Korak: Pokrijte IR senzor

Pritrdite električni trak, da pokrijete vse razen majhne reže IR senzorja na sprednji strani robota Create. Odstranite navidezno stensko enoto in izvlecite majhno vezje na sprednji strani enote. To je nekoliko zapleteno, ker je veliko skritih vijakov in plastičnih nosilcev. IR oddajnik je na vezju. IR oddajnik pokrijte s kosom papirja, da se izognete IR odsevom. Pritrdite vezje na trak ali elastični trak, ki se lahko ovije okoli gležnja. Baterije priklopite na vezje, tako da imate baterije na udobnem mestu (naredil sem jih tako, da sem jih lahko dal v žep).

2. IR detektor povežite s priključkom DB-9 in ga vstavite v ePort pin 3 (signal) in pin 5 (ozemljitev) v Cargo Bay ePort. Drugi IR detektor pritrdite na vrh obstoječega IR senzorja pri ustvarjanju in ga pokrijte z nekaj plastmi papirnatega papirja, dokler drugi IR detektor ne vidi oddajnika na razdalji, za katero želite, da se robot za ustvarjanje ustavi da te ne udarim. To lahko preizkusite, ko pritisnete gumb za ponastavitev in opazujete, kako LED -dioda napreduje, ko ste na zaustavitveni razdalji.

2. korak: Pritrdite košaro

Košaro pritrdite z vijaki 6-32. Košaro sem pravkar namestil na vrh robota Create. Potisnite tudi zadnje kolo, da položite težo na zadnjo stran robota Create.

Opombe: - Robot lahko prenese kar nekaj bremena, vsaj 30 lbs. - Majhna velikost je bila najtežji del pri prtljagi - IR je zelo temperamenten. Morda je bolje uporabiti slikanje, vendar je veliko dražje

3. korak: Prenesite izvorno kodo

Prenesite izvorno kodo
Prenesite izvorno kodo

Sledi izvorna koda, ki je priložena v besedilni datoteki:

/*********************************************** ******************** follow.c ** -------- ** deluje na Create Command Module ** pokriva vse razen majhnih odprtin na sprednji strani IR senzorja ** Create bo sledilo navidezni steni (ali katerikoli IR, ki oddaja ** signal polja sil) in se upajmo izognili oviram v procesu ***************** ************************************************ **/#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#definiraj SearchRightAngle (SearchLeftAngle - 1000) #define CoastDistance 150#define TraceDistance 250#define TraceAngle 30#define BackDistance 25#define IRDetected (~ PINB & 0x01) // stanja#določi Ready 0#definiraj Sledi 1#definiraj WasFollowing 2 #define SearchingLeft 3#define SearchingRight 4#define TracingLeft 5#define TracingRight 6#definiraj BackingTraceLeft 7#definiraj BackingTraceRight 8 // Globalne spremenljivkev olatile uint16_t timer_cnt = 0; hlapni uint8_t timer_on = 0; hlapni uint8_t senzorji_flag = 0; nestanovitni uint8_t senzorji_indeks = 0; hlapni uint8_t senzorji_in [Sen6Size]; hlapni uint8_t senzorji; volatile uint8_t inRange = 0; // Funkcijevoid byteTx (vrednost uint8_t); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (unsigned int time_ms); void Initiali baud (uint8_t baud_code); void pogon (int16_t hitrost, int16_t polmer); uint16_t randomAngle (void); void defineSongs (void); int main (void) {// spremenljivka stanjauint8_t state = Ready; int found = 0; int wait_counter = 0; // nastavite Create in moduleinitialize (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // nastavite v/i za drugi IR senzorDDRB & = ~ 0x01; // nastavite ePort pin 3 tovornega prostora za vhodPORTB | = 0x01; // nastavimo tovorni ePort pin3 omogočeno vlečenje // programsko zanko (TRUE) {// ustavimo samo kot previdnostni pogon (0, RadStraight); // nastavimo LEDsbyteTx (CmdLeds); byteTx (((senzorji [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (senzorji [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? (10); if (UserButtonPressed) {delayAndUpdateSensors (1000); // aktivna zanka (! (UserButtonPressed) && (! Senzorji [SenCliffL]) && (! Senzorji [SenCliffFL]) && (! Senzorji [SenCliffFR]) && (! senzorji [SenCliffR])) {byteTx (CmdLeds); byteTx ((((senzorji [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (senzorji [SenCharge1]); byteTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; stikalo (stanje) {primer pripravljen: if (senzorji [SenVWall]) {// preverite bližino leaderif (inRange) {drive (0, RadStraight);} else {// vozi naravnost (SlowSpeed, RadStraight); state = Follow;}} else {// iskanje beamangle = 0; distance = 0; wait_counter = 0; najdeno = FALSE; pogon (SearchSpeed, RadCCW); stanje = SearchingLeft;} prelom; primer Sledi: if (senzorji [SenBumpDrop] & BumpRight) {razdalja = 0; kot = 0; pogon (-Slaba hitrost, RadStraight); state = BackingTraceLeft;} else if (sensors [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (sensors [SenVWall]) {// preveri bližina leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// vozite naravnost (FullSpeed, RadStraight); state = Follow;}} else {// je signal le izgubil, nadaljujte počasi ena cycledistance = 0; drive (SlowSpeed, RadStraight); state = WasFollowing;} break; case WasFollowing: if (senzorji [SenBumpDrop] & BumpRight) {razdalja = 0; kot = 0; pogon (-SlowSpeed, RadStraight); stanje = BackingTraceLeft;} else if (sensors [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (sensors [SenVWall]) {// preverite bližino leaderif (inRange) {pogon (0, RadStraight); stanje = R eady;} else {// vozite naravnost (FullSpeed, RadStraight); state = Follow;}} else if (distance> = CoastDistance) {drive (0, RadStraight); state = Ready;} else {drive (SlowSpeed, RadStraight);} break; primer SearchingLeft: if (najdeno) {if (kot> = ExtraAngle) {pogon (SlowSpeed, RadStraight); stanje = Sledi;} else {pogon (SearchSpeed, RadCCW);}} else if (senzorji [SenVWall]) {found = TRUE; angle = 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); stanje = Sledi;} else {drive (SearchSpeed, RadCW);}} else if (sensors [SenVWall]) {found = TRUE; kot = 0; if (inRange) {drive (0, RadStraight); state = Ready;} else {drive (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; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (sensors [SenBumpDrop] & BumpLeft) {drive (0, RadStraight); state = Ready;} else if (sensors [SenVWall]) {// check za bližino leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// vozite naravnost (SlowSpeed, RadStraight); state = Follow;}} else if (! (distance> = TraceDistance)) { drive (SlowSpeed, RadStraight);} else if (! (-angle> = TraceAngle)) {drive (SearchSpeed, RadCW);} else {distance = 0; kot = 0; pogon (SlowSpeed, RadStraight); stanje = pripravljeno; } break; case TracingRight: if (sensors [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} else if (sensors [SenBumpDrop] & BumpLeft) {distance = 0; kot = 0; pogon (- SlowSpeed, RadStraight); state = BackingTraceRight;} else if (sensors [SenVWall]) {// preverite bližino leaderif (inRang e) {drive (0, RadStraight); state = Ready;} else {// vozite naravnost (SlowSpeed, RadStraight); state = Follow;}} else if (! (distance> = TraceDistance)) {drive (SlowSpeed, RadStraight);} else if (! (angle> = TraceAngle)) {drive (SearchSpeed, RadCCW);} else {distance = 0; kot = 0; drive (SlowSpeed, RadStraight); state = Ready;} prelom; case BackingTraceLeft: if (senzorji [SenVWall] && inRange) {pogon (0, RadStraight); stanje = Pripravljeno;} drugače, če (kot> = TraceAngle) {razdalja = 0; kot = 0; pogon (SlowSpeed, RadStraight); stanje = TracingLeft; } else if (-distance> = BackDistance) {drive (SearchSpeed, RadCCW);} else {drive (-SlowSpeed, RadStraight);} break; case BackingTraceRight: if (sensors [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} else if (-angle> = TraceAngle) {distance = 0; kot = 0; drive (SlowSpeed, RadStraight); state = TracingRight;} else if (-distance> = BackDistance) {drive (SearchSpeed, RadCW);} else {drive (-SlowSpeed, RadStraight);} break; privzeto: // stopdrive (0, RadStraight); state = Re ady; break;} delayAndCheckIR (10); delayAndUpdateSensors (10);} // odkrita pečina ali uporabniški gumb, omogoči stabilizacijo stanja (npr. gumb za sprostitev) pogon (0, RadStraight); delayAndUpdateSensors (2000);}}} // Serijsko prejemanje prekinitve za shranjevanje vrednosti senzorjev SIGNAL (SIG_USART_RECV) {uint8_t temp; temp = UDR0; if (sensors_flag) {sensors_in [sensors_index ++] = temp; if (sensors_index> = Sen6Size) sensors_flag = 0;}} // Časovnik 1 prekinitev do časovnih zamud v msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // Pošlji bajt preko zaporednega porta, prepreči byteTx (uint8_t vrednost) {while (! (UCSR0A & _BV (UDRE0)); UDR0 = vrednost;} // Zamuda za določen čas v ms brez posodabljanja vrednosti senzorjavoid delayMs (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; while (timer_on);} // Zakasnitev za določen čas v ms in preverjanje sekunde IR detektorvoid delayAndCheckIR (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));} // Zakasnitev za določen čas v ms in posodobitev vrednosti senzorja void 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 ++) senzorji [temp] = sensors_in [temp]; // Posodobi tekoče seštevke razdalje in kotne razdalje += (int) ((senzorji [SenDist1] 8) | senzorji [SenDist0]); kot += (int) ((senzorji [SenAng1] 8) | senzorji [SenAng0]); byteTx (CmdSensors); byteTx (6); sensors_index = 0; sensors_flag = 1;}}} // Inicializirajte nadzor uma & aposs ATmega168 mikrokontrolervoid initialize (void) {cli (); // Nastavi vhodno/izhodne zatiče DDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Nastavi časovnik 1 za ustvarjanje prekinitve vsakih 1 msTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Nastavite serijska vrata s prekinitvijo rxUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0]); ! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Zamuda v tem stanjuRobotPwrToggleHigh; // Nizek do visok prehod za preklop powerdelayMs (100); // Zamuda v tem stanjuRobotPwrToggleLow;} delayMs (3500); // Zakasnitev pri zagonu}} // Vklopite hitrost prenosa tako na Ustvari kot na moduluvoid baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code);/ / Počakajte, da se prenos dokonča (! (UCSR0A & _BV (TXC0))); cli (); // Preklopite registerif hitrosti prenosa (baud_code == Baud115200) UBRR0 = Ubrr115200; drugače če (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 == Baud14400) if (baud_code == Baud9600) UBRR0 = Ubrr9600; else if (baud_code == Baud4800) UBRR0 = Ubrr4800; else if (baud_code == Baud2400) UBRR0 = Ubrr2400; baud_code == Baud600) UBRR0 = Ubrr600; drugače če (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Pošlji Ukaze pogona glede na hitrost in radiusvoid pogon (int16_t hitrost, int16_t polmer) {byteTx (CmdDrive); byteTx ((uint 8_t) ((hitrost >> 8) & 0x00FF)); byteTx ((uint8_t) (hitrost & 0x00FF)); byteTx ((uint8_t) ((polmer >> 8) & 0x00FF)); byteTx ((uint8_t) (polmer & 0x00FF));}

Priporočena: