Sadržaj:
Video: Kako napraviti Robo-Bellhop: 3 koraka
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:38
Autor jeffreyfFollow Više od autora:
O: Volim rastavljati stvari i shvatiti kako funkcioniraju. Nakon toga općenito gubim interes. Više o jeffreyfu »
Ovaj Instructable pokazuje kako koristiti iRobot Create za izradu pokretnog zvona. Ovo je u potpunosti ukinuto uz dopuštenje uputa carolDancer, a ja sam ga stavio kao uzorak za naše natjecanje. Robo-BellHop može biti vaš osobni pomoćnik za nošenje torbi, namirnica, rublja itd., Tako da nemate do. Osnovni Create ima spremnik pričvršćen na vrh i koristi dva ugrađena IR detektora za praćenje IC odašiljača svog vlasnika. S vrlo osnovnim programskim kodom C, korisnik može osigurati teške namirnice, veliki tovar rublja ili torbu za noćenje na Robo -BellHop i neka vas robot prati ulicom, kroz trgovački centar, niz hodnik ili kroz zračnu luku - - kamo god korisnik treba ići. Osnovni rad1) Pritisnite gumb Reset za uključivanje naredbenog modula i provjerite da li su senzori uključeni1a) LED za reprodukciju trebao bi se uključiti kad vidi da vas IC odašiljač prati1b) LED za napredovanje trebao bi se uključiti kada se robot je na vrlo velikoj udaljenosti2) Pritisnite crnu mekanu tipku za pokretanje Robo-BellHop rutine3) Priključite IC odašiljač na gležanj i provjerite je li uključen. Zatim napunite košaru 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 izađe iz dometa (ako je kutak predaleko ili previše oštar), robot će prijeći kratku udaljenost pri maloj brzini u slučaju da se signal ponovno pokupi4c) Ako se IC signal ne detektira, 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 gležnjevi vlasnika 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 košaru za rublje iz Targeta - 51 USD dodatni kotač za postavljanje na stražnja strana Create robotElectrical tape, wire and leam
Korak 1: Pokrivanje IC senzora
Pričvrstite električnu traku da pokrije sve osim malog proreza IC senzora na prednjoj strani Create robota. Rastavite jedinicu virtualnog zida i izvadite malu ploču s prednje strane jedinice. Ovo je pomalo zeznuto jer postoji mnogo skrivenih vijaka i plastičnih držača. IC odašiljač nalazi se na pločici. 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 iglu 3 za Cargo Bay (signal) i iglu 5 (uzemljenje). 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. To možete testirati nakon što pritisnete gumb za poništavanje i gledate kako LED lampica napredovanja svijetli kad ste na zaustavnoj udaljenosti.
Korak 2: Pričvrstite košaru
Pričvrstite košaru pomoću vijaka 6-32. Upravo sam montirao košaru 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 puno skuplje
Korak 3: Preuzmite izvorni kod
Slijedi izvorni kod koji je priložen u tekstualnu datoteku:
/*********************************************** ******************** 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#define SearchRightAngle (SearchLeftAngle - 1000) #define CoastDistance 150#define TraceDistance 250#define TraceAngle 30#definiraj BackDistance 25#definiraj IRDetected (~ PINB & 0x01) // stanja#definiraj Spremno 0#definiraj Slijedi 1#definiraj 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 [nestabilno 0; volatile uint8_t inRange = 0; // Funkcijevoid byteTx (vrijednost uint8_t); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (unsigned int time_ms); void initialize (void Initial (void) baud (uint8_t baud_code); void drive (int16_t velocity, int16_t radius); uint16_t randomAngle (void); void defineSongs (void); int main (void) {// varijabla stanjauint8_t stanje = Spremno; int pronađeno = 0; int čekanje_broj = 0; // Postavi Create and moduleinitialize (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // postavite i/o za drugi IR senzorDDRB & = ~ 0x01; // postavimo ePort pin 3 teretnog prostora za ulazPORTB | = 0x01; // postavljanje omogućeno izvlačenje tereta ePort pin3 // programska petlja tijekom (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? LED1On: LED1Off; // u potrazi za korisničkim gumbom, provjerite zadrškuAndUpdateSensors (10); (10); if (UserButtonPressed) {delayAndUpdateSensors (1000); // aktivna petlja (! (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ženje 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; kut = 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 (sensors [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (sensors [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 ravno (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 = Slijedi;} 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 (sensors [SenBumpDrop] & BumpLeft) {drive (0, RadStraight); state = Ready;} else if (sensors [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) {pogon (SearchSpeed, RadCCW);} else {drive (-SlowSpeed, RadStraight);} break; case BackingTraceRight: if (senzori [SenVWall] && inRange) {pogon (0, RadStraight); stanje = Spremno;} 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);} // litica ili korisnička tipka otkrivena, omogućuju stabilizaciju stanja (npr. gumb za otpuštanje) pogon (0, RadStraight); delayAndUpdateSensors (2000);}}} // Prekid serijskog primanja radi spremanja 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;}} // Timer 1 prekid do vremenskih kašnjenja u msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // Prijenos bajta preko serijskog portvoida byteTx (uint8_t vrijednost) {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; while (timer_on);} // Odgoda određenog vremena u ms i provjera sekunde IC 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));} // 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 zbrojeve udaljenosti i kutne 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 timera 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 (! 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 Stvori i na moduluvoid baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code);/ / Pričekajte dok prijenos ne završi (! (UCSR0A & _BV (TXC0))); cli (); // Promijenite registerif 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; inace if (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Slanje Napravite 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) ((radijus >> 8) & 0x00FF)); byteTx ((uint8_t) (radijus & 0x00FF));}
Preporučeni:
Uradi sam Kako napraviti sat koji izgleda lijepo - StickC - Jednostavno za napraviti: 8 koraka
Uradi sam Kako napraviti sat sa lijepim izgledom - StickC - Jednostavno za napraviti: U ovom ćemo vodiču naučiti kako programirati ESP32 M5Stack StickC s Arduino IDE -om i Visuinom za prikaz vremena na LCD -u te također postaviti vrijeme pomoću tipki StickC
Kako napraviti brojač koraka?: 3 koraka (sa slikama)
Kako napraviti brojač koraka?: Nekada sam se dobro snašao u mnogim sportovima: hodanje, trčanje, vožnja bicikla, igranje badmintona itd. Volim jahanje da bih brzo putovao. Pa, pogledaj moj trbušni trbuh … Pa, u svakom slučaju, odlučujem ponovno početi vježbati. Koju opremu trebam pripremiti?
Kako napraviti najmanjeg robota za sljedbenike na svijetu (robo Rizeh): 7 koraka (sa slikama)
Kako napraviti robota za najmanji linijski sljedbenik na svijetu (robo Rizeh): Kako napraviti najmanjeg robota za sljedbenike na svijetu (vibrobot) " roboRizeh " težina: 5gr veličina: 19x16x10 mm od: Naghi Sotoudeh Riječ " Rizeh " je perzijska riječ koja znači "sićušan". Rizeh se temelji na vibracijama vrlo malih ro
KAKO NAPRAVITI ARDUINO NANO/MINI - Kako snimiti Bootloader: 5 koraka
KAKO NAPRAVITI ARDUINO NANO/MINI | Kako snimiti Bootloader: U ovom uputstvu pokazat ću vam kako napraviti Arduino MINI od ogrebotina. Postupak napisan u ovim uputama može se koristiti za izradu bilo kojih arduino ploča za vaše prilagođene zahtjeve projekta. Molimo pogledajte video za bolje razumijevanje
Kako napraviti kalendar djeda i bake & Spomenar (čak i ako ne znate kako spomenar): 8 koraka (sa slikama)
Kako napraviti kalendar djeda i bake & Spomenar (čak i ako ne znate zapisati album): Ovo je vrlo ekonomičan (i cijenjen!) Blagdanski dar za bake i djedove. Ove sam godine napravio 5 kalendara za manje od 7 USD svaki. Materijali: 12 sjajnih fotografija vašeg djeteta, djece, nećaka, nećaka, pasa, mačaka ili druge rodbine12 različitih komada