Sisukord:
Video: Kuidas teha Robo-Bellhopi: 3 sammu
2024 Autor: John Day | [email protected]. Viimati modifitseeritud: 2024-01-30 08:50
Jälgi autori lisateavet:
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
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:
Kuidas teha traadita plekk-telefoni! (Arduino Walkie Talkie): 7 sammu (koos piltidega)
Kuidas teha traadita plekk-telefoni! (Arduino Walkie Talkie): Just teisel päeval olin keset väga olulist telefonikõnet, kui mu banaanitelefon lakkas töötamast! Ma olin nii pettunud. See on viimane kord, kui ma selle rumala telefoni tõttu kõnest ilma jäin! (Tagantjärele mõeldes olin ma võib -olla natuke liiga vihane
Kuidas teha päikeseenergia laetavat valgust: 8 sammu
Kuidas teha päikeseenergia laetavat valgust:
DIY Kuidas kuvada aega M5StickC ESP32 -l Visuino abil - lihtne teha: 9 sammu
DIY Kuidas kuvada aega M5StickC ESP32 -l Visuino abil - lihtne teha: Selles õpetuses õpime, kuidas programmeerida ESP32 M5Stack StickC koos Arduino IDE ja Visuinoga, et kuvada kellaaeg LCD -ekraanil
Kuidas teha maailma väikseimat liinijälgija robotit (robo Rizeh): 7 sammu (piltidega)
Kuidas teha maailma väikseimat liinijälgimisrobotit (robo Rizeh): kuidas teha maailma väikseim liinijälgimisrobot (vibrobot) " roboRizeh " kaal: 5gr suurus: 19x16x10 mm autor: Naghi Sotoudeh Sõna "Rizeh" on pärsia sõna, mis tähendab "pisike". Rizeh on vibratsioonil põhinev väga väike ro
Kuidas teha vanavanemate kalendrit & Külalisteraamat (isegi kui te ei tea, kuidas külalisteraamatut teha): 8 sammu (piltidega)
Kuidas teha vanavanemate kalendrit & Külalisteraamat (isegi kui te ei tea, kuidas külalisteraamatut teha): see on väga ökonoomne (ja väga tänuväärne!) Puhkusekink vanavanematele. Ma tegin sel aastal 5 kalendrit hinnaga vähem kui 7 dollarit. Materjalid: 12 suurepärast fotot teie lapsest, lastest, õetütardest, vennapoegadest, koertest, kassidest või muudest sugulastest12 erinevat tükki