Cuprins:

Cum să faci un Robo-Bellhop: 3 pași
Cum să faci un Robo-Bellhop: 3 pași

Video: Cum să faci un Robo-Bellhop: 3 pași

Video: Cum să faci un Robo-Bellhop: 3 pași
Video: CUM REZOLVI UN CUB RUBIK 2024, Noiembrie
Anonim

De jeffreyf Urmărește mai multe de la autor:

Cum să participi la mini-concursul iRobot Create Scholarship
Cum să participi la mini-concursul iRobot Create Scholarship
Cum să participi la mini-concursul iRobot Create Scholarship
Cum să participi la mini-concursul iRobot Create Scholarship
Cum se fac LOLCats, pisici Meme, macro-uri de pisici sau imagini de pisici cu subtitrări amuzante
Cum se fac LOLCats, pisici Meme, macro-uri de pisici sau imagini de pisici cu subtitrări amuzante
Cum să faci LOLCats, pisici Meme, macro-uri pentru pisici sau imagini cu pisici cu subtitrări amuzante
Cum să faci LOLCats, pisici Meme, macro-uri pentru pisici sau imagini cu pisici cu subtitrări amuzante

Despre: Îmi place să scot lucrurile și să aflu cum funcționează. În general, îmi pierd interesul după aceea. Mai multe despre jeffreyf »

Acest instructable arată cum să utilizați iRobot Create pentru a crea un clopot în mișcare. Acest lucru a fost ridicat în totalitate cu permisiunea instrucțiunilor carolDancer și l-am prezentat ca un exemplu de intrare pentru concursul nostru. la. Creare de bază are un coș atașat în partea de sus și folosește doi detectori IR la bord pentru a urmări transmițătorul IR al proprietarului. Cu un cod software de bază C, utilizatorul poate asigura produse alimentare grele, o încărcătură mare de rufe sau geanta de peste noapte pe Robo-BellHop și cere robotului să vă urmărească pe stradă, prin mall, pe hol sau prin aeroport - - oriunde trebuie să meargă utilizatorul. Operațiunea de bază 1) Apăsați butonul Reset pentru a porni modulul de comandă și verificați dacă senzorii sunt cuplați1a) LED-ul de redare ar trebui să se aprindă când vede transmițătorul IR pentru a vă urmări 1b) LED-ul Advance ar trebui să se aprindă când robotul se află la o distanță foarte apropiată 2) Apăsați butonul negru pentru a rula rutina Robo-BellHop 3) Atașați transmițătorul IR la gleznă și asigurați-vă că este pornit. Apoi încărcați coșul și mergeți! 4) Logica Robo-BellHop este următoarea: 4a) Pe măsură ce vă plimbați, dacă semnalul IR este detectat, robotul va conduce la viteza maximă 4b) Dacă semnalul IR se stinge (dacă este un unghi prea îndepărtat sau prea ascuțit), robotul va parcurge o distanță scurtă la viteză mică, în cazul în care semnalul este preluat din nou 4c) Dacă semnalul IR nu este detectat, robotul se va întoarce la stânga și la dreapta într-un încercarea de a găsi din nou semnalul 4d) Dacă semnalul IR este detectat, dar robotul lovește un obstacol, robotul va încerca să circule în jurul obstacolului 4e) Dacă robotul se apropie foarte mult de semnalul IR, robotul se va opri pentru a evita lovirea glezne ale proprietarului Unitate virtuală de perete iRobot Hardware1 - Detector IR 301 dolari de la RadioShack - Conector masculin DB-9 de 31 dolari de la Radio Shack - 44 șuruburi de 6-32 dolari de la Home Depot - 2,502 dolari baterii 3V, am folosit coș de rufe D1 de la Țintă - 51 dolari roată suplimentară pe pe partea din spate a robotului Creați bandă electrică, sârmă și lipit

Pasul 1: Acoperirea senzorului IR

Atașați bandă electrică pentru a acoperi toate, cu excepția unei mici fante a senzorului IR de pe partea din față a robotului Create. Demontați unitatea virtuală de perete și extrageți placa de circuit mic din partea din față a unității. Acest lucru este un pic dificil, deoarece există o mulțime de șuruburi ascunse și suporturi din plastic. Transmițătorul IR este pe placa de circuit. Acoperiți transmițătorul IR cu o bucată de hârtie absorbantă pentru a evita reflexiile IR. Atașați placa de circuit la o curea sau bandă elastică care vă poate înfășura în jurul gleznei. Conectați bateriile la placa de circuit, astfel încât să puteți avea bateriile într-un loc confortabil (am făcut-o astfel încât să pot pune bateriile în buzunar).

Conectați al doilea detector IR la conectorul DB-9 și introduceți în pinul 3 (semnal) și pinul 5 (masă) Cargo Bay ePort. Atașați al doilea detector IR la partea superioară a senzorului IR existent de pe Creați și acoperiți-l cu câteva straturi de hârtie de țesut până când al doilea detector IR nu vede emițătorul la o distanță pe care doriți ca robotul Create să se oprească pentru a-l păstra de la lovirea ta. Puteți testa acest lucru după ce ați apăsat butonul Resetare și urmăriți LED-ul Advance pentru a porni când sunteți la distanță de oprire.

Pasul 2: Atașați coșul

Atașați coșul folosind șuruburile 6-32. Tocmai am montat coșul în partea de sus a robotului Create. De asemenea, glisați în roata din spate, astfel încât să plasați greutatea pe spatele robotului Create.

Note: - Robotul poate transporta destul de puțină sarcină, cel puțin 30 lbs. - Mărimea mică părea să fie cea mai grea parte a obținerii bagajelor - IR este foarte temperamental. Poate că utilizarea imaginilor este mai bună, dar este mult mai scumpă

Pasul 3: Descărcați codul sursă

Descărcați codul sursă
Descărcați codul sursă

Urmează codul sursă și este atașat într-un fișier text:

/ ************************************************* ******************** follow.c ** -------- ** rulează pe Creare modul de comandă ** acoperă toate deschiderile, cu excepția micii din față al senzorului IR ** Creare va urma un perete virtual (sau orice IR care trimite ** semnalul câmpului de forță) și, sperăm, să evite obstacolele din proces ***************** *************************************************** ** / # 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) // stări # define Ready 0 # define Urmează 1 # definește WasFollowing 2 #define SearchingLeft 3 # define SearchingRight 4 # define TracingLeft 5 # define TracingRight 6 # define BackingTraceLeft 7 # define BackingTraceRight 8 // Variabile globalev 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 [Sen6Size]; volatile int16_t distanță = 0; volatile int16_t distanță = 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); void initialize (void); baud (uint8_t baud_code); unitate void (viteza int16_t, raza int16_t); uint16_t randomAngle (void); void definește Cântece (void); int main (void) {// variabilă stateuint8_t state = Ready; 0; // Configurare Create and moduleinitialize (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // set i / o pentru al doilea senzor IRDDRB & = ~ 0x01; // setați pinul ePort 3 al portului de încărcare să fie o intrarePORTB | = 0x01; // set cargo ePort pin3 pullup enabled // program loopwhile (TRUE) {// Stop just as 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; (10); if (UserButtonPressed) {delayAndUpdateSensors (1000); // active loop while (! (UserButtonPressed) && (! Sensors [SenCliffL]) && (! Sensors [SenCliffFL]) && (! Sensors [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 (state) {case Ready: if (senzori [SenVWall]) {// verificați dacă există proximitate de leaderif (inRange) {unitate (0, RadStraight);} else {// drive straightdrive (SlowSpeed, RadStraight); state = Următor;}} else {// căutare beamangle = 0; distance = 0; wait_counter = 0; găsit = FALS; drive (SearchSpeed, RadCCW); state = SearchingLeft;} break; case Următorul: 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 (senzori [SenVWall]) {// căutați pentru apropierea de leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = Following;}} else {// tocmai a pierdut semnalul, continuați încet unul 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 (senzori [SenVWall]) {// verificați proximitatea cu leaderif (inRange) {unitate (0, RadStraight); state = R eady;} 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 (senzori [SenVWall]) {găsit = TRUE; unghi = 0; if (inRange) {unitate (0, RadStraight); state = Ready;} else {unitate (SearchSpeed, RadCCW);}} else if (angle> = SearchLeftAngle) {unitate (SearchSpeed, RadCW); wait_counter = 0; state = SearchingRight;} else {drive (SearchSpeed, RadCCW);} break; case SearchingRight: if (found) {if (-angle> = ExtraAngle) {drive (SlowSpeed, RadStraight); state = Urmează;} 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 (senzori [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]) {// verificați pentru apropierea de 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 (senzori [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} else if (senzori [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (- SlowSpeed, RadStraight); state = BackingTraceRight;} else if (senzori [SenVWall]) {// verificați apropierea de leaderif (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 (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 (senzori [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; implicit: // stopdrive (0, RadStraight); state = Re ady; break;} delayAndCheckIR (10); delayAndUpdateSensors (10);} // stâncă sau userbutton detectat, permite condiția să se stabilizeze (de exemplu, butonul care trebuie eliberat) unitate (0, RadStraight); delayAndUpdateSensors (2000);}}} // Întrerupere de recepție serial pentru a stoca valorile senzorilor 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 interrupt la întârzieri în msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt -; elsetimer_on = 0;} // Transmit un octet peste portvoid serial byteTx (valoare uint8_t) {while (! (UCSR0A & _BV (UDRE0))); UDR0 = valoare;} // Întârziere pentru timpul specificat în ms fără actualizarea valorilor senzorului anulați întârziere Ms (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; while (timer_on);} // Întârziere pentru timpul specificat în ms și verificați secunda Detector IRevita 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));} // Întârziere pentru timpul specificat în ms și actualizați valorile senzorului 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 ++) senzori [temp] = sensors_in [temp]; // Actualizați totalurile de funcționare ale distanței și distanței angulare + = (int) ((senzori [SenDist1] 8) | senzori [SenDist0]); unghi + = (int) ((senzori [SenAng1] 8) | senzori [SenAng0]); byteTx (CmdSensors); byteTx (6); sensors_index = 0; sensors_flag = 1;}}} // Initialize Mind Control & aposs ATmega168 microcontrollervoid initialize (void) {cli (); // Setați pinii I / O DDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Configurați temporizatorul 1 pentru a genera o întrerupere la fiecare 1 msTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Configurați portul serial cu întrerupere rxUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0)); UCSR0C = (_BV (UCSZ00) | _BV (UCSZ01)); // Activați interruptssei ();} void powerOnRobot (void) {// Dacă creați și apăsați puterea este oprită, activați-l dacă (! RobotIsOn) {while (! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Întârziere în această stareRobotPwrToggleHigh; // Tranziție de la scăzută la ridicată pentru a comuta powerdelayMs (100); // Întârziere în această stareRobotPwrToggleLow;} delayMs (3500); // Întârziere pentru pornire}} // Comutați rata de transmisie atât pe Creați, cât și pe modulevoid baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code); / / Așteptați până când transmisia este completă (! (UCSR0A & _BV (TXC0))); cli (); // Comutați registrul ratei baudif (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 == Baud14400) UBRR0 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);}} // Trimiteți Creați comenzi de unitate în termeni de viteză și radiusvoid drive (int16_t speed, int16_t rază) {byteTx (CmdDrive); byteTx ((uint 8_t) ((viteza >> 8) & 0x00FF)); byteTx ((uint8_t) (velocity & 0x00FF)); byteTx ((uint8_t) ((radius >> 8) & 0x00FF)); byteTx ((uint8_t) (radius & 0x00FF));}

Recomandat: