Përmbajtje:

Si të bëni një Robo-Bellhop: 3 hapa
Si të bëni një Robo-Bellhop: 3 hapa

Video: Si të bëni një Robo-Bellhop: 3 hapa

Video: Si të bëni një Robo-Bellhop: 3 hapa
Video: ЛЮБОВЬ С ДОСТАВКОЙ НА ДОМ (2020). Романтическая комедия. Хит 2024, Nëntor
Anonim

Ndiqni më shumë nga autori:

Si të futeni në mini-konkursin iRobot Krijo Bursa
Si të futeni në mini-konkursin iRobot Krijo Bursa
Si të futeni në mini-konkursin iRobot Krijo Bursa
Si të futeni në mini-konkursin iRobot Krijo Bursa
Si të bëni LOLCats, macet Meme, macros macet ose fotografi të maceve me titra qesharak
Si të bëni LOLCats, macet Meme, macros macet ose fotografi të maceve me titra qesharak
Si të bëni LOLCats, macet Meme, macros macet ose fotografi të maceve me titra qesharak
Si të bëni LOLCats, macet Meme, macros macet ose fotografi të maceve me titra qesharak

Rreth: Më pëlqen t’i ndaj gjërat dhe të kuptoj se si funksionojnë. Në përgjithësi, unë humbas interesin pas kësaj. Më shumë rreth Jeffreyf »

Ky udhëzues tregon se si të përdorni iRobot Krijo për të bërë një kambanë lëvizëse. Kjo u hoq plotësisht me lejen nga udhëzimet e carolDancer, dhe unë e vendosa atë si një hyrje shembull për konkursin tonë. Robo-BellHop mund të jetë asistenti juaj personal për të mbajtur çantat, ushqimet, lavanderi, etj., Kështu që ju nuk keni te Krijimi bazë ka një kosh të bashkangjitur në krye dhe përdor dy detektorë IR në bord për të ndjekur transmetuesin IR të pronarit të tij. Me kodin bazë të softuerit C, përdoruesi mund të sigurojë ushqime të rënda, një ngarkesë të madhe lavanderi ose çantën tuaj gjatë natës në Robo -BellHop dhe të kërkojë që roboti t'ju ndjekë në rrugë, nëpër qendrën tregtare, poshtë sallës ose përmes aeroportit - - kudo që përdoruesi duhet të shkojë. Funksionimi bazë 1) Goditni butonin Reset për të ndezur modulin e komandës dhe kontrolloni sensorët që janë të përfshirë1a) LED -i i luajtjes duhet të ndizet kur sheh transmetuesin IR që ju ndjek roboti është në një distancë shumë të afërt2) Shtypni butonin e zi të zi për të ekzekutuar rutinën Robo-BellHop3) Lidhni transmetuesin IR në kyçin e këmbës dhe sigurohuni që është ndezur. Pastaj ngarkoni shportën dhe shkoni! 4) Logjika e Robo-BellHop është si më poshtë: 4a) Ndërsa ecni përreth, nëse sinjali IR është duke u zbuluar, roboti do të ngasë me shpejtësinë maksimale4b) Nëse sinjali IR del jashtë diapazoni (duke qenë një kënd shumë i largët ose shumë i mprehtë), roboti do të përshkojë një distancë të shkurtër me shpejtësi të ngadaltë në rast se sinjali merret përsëri4c) Nëse sinjali IR nuk po zbulohet, roboti do të kthehet majtas dhe djathtas në një 4d) Nëse sinjali IR është duke u zbuluar por roboti godet një pengesë, roboti do të përpiqet të vozisë rreth pengesës4e) Nëse roboti i afrohet shumë sinjalit IR, roboti do të ndalet për të shmangur goditjen e kyçet e këmbës së pronarit Hardware1 njësia mur virtuale iRobot - 301 dollarë detektor IR nga RadioShack - 31 dollarë lidhës mashkull DB -9 nga Radio Shack - 44 dollarë 6-32 dollarë nga Home Depot - 2.502 dollarë bateri 3V, kam përdorur shportën e rrobave D1 nga Target - 51 dollarë rrota shtesë për në pjesa e pasme e shiritit Krijo robotin elektrik, tela dhe lidhës

Hapi 1: Mbulimi i sensorit IR

Bashkangjitni shiritin elektrik për të mbuluar të gjithë, përveç një të çarë të vogël të sensorit IR në pjesën e përparme të robotit Krijo. Çmontoni njësinë virtuale të murit dhe nxirrni tabelën e qarkut të vogël në pjesën e përparme të njësisë. Kjo është pak e ndërlikuar sepse ka shumë vida të fshehura dhe montime plastike. Transmetuesi IR është në tabelën e qarkut. Mbuloni transmetuesin IR me një copë letër indi për të shmangur reflektimet IR. Bashkangjitni bordin e qarkut në një rrip ose brez elastik që mund të mbështillet rreth kyçit të këmbës. Lidhni bateritë në tabelën e qarkut në mënyrë që të keni bateritë në një vend të rehatshëm (e kam bërë atë në mënyrë që të mund t'i fus bateritë në xhep).

Lidhni detektorin e dytë IR në lidhësin DB-9 dhe futeni në kargo Bay ePort pin 3 (sinjal) dhe pin 5 (tokë). Bashkangjitni detektorin e dytë IR në krye të sensorit IR ekzistues në Krijo dhe mbulojeni atë me disa shtresa letre indi derisa detektori i dytë IR nuk e sheh emetuesin në një distancë që dëshironi që roboti Krijo të ndalojë për ta mbajtur nga goditja jote. Ju mund ta provoni këtë pasi të keni shtypur butonin Reset dhe të shihni LED Advance për të vazhduar kur jeni në distancën e ndalimit.

Hapi 2: Bashkojeni Shportën

Bashkangjitni shportën duke përdorur 6-32 vida. Sapo e vendosa shportën në krye të robotit Krijo. Gjithashtu rrëshqisni në timonin e pasmë në mënyrë që të vendosni peshë në anën e pasme të robotit Krijo.

Shënime: - Roboti mund të mbajë mjaft ngarkesë, të paktën 30 kg. - Madhësia e vogël dukej se ishte pjesa më e vështirë në marrjen e saj për të mbajtur ndonjë bagazh - IR është shumë temperament. Ndoshta përdorimi i imazhit është më i mirë, por është shumë më i shtrenjtë

Hapi 3: Shkarkoni Kodin Burimor

Shkarkoni Kodin Burimor
Shkarkoni Kodin Burimor

Kodi burimor vijon dhe bashkëngjitet në një skedar teksti:

/********************************************* ******************* follow.c ** -------- ** funksionon në Krijo Modulin e Komandës ** mbuloni të gjitha hapjet, përveç të voglave në pjesën e përparme i sensorit IR ** Krijo do të ndjekë një mur virtual (ose ndonjë IR që dërgon sinjalin e fushës së forcës **) dhe shpresojmë të shmangë pengesat në proces ****************** ********************************************** **/#include interrupt.h> #include io.h>#përfshijnë#përfshijnë "oi.h" #përcakto TRUE 1#përcakto FALSE 0#përcakto FullSpeed 0x7FFF#përcakto SlowSpeed 0x0100#përcakto SearchSpeed 0x0100#përcakto ExtraAngle 10#përcakto SearchLeftAngle 125#define SearchRightAngle (SearchLeftAngle - 1000) #define CoastDistance 150#përcakto TraceDistance 250#përcakto TraceAngle 30#përcakto BackDistance 25#përcakto IRDetected (~ PINB & 0x01) // gjendjet#përcakto Gati 0#përcakto në vijim 1#përcakto WasFollowing 2 #define SearchingLeft 3#përcakto SearchingRight 4#përcakto TracingLeft 5#përcakto TracingRight 6#përcakto BackingTraceLeft 7#përcakto BackingTraceRight 8 // Global variablesv ointile uint16_t timer_cnt = 0; uint8_t timer_on i paqëndrueshëm = 0; sensorë_flag = 0; të paqëndrueshëm uint8_t; sensorë_index = 0; të paqëndrueshëm uint8_t sensorë_në [Sen6Size]; të paqëndrueshëm uint8_t sensorë 0 = 16; kënd = 016 i paqëndrueshëm uint8_t inRange = 0; // Funksionet shmang byteTx (vlera uint8_t); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (unsigned int time_ms); void void inoid (power) bar 0; // Konfiguro Krijo dhe modulizo (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // vendos i/o për sensorin e dytë IRDDDRB & = X 0x01; // vendosni karrigen ePort pin 3 për të qenë një inputPORTB | = 0x01; // aktivizo tërheqjen e ngarkesës ePort pin3 // program loop while (TRUE) {// Ndalo vetëm si një masë paraprake (0, RadStraight); // vendos LEDsbyteTx (CmdLeds); byteTx ((((sensorët [SenVWall]))? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (sensorë [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // duke kërkuar për butonin e përdoruesit, kontrolloni oftendelayAndUpdateSensorët (10); (10); në qoftë se (UserButtonPressed) {delayAndUpdateSensors (1000); // aktiv loop while (! (UserButtonPressed) && (!! Sensorë [SenCliffL]) && (! Sensorë [SenCliffFL]) && (! Sensorë [SenCliffFR]) && (! sensorë [SenCliffR])) {byteTx (CmdLeds); byteTx (((sensorë [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (sensorë [SenCharge1]); byteTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; kaloni (gjendja) {rasti Gati: nëse (sensorë [SenVWall]) {// kontrolloni afërsinë me leaderif (inRange) {drive (0, RadStraight);} tjetër {// drejtoni drejtimin e makinës (SlowSpeed, RadStraight); gjendja = Ndjekja;}} tjetër {/kërko për trarët = 0; distanca = 0; pritja_kont. = 0; u gjet = FALSE; makinë (SearchSpeed, RadCCW); gjendje = SearchingLeft;} pushim; rast pas: nëse (sensorë [SenBumpDrop] & BumpRight) {distanca = 0; këndi = 0; ngasja (-SlowSpeed, RadStraight); gjendja = BackingTraceLeft;} tjetër nëse (sensorë [SenBumpDrop] & BumpLeft) {distanca = 0; këndi = 0; ngasja (-SlowSpeed, RadStraight); gjendja = BackingTraceRight;} tjetër nëse (sensorë [SenVWall]) {{kontrolloni për afërsia me leaderif (inRange) {disku (0, RadStraight); gjendja = Gati;} tjetër {// drive straightdrive (FullSpeed, RadStraight); state = Following;}} tjetër {// sapo humbi sinjalin, vazhdoni ngadalë një çiklistencë = 0; makinë (SlowSpeed, RadStraight); gjendje = WasFollowing;} pushim; rast WasFollowing: if (sensorë [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; makinë (-SlowSpeed, RadStraight); gjendje = BackingTraceLeft;} tjetër nëse (sensorët [SenBumpDrop] & BumpLeft) {distanca = 0; këndi = 0; disku (-SlowSpeed, RadStraight); gjendja = BackingTraceRight;} tjetër nëse (sensorë [SenVWall]) {// kontrolloni afërsinë me leaderif (inRange) {disku (0, RadStraight); gjendja = R eady;} tjetër {// drive straightdrive (FullSpeed, RadStraight); state = Following;}} tjetër nëse (distance> = CoastDistance) {drive (0, RadStraight); state = Ready;} else {drive (SlowSpeed, RadStraight);} pushim; rast SearchingLeft: nëse (gjendet) {if (angle> = ExtraAngle) {drive (SlowSpeed, RadStraight); state = Following;} else {drive (SearchSpeed, RadCCW);}} tjetër nëse (sensorë [SenVWall]) {found = TRUE; angle = 0; if (inRange) {drive (0, RadStraight); state = Ready;} else {drive (SearchSpeed, RadCCW);}} tjetër nëse (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); gjendja = Duke ndjekur;} tjetër {drive (SearchSpeed, RadCW);}} tjetër nëse (sensorë [SenVWall]) {found = TRUE; angle = 0; if (inRange) {drive (0, RadStraight); state = Ready;} tjetër {drive (SearchSpeed, RadCCW);}} tjetër nëse (wait_counter> 0) {wait_counter -= 20; makinë (0, RadStraight);} tjetër nëse (kënd = Kërko RightAngle) {drive (0, RadStraight); wait_counter = 5000; angle = 0;} else {drive (SearchSpeed, RadCW);} pushim; rast TracingLeft: if (sensorë [SenBumpDrop] & BumpRight) {distanca = 0; kënd = 0; makinë (-SlowSpeed, RadStraight); gjendje = BackingTraceLeft;} tjetër nëse (sensorë [SenBumpDrop] & BumpLeft) {makinë (0, RadStraight); gjendje = Gati;} tjetër nëse (sensorë [SenVWall]) {{kontrolloni për afërsinë me leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Following;}} tjetër nëse (! (distanca> = TraceDistance)) { makinë (SlowSpeed, RadStraight);} tjetër nëse (! (-angle> = TraceAngle)) {drive (SearchSpeed, RadCW);} tjetër {distance = 0; kënd = 0; makinë (SlowSpeed, RadStraight); gjendje = Gati; } break; case TracingRight: if (sensorë [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} tjetër nëse (sensorë [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; makinë (- SlowSpeed, RadStraight); gjendja = BackingTraceRight;} tjetër nëse (sensorë [SenVWall]) {// kontrolloni afërsinë me leaderif (inRang e) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Following;}} tjetër nëse (! (distanca> = TraceDistance)) {drive (SlowSpeed, RadStraight);} tjetër nëse (! (këndi> = TraceAngle)) {disku (SearchSpeed, RadCCW);} tjetër {distanca = 0; këndi = 0; disku (SlowSpeed, RadStraight); gjendja = Gati;} pushim; rasti BackingTraceLeft: if (sensorë [SenVWall] && inRange) {makinë (0, RadStraight); gjendja = Gati;} tjetër nëse (këndi> = TraceAngle) {distanca = 0; këndi = 0; ngasja (SlowSpeed, RadStraight); gjendje = TracingLeft; } else if (-distance> = BackDistance) {drive (SearchSpeed, RadCCW);} else {drive (-SlowSpeed, RadStraight);} break; case BackingTraceRight: if (sensorë [SenVWall] && inRange) {disku (0, RadStraight); gjendja = Gati;} tjetër nëse (-angulli> = TraceAngle) {distanca = 0; këndi = 0; ngasja (SlowSpeed, RadStraight); gjendja = TracingRight;} tjetër nëse (-distanca> = BackDistance) {disku (SearchSpeed, RadCW);} else {drive (-SlowSpeed, RadStraight);} pushim; parazgjedhje: // stopdrive (0, RadStraight); gjendja = Re ady; pushim;} delayAndCheckIR (10); delayAndUpdateSensors (10);} // shkëmbi ose butoni i përdoruesit të zbuluar, lejojnë që gjendja të stabilizohet (p.sh., butoni që do të lëshohet) disku (0, RadStraight); delayAndUpdateSensors (2000);}}} // Ndërprerja e marrjes serike për të ruajtur vlerat e sensoritSIGNAL (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 ndërprerje deri te vonesat në msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // Transmetoni një bajt mbi byteTx portvoid serial (vlera uint8_t) {ndërsa (! (UCSR0A & _BV) (UDRE0) UDR0 = vlera;} // Vonesa për kohën e caktuar në ms pa përditësuar vlerat e sensorit shmangni vonesatM (uint16_t time_ms) {timer_on = 1; timer_cnt = time_ms; ndërsa (timer_on);} // Vonesa për kohën e caktuar në ms dhe kontrolloni sekondën Detektor IR shmang vonesënAndCheckIR (uint16_t time_ms) {uint8_t timer_val = 0; inRange = 0; timer_on = 1; timer_cnt = time_ms; ndërsa (timer_on) {if (! (Timer_val == timer_cnt)) {inRange + = IRDetected; timer_val = timer_cnt;}} inRange = (inRange> = (time_ms >> 1));} // Vonesa për kohën e caktuar në ms dhe përditësoni vlerat e sensorit shmangni delayAndUpdateSensorët (uint16_t time_ms) {uint8_t temp; timer_on = 1; timer_cnt = time_ms; ndërsa (timer_on) {if (! sensorë_flag) {për (temp = 0; temp Sen6Size; temp ++) sensorë [temp] = sensorë_në [temp]; // Përditëso totalin e vrapimit të distancës dhe distancës së këndit += (int) ((sensorë [SenDist1] 8) | sensorë [SenDist0]); kënd += (int) ((sensorë [SenAng1] 8) | sensorë [SenAng0]); byteTx (CmdSensors); byteTx (6); sensors_index = 0; sensorë_flag = 1;}}} // Inicialize the Mind Control & aposs ATmega168 microcontrollervoid initialize (pavlefshme) {cli (); // Vendosni kunjat I/ODDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Vendosni kohëmatësin 1 për të gjeneruar një ndërprerje çdo 1 msTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Vendosni portin serik me ndërprerje rxUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0)); UCSR0C = (_BV (UCSZ00) | _BV (UCSZ01)); // Aktivizo interruptssei ();} void powerOnRobot (e pavlefshme) {// Nëse Krijo & aposs energjia është e fikur, aktivizoje atë (! RobotIsOn) {ndërsa (! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Vonesa në këtë gjendjeRobotPwrToggleHigh; // Kalim i ulët në i lartë për të ndryshuar powerdelayMs (100); // Vonesa në këtë gjendjeRobotPwrToggleLow;} delayMs (3500); // Vonesa për fillimin}} // Ndërroni normën e baudit si në Krijimin ashtu edhe në modulin shmangni baud (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code);/ / Prisni derisa transmetimi të përfundojë ndërkohë (! (UCSR0A & _BV (TXC0))); cli (); // Ndërroni regjistrin e normës së baudit (baud_code == Baud115200) UBRR0 = Ubrr115200; përndryshe nëse (baud_code == Baud57600) UBR5000 = Ubrr7; përndryshe nëse (baud_code == Baud38400) UBRR0 = Ubrr38400; përndryshe nëse (baud_code == Baud28800) UBRR0 = Ubrr28800; përndryshe nëse (baud_code == Baud19200) UBRR0 = Ubrr19200; përndryshe nëse (baud_code = UBr1400 = Ubr1400 = UBR1400 = UBR1400 = UBr1400 = UBR1400 = UBr1400 = UBr1400 = UBR1400 = nëse (baud_code == Baud9600) UBRR0 = Ubrr9600; përndryshe nëse (baud_code == Baud4800) UBRR0 = Ubrr4800; përndryshe nëse (baud_code == Baud2400) UBRR0 = Ubrr2400; përndryshe nëse (baud_code == Baud1200) tjetër baud_code == Baud600) UBRR0 = Ubrr600; përndryshe nëse (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Dërgo Krijo komandat e diskut për sa i përket shpejtësisë dhe radiusvoid drive (int16_t shpejtësia, int16_t rreze) {byteTx (CmdDrive); byteTx ((uint 8_t) ((shpejtësia >> 8) & 0x00FF)); byteTx ((uint8_t) (shpejtësia & 0x00FF)); byteTx ((uint8_t) ((rrezja >> 8) & 0x00FF)); byteTx ((uint8_t) (rreze & 0x00FF));}

Recommended: