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, Studeni
Anonim

Autor jeffreyfFollow Više od autora:

Kako se prijaviti na mini natječaj iRobot Create Scholarship
Kako se prijaviti na mini natječaj iRobot Create Scholarship
Kako se prijaviti na mini natječaj iRobot Create Scholarship
Kako se prijaviti na mini natječaj 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 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

Preuzmite izvorni kod
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: