Innholdsfortegnelse:

Hvordan lage en Robo-Bellhop: 3 trinn
Hvordan lage en Robo-Bellhop: 3 trinn

Video: Hvordan lage en Robo-Bellhop: 3 trinn

Video: Hvordan lage en Robo-Bellhop: 3 trinn
Video: Карл Фристон: «Мета» принцип свободной энергии [ЧАСТЬ 1!] 2024, November
Anonim

Av jeffreyfFølg Mer av forfatteren:

Slik deltar du i iRobot Create Scholarship minikonkurranse
Slik deltar du i iRobot Create Scholarship minikonkurranse
Slik deltar du i iRobot Create Scholarship minikonkurranse
Slik deltar du i iRobot Create Scholarship minikonkurranse
Hvordan lage LOLCats, Meme katter, Kattmakroer eller kattbilder med morsomme bildetekster
Hvordan lage LOLCats, Meme katter, Kattmakroer eller kattbilder med morsomme bildetekster
Hvordan lage LOLCats, Meme katter, Kattmakroer eller kattbilder med morsomme bildetekster
Hvordan lage LOLCats, Meme katter, Kattmakroer eller kattbilder med morsomme bildetekster

Om: Jeg liker å ta ting fra hverandre og finne ut hvordan de fungerer. Jeg mister generelt interessen etter det. Mer om jeffreyf »

Denne instruksjonsboken viser hvordan du bruker iRobot Create til å lage en bevegelig bellhop. Dette ble opphevet helt med tillatelse fra carolDancer instruksjoner, og jeg la det opp som en prøveoppføring for konkurransen vår. Robo-BellHop kan være din egen personlige assistent for å bære vesker, dagligvarer, klesvask, etc., slik at du ikke har til. Den grunnleggende Create har en skuff festet på toppen og bruker to innebygde IR-detektorer for å følge eierens IR-sender. Med helt grunnleggende C -programvarekode kan brukeren sikre tunge dagligvarer, en stor mengde vaskeri eller overnattingposen din på Robo -BellHop og få roboten til å følge deg nedover gaten, gjennom kjøpesenteret, ned gangen eller gjennom flyplassen - - uansett hvor brukeren trenger å gå. Grunnleggende betjening 1) Trykk på Reset -knappen for å slå på kommandomodulen og kontrollere at sensorene er i gang 1a) Play -LED -en skal lyse når den ser at IR -senderen følger deg1b) Advance LED -lampen skal gå på når roboten er på veldig nært område2) Trykk på den svarte myke knappen for å kjøre Robo-BellHop-rutinen3) Fest IR-senderen til ankelen og kontroller at den er slått på. Last deretter opp kurven og gå! 4) Logikken til Robo-BellHop er som følger: 4a) Hvis IR-signalet oppdages når du går rundt, kjører roboten med maks hastighet4b) Hvis IR-signalet går ut av rekkevidde (ved å være for langt eller for skarp vinkel), vil roboten krysse en kort avstand med lav hastighet i tilfelle signalet blir tatt opp igjen4c) Hvis IR -signalet ikke oppdages, vil roboten svinge til venstre og høyre i en forsøk på å finne signalet igjen4d) Hvis IR -signalet oppdages, men roboten treffer et hinder, vil roboten prøve å kjøre rundt hinderet4e) Hvis roboten kommer veldig nær IR -signalet, vil roboten stoppe for å unngå å treffe eierens ankler Hardware1 iRobot virtuell veggenhet - $ 301 IR -detektor fra RadioShack - $ 31 DB -9 hannkontakt fra Radio Shack - $ 44 6-32 skruer fra Home Depot - $ 2.502 3V batterier, jeg brukte D1 vasketøyskurv fra Target - $ 51 ekstra hjul til på baksiden av Create robotElektrisk tape, wire og loddetinn

Trinn 1: Dekker IR -sensoren

Fest elektrisk tape for å dekke alle unntatt en liten spalte av IR -sensoren på forsiden av Create -roboten. Demonter den virtuelle veggenheten og trekk ut det lille kretskortet på forsiden av enheten. Dette er litt vanskelig fordi det er mange skjulte skruer og plastfester. IR -senderen er på kretskortet. Dekk IR -senderen med et stykke silkepapir for å unngå IR -refleksjoner. Fest kretskortet til en stropp eller elastikk som kan vikles rundt ankelen. Koble batteriene til kretskortet slik at du kan ha batteriene på et behagelig sted (jeg lagde det slik at jeg kunne putte batteriene i lommen).

Koble den andre IR-detektoren til DB-9-kontakten og sett den inn i Cargo Bay ePort pin 3 (signal) og pin 5 (jord). Fest den andre IR -detektoren til toppen av den eksisterende IR -sensoren på Create og dekk den med et par lag silkepapir til den andre IR -detektoren ikke ser senderen på en avstand som du vil at Create -roboten skal stoppe for å beholde fra å slå deg. Du kan teste dette etter at du har trykket på Tilbakestill -knappen og se Advance LED for å gå på når du er på stoppavstanden.

Trinn 2: Fest kurven

Fest kurven med 6-32 skruene. Jeg har nettopp montert kurven på toppen av Create -roboten. Skyv også inn bakhjulet slik at du legger vekt på baksiden av Create -roboten.

Merknader: - Roboten kan bære ganske mye belastning, minst 30 kg. - Den lille størrelsen syntes å være den vanskeligste delen med å få den til å bære bagasje - IR er veldig temperamentsfull. Kanskje det er bedre å bruke bildebehandling, men det er mye dyrere

Trinn 3: Last ned kildekoden

Last ned kildekoden
Last ned kildekoden

Kildekoden følger, og er vedlagt i en tekstfil:

/************************************************* ******************** follow.c ** -------- ** kjører på Create Command Module ** dekker alt unntatt liten åpning på forsiden av IR-sensoren ** Create vil følge en virtuell vegg (eller en IR som sender ut ** kraftfelt-signalet) og forhåpentligvis unngå hindringer i prosessen ***************** ************************************************* **/#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#definere TraceDistance 250#definere TraceAngle 30#definere BackDistance 25#definere IRDetected (~ PINB & 0x01) // tilstander#definere Klar 0#definere Følgende 1#definere WasFollowing 2 #define SearchingLeft 3#define SearchingRight 4#definere TracingLeft 5#definere TracingRight 6#definere BackingTraceLeft 7#definere BackingTraceRight 8 // Globale variablerv 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 sensorer [Sen6Size]; volatile int16_t distance = 0; 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); void initialize (voidnot); baud (uint8_t baud_code); void drive (int16_t velocity, int16_t radius); uint16_t randomAngle (void); void defineSongs (void); int main (void) {// state variableuint8_t state = Ready; int found = 0; int wait_counter = 0; // Konfigurer Opprett og modulinitialiser (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // sett i/o for andre IR -sensorDDRB & = = ~ 0x01; // angi carport bay ePort pin 3 til å være en inputPORTB | = 0x01; // set cargo ePort pin3 pullup enabled // program loop while (TRUE) {// Stop just as a precautiondrive (0, RadStraight); // set LEDsbyteTx (CmdLeds); byteTx (((sensorer [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (sensorer [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // ser etter brukerknapp, sjekk ofteendayAndUpdateSensors (10); delayAndCheck (10); if (UserButtonPressed) {delayAndUpdateSensors (1000); // active loop while (! (UserButtonPressed) && (! Sensors [SenCliffL]) && (! Sensors [SenCliffFL]) && (! Sensors [SenCliffFR]) && (! sensorer [SenCliffR])) {byteTx (CmdLeds); byteTx (((sensorer [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (sensorer [SenCharge1]); byteTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; switch (state) {case Ready: if (sensorer [SenVWall]) {// kontroller om det er nærhet til leaderif (inRange) {drive (0, RadStraight);} annet {// drive straightdrive (SlowSpeed, RadStraight); state = Følger;}} annet {// søk etter bjelkelaget = 0; distanse = 0; wait_counter = 0; funnet = FALSK; stasjon (SearchSpeed, RadCCW); state = SearchingLeft;} break; case Følgende: if (sensorer [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;} ellers hvis (sensorer [SenVWall]) {// se etter nærhet til leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = Following;}} else {// nettopp mistet signalet, fortsett sakte en cycledistance = 0; drive (SlowSpeed, RadStraight); state = WasFollowing;} break; case WasFollowing: if (sensors [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} annet hvis (sensorer [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} ellers hvis (sensorer [SenVWall]) {// kontroller om det er nærhet til leaderif (inRange) {stasjon (0, RadStraight); tilstand = 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 (sensorer [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 = Følger;} else {stasjon (SearchSpeed, RadCW);}} annet hvis (sensorer [SenVWall]) {funnet = SANN; vinkel = 0; hvis (inRange) {stasjon (0, RadStraight); state = Klar;} annet {stasjon (SearchSpeed, RadCCW);}} annet hvis (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]) {// check for nærhet til 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;} ellers hvis (sensorer [SenVWall]) {// sjekk for nærhet til 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 (sensorer [SenVWall] && inRange) {stasjon (0, RadStraight); state = Ready;} ellers hvis (vinkel> = TraceAngle) {distance = 0; vinkel = 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);} // cliff eller user -knapp oppdaget, la tilstanden stabilisere (f.eks. knappen som skal slippes) stasjon (0, RadStraight); delayAndUpdateSensors (2000);}}}} // Seriell mottaksavbrudd for å lagre sensorverdier 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 til tidsforsinkelser i msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // Overfør en byte over den serielle portvoid byteTx (uint8_t verdi) {while (! (UCSR0A & _BV (UDRE0)))); UDR0 = verdi;} // Delay for den angitte tiden i ms uten å oppdatere sensorverdier ugyldige delayMs (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; while (timer_on);} // Delay for den angitte tiden i ms og sjekk sekund IR -detektor void 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));} // Delay for den angitte tiden i ms og oppdater sensorverdiervoid 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. [SenAng1] 8) | sensorer [SenAng0]); byteTx (CmdSensors); byteTx (6); sensors_index = 0; sensors_flag = 1;}}} // Initialize Mind Control & aposs ATmega168 microcontrollervoid initialize (void) {cli (); // Sett I/O -pinsDDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Sett opp timer 1 for å generere et avbrudd hver 1 msTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Sett opp serieporten med rx interruptUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0)); UCSR0C = (_BV (UCSZ00) | _BV (UCSZ01)); // Slå på interruptssei ();} void powerOnRobot (void) {// Hvis Create & aposs strøm er slått av, slå den på hvis (! RobotIsOn) {mens (! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Forsinkelse i denne stateRobotPwrToggleHigh; // Lav til høy overgang til å bytte powerdelayMs (100); // Delay in this stateRobotPwrToggleLow;} delayMs (3500); // Forsinkelse ved oppstart}} // Bytt overføringshastighet på både Create og modulevoid baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code);/ / Vent til overføringen er fullført (((UCSR0A & _BV (TXC0))); cli (); // Bytt overføringshastighetsregister (baud_code == Baud115200) UBRR0 = Ubrr115200; ellers hvis (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; ellers hvis (baud_code == Baud14400) UBRR0 = Ubr if (baud_code == Baud9600) UBRR0 = Ubrr9600; else if (baud_code == Baud4800) UBRR0 = Ubrr4800; else if (baud_code == Baud2400) UBRR0 = Ubrr2400; ellers if (baud_code == Baud1200) UBRR0 = Ubrr00 baud_code == Baud600) UBRR0 = Ubrr600; ellers hvis (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Send Opprett stasjonskommandoer når det gjelder hastighet og radiushul stasjon (int16_t hastighet, int16_t radius) {byteTx (CmdDrive); byteTx ((uint 8_t) ((hastighet >> 8) & 0x00FF)); byteTx ((uint8_t) (hastighet & 0x00FF)); byteTx ((uint8_t) ((radius >> 8) & 0x00FF)); byteTx ((uint8_t) (radius & 0x00FF));}

Anbefalt: