Sisukord:

Kuidas teha Robo-Bellhopi: 3 sammu
Kuidas teha Robo-Bellhopi: 3 sammu

Video: Kuidas teha Robo-Bellhopi: 3 sammu

Video: Kuidas teha Robo-Bellhopi: 3 sammu
Video: Часть 3 — Аудиокнига «Бэббит» Синклера Льюиса (главы 10–15) 2024, November
Anonim

Jälgi autori lisateavet:

Kuidas osaleda minikonkursil iRobot Create Scholarship
Kuidas osaleda minikonkursil iRobot Create Scholarship
Kuidas osaleda minikonkursil iRobot Create Scholarship
Kuidas osaleda minikonkursil iRobot Create Scholarship
Kuidas teha LOLCatsi, meemikassi, kassi makrot või kassi pilte naljakate allkirjadega
Kuidas teha LOLCatsi, meemikassi, kassi makrot või kassi pilte naljakate allkirjadega
Kuidas teha LOLCatsi, meemikassi, kassi makrot või kassi pilte naljakate allkirjadega
Kuidas teha LOLCatsi, meemikassi, kassi makrot või kassi pilte naljakate allkirjadega

Teave: Mulle meeldib asju lahti võtta ja välja mõelda, kuidas need toimivad. Üldiselt kaotasin huvi pärast seda. Lisateave jeffreyfi kohta »

Selles juhendis on näidatud, kuidas kasutada iRobot Create'i liikuva kella loomiseks. See tühistati täielikult carolDanceri juhiste loal ja ma panin selle meie võistluse näidistööks. Robo-BellHop võib olla teie isiklik abiline teie kottide, toidukaupade, pesu jne kandmiseks, nii et teil pole seda et. Basic Creatil on ülaosas prügikast ja selle omaniku IR-saatja jälgimiseks kasutatakse kahte pardal olevat IR-detektorit. Väga lihtsa C -tarkvarakoodi abil saab kasutaja Robo -BellHopile kinnitada raskeid toiduaineid, suure pesukoguse või teie öökoti ja lasta robotil teid tänaval, kaubanduskeskuse, koridori või lennujaama kaudu jälgida - - kuhu iganes kasutaja peab minema. Põhitoimingud 1) Vajutage käsumooduli sisselülitamiseks nuppu Lähtesta ja kontrollige, kas andurid haakuvad robot on väga lähedal 2) Robo-BellHopi rutiini käivitamiseks vajutage musta pehmet nuppu 3) Kinnitage IR-saatja pahkluu külge ja veenduge, et see on sisse lülitatud. Seejärel laadige korv üles ja minge! 4) Robo-BellHopi loogika on järgmine: 4a) Kui jalutate ringi, siis kui IR-signaali tuvastatakse, sõidab robot maksimaalse kiirusega4b) Kui IR-signaal kaob vahemikus (olles liiga kaugel või liiga terava nurga all) läbib robot väikese kiiruse väikese kiirusega juhuks, kui signaal uuesti üles võetakse4c) Kui infrapunasignaali ei tuvastata, pöörab robot vasakul ja paremal proovige signaali uuesti üles leida riistvara1 iRobot virtuaalne seinaplokk - 301 dollari suurune IR -detektor RadioShackilt - 31 dollarit DB -9 isane pistik Radio Shackilt - 44 dollarit 6-32 kruvi Home Depotilt - 2,502 dollarit 3V patareid, kasutasin Target D1 pesukorvi - 51 dollarit lisaratt loo roboti tagakülg Elektriline lint, traat ja joodis

Samm: IR -anduri katmine

Kinnitage elektrilint, et katta kõik, välja arvatud väike pilu IR -andurist roboti loomise esiküljel. Võtke virtuaalne seinaplokk lahti ja eemaldage seadme esiküljel olev väike trükkplaat. See on natuke keeruline, kuna seal on palju peidetud kruvisid ja plastkinnitusi. IR -saatja on trükkplaadil. Infrapunase peegeldumise vältimiseks katke infrapunasaatja pehme paberiga. Kinnitage trükkplaat rihma või elastse riba külge, mis võib teie pahkluu ümber mässida. Ühendage patareid trükkplaadiga, nii et teil oleks patareid mugavas kohas (tegin selle nii, et saaksin patareid taskusse panna).

Ühendage teine infrapunaandur DB-9 pistikuga ja sisestage Cargo Bay ePorti tihvti 3 (signaal) ja tihvti 5 (maandus) sisse. Kinnitage teine infrapunaandur loomisel olemasoleva IR -anduri ülaossa ja katke see paari kihiga siidpaberiga, kuni teine infrapunaandur ei näe kiirgurit sellisel kaugusel, kui soovite, et loomise robot peatuks sind löömast. Saate seda testida pärast seda, kui olete vajutanud lähtestamisnuppu, ja vaadata, kuidas edasiliikumine süttib, kui olete peatumiskaugusel.

Samm: kinnitage korv

Kinnitage korv 6-32 kruvi abil. Paigaldasin korvi just roboti loomise ülaossa. Samuti libistage tagumine ratas sisse, nii et asetate kaalu Create roboti tagaküljele.

Märkused: - Robot kannab üsna vähe koormust, vähemalt 30 naela. - Väike suurus tundus olevat kõige raskem osa selle kaasavõtmisel pagasisse - IR on väga temperamentne. Võib -olla on pildistamine parem, kuid see on palju kallim

Samm: laadige alla lähtekood

Laadige alla lähtekood
Laadige alla lähtekood

Lähtekood on järgmine ja see on lisatud tekstifaili:

/************************************************ ******************** follow.c ** -------- ** töötab käsumooduli loomisega ** katab esiküljel kõik peale väikese ava Infrapunaanduri ** Create järgib virtuaalset seina (või mis tahes infrapuna, mis saadab välja ** jõuvälja signaali) ja loodetavasti väldib selle käigus takistusi ***************** ************************************************* **/#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) // olekud#define Valmis 0#define Järgmine 1#define WasFollowing 2 #define SearchingLeft 3#define SearchingRight 4#define TracingLeft 5#define TracingRight 6#define BackingTraceLeft 7#define BackingTraceRight 8 // Globaalsed muutujadv lenduv uint16_t timer_cnt = 0; lenduv uint8_t timer_on = 0; lenduv uint8_t sensor_flag = 0; lenduv uint8_t sensor_index = 0; lenduv uint8_t sensor_in [Sen6Size]; lenduv uint8_t andurid [Sen6Size 0_t = lenduv volatile uint8_t inRange = 0; // Funktsioonidvoid byteTx (väärtus uint8_t); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (unsigned int time_ms); void void; void void; void void baud (uint8_t baud_code); void drive (int16_t kiirus, int16_t raadius); uint16_t randomAngle (void); void defineSongs (void); int main (void) {// oleku muutuja uint8_t state = Valmis; int leitud = 0; int wait_counter = 0; // seadistamine Loo ja moodul initsialiseeri (); LEDBothOff; powerOnRobot (); baitTx (CmdStart); baud (Baud28800); baitTx (CmdControl); baitTx (CmdFull); // määrake teise IR -anduri sisend/väljundDDRB & = ~ 0x01; // seadistage kaubaruumi ePorti tihvt 3 sisendiksPORTB | = 0x01; // seada lasti ePort pin3 pullup lubatud // programmi tsükkel (TRUE) {// Peatage ettevaatusabinõuna sõit (0, RadStraight); // määrake LEDsbyteTx (CmdLeds); byteTx (((andurid [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); baitTx (andurid [SenCharge1]); baitTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // otsib kasutajanuppu, kontrolli oftendelayAndUpdateSensors (10); delay (10); if (UserButtonPressed) {delayAndUpdateSensors (1000); // active loop while (! (UserButtonPressed) && (! Sensors [SenCliffL]) && (! Sensors [SenCliffFL]) && (! Sensors [SenCliffFR]) && (! andurid [SenCliffR])) {byteTx (CmdLeds); byteTx (((andurid [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); baitTx (andurid [SenCharge1]); byteTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; lüliti (olek) {case Ready: if (sensorid [SenVWall]) {// kontrollige, kas lähedus on leaderif (inRange) {drive (0, RadStraight);} else {// sõita otsejooksul (aeglane kiirus, radStraight); olek = järgimine;}} muu {// otsi kiirnurk = 0; vahemaa = 0; oota_loendur = 0; leitud = FALSE; drive (SearchSpeed, RadCCW); state = SearchingLeft;} break; case After: if (sensorid [SenBumpDrop] & BumpRight) {distance = 0; nurk = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (sensorid [SenBumpDrop] & BumpLeft) {distance = 0; nurk = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (sensorid [SenVWall]) {// kontrolli proximity to leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = Follow;}} else {// just kaotanud signaali, jätkake aeglaselt üks cycledistance = 0; drive (SlowSpeed, RadStraight); state = WasFollowing;} break; case WasFollowing: if (sensorid [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (andurid [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (sensorid [SenVWall]) {// kontrollige, kas Leadif on läheduses (inRange) {drive (0, RadStraight); olek = R eady;} else {// sõida otsejooksul (FullSpeed, RadStraight); state = Follow;}} else if (distance> = CoastDistance) {drive (0, RadStraight); state = Ready;} else {drive (SlowSpeed, RadStraight);} break; case SearchingLeft: if (leitud) {if (nurk> = ExtraAngle) {drive (SlowSpeed, RadStraight); state = Follow;} else {drive (SearchSpeed, RadCCW);}} else if (sensorid [SenVWall]) {found = TRUE; nurk = 0; if (inRange) {drive (0, RadStraight); state = Ready;} else {drive (SearchSpeed, RadCCW);}} else if (nurk> = 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 = Jälgitakse;} else {drive (SearchSpeed, RadCW);}} else if (sensorid [SenVWall]) {found = TRUE; nurk = 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 (nurk = otsing RightAngle) {drive (0, RadStraight); wait_counter = 5000; nurk = 0;} else {drive (SearchSpeed, RadCW);} break; case TracingLeft: if (sensorid [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (sensorid [SenBumpDrop] & BumpLeft) {drive (0, RadStraight); state = Ready;} else if (sensorid [SenVWall]) {// check leaderif (inRange) läheduse jaoks {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 = Valmis; } paus; juhtum TracingRight: if (sensorid [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} else if (sensorid [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (- SlowSpeed, RadStraight); state = BackingTraceRight;} else if (sensorid [SenVWall]) {// kontrollige Leadif (inRang) lähedust 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 (sensorid [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} else if (nurk> = TraceAngle) {distance = 0; nurk = 0; drive (SlowSpeed, RadStraight); state = TracingLeft; } else if (-distance> = BackDistance) {drive (SearchSpeed, RadCCW);} else {drive (-SlowSpeed, RadStraight);} break; case BackingTraceRight: if (sensorid [SenVWall] && inRange) {drive (0, RadStraight); olek = Valmis;} else if (-nurk> = TraceAngle) {distance = 0; nurk = 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);} // kalju või kasutaja nupp tuvastatud, lubage tingimusel stabiliseeruda (nt vabastatav nupp) draiv (0, RadStraight); delayAndUpdateSensors (2000);}}} // Sarja vastuvõtu katkestus anduri väärtuste salvestamiseks aja viivitustele msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // Edastab baidi jadaportvoid byteTx (uint8_t väärtus) kaudu {while (! (UCSR0A & _BV (UDRE0))) UDR0 = väärtus;} // Viivitus määratud aja jooksul ms -is ilma anduri väärtusi värskendamata puudub viivitus IR -detektoril puudub viivitusAndCheckIR (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));} // Viivitus määratud aja jooksul ms -is ja anduri väärtuste värskendaminevoid 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 ++) andurid [temp] = sensorid_tem [temp]; // Värskendage vahemaa ja nurgakauguse jooksvaid kogusummasid += (int) ((andurid [SenDist1] 8) | andurid [SenDist0]); nurk += (int) ((andurid [SenAng1] 8) | andurid [SenAng0]); byteTx (CmdSensors); byteTx (6); sensors_index = 0; sensors_flag = 1;}}} // Initsialiseeri Mind Control & aposs ATmega168 mikrokontrollervoid initsialiseerimine (tühine) {cli (); // Määra I/O kontaktidDDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Seadistage taimer 1, et tekitada katkestus iga 1 ms tagantTCCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Seadistage jadaport rx -katkestusegaUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0)); UCSR0C = (_BV (UCSZ00) | _BV (UCSZ01)); // Lülita interruptssei ();} void powerOnRobot (void) {// Kui Loo & aposs toide on välja lülitatud, lülita see sisse (kui; RobotIsOn) {while (! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Viivitus selles olekusRobotPwrToggleHigh; // Madal kuni kõrge üleminek lülitamiseks powerdelayMs (100); // Viivitus selles olekusRobotPwrToggleLow;} delayMs (3500); // Viivitus käivitamisel}} // Lülitage andmeedastuskiirus sisse nii loomisel kui ka moodulivaba baudil (uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code);/ / Oodake, kuni edastamine on lõpetatud (! (UCSR0A & _BV (TXC0))); cli (); // Lülitage andmeedastuskiiruse registr (baud_code == Baud115200) UBRR0 = Ubrr115200; muidu, kui (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) else UBR00; baud_code == Baud600) UBRR0 = Ubrr600; else if (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Saada Loo draivikäsklused kiiruse ja raadiusevaba ajami järgi (int16_t kiirus, int16_t raadius) {baitTx (CmdDrive); baitTx ((uint 8_t) ((kiirus >> 8) & 0x00FF)); baitTx ((uint8_t) (kiirus & 0x00FF)); baitTx ((uint8_t) ((raadius >> 8) ja 0x00FF)); baitTx ((uint8_t) (raadius & 0x00FF));}

Soovitan: