Taula de continguts:

Com fer un Robo-Bellhop: 3 passos
Com fer un Robo-Bellhop: 3 passos

Vídeo: Com fer un Robo-Bellhop: 3 passos

Vídeo: Com fer un Robo-Bellhop: 3 passos
Vídeo: Far From The Others | Critical Role | Campaign 3, Episode 52 2024, Desembre
Anonim

Per jeffreyf Segueix-ne més per l'autor:

Com participar al mini-concurs iRobot Create Scholarship
Com participar al mini-concurs iRobot Create Scholarship
Com participar al mini-concurs iRobot Create Scholarship
Com participar al mini-concurs iRobot Create Scholarship
Com fer LOLCats, gats meme, macros de gats o imatges de gats amb subtítols divertits
Com fer LOLCats, gats meme, macros de gats o imatges de gats amb subtítols divertits
Com fer LOLCats, gats meme, macros de gats o imatges de gats amb subtítols divertits
Com fer LOLCats, gats meme, macros de gats o imatges de gats amb subtítols divertits

Quant a: M’agrada desmuntar les coses i esbrinar com funcionen. En general, desaprofito l'interès. Més informació sobre jeffreyf »

Aquesta instrucció mostra com utilitzar el iRobot Create per fer un botó de moviment. Això es va aixecar completament amb el permís de les instruccions de carolDancer i el vaig presentar com a entrada de mostra per al nostre concurs. a. El Create bàsic té un contenidor connectat a la part superior i utilitza dos detectors IR integrats per seguir el transmissor IR del seu propietari. Amb un codi de programari C molt bàsic, l’usuari pot assegurar queviures pesats, una gran càrrega de roba o la bossa de la nit a Robo-BellHop i fer que el robot us segueixi pel carrer, pel centre comercial, pel passadís o per l’aeroport. - Allà on l’usuari hagi d’anar. Operació bàsica 1) Premeu el botó Restableix per activar el mòdul d’ordres i comproveu que els sensors estiguin en contacte 1a) el LED de reproducció s’hauria d’encendre quan vegi que el transmissor IR us segueixi 1b) el LED d’avanç hauria d’encendre’s quan el robot es troba molt a prop 2) Premeu el botó suau negre per executar la rutina Robo-BellHop 3) Connecteu el transmissor IR al turmell i assegureu-vos que estigui engegat. A continuació, carregueu la cistella i llest! 4) La lògica de Robo-BellHop és la següent: 4a) Mentre passegeu, si es detecta el senyal IR, el robot conduirà a la velocitat màxima 4b) Si el senyal IR surt de (si es troba un angle massa llunyà o massa pronunciat), el robot recorrerà una distància curta a velocitat lenta en cas que es reprengui el senyal 4c) Si no es detecta el senyal IR, el robot girarà a l’esquerra i a la dreta intenta trobar el senyal de nou 4d) Si es detecta el senyal IR però el robot xoca amb un obstacle, el robot intentarà circular al voltant de l’obstacle 4e) Si el robot s’acosta molt al senyal IR, el robot s’aturarà per evitar colpejar el turmells del propietari Unitat de paret virtual iRobot de Hardware1 - Detector IR de 301 dòlars de RadioShack - Connector mascle DB-9 de 31 dòlars de Radio Shack - 44 cargols 6-32 dòlars de Home Depot - 2,502 dòlars de bateries de 3V part posterior del robot CreateCinta elèctrica, filferro i soldadura

Pas 1: cobrir el sensor IR

Col·loqueu cinta elèctrica per cobrir totes, excepte una petita escletxa del sensor IR a la part frontal del robot Create. Desmunteu la unitat de paret virtual i extraieu la petita placa de circuit que hi ha a la part frontal de la unitat. Això és una mica complicat perquè hi ha molts cargols ocults i suports de plàstic. El transmissor IR es troba a la placa de circuits. Cobriu el transmissor IR amb un tros de paper de seda per evitar reflexos IR. Connecteu la placa de circuit a una corretja o una banda elàstica que us pugui enrotllar al turmell. Connecteu les bateries a la placa de circuit perquè pugueu tenir-les en un lloc còmode (l’he fet per poder posar-les a la butxaca).

Connecteu el segon detector IR al connector DB-9 i introduïu-lo al pin 3 (senyal) i al pin 5 (terra) de Cargo Bay ePort. Connecteu el 2n detector d’IR a la part superior del sensor d’IR existent a Crea i cobreix-lo amb un parell de capes de paper de seda fins que el 2n detector d’IR no vegi l’emissor a una distància que voleu que es detingui el robot Crea. de colpejar-te. Podeu provar-ho després de prémer el botó Restableix i veure el LED d’avanç perquè s’encengui quan esteu a la distància de parada.

Pas 2: fixeu la cistella

Col·loqueu la cistella amb els cargols 6-32. Acabo de muntar la cistella a la part superior del robot Create. Feu lliscar també la roda posterior per col·locar el pes a la part posterior del robot Create.

Notes: - El robot pot carregar força càrrega, com a mínim 30 lliures. - La mida petita semblava ser la part més difícil d’aconseguir que portés qualsevol equipatge. L’IR és molt temperamental. Potser és millor fer servir imatges, però és molt més car

Pas 3: baixeu el codi font

Baixeu-vos el codi font
Baixeu-vos el codi font

El codi font el segueix i s’adjunta en un fitxer de text:

/ ************************************************** ******************** follow.c ** -------- ** s'executa en Crea un mòdul d'ordres ** cobreix totes les obertures excepte petites del sensor IR ** Crea seguirà una paret virtual (o qualsevol IR que enviï el ** senyal de camp de força) i, amb sort, evitarà obstacles en el procés ***************** *************************************************** ** / # 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 # define IRDetected (~ PINB & 0x01) // states # define Ready 0 # define Segueix 1 # defineix WasFollowing 2 #define SearchingLeft 3 # define SearchingRight 4 # define TracingLeft 5 # define TracingRight 6 # define BackingTraceLeft 7 # define BackingTraceRight 8 // Variables globalsv 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 sensors [Sen6Size]; volatile int16_t distance = 0; volatile uint8_t inRange = 0; // Functionsvoid byteTx (uint8_t value); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (unsigned int time_ms); baud (uint8_t baud_code); unitat void (velocitat int16_t, radi int16_t); uint16_t randomAngle (void); void defineixSongs (void); int main (void) {// state variableuint8_t state = Ready; int found = 0; int wait_counter = 0; // Configureu Crea i modifiqueu inicialitzar (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // set i / o per al segon sensor IRDDRB & = ~ 0x01; // Estableix el pin ePort 3 de la nau de càrrega com a entradaPORTB | = 0x01; // Estableix l’ePort de pin3 de càrrega habilitat // Programa loop while (TRUE) {// Atura-ho com a precautiondrive (0, RadStraight); // set LEDsbyteTx (CmdLeds); byteTx (((sensors [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (sensors [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // cercant el botó d'usuari, comproveu els sensors de tendència i actualitzacióSensors (10); (10); if (UserButtonPressed) {delayAndUpdateSensors (1000); // active loop while (! (UserButtonPressed) && (! Sensors [SenCliffL]) && (! Sensors [SenCliffFL]) && (! Sensors [SenCliffFR]) && (! sensors [SenCliffR])) {byteTx (CmdLeds); byteTx (((sensors [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (sensors [SenCharge1]); byteTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; switch (state) {case Ready: if (sensors [SenVWall]) {// comproveu la proximitat a leaderif (inRange) {drive (0, RadStraight);} else {// drive straightdrive (SlowSpeed, RadStraight); state = Following;}} else {// search of the beamangle = 0; distance = 0; wait_counter = 0; trobat = FALS; unitat (SearchSpeed, RadCCW); state = SearchingLeft;} break; case Següent: 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]) {// buscar proximitat a leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = Following;}} else {// acaba de perdre el senyal, continueu lentament un 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]) {// comproveu la proximitat a leaderif (inRange) {unitat (0, RadStraight); estat = R llest;} else {// drive straightdrive (FullSpeed, RadStraight); state = Following;}} 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 = Following;} else {drive (SearchSpeed, RadCCW);}} else if (sensors [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); state = Després;} else {unitat (SearchSpeed, RadCW);}} else if (sensors [SenVWall]) {found = TRUE; angle = 0; if (inRange) {drive (0, RadStraight); state = Ready;} else {unitat (SearchSpeed, RadCCW);}} else if (wait_counter> 0) {wait_counter - = 20; drive (0, RadStraight);} else if (angle = Cerca 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 per proximitat a leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Following;}} 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]) {// comprova la proximitat al líder (inRang e) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Following;}} 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 (sensors [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);} // penya o botó d'usuari detectat, permet l'estabilització de la condició (per exemple, el botó que s'allibera) de la unitat (0, RadStraight); delayAndUpdateSensors (2000);}}} // Interrupció de recepció sèrie per emmagatzemar els valors del sensor SIGNAL (SIG_USART_RECV) {uint8_t temp; temp = UDR0; if (sensors_flag) {sensors_in [sensors_index ++] = temp; if (sensors_index> = Sen6Size) sensors_flag = 0;}} // Interrupció del temporitzador 1 a retards temporals en msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt -; elsetimer_on = 0;} // Transmet un byte sobre el byteTx (uint8_t) portvoid sèrie {while (! (UCSR0A & _BV (UDRE0))); UDR0 = valor;} // Retard durant el temps especificat en ms sense actualitzar els valors del sensor eviteu el retard Ms (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; while (timer_on);} // Retard del temps especificat en ms i comproveu el segon Detector IR: evitar 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));} // Retard del temps especificat en ms i actualització dels valors del sensorvoid 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 ++) sensors [temp] = sensors_in [temp]; // Actualitzar els totals de distància i distància angular + = (int) ((sensors [SenDist1] 8) | sensors [SenDist0]); angle + = (int) ((sensors) [SenAng1] 8) | sensors [SenAng0]); byteTx (CmdSensors); byteTx (6); sensors_index = 0; sensors_flag = 1;}}} // Initialize the Mind Control & aposs ATmega168 microcontrollervoid initialize (void) {cli (); // Establir pins d'E / S DDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Configureu el temporitzador 1 per generar una interrupció cada 1 msTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Configureu el port sèrie amb interrupció rxUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0)); UCSR0C = (_BV (UCSZ00) | _BV (UCSZ01)); // Activa interruptssei ();} void powerOnRobot (void) {// Si Crea & aposs el poder està apagat, activa'l si (! RobotIsOn) {while (! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Retard en aquest estat RobotPwrToggleHigh; // Transició de baixa a alta per canviar powerdelayMs (100); // Retard en aquest estat RobotPwrToggleLow;} delayMs (3500); // Retard per a l’inici}} // Canvia la velocitat de transmissió tant en Creació com en modulevoid baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code); / / Espereu fins que es completi la transmissió (! (UCSR0A & _BV (TXC0))); cli (); // Canvia el registre de velocitat en baud (baud_code == Baud115200) UBRR0 = Ubrr115200; else 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 == Baud0400) else 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 = ifbrr00 baud_code == Baud600) UBRR0 = Ubrr600; else if (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Enviar Crea ordres de la unitat en termes de velocitat i radiusvoid drive (int16_t velocity, int16_t radi) {byteTx (CmdDrive); byteTx ((uint 8_t) ((velocitat >> 8) i 0x00FF)); byteTx ((uint8_t) (velocitat & 0x00FF)); byteTx ((uint8_t) ((radi >> 8) & 0x00FF)); byteTx ((uint8_t) (radi & 0x00FF));}

Recomanat: