Indholdsfortegnelse:

Sådan laver du en Robo-Bellhop: 3 trin
Sådan laver du en Robo-Bellhop: 3 trin

Video: Sådan laver du en Robo-Bellhop: 3 trin

Video: Sådan laver du en Robo-Bellhop: 3 trin
Video: Bellman-Ford in 5 minutes — Step by step example 2024, November
Anonim

Af jeffreyfFølg mere af forfatteren:

Sådan deltager du i iRobot Create Scholarship minikonkurrence
Sådan deltager du i iRobot Create Scholarship minikonkurrence
Sådan deltager du i iRobot Create Scholarship minikonkurrence
Sådan deltager du i iRobot Create Scholarship minikonkurrence
Sådan laver du LOLCats, Meme -katte, Katmakroer eller kattebilleder med sjove billedtekster
Sådan laver du LOLCats, Meme -katte, Katmakroer eller kattebilleder med sjove billedtekster
Sådan laver du LOLCats, Meme -katte, Katmakroer eller kattebilleder med sjove billedtekster
Sådan laver du LOLCats, Meme -katte, Katmakroer eller kattebilleder med sjove billedtekster

Om: Jeg kan godt lide at skille tingene ad og finde ud af, hvordan de fungerer. Jeg mister generelt interessen efter det. Mere om jeffreyf »

Denne instruktion viser, hvordan du bruger iRobot Create til at lave en bevægelig bellhop. Dette blev helt ophævet med tilladelse fra carolDancer instruktioner, og jeg lagde det op som et eksempel på vores konkurrence. Robo-BellHop kan være din egen personlige assistent til at bære dine tasker, dagligvarer, vasketøj osv., Så du ikke har til. Den grundlæggende Create har en bakke fastgjort til toppen og bruger to indbyggede IR-detektorer til at følge ejerens IR-sender. Med meget grundlæggende C -softwarekode kan brugeren sikre tunge dagligvarer, et stort tøjvask eller din overnatningspose på Robo -BellHop og få robotten til at følge dig ned ad gaden, gennem indkøbscenteret, ned ad gangen eller gennem lufthavnen - - uanset hvor brugeren skal hen. Grundlæggende betjening 1) Tryk på Reset -knappen for at tænde kommandomodulet og kontrollere, at sensorer er i gang 1a) Play -LED'en skal tænde, når den ser IR -senderen følge dig1b) Advance LED'en skal tænde, når robotten er meget tæt på 2) Tryk på den sorte bløde knap for at køre Robo-BellHop-rutinen3) Sæt IR-sender på anklen, og sørg for, at den er tændt. Læg derefter kurven i og gå! 4) Robo-BellHops logik er som følger: 4a) Hvis du går rundt, og hvis IR-signalet detekteres, kører robotten med maks. Hastighed4b) Hvis IR-signalet går ud af rækkevidde (ved at være for langt eller for skarp vinkel), vil robotten krydse en kort afstand ved langsom hastighed, hvis signalet hentes igen4c) Hvis IR -signalet ikke registreres, vil robotten dreje til venstre og højre i en forsøg på at finde signalet igen4d) Hvis IR -signalet registreres, men robotten rammer en forhindring, vil robotten forsøge at køre rundt om forhindringen4e) Hvis robotten kommer meget tæt på IR -signalet, stopper robotten for at undgå at ramme ejerens anklerHardware1 iRobot virtuel væg -enhed - $ 301 IR -detektor fra RadioShack - $ 31 DB -9 hanstik fra Radio Shack - $ 44 6-32 skruer fra Home Depot - $ 2.502 3V batterier, jeg brugte D1 vasketøjskurv fra Target - $ 51 ekstra hjul til på bagsiden af Opret robotElektrisk tape, wire og loddetin

Trin 1: Dækning af IR -sensoren

Sæt elektrisk tape på for at dække alt andet end en lille spalte af IR -sensoren på forsiden af Create -robotten. Demonter den virtuelle væg og træk det lille printkort ud foran på enheden. Dette er lidt vanskelig, fordi der er masser af skjulte skruer og plastikbeslag. IR -senderen er på printkortet. Dæk IR -senderen med et stykke silkepapir for at undgå IR -refleksioner. Fastgør printkortet til en rem eller elastik, der kan vikle rundt om din ankel. Tilslut batterierne til printkortet, så du kan have batterierne et behageligt sted (jeg lavede det, så jeg kunne putte batterierne i lommen).

Led den 2. IR-detektor til DB-9-stikket, og indsæt den i Cargo Bay ePort pin 3 (signal) og pin 5 (jord). Fastgør den 2. IR -detektor til toppen af den eksisterende IR -sensor på Opret og dæk den med et par lag silkepapir, indtil den 2. IR -detektor ikke kan se emitteren på en afstand, som du vil have, at Opret -robotten skal stoppe for at beholde fra at ramme dig. Du kan teste dette, når du har trykket på Reset -knappen og se Advance -LED'en for at tænde, når du er på stopafstanden.

Trin 2: Fastgør kurven

Fastgør kurven med 6-32 skruerne. Jeg har lige monteret kurven øverst på Create -robotten. Skub også baghjulet ind, så du lægger vægt på bagsiden af Create -robotten.

Bemærkninger: - Robotten kan bære en hel del belastning, mindst 30 lbs. - Den lille størrelse syntes at være den sværeste del ved at få den til at bære enhver bagage - IR er meget temperamentsfuld. Måske er det bedre at bruge billeddannelse, men det er meget dyrere

Trin 3: Download kildekoden

Download kildekoden
Download kildekoden

Kildekoden følger og er vedhæftet i en tekstfil:

/************************************************* ******************** follow.c ** -------- ** kører på Create Command Module ** dækker alt undtagen lille åbning på forsiden af IR-sensoren ** Opret vil følge en virtuel væg (eller enhver IR, der sender ** kraftfelt-signalet) og forhåbentlig undgå forhindringer i processen ***************** ************************************************** **/#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) // tilstande#definere Klar 0#definere Følgende 1#definere WasFollowing 2 #define SearchingLeft 3#Definer SearchingRight 4#Definer TracingLeft 5#Definer TracingRight 6#Definer BackingTraceLeft 7#Definerer 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; flygtige uint8_t sensorer_i [Sen6Size]; flygtige uint8_t sensorer [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); 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 Opret og modulinitialiser (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // sæt i/o for anden IR -sensorDDRB & = = ~ 0x01; // indstil carport bay ePort pin 3 til at være en inputPORTB | = 0x01; // sæt cargo ePort pin3 pullup aktiveret // program loop while (TRUE) {// Stop bare som en sikkerhedsforanstaltning (0, RadStraight); // sæt LEDsbyteTx (CmdLeds); byteTx (((sensorer [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (sensorer [SenCharge1]); byteTx (64); IRDetekteret? LED2On: LED2Off; inRange? LED1On: LED1Off; // leder efter brugerknap, tjek ofteendayAndUpdateSensors (10); delayAndCheck (10); hvis (UserButtonPressed) {delayAndUpdateSensors (1000); // aktiv loop while (! (UserButtonPressed) && (! Sensorer [SenCliffL]) && (! Sensorer [SenCliffFL]) && (! Sensorer [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 (tilstand) {case Ready: if (sensorer [SenVWall]) {// tjek for nærhed til leaderif (inRange) {drive (0, RadStraight);} ellers {// kør straightdrive (SlowSpeed, RadStraight); tilstand = Følger;}} ellers {// søg efter bjælke = 0; afstand = 0; ventetæller = 0; fundet = FALSK; drive (SearchSpeed, RadCCW); state = SearchingLeft;} break; case Følgende: if (sensorer [SenBumpDrop] & BumpRight) {distance = 0; vinkel = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} ellers hvis (sensorer [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} ellers hvis (sensorer [SenVWall]) {// se efter nærhed til leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = Following;}} else {// lige mistet signalet, fortsæt langsomt en cycledistance = 0; drive (SlowSpeed, RadStraight); state = WasFollowing;} break; case WasFollowing: if (sensors [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} ellers hvis (sensorer [SenBumpDrop] & BumpLeft) {distance = 0; vinkel = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} ellers hvis (sensorer [SenVWall]) {// tjek for nærhed til leaderif (inRange) {drive (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 {drive (SearchSpeed, RadCW);}} else if (sensorer [SenVWall]) {fundet = TRUE; vinkel = 0; if (inRange) {drive (0, RadStraight); state = Ready;} else {drive (SearchSpeed, RadCCW);}} ellers 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 (sensorer [SenBumpDrop] & BumpRight) {distance = 0; vinkel = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} ellers hvis (sensorer [SenBumpDrop] & BumpLeft) {drive (0, RadStraight); state = Ready;} ellers hvis (sensorer [SenVWall]) {// tjek for nærhed til leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Following;}} ellers if (! (distance> = TraceDistance)) { drive (SlowSpeed, RadStraight);} ellers hvis (! (-vinkel> = TraceAngle)) {drive (SearchSpeed, RadCW);} else {distance = 0; vinkel = 0; drive (SlowSpeed, RadStraight); tilstand = Klar; } break; case TracingRight: if (sensorer [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} ellers hvis (sensorer [SenBumpDrop] & BumpLeft) {distance = 0; vinkel = 0; kørsel (- SlowSpeed, RadStraight); state = BackingTraceRight;} ellers hvis (sensorer [SenVWall]) {// tjek for nærhed til leaderif (inRang e) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Following;}} else if (! (distance> = TraceDistance)) {drive (SlowSpeed, RadStraight));} ellers hvis (! (vinkel> = TraceAngle)) {drive (SearchSpeed, RadCCW);} else {distance = 0; vinkel = 0; drive (SlowSpeed, RadStraight); state = Ready;} break; case BackingTraceLeft: if (sensorer [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} ellers if (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;} ellers hvis (-angle> = TraceAngle) {distance = 0; vinkel = 0; drive (SlowSpeed, RadStraight); state = TracingRight;} ellers hvis (-distance> = BackDistance) {drive (SearchSpeed), RadCW);} else {drive (-SlowSpeed, RadStraight);} break; default: // stopdrive (0, RadStraight); state = Re ady; break;} delayAndCheckIR (10); delayAndUpdateSensors (10);} // cliff eller userbutton opdaget, lad tilstanden stabilisere (f.eks. knappen, der skal frigives) drive (0, RadStraight); delayAndUpdateSensors (2000);}}}} // Seriel modtagelsesafbrydelse for at gemme sensorværdier 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 afbrydelse 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 værdi) {while (! (UCSR0A & _BV (UDRE0)))); UDR0 = værdi;} // Delay for den angivne tid i ms uden opdatering af sensorværdiervoid delayMs (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; while (timer_on);} // Delay for den angivne tid i ms og tjek sekund IR 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 + = IRDetekteret; timer_val = timer_cnt;}} inRange = (inRange> = (time_ms >> 1));} // Delay for den angivne tid i ms og opdater sensor værdiervoid 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 ++) sensorer [temp] = sensorer_i [temp]; // Opdater løbende totaler af afstand og vinkeldistance += (int) ((sensorer [SenDist1] 8) | sensorer [SenDist0]); vinkel += (int) ((sensorer [SenAng1] 8) | sensorer [SenAng0]); byteTx (CmdSensors); byteTx (6); sensors_index = 0; sensors_flag = 1;}}} // Initialize Mind Control & aposs ATmega168 microcontrollervoid initialize (void) {cli (); // Indstil I/O -pinsDDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Indstil timer 1 til at generere en afbrydelse for hver 1 msTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Konfigurer den serielle port med rx interruptUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0)); UCSR0C = (_BV (UCSZ00) | _BV (UCSZ01)); // Tænd interruptssei ();} void powerOnRobot (void) {// Hvis Create & aposs power er slået fra, skal du tænde den hvis (! RobotIsOn) {mens (! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Forsinkelse i denne stateRobotPwrToggleHigh; // Lav til høj overgang til at skifte powerdelayMs (100); // Forsinkelse i denne stateRobotPwrToggleLow;} delayMs (3500); // Forsinkelse ved opstart}} // Skift baudhastighed på både Create og modulevoid baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code);/ / Vent, indtil afsendelsen er fuldført, mens (! (UCSR0A & _BV (TXC0))); cli (); // Skift baudhastighedsregistret (baud_code == Baud115200) UBRR0 = Ubrr115200; ellers hvis (baud_code == Baud57600) UBRR0 = Ubrr57600; ellers hvis (baud_code == Baud38400) UBRR0 = Ubrr38400; ellers hvis (baud_code == Baud28800) UBRR0 = Ubrr28800; ellers if (baud_code == Baud19200) UBRR0 = Ubrr19200; ellers hvis (baud_code == Baud14400) UBRR0 = Ubr hvis (baud_code == Baud9600) UBRR0 = Ubrr9600; ellers if (baud_code == Baud4800) UBRR0 = Ubrr4800; ellers if (baud_code == Baud2400) UBRR0 = Ubrr2400; ellers hvis (baud_code == Baud1200) UBRR0 = Ubrr00 baud_code == Baud600) UBRR0 = Ubrr600; ellers hvis (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Send Opret drevkommandoer med hensyn til hastighed og radiushul drev (int16_t hastighed, int16_t radius) {byteTx (CmdDrive); byteTx ((uint 8_t) ((hastighed >> 8) & 0x00FF)); byteTx ((uint8_t) (hastighed & 0x00FF)); byteTx ((uint8_t) ((radius >> 8) & 0x00FF)); byteTx ((uint8_t) (radius & 0x00FF));}

Anbefalede: