Obsah:

Jak vyrobit Robo-Bellhop: 3 kroky
Jak vyrobit Robo-Bellhop: 3 kroky

Video: Jak vyrobit Robo-Bellhop: 3 kroky

Video: Jak vyrobit Robo-Bellhop: 3 kroky
Video: Jak Vyrobit Diamant Doma - Krok za Krokem 2024, Listopad
Anonim

Autor jeffreyfSledovat více od autora:

Jak se zapojit do minisoutěže iRobot Create Scholarship
Jak se zapojit do minisoutěže iRobot Create Scholarship
Jak se zapojit do minisoutěže iRobot Create Scholarship
Jak se zapojit do minisoutěže iRobot Create Scholarship
Jak vytvořit LOLCats, Meme kočky, Cat makra nebo obrázky koček vtipnými titulky
Jak vytvořit LOLCats, Meme kočky, Cat makra nebo obrázky koček vtipnými titulky
Jak vytvořit LOLCats, Meme kočky, Cat makra nebo obrázky koček vtipnými titulky
Jak vytvořit LOLCats, Meme kočky, Cat makra nebo obrázky koček vtipnými titulky

O: Rád věci rozebírám a zjišťuji, jak fungují. Poté obecně ztrácím zájem. Více o jeffreyfovi »

Tento Instructable ukazuje, jak pomocí iRobot Create vytvořit pohyblivého poslíčka. To bylo zcela zrušeno se svolením instrukcí carolDancer a já jsem to uvedl jako ukázkový vstup do naší soutěže. Robo-BellHop může být vaším vlastním osobním asistentem pro přenášení vašich tašek, potravin, prádla atd., Takže nemáte na. Základní Create má nahoře připevněnou přihrádku a pomocí dvou integrovaných IR detektorů sleduje IR vysílač svého majitele. S velmi základním softwarovým kódem C si uživatel může zajistit těžké potraviny, velké množství prádla nebo tašku přes noc na Robo -BellHop a nechat vás robota sledovat po ulici, v obchodním centru, v hale nebo na letišti - - kamkoli uživatel potřebuje jít. Základní obsluha robot je ve velmi těsné blízkosti Potom vložte košík a jděte! 4) Logika Robo-BellHop je následující: 4a) Když procházíte kolem, pokud je detekován IR signál, robot pojede maximální rychlostí4b) Pokud IR signál zhasne dosah (příliš velký nebo příliš ostrý úhel), robot přejde krátkou vzdálenost pomalou rychlostí v případě, že je signál znovu zachycen 4c) Pokud není detekován infračervený signál, robot se otočí doleva a doprava zkuste znovu najít signál4d) Pokud je detekován infračervený signál, ale robot narazí na překážku, robot se pokusí překážku obejít kotníky majitele Hardware1 iRobot virtuální nástěnná jednotka - 301 $ IR detektor od RadioShack - 31 $ DB -9 samčí konektor od Radio Shack - 44 $ 6-32 šroubů od Home Depot - 2,502 $ 3V baterie, použil jsem koš na prádlo D1 od Target - 51 $ navíc kolečko na zadní část robota CreateElektrická páska, drát a pájka

Krok 1: Zakrytí infračerveného senzoru

Připojte elektrickou pásku k zakrytí všech kromě malé štěrbiny infračerveného senzoru na přední straně robota Create. Demontujte jednotku virtuální zdi a extrahujte desku s malými obvody v přední části jednotky. To je trochu ošidné, protože existuje spousta skrytých šroubů a plastových držáků. IR vysílač je na desce s obvody. Zakryjte infračervený vysílač kouskem hedvábného papíru, aby se zabránilo infračerveným odrazům. Připojte desku s obvody k popruhu nebo gumičce, která se vám může omotat kolem kotníku. Zapojte baterie na desku s obvody, abyste měli baterie na pohodlném místě (vyrobil jsem je, abych mohl dát baterie do kapsy).

Připojte druhý infračervený detektor ke konektoru DB-9 a zasuňte do kolíku 3 (signál) a kolíku 5 (uzemnění) do Cargo Bay ePort. Připojte druhý infračervený detektor k horní části stávajícího infračerveného senzoru na Vytvořit a zakryjte ho několika vrstvami hedvábného papíru, dokud druhý infračervený detektor nevidí vysílač ve vzdálenosti, kterou chcete, aby se robot Create zastavil, aby od toho, abych tě udeřil. Můžete to vyzkoušet po stisknutí tlačítka Reset a sledovat rozsvícení LED Advance, když jste na zastávce.

Krok 2: Připojte košík

Košík připevněte pomocí šroubů 6-32. Právě jsem namontoval koš na vrchol robota Create. Také zasuňte zadní kolo, abyste na zadní část robota Create položili závaží.

Poznámky: - Robot unese docela velkou zátěž, minimálně 30 liber. - Zdálo se, že malá velikost byla nejtěžší na tom, aby bylo možné přepravovat jakákoli zavazadla - IR je velmi temperamentní. Možná je lepší používat zobrazování, ale je to mnohem dražší

Krok 3: Stáhněte si zdrojový kód

Stáhněte si zdrojový kód
Stáhněte si zdrojový kód

Následuje zdrojový kód, který je připojen v textovém souboru:

/******************************************************* ************************************************************************************ IR senzoru ** Create bude sledovat virtuální zeď (nebo jakýkoli IR vysílající signál ** silového pole) a doufejme, že se vyhne překážkám v tomto procesu ***************** ******************************************************* **/#zahrnout přerušení.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#definovat SearchRightAngle (SearchLeftAngle - 1000) #define CoastDistance 150#definovat TraceDistance 250#definovat TraceAngle 30#definovat BackDistance 25#definovat IRDetected (~ PINB & 0x01) // stavy#definovat Připraveno 0#definovat Následující 1#definovat WasFollowing 2 #define SearchingLeft 3#definovat SearchingRight 4#definovat TracingLeft 5#definovat TracingRight 6#definovat BackingTraceLeft 7#definovat BackingTraceRight 8 // Globální proměnné 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; // Funkce Vyhněte se byteTx (hodnota uint8_t); neplatné delayMs (uint16_t time_ms); neplatné delayAndCheckIR (uint16_t time_ms); neplatné delayAndUpdateSensors (nepodepsané int time_ms); void initialize (void); void) baud (uint8_t baud_code); prázdný disk (rychlost int16_t, poloměr int16_t); uint16_t náhodný úhel (prázdný); neplatný defineSongs (neplatný); int hlavní (prázdný) {// stav proměnnáuint8_t stav = Připraveno; int nalezeno = 0; int čekání_počítač = 0; // Nastavení Create a moduleinitialize (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // nastavení I/O pro druhý IR senzorDDRB & = ~ 0x01; // nastavit pin 3 ePort nákladního prostoru jako vstupní PORTB | = 0x01; // nastavit cargo ePort pin3 povoleno // program ve smyčce (TRUE) {// Zastavit jako preventivní pohon (0, RadStraight); // set LEDsbyteTx (CmdLeds); byteTx (((senzory [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (senzory [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // hledání uživatelského tlačítka, kontrola oftendelayAndUpdateSensors (10); delayAndCheck (10); if (UserButtonPressed) {delayAndUpdateSensors (1000); // aktivní smyčka (! (UserButtonPressed) && (! Senzory [SenCliffL]) && (! Senzory [SenCliffFL]) && (! Senzory [SenCliffFR]) && (! senzory [SenCliffR])) {byteTx (CmdLeds); byteTx (((senzory [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (senzory [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 = Následující;}} else {// hledání paprsku paprsku = 0; vzdálenost = 0; počkání = 0; nalezeno = NEPRAVDA; pohon (SearchSpeed, RadCCW); stav = SearchingLeft;} zlom; případ následující: if (senzory [SenBumpDrop] & BumpRight) {vzdálenost = 0; úhel = 0; pohon (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (senzory [SenBumpDrop] & BumpLeft) {vzdálenost = 0; úhel = 0; pohon (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (senzory [SenVWall]) {// kontrola blízkost leaderifu (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = following;}} else {// právě ztratil signál, pokračujte pomalu jeden cykledistance = 0; pohon (SlowSpeed, RadStraight); state = WasFollowing;} break; case WasFollowing: if (senzory [SenBumpDrop] & BumpRight) {vzdálenost = 0; úhel = 0; pohon (-SlowSpeed, RadStraight); stav = BackingTraceLeft;} else if (senzory [SenBumpDrop] & BumpLeft) {vzdálenost = 0; úhel = 0; pohon (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (senzory [SenVWall]) {// kontrola blízkosti leaderifu (inRange) {drive (0, RadStraight); state = R eady;} else {// drive straightdrive (FullSpeed, RadStraight); state = Následující;}} 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 = Následující;} 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 (senzory [SenVWall]) {// kontrola pro blízkost leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Následující;}} else if (! (vzdálenost> = 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 (senzory [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} else if (senzory [SenBumpDrop] & BumpLeft) {vzdálenost = 0; úhel = 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 (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 (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);} // detekován útes nebo uživatelské tlačítko, umožňující stabilizaci stavu (např. uvolnění tlačítka) pohon (0, RadStraight); delayAndUpdateSensors (2000);}}} // Přerušení sériového příjmu pro uložení hodnot senzorů 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 přerušení časová zpoždění v msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // Přenos bajtu přes sériový port Vyhněte se byteTx (hodnota uint8_t) {while (! (UCSR0A & _BV (UDRE0))); UDR0 = hodnota;} // Zpoždění po zadanou dobu v ms bez aktualizace hodnot senzoru Vyhněte se delayMs (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; while (timer_on);} // Zpoždění po zadanou dobu v ms a zkontrolujte sekundu IR detektor vyhnout 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));} // Zpoždění po zadanou dobu v ms a aktualizace hodnot senzoru Vyhněte se 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 Sen6Size; temp ++) senzory [temp] = sensor_in [temp]; // Aktualizace součtů vzdálenosti a úhlové vzdálenosti += (int) ((senzory [SenDist1] 8) | senzory [SenDist0]); úhel += (int) ((senzory [SenAng1] 8) | senzory [SenAng0]); byteTx (CmdSensors); byteTx (6); sensor_index = 0; sensor_flag = 1;}}}} // Inicializace ovládání mysli & aposs ATmega168 mikrokontroleroid inicializovat (neplatné) {cli (); // Nastavit I/O piny (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Nastavení sériového portu s přerušením rxUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0;); ! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Zpoždění v tomto stavuRobotPwrToggleHigh; // Nízký až vysoký přechod na přepínání powerdelayMs (100); // Zpoždění v tomto stavuRobotPwrToggleLow;} delayMs (3500); // Zpoždění při spuštění}} // Přepněte přenosovou rychlost na Create i modulevoid baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code);/ / Počkejte, dokud se přenos nedokončí (! (UCSR0A & _BV (TXC0))); cli (); // Přepněte registr přenosové rychlostiif (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) UBR1 = UBR1 baud_code == Baud600) UBRR0 = Ubrr600; else if (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Odeslat Vytvořit příkazy pohonu z hlediska rychlosti a poloměru vyhnout se pohonu (int16_t rychlost, int16_t poloměr) {byteTx (CmdDrive); byteTx ((uint 8_t) ((rychlost >> 8) & 0x00FF)); byteTx ((uint8_t) (rychlost & 0x00FF)); byteTx ((uint8_t) ((poloměr >> 8) & 0x00FF)); byteTx ((uint8_t) (poloměr & 0x00FF));}

Doporučuje: