Sadržaj:

Kako napraviti Robo-Bellhop: 3 koraka
Kako napraviti Robo-Bellhop: 3 koraka

Video: Kako napraviti Robo-Bellhop: 3 koraka

Video: Kako napraviti Robo-Bellhop: 3 koraka
Video: Как за год накопить 137 800 рублей #накопить#деньги #shorts 2024, Novembar
Anonim

Autor jeffreyfFollow Više od autora:

Kako se prijaviti na mini konkurs iRobot Create Scholarship
Kako se prijaviti na mini konkurs iRobot Create Scholarship
Kako se prijaviti na mini konkurs iRobot Create Scholarship
Kako se prijaviti na mini konkurs iRobot Create Scholarship
Kako napraviti LOLCats, Meme mačke, Makroe mačaka ili slike mačaka sa smiješnim natpisima
Kako napraviti LOLCats, Meme mačke, Makroe mačaka ili slike mačaka sa smiješnim natpisima
Kako napraviti LOLCats, Meme mačke, Makroe mačaka ili slike mačaka sa smiješnim natpisima
Kako napraviti LOLCats, Meme mačke, Makroe mačaka ili slike mačaka sa smiješnim natpisima

O: Volim razdvajati stvari i shvatiti kako funkcioniraju. Generalno nakon toga gubim kamatu. Više o jeffreyfu »

Ovaj Instructable pokazuje kako koristiti iRobot Create za izradu pokretnog zvona. Ovo je u potpunosti ukinuto uz dopuštenje instrukcija carolDancer-a, a ja sam ga stavio kao uzorak za naše takmičenje. Robo-BellHop može biti vaš lični asistent za nošenje torbi, namirnica, veša itd., Tako da nemate to. Osnovni Create ima kantu pričvršćenu na vrhu i koristi dva ugrađena IR detektora za praćenje IC odašiljača svog vlasnika. Pomoću vrlo osnovnog programskog koda C korisnik može osigurati teške namirnice, veliki tovar rublja ili torbu za noćenje na Robo -BellHop -u i neka vas robot prati ulicom, kroz trgovački centar, niz hodnik ili kroz aerodrom - - kamo god korisnik treba ići. Osnovne operacije1) Pritisnite dugme Reset da biste uključili komandni modul i provjerili da li su senzori uključeni1a) LED za reprodukciju trebao bi se uključiti kada vidi da vas IC predajnik prati1b) LED za napredovanje trebao bi se uključiti kada se robot je na vrlo velikoj udaljenosti2) Pritisnite crno soft dugme za pokretanje Robo-BellHop rutine3) Priključite IC odašiljač na gležanj i provjerite je li uključen. Zatim napunite korpu i krenite! 4) Logika Robo-BellHopa je sljedeća: 4a) Dok hodate uokolo, ako se detektira IC signal, robot će voziti najvećom brzinom 4b) Ako IC signal nestane u opsegu (ako je predaleko ili previše oštar ugao), robot će preći kratku udaljenost pri maloj brzini u slučaju da se signal ponovo pokupi4c) Ako se IR signal ne otkrije, robot će skrenuti lijevo i desno u pokušaj ponovnog pronalaženja signala4d) Ako se detektira IC signal, ali robot naiđe na prepreku, robot će pokušati zaobići prepreku4e) Ako se robot jako približi IC signalu, robot će se zaustaviti kako ne bi udario u vlasnički gležnjevi Hardware1 iRobot virtualna zidna jedinica - 301 USD IR detektor iz RadioShacka - 31 USD DB -9 muški konektor iz Radio Shacka - 44 USD 6-32 vijci iz Home Depota - 2.502 USD 3V baterije, koristio sam D1 korpu za rublje iz Targeta - 51 USD dodatni kotač za postavljanje na na poleđini Create robotElectric tape, žica i lemljenje

Korak 1: Pokrivanje IC senzora

Pričvrstite električnu traku da pokrije sve osim malog proreza IC senzora na prednjoj strani Create robota. Demontirajte jedinicu virtualnog zida i izvadite malu ploču s prednje strane jedinice. Ovo je pomalo zeznuto jer ima puno skrivenih vijaka i plastičnih držača. IC odašiljač je na ploči. Pokrijte IC odašiljač komadom papirnatog papira kako biste izbjegli IC refleksije. Pričvrstite ploču na remen ili elastičnu traku koja vas može omotati oko gležnja. Priključite baterije na ploču tako da baterije budu na ugodnom mjestu (ja sam ih napravio tako da mogu staviti baterije u džep).

Priključite 2. IR detektor na konektor DB-9 i umetnite u ePort pin 3 (signal) i iglu 5 (uzemljenje) u Cargo Bay ePort priključku. Pričvrstite 2. IR detektor na vrh postojećeg IR senzora na stranici Create i prekrijte ga s nekoliko slojeva papirnatog papira sve dok drugi IR detektor ne vidi odašiljač na udaljenosti za koju želite da se robot Create zaustavi da te ne udarim. Ovo možete testirati nakon što pritisnete tipku za poništavanje i gledate kako napredna LED dioda svijetli kad ste na zaustavnoj udaljenosti.

Korak 2: Pričvrstite korpu

Pričvrstite korpu pomoću vijaka 6-32. Upravo sam montirao korpu na vrh Create robota. Također gurnite stražnji kotač tako da postavite težinu na stražnju stranu robota Create.

Napomene: - Robot može podnijeti dosta tereta, najmanje 30 lbs. - Činilo se da je mala veličina najteži dio pri nošenju prtljage - IR je vrlo temperamentan. Možda je korištenje slike bolje, ali je mnogo skuplje

Korak 3: Preuzmite izvorni kod

Preuzmite izvorni kod
Preuzmite izvorni kod

Slijedi izvorni kod koji je priložen u tekstualnoj datoteci:

/************************************************* ******************** follow.c ** -------- ** radi na Create Command Module ** pokriva sve osim malih otvora na prednjoj strani IC senzora ** Create će slijediti virtualni zid (ili bilo koji IC koji šalje signal ** polja polja) i nadamo se da će izbjeći prepreke u procesu ***************** ************************************************ **/#include interrupt.h> #include io.h>#include#include "oi.h" #define TRUE 1#definirati FALSE 0#definirati FullSpeed 0x7FFF#definirati SlowSpeed 0x0100#definirati SearchSpeed 0x0100#definirati ExtraAngle 10#definirati SearchLeftAngle 125#definirajte SearchRightAngle (SearchLeftAngle - 1000) #define CoastDistance 150#definirajte TraceDistance 250#definirajte TraceAngle 30#definirajte BackDistance 25#definirajte IRDetected (~ PINB & 0x01) // stanja#definirajte Spremno 0#definirajte Slijedeći 1#definirajte WasFollowing 2 #define SearchingLeft 3#define SearchingRight 4#definirati TracingLeft 5#definirati TracingRight 6#definirati BackingTraceLeft 7#definirati BackingTraceRight 8 // Globalne varijablev olatile uint16_t timer_cnt = 0; volatile uint8_t timer_on = 0; volatile uint8_t sensors_flag = 0; volatile uint8_t sensors_index = 0; volatile uint8_t sensors_in [Sen6Size]; volatile uint8_t senzori; volatile uint8_t inRange = 0; // Funkcijevoid byteTx (vrijednost uint8_t); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (nepotpisani int time_ms); baud (uint8_t baud_code); void disk (int16_t brzina, int16_t radijus); uint16_t randomAngle (void); void defineSongs (void); int main (void) {// varijabla stanjauint8_t stanje = Spremno; int pronađeno = 0; int čekanje_broj = 0; // Podesite Create and moduleinitialize (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // postavite i/o za drugi IR senzorDDRB & = ~ 0x01; // postavljamo ePort pin 3 teretnog prostora kao ulazPORTB | = 0x01; // postavljanje omogućeno povlačenje ePort pin3 tereta // programska petlja u toku (TRUE) {// Zaustavljanje samo kao mjera opreza (0, RadStraight); // postavljanje LEDsbyteTx (CmdLeds); byteTx (((senzori [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (senzori [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? (10); if (UserButtonPressed) {delayAndUpdateSensors (1000); // aktivno petlje (! (UserButtonPressed) && (! Senzori [SenCliffL]) && (! Senzori [SenCliffFL]) && (! Senzori [SenCliffFR]) && (! senzori [SenCliffR])) {byteTx (CmdLeds); byteTx (((senzori [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (senzori [SenCharge1]); byteTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; switch (stanje) {case Ready: if (sensors [SenVWall]) {// provjerite blizinu leaderif (inRange) {drive (0, RadStraight);} else {// vozite ravno (SlowSpeed, RadStraight); state = Follow;}} else {// tražite beamangle = 0; distance = 0; wait_counter = 0; pronađeno = FALSE; pogon (SearchSpeed, RadCCW); stanje = SearchingLeft;} prekid; slučaj Slijedi: if (senzori [SenBumpDrop] & BumpRight) {udaljenost = 0; ugao = 0; pogon (-Sporena brzina, RadStraight); state = BackingTraceLeft;} else if (senzori [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (senzori [SenVWall]) {// provjerite blizina leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// vozite ravno (FullSpeed, RadStraight); state = Follow;}} else {// samo je izgubio signal, nastavite polako jedan cycledistance = 0; drive (SlowSpeed, RadStraight); state = WasFollowing;} break; case WasFollowing: if (senzori [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (senzori [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (sensors [SenVWall]) {// provjerite blizinu leaderif-a (inRange) {pogon (0, RadStraight); stanje = R eady;} else {// vozite ravnopogon (FullSpeed, RadStraight); state = Follow;}} else if (distance> = CoastDistance) {drive (0, RadStraight); state = Ready;} else {drive (SlowSpeed, RadStraight);} break; case SearchingLeft: if (found) {if (angle> = ExtraAngle) {drive (SlowSpeed, RadStraight); state = Follow;} else {drive (SearchSpeed, RadCCW);}} else if (senzori [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 = Prati;} else {drive (SearchSpeed, RadCW);}} else if (senzori [SenVWall]) {found = TRUE; angle = 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 (senzori [SenBumpDrop] & BumpLeft) {drive (0, RadStraight); state = Ready;} else if (senzori [SenVWall]) {// provjerite za blizinu leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// vozite ravno (SlowSpeed, RadStraight); state = Follow;}} else if (! (distance> = TraceDistance)) { drive (SlowSpeed, RadStraight);} else if (! (-angle> = TraceAngle)) {drive (SearchSpeed, RadCW);} else {distance = 0; angle = 0; drive (SlowSpeed, RadStraight); state = Ready; } break; case TracingRight: if (sensors [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} else if (sensors [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (- SlowSpeed, RadStraight); state = BackingTraceRight;} else if (sensors [SenVWall]) {// provjerite blizinu leaderif (inRang e) {drive (0, RadStraight); state = Ready;} else {// vozite ravno (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 (senzori [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} else if (angle> = 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); state = Ready;} else if (-angle> = = TraceAngle) {distance = 0; angle = 0; drive (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);} // otkrivena litica ili korisničko dugme, omogućavaju stabilizaciju stanja (npr. dugme za otpuštanje) pogon (0, RadStraight); delayAndUpdateSensors (2000);}}} // Prekid serijskog prijema za spremanje vrijednosti senzora SIGNAL (SIG_USART_RECV) {uint8_t temp; temp = UDR0; if (sensors_flag) {sensors_in [sensors_index ++] = temp; if (sensors_index> = Sen6Size) sensors_flag = 0;}} // Prekidač timera 1 do vremenskih kašnjenja u msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // Prijenos bajta preko serijskog porta izbegava byteTx (vrijednost uint8_t) {while (! (UCSR0A & _BV (UDRE0)); UDR0 = vrijednost;} // Odgoda određenog vremena u ms bez ažuriranja vrijednosti senzora izbjegavanje kašnjenjaMs (uint16_t vrijeme_ms) {timer_on = 1; timer_cnt = vrijeme_ms; dok (timer_on);} // Odgoda za navedeno vrijeme u ms i provjera sekunde IC detektorotpornost 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));} // Odgoda za navedeno vrijeme u ms i ažuriranje vrijednosti senzoravoid 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 ++) senzori [temp] = sensors_in [temp]; // Ažurirajte tekuće ukupne udaljenosti i nagnute udaljenosti += (int) ((senzori [SenDist1] 8) | senzori [SenDist0]); kut += (int) ((senzori [SenAng1] 8) | senzori [SenAng0]); byteTx (CmdSensors); byteTx (6); sensors_index = 0; sensors_flag = 1;}}} // Inicijalizacija kontrole uma & aposs ATmega168 mikrokontrolervoid initialize (void) {cli (); // Postavljanje I/O pinovaDDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Postavljanje tajmera 1 za generiranje prekida svakih 1 msTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Postavljanje serijskog porta s rx prekidomUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0)); UCSR0C = (_BV (UCSZ00) | _BV (UCSZ01)); // Uključite interruptssei ();} void powerOnRobot (void) {// Ako je napajanje Create & aposs isključeno, isključite ga onif (! RobotIsOn) {while (! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Kašnjenje u ovom stanjuRobotPwrToggleHigh; // Niski prema visokom prijelazu za prebacivanje powerdelayMs (100); // Kašnjenje u ovom stanjuRobotPwrToggleLow;} delayMs (3500); // Odgoda za pokretanje}} // Uključite brzinu prijenosa i na Kreiraj i na modulovoid baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code);/ / Sačekajte dok se prijenos ne završi (! (UCSR0A & _BV (TXC0))); cli (); // Promijenite registar brzine prijenosa (baud_code == Baud115200) UBRR0 = Ubrr115200; inače if (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) UBR 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) UBRR0 = Ubrr12 baud_code == Baud600) UBRR0 = Ubrr600; inače if (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Pošalji Kreiraj naredbe pogona u smislu brzine i radiusvoid pogona (int16_t brzina, int16_t radijus) {byteTx (CmdDrive); byteTx ((uint 8_t) ((velocity >> 8) & 0x00FF)); byteTx ((uint8_t) (velocity & 0x00FF)); byteTx ((uint8_t) ((radius >> 8) & 0x00FF)); byteTx ((uint8_t) (radius & 0x00FF));}

Preporučuje se: