Obsah:

Ako si vyrobiť Robo-Bellhop: 3 kroky
Ako si vyrobiť Robo-Bellhop: 3 kroky

Video: Ako si vyrobiť Robo-Bellhop: 3 kroky

Video: Ako si vyrobiť Robo-Bellhop: 3 kroky
Video: Как собрать LEGO Brick mini 3 комбайнер-трансформер MOC - Monster Slayer 2024, November
Anonim

Od jeffreyf Nasledovať viac od autora:

Ako sa zapojiť do minisúťaže iRobot Vytvorenie štipendia
Ako sa zapojiť do minisúťaže iRobot Vytvorenie štipendia
Ako sa zapojiť do mini-súťaže o štipendium iRobot Vytvoriť
Ako sa zapojiť do mini-súťaže o štipendium iRobot Vytvoriť
Ako vytvoriť vtipné titulky pre LOLCats, meme mačky, makrá pre mačky alebo obrázky mačiek
Ako vytvoriť vtipné titulky pre LOLCats, meme mačky, makrá pre mačky alebo obrázky mačiek
Ako vytvoriť vtipné titulky pre LOLCats, meme mačky, makrá pre mačky alebo obrázky mačiek
Ako vytvoriť vtipné titulky pre LOLCats, meme mačky, makrá pre mačky alebo obrázky mačiek

O: Rád veci rozoberám a zisťujem, ako fungujú. Potom spravidla strácam záujem. Viac o jeffreyfovi »

Tento návod ukazuje, ako použiť iRobot Create na pohyblivé zvonice. Toto bolo úplne zrušené so súhlasom pokynov koledníka Tanečníka a ja som to uviedol ako ukážkový vstup do našej súťaže. Robo-BellHop môže byť vašim osobným asistentom na prenášanie tašiek, potravín, práčovne atď., Takže nemáte do. Základný Create má v hornej časti pripevnený kôš a pomocou dvoch palubných IR detektorov sleduje infračervený vysielač svojho majiteľa. Vďaka úplne základnému softvérovému kódu C môže používateľ zaistiť ťažké potraviny, veľkú dávku bielizne alebo tašku na noc na Robo -BellHop a nechať vás robota nasledovať po ulici, v nákupnom centre, na chodbe alebo na letisku - - kamkoľvek používateľ potrebuje ísť. Základná obsluha 1) Stlačením tlačidla Reset zapnite príkazový modul a skontrolujte, či sú senzory zapojené 1a) LED dióda Play by sa mala rozsvietiť, keď uvidí, že vás IR vysielač sleduje 1b) Kontrolka Advance by sa mala rozsvietiť, keď robot je vo veľmi tesnej blízkosti Potom naložte košík a choďte! 4) Logika Robo-BellHop je nasledovná: 4a) Keď idete okolo a ak je detekovaný infračervený signál, robot pôjde maximálnou rýchlosťou 4b) Ak infračervený signál zhasne dosah (tým, že je príliš ďaleko alebo príliš ostrý uhol), robot prejde krátku vzdialenosť nízkou rýchlosťou v prípade, že bude signál opäť zachytený4c) Ak sa IR signál nezistí, robot sa otočí doľava a doprava pokúste sa znova nájsť signál4d) Ak je detekovaný infračervený signál, ale robot narazí na prekážku, robot sa pokúsi obísť prekážku Hardvér 1 Virtuálna nástenná jednotka iRobot - 301 dolárov IR detektor od RadioShack - 31 dolárov konektor DB -9 od Radio Shack - 44 dolárov 6-32 skrutiek od Home Depot - 2 502 dolárov 3V batérie, použil som kôš na bielizeň D1 od Target - ďalšie koleso 51 dolárov na zadná strana robota CreateElektrická páska, drôt a spájka

Krok 1: Zakrytie infračerveného senzora

Pripojte elektrickú pásku tak, aby bola zakrytá všetky okrem malej štrbiny infračerveného senzora na prednej strane robota Create. Demontujte jednotku virtuálnej steny a vyberte malú dosku s plošnými spojmi v prednej časti jednotky. Je to trochu zložité, pretože existuje veľa skrytých skrutiek a plastových držiakov. IR vysielač je na doske plošných spojov. Zakryte infračervený vysielač kusom hodvábneho papiera, aby ste predišli odrazom infračerveného žiarenia. Pripojte dosku s obvodmi k popruhu alebo gumičke, ktorá sa vám môže omotať okolo členka. Batérie zapojte do dosky plošných spojov, aby ste ich mohli mať na pohodlnom mieste (vyrobil som ho tak, aby som mohol vložiť batérie do vrecka).

Pripojte druhý infračervený detektor ku konektoru DB-9 a zapojte ho do kolíka 3 (signál) a kolíka 5 (uzemnenie) do zásuvky e-portu Cargo Bay. Pripojte druhý infračervený detektor k hornej časti existujúceho infračerveného senzora v časti Vytvoriť a prikryte ho niekoľkými vrstvami hodvábneho papiera, kým druhý infračervený detektor neuvidí žiarič vo vzdialenosti, ktorú má robot Create zastaviť, aby dodržal od toho, aby ťa udrel. Môžete to vyskúšať potom, čo stlačíte tlačidlo Reset, a budete sa pozerať, ako sa rozsvieti kontrolka Advance LED, keď ste na zastávke.

Krok 2: Pripojte košík

Kôš pripevnite pomocou skrutiek 6-32. Práve som namontoval kôš na vrch robota Create. Zasuňte aj zadné koleso, aby ste na zadnú stranu robota Create položili závažie.

Poznámky: - Robot unesie pomerne veľkú záťaž, najmenej 30 libier. - Malé rozmery sa zdali byť najťažšie pri preprave akejkoľvek batožiny - IR je veľmi temperamentný. Možno je lepšie používať zobrazovanie, ale je to oveľa drahšie

Krok 3: Stiahnite si zdrojový kód

Stiahnite si zdrojový kód
Stiahnite si zdrojový kód

Nasleduje zdrojový kód, ktorý je pripojený k textovému súboru:

/********************************************************************** ******************** follow.c ** -------- ** beží na Create Command Module ** zakrýva všetky okrem malého otvoru vpredu infračerveného senzora ** Create bude nasledovať po virtuálnej stene (alebo ľubovoľnom IR vysielajúcom signál ** silového poľa) a dúfajme, že sa v tomto procese vyhne prekážkam ***************** ********************************************************** **/#zahrnúť prerušenie.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#definovať SearchRightAngle (SearchLeftAngle - 1000) #define CoastDistance 150#definovať TraceDistance 250#definovať TraceAngle 30#definovať BackDistance 25#definovať IRDetected (~ PINB & 0x01) // stavy#definovať Pripravené 0#definovať Nasledujúce 1#definovať WasFollowing 2 #define SearchingLeft 3#definujte SearchingRight 4#definujte TracingLeft 5#definujte TracingRight 6#definujte BackingTraceLeft 7#definujte BackingTraceRight 8 // Globálne premenné v olatile uint16_t timer_cnt = 0; volatile uint8_t timer_on = 0; volatile uint8_t sensor_flag = 0; volatile uint8_t sensor_index = 0; volatile uint8_t sensor_in [Sen6Size]; volatile uint8_t sensor [Sen6Size]; volatile int16_t distance = 0; volatile int16_t distance = 0 volatile uint8_t inRange = 0; // Funkcie Vyhnite sa byteTx (hodnota uint8_t); neplatné delayMs (uint16_t time_ms); neplatné delayAndCheckIR (uint16_t time_ms); neplatné delayAndUpdateSensors (nepodpísané int time_ms); void initialize (void); void baud (uint8_t baud_code); prázdny disk (rýchlosť 16, vnútorný polomer 16) 0; // Nastavenie Create and moduleinitialize (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // nastavenie I/O pre druhý IR senzorDDRB & = ~ 0x01; // nastavenie nákladného priestoru ePort pin 3 ako vstupnéhoPORTB | = 0x01; // nastaviť náklad ePort pin3 povolený // program v slučke (TRUE) {// Zastaviť ako preventívny pohon (0, RadStraight); // nastaviť LEDsbyteTx (CmdLeds); byteTx (((snímače [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (senzory [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // hľadanie používateľského tlačidla, kontrola oftendelayAndUpdateSensors (10); delayAndCheck (10); if (UserButtonPressed) {delayAndUpdateSensors (1000); // active loop while (! (UserButtonPressed) && (! Senzory [SenCliffL]) && (! Senzory [SenCliffFL] && (! Senzory [SenCliffFR]) && (! senzory [SenCliffR])) {byteTx (CmdLeds); byteTx (((senzory [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (snímače [SenCharge1]); byteTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; switch (state) {case Ready: if (senzory [SenVWall]) {// check for proximity to leaderif (inRange) {drive (0, RadStraight);} else {// drive straightdrive (SlowSpeed, RadStraight); state = following;}} else {// search for the beamangle = 0; distance = 0; wait_counter = 0; nájdené = FALSE; pohon (SearchSpeed, RadCCW); stav = SearchingLeft;} zlom; prípad nasledujúci: if (snímače [SenBumpDrop] & BumpRight) {vzdialenosť = 0; uhol = 0; pohon (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (senzory [SenBumpDrop] & BumpLeft) {vzdialenosť = 0; uhol = 0; pohon (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (senzory [SenVWall]) {// skontrolovať blízkosť leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = following;}} else {// práve stratil signál, pokračujte pomaly jeden cyklovaná vzdialenosť = 0; pohon (SlowSpeed, RadStraight); stav = WasFollowing;} prerušenie; prípad WasFollowing: if (snímače [SenBumpDrop] & BumpRight) {vzdialenosť = 0; uhol = 0; pohon (-SlowSpeed, RadStraight); stav = BackingTraceLeft;} else if (senzory [SenBumpDrop] & BumpLeft) {vzdialenosť = 0; uhol = 0; pohon (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (senzory [SenVWall]) {// kontrola blízkosti leaderifu (inRange) {drive (0, RadStraight); state = R eady;} else {// jazda 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 (senzory [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 = Nasleduje;} else {drive (SearchSpeed, RadCW);}} else if (senzory [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 (senzory [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; pohon (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (senzory [SenBumpDrop] & BumpLeft) {drive (0, RadStraight); state = Ready;} else if (snímače [SenVWall]) {// kontrola pre blízkosť leaderifu (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = following;}} else if (! (distance> = TraceDistance)) { pohon (SlowSpeed, RadStraight);} else if (! (-angle> = TraceAngle)) {drive (SearchSpeed, RadCW);} else {distance = 0; angle = 0; drive (SlowSpeed, RadStraight); state = Ready; } break; case TracingRight: if (senzory [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} else if (senzory [SenBumpDrop] & BumpLeft) {vzdialenosť = 0; uhol = 0; pohon (- SlowSpeed, RadStraight); state = BackingTraceRight;} else if (senzory [SenVWall]) {// kontrola blízkosti leaderifu (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 (senzory [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} else if (uhol> = TraceAngle) {vzdialenosť = 0; uhol = 0; pohon (SlowSpeed, RadStraight); state = TracingLeft; } else if (-distance> = BackDistance) {drive (SearchSpeed, RadCCW);} else {drive (-SlowSpeed, RadStraight);} break; case BackingTraceRight: if (senzory [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);} // zistený útes alebo užívateľské tlačidlo, umožnenie stabilizácie stavu (napr. uvoľnenie tlačidla) pohon (0, RadStraight); delayAndUpdateSensors (2000);}}} // Sériové prerušenie príjmu na uloženie hodnôt senzorov SIGNAL (SIG_USART_RECV) {uint8_t temp; temp = UDR0; if (Sensor_flag) {Sensor_in [Sensor_index ++] = temp; if (sensor_index> = Sen6Size) sensor_flag = 0;}} // Časovač 1 prerušenie na časové oneskorenia v msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // Prenos bajtu cez sériový port Vyhnite sa byteTx (hodnota uint8_t) {while (! (UCSR0A & _BV (UDRE0))); UDR0 = hodnota;} // Oneskorenie o zadaný čas v ms bez aktualizácie hodnôt senzora Vyhnite sa delayMs (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; while (timer_on);} // Oneskorenie o zadaný čas v ms a kontrola sekundy IR detektor vyhnite sa 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));} // Oneskorenie po zadaný čas v ms a aktualizácia hodnôt senzora Vyhnite sa delayAndUpdateSensors (uint16_t time_ms) {uint8_t temp; timer_on = 1; timer_cnt = time_ms; while (timer_on) {if (! sensor_flag) {for (temp = 0; temp Sen6Veľkosť; temp ++) senzory [temp] = sensor_in [temp]; // Aktualizácia súčtov vzdialenosti a uhlovej vzdialenosti += (int) ((snímače [SenDist1] 8) | snímače [SenDist0]); uhol += (int) ((snímače [SenAng1] 8) | senzory [SenAng0]); byteTx (CmdSensors); byteTx (6); sensor_index = 0; sensor_flag = 1;}}}} // Inicializácia ovládania mysle & aposs ATmega168 mikrokontrolervoid inicializovať (prázdne) {cli (); // Nastavte I/O piny (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Nastavenie sériového portu s prerušením rxUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0;); ! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Oneskorenie v tomto staveRobotPwrToggleHigh; // Nízky až vysoký prechod na prepínanie powerdelayMs (100); // Oneskorenie v tomto staveRobotPwrToggleLow;} delayMs (3500); // Oneskorenie spustenia}} // Prepnite prenosovú rýchlosť na Vytvorenie aj modul Vyhnite sa prenosovej rýchlosti (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code);/ / Počkajte, kým sa prenos nedokončí (! (UCSR0A & _BV (TXC0))); cli (); // Prepnite prenosovú rýchlosť 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 == Baud14400) UrR0 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) ifBr1 baud_code == Baud600) UBRR0 = Ubrr600; else if (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Odoslať Vytvorte príkazy pohonu z hľadiska rýchlosti a polomeru jazdy (int16_t velocity, int16_t polomer) {byteTx (CmdDrive); byteTx ((uint 8_t) ((rýchlosť >> 8) & 0x00FF)); byteTx ((uint8_t) (rýchlosť & 0x00FF)); byteTx ((uint8_t) ((polomer >> 8) & 0x00FF)); byteTx ((uint8_t) (polomer & 0x00FF));}}

Odporúča: