Tartalomjegyzék:

Robo-harangláb készítése: 3 lépés
Robo-harangláb készítése: 3 lépés

Videó: Robo-harangláb készítése: 3 lépés

Videó: Robo-harangláb készítése: 3 lépés
Videó: Kárpátalja - Рідне Закарпаття 2024, November
Anonim

Kövesse a szerző további információit:

Hogyan lehet nevezni az iRobot Create Scholarship mini versenyre?
Hogyan lehet nevezni az iRobot Create Scholarship mini versenyre?
Hogyan lehet nevezni az iRobot Create Scholarship mini versenyre?
Hogyan lehet nevezni az iRobot Create Scholarship mini versenyre?
LOLCats, Meme macskák, macska makrók vagy macskaképek készítése vicces feliratokkal
LOLCats, Meme macskák, macska makrók vagy macskaképek készítése vicces feliratokkal
LOLCats, Meme macskák, macska makrók vagy macskaképek készítése vicces feliratokkal
LOLCats, Meme macskák, macska makrók vagy macskaképek készítése vicces feliratokkal

Névjegy: Szeretem szétszedni a dolgokat, és kitalálni, hogyan működnek. Ezek után általában elveszítem az érdeklődésemet. Tudj meg többet jeffreyf -ről »

Ez az útmutató bemutatja, hogyan kell mozgó harangot készíteni az iRobot Create használatával. Ezt teljes egészében a carolDancer utasításainak engedélyével oldottuk fel, és mintavételként tettem fel a versenyünkre. A Robo-BellHop lehet a személyes asszisztense a táskák, élelmiszerek, ruhaneműk stb. Hordozásához, így nincs nak nek. Az alap Create-nek van egy tartálya a tetején, és két fedélzeti IR-érzékelőt használ a tulajdonos IR-adójának követésére. Az alapvető C szoftverkóddal a felhasználó nehéz élelmiszereket, nagy mennyiségű ruhaneműt vagy éjszakai táskáját rögzítheti a Robo -BellHopra, és a robot követheti Önt az utcán, a bevásárlóközpontban, a folyosón vagy a repülőtéren - - bárhová is kell mennie a felhasználónak. Alapműveletek a robot nagyon közel van2) Nyomja meg a fekete lágy gombot a Robo-BellHop rutin futtatásához3) Csatlakoztassa az infravörös jeladót a bokájához, és győződjön meg arról, hogy be van kapcsolva. Ezután töltse fel a kosarat és menjen! 4) A Robo-BellHop logikája a következő: 4a) Ahogy sétál, és ha az IR jelet érzékeli, a robot maximális sebességgel fog haladni4b) Ha az IR jel kialszik tartományban (túl messze vagy túl éles szögben), a robot lassú sebességgel rövid utat tesz meg, ha a jelet ismét felveszi4c) Ha az IR jelet nem észleli, a robot balra és jobbra fordul egy próbálja meg újra megtalálni a jelet Hardver1 iRobot virtuális fali egység - $ 301 IR érzékelő a RadioShack -tól - $ 31 DB -9 dugó a Radio Shack -től - $ 44 6-32 csavar a Home Depot -tól - 2,502 dollár 3V -os elemek, a D1 -es szennyes kosarat használtam a Target -től - 51 dollár extra kerék a a Create robot eleje Elektromos szalag, huzal és forrasztás

1. lépés: Az infravörös érzékelő lefedése

Csatlakoztasson elektromos szalagot az infravörös érzékelő kis réseinek kivételével a Create robot elejére. Szerelje szét a virtuális fali egységet, és vegye ki a kis áramköri lapot az egység elején. Ez egy kicsit trükkös, mert sok rejtett csavar és műanyag tartó található. Az infravörös távadó az áramköri lapon található. Fedje le az infravörös jeladót egy selyempapírral, hogy elkerülje az infravörös visszaverődést. Csatlakoztassa az áramköri lapot egy hevederhez vagy rugalmas szalaghoz, amely körbe tudja csavarni a bokáját. Csatlakoztassa az elemeket az áramköri laphoz, hogy kényelmes helyen tarthassa az elemeket (én úgy készítettem, hogy az elemeket a zsebembe tegyem).

Csatlakoztassa a 2. infravörös érzékelőt a DB-9 csatlakozóhoz, és illessze be a Cargo Bay ePort 3. tűjébe (jel) és az 5. tűbe (földelt). Csatlakoztassa a 2. infravörös érzékelőt a Create meglévő infravörös érzékelőjének tetejéhez, és fedje le pár réteg selyempapírral, amíg a 2. IR érzékelő nem látja a sugárzót olyan távolságban, amelyet a Create robot meg szeretne tartani. attól, hogy megütlek. Ezt a Reset gomb megnyomása után tesztelheti, és figyelheti, hogy az Előrehaladás LED világít, amikor megáll a távolságtól.

2. lépés: Csatlakoztassa a kosarat

Rögzítse a kosarat a 6-32 csavar segítségével. A kosarat éppen a Create robot tetejére szereltem fel. Csúsztassa be a hátsó kereket is, hogy a Create robot hátára nehezedjen.

Megjegyzések: - A robot elég sok terhet képes szállítani, legalább 30 fontot. - A kis méret tűnt a legnehezebbnek abban, hogy bármilyen poggyászt vigyen magával - az IR nagyon temperamentumos. Talán jobb a képalkotás használata, de sokkal drágább

3. lépés: Töltse le a forráskódot

Töltse le a forráskódot
Töltse le a forráskódot

A forráskód következik, és egy szöveges fájlban van csatolva:

/************************************************* ******************** follow.c ** -------- ** a Parancsmodul létrehozása ** -on fut Az infravörös érzékelő ** Létrehozása egy virtuális falat követ (vagy bármely, a ** erő-mező jelet küldő IR-t), és remélhetőleg elkerüli az akadályokat a folyamatban ***************** ************************************************** **/#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) // state#define Ready 0#define Következő 1#define WasFollowing 2 #define SearchingLeft 3#define SearchingRight 4#define TracingLeft 5#define TracingRight 6#define BackingTraceLeft 7#define BackingTraceRight 8 // Globális változókv olatile uint16_t timer_cnt = 0; volatile uint8_t timer_on = 0; volatile uint8_t sensors_flag = 0; volatile uint8_t sensors_index = 0; illékony uint8_t sensors_in [Sen6Size]; illékony uint8_t érzékelők [Sen6Size 0t = intervallum volatile uint8_t inRange = 0; // Funkciókvoid byteTx (uint8_t érték); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (unsigned int time_ms); void void void; void void baud (uint8_t baud_code); void meghajtó (int16_t sebesség, int16_t sugár); uint16_t randomAngle (void); void defineSongs (void); int main (void) {// állapotváltozó 0; // Beállítás létrehozása és modul inicializálása (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // az i/o beállítása a második infravörös érzékelőhözDDRB & = ~ 0x01; // a rakodótér ePort 3 érintkezőjét állítsa be bemenetrePORTB | = 0x01; // állítsa be a cargo ePort pin3 lehúzását engedélyezve // program hurok (TRUE) {// Leállítás csak elővigyázatosságból meghajtó (0, RadStraight); // set LEDsbyteTx (CmdLeds); byteTx (((érzékelők [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (érzékelők [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // felhasználói gombot keres, ellenőrizze a oftendelayAndUpdateSensors (10); delay (10); if (UserButtonPressed) {delayAndUpdateSensors (1000); // active loop while (! (UserButtonPressed) && (! Sensors [SenCliffL]) && (! Sensors [SenCliffFL]) && (! Sensors [SenCliffFR]) && (! érzékelők [SenCliffR])) {byteTx (CmdLeds); byteTx (((érzékelők [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (érzékelők [SenCharge1]); byteTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; kapcsoló (állapot) {case Ready: if (szenzorok [SenVWall]) {// ellenőrizze a leaderif (inRange) {drive (0, RadStraight);}} közelségét {// egyenes hajtás (SlowSpeed, RadStraight); állapot = Követés;}} else {// keressen rá a sugárzásra = 0; távolság = 0; várjon_számláló = 0; talált = HAMIS; meghajtó (SearchSpeed, RadCCW); state = SearchingLeft;} szünet; eset Következő: if (érzékelők [SenBumpDrop] & BumpRight) {távolság = 0; szög = 0; meghajtó (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (érzékelők [SenBumpDrop] & BumpLeft) {távolság = 0; szög = 0; meghajtó (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (érzékelők [SenVWall]) {// ellenőrizze, hogy proximity to leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = Follow;}} else {// csak elvesztette a jelet, lassan haladjon tovább cycledistance = 0; meghajtó (SlowSpeed, RadStraight); state = WasFollowing;} szünet; case WasFollowing: if (érzékelők [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (érzékelők [SenBumpDrop] & BumpLeft) {távolság = 0; szög = 0; meghajtó (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (szenzorok [SenVWall]) {// ellenőrizze a leaderif közelségét (inRange) {meghajtó (0, RadStraight); állapot = R eady;} else {// drive straightdrive (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 = Following;} else {drive (SearchSpeed, RadCCW);}} else if (szenzorok [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 = Követés;} else {meghajtó (SearchSpeed, RadCW);}} else if (érzékelők [SenVWall]) {found = TRUE; szög = 0; if (inRange) {drive (0, RadStraight); state = Ready;} else {meghajtó (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 (szenzorok [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; meghajtó (-SlowSpeed, RadStraight); állapot = BackingTraceLeft;} else if (érzékelők [SenBumpDrop] & BumpLeft) {meghajtó (0, RadStraight); állapot = Kész;} else if (érzékelők [SenVWall]) {// ellenőrzés a leaderif (inRange) közelségéhez {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (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 (érzékelők [SenBumpDrop] & BumpRight) {meghajtó (0, RadStraight); állapot = Kész;} else if (érzékelők [SenBumpDrop] & BumpLeft) {távolság = 0; szög = 0; meghajtó (- SlowSpeed, RadStraight); state = BackingTraceRight;} else if (érzékelők [SenVWall]) {// ellenőrizze a leaderif (inRang) közelségét e) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (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 (érzékelők [SenVWall] && inRange) {meghajtó (0, RadStraight); state = Ready;} else if (szög> = TraceAngle) {távolság = 0; szög = 0; meghajtó (SlowSpeed, RadStraight); state = TracingLeft; } else if (-distance> = BackDistance) {drive (SearchSpeed, RadCCW);} else {drive (-SlowSpeed, RadStraight);} break; case BackingTraceRight: if (szenzorok [SenVWall] && inRange) {drive (0, RadStraight); állapot = Kész;} 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);} // szikla vagy felhasználói gomb észlelve, lehetővé teszi a feltétel stabilizálódását (pl. a gomb elengedése) meghajtó (0, RadStraight); delayAndUpdateSensors (2000);}}} // Soros fogadás megszakítás az érzékelőértékek tárolásáhozSIGNAL (SIG_USART_RECV) {uint8_t temp; temp = UDR0; if (sensors_flag) {sensors_in [sensors_index ++] = temp; if (sensors_index> = Sen6Size) sensors_flag = 0;}} // 1. időzítő megszakítása időkésésekhez msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // Bájt átvitele a soros porton keresztül byvoTx (uint8_t érték) {while (! (UCSR0A & _BV (UDRE0))) UDR0 = érték;} // Késleltetés a megadott időtartamban ms -ban, anélkül, hogy frissítené az érzékelői értékeket. Érvénytelen késleltetés IR -érzékelő késleltetés nélkül = IRDetected; timer_val = timer_cnt;}} inRange = (inRange> = (time_ms >> 1));} // Késleltetés a megadott ideig ms -ban és az érzékelő értékeinek frissítésevoid delayAndUpdateSensors (uint16_t time_ms) {uint8_t temp; timer_on = 1; timer_cnt = time_ms; while (timer_on) {if (! sensors_flag) {for (temp = 0; hőmérséklet Sen6Size; hőm [SenAng1] 8) | érzékelők [SenAng0]); byteTx (CmdSensors); byteTx (6); sensors_index = 0; sensors_flag = 1;}}} // Inicialize the Mind Control & aposs ATmega168 microcontrollervoid initialize (void) {cli (); // I/O tűk beállításaDDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Állítsa be az 1. időzítőt 1 ms -os megszakítás generálásáraTCTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Állítsa be a soros portot rx megszakítássalUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0)); UCSR0C = (_BV (UCSZ00) | _BV (UCSZ01)); // Turn on interruptssei ();} void powerOnRobot (void) {// Ha a Create & aposs power ki van kapcsolva, kapcsolja be onif (! RobotIsOn) {while (! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Késleltetés ebben az állapotbanRobotPwrToggleHigh; // Alacsony és magas közötti átállás a powerdelayMs váltására (100); // Késleltetés ebben az állapotbanRobotPwrToggleLow;} delayMs (3500); // Indítás késleltetése}} // Kapcsolja be az átviteli sebességet mind a Create, mind a modulvoid baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code);/ / Várja meg, amíg az átvitel befejeződik (! (UCSR0A & _BV (TXC0))); cli (); // Kapcsolja át a baud rate registerif (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 == BaR14400) 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) if UBR00; baud_code == Baud600) UBRR0 = Ubrr600; else if (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Küldés Meghajtóparancsok létrehozása sebesség és sugármentes meghajtó (int16_t sebesség, int16_t) sugár) {byteTx (CmdDrive); byteTx ((uint 8_t) ((sebesség >> 8) & 0x00FF)); byteTx ((uint8_t) (sebesség & 0x00FF)); byteTx ((uint8_t) ((sugár >> 8) & 0x00FF)); byteTx ((uint8_t) (sugár & 0x00FF));}

Ajánlott: