Turinys:
- 1 žingsnis: IR jutiklio uždengimas
- 2 žingsnis: pritvirtinkite krepšelį
- 3 veiksmas: atsisiųskite šaltinio kodą
Video: Kaip pasidaryti „Robo-Bellhop“: 3 žingsniai
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-30 10:49
Sekite daugiau autoriaus:
Apie: Man patinka dalykus išardyti ir išsiaiškinti, kaip jie veikia. Po to paprastai prarandu susidomėjimą. Daugiau apie Jeffreyf »
Šioje instrukcijoje parodyta, kaip naudoti „iRobot Create“judančiam varpui. Tai buvo visiškai atšaukta gavus leidimą iš „carolDancer“nurodymų, ir aš tai pateikiau kaip pavyzdį mūsų konkursui. „Robo-BellHop“gali būti jūsų asmeninis asistentas nešiotis jūsų krepšius, bakalėjos gaminius, skalbinius ir kt., Todėl neturite į. „Basic Create“turi šiukšliadėžę, pritvirtintą prie viršaus, ir naudoja du įmontuotus IR jutiklius, kad galėtų sekti jo savininko IR siųstuvą. Naudodamas labai paprastą C programinės įrangos kodą, vartotojas gali užsidėti sunkius maisto produktus, didelį skalbinių kiekį ar jūsų naktinį krepšį ant „Robo -BellHop“ir leisti robotui sekti jus gatve, per prekybos centrą, koridoriuje ar per oro uostą - - visur, kur vartotojui reikia eiti. Pagrindinė operacija Robotas yra labai arti Tada pakrauk krepšį ir pirmyn! 4) „Robo-BellHop“logika yra tokia: 4a) Vaikštinėdamas, jei aptinkamas IR signalas, robotas važiuos maksimaliu greičiu4b) Jei IR signalas dingsta diapazonas (būdamas per toli ar per aštrus kampas), robotas lėtu greičiu įveiks trumpą atstumą, jei signalas vėl būtų paimtas4c) Jei IR signalas neaptinkamas, robotas pasuks į kairę ir į dešinę. 4d) Jei aptinkamas IR signalas, bet robotas atsitrenkia į kliūtį, robotas bandys apvažiuoti aplink kliūtį4e) Jei robotas priartės prie IR signalo, robotas sustos, kad nepataikytų į „Hardware1“virtualus „iRobot“sieninis blokas - 301 USD „IR“detektorius iš „RadioShack“- 31 USD „DB -9“jungtis iš „Radio Shack“- 44 USD 6–32 varžtai iš „Home Depot“- 2,502 USD 3 V baterijos, naudoju „D1“skalbinių krepšį iš „Target“- 51 USD papildomo rato. „Sukurti robotą“užpakalinė dalisElektrinė juosta, viela ir lydmetalis
1 žingsnis: IR jutiklio uždengimas
Pritvirtinkite elektros juostą, kad padengtumėte visus, išskyrus mažą, IR jutiklio plyšį „Create“roboto priekyje. Išardykite virtualų sieninį bloką ir ištraukite mažą plokštę įrenginio priekyje. Tai šiek tiek sudėtinga, nes yra daug paslėptų varžtų ir plastikinių laikiklių. IR siųstuvas yra ant plokštės. Kad išvengtumėte infraraudonųjų spindulių atspindžių, uždenkite IR siųstuvą minkštu popieriumi. Pritvirtinkite plokštę prie diržo ar elastinės juostos, kuri gali apvynioti kulkšnį. Prijunkite baterijas prie grandinės plokštės, kad galėtumėte jas laikyti patogioje vietoje (aš padariau taip, kad galėčiau įdėti baterijas į kišenę).
Prijunkite antrąjį IR detektorių prie DB-9 jungties ir įkiškite į „Cargo Bay ePort“kaištį 3 (signalas) ir 5 kaištį (įžemintas). Pritvirtinkite antrąjį IR detektorių prie esamo IR jutiklio viršuje „Create“ir uždenkite porą sluoksnių minkšto popieriaus, kol antrasis IR detektorius nematys spinduliuotės atstumu, kurio norite, kad „Create Robot“sustotų. nuo tavęs smūgio. Tai galite išbandyti paspaudę mygtuką „Atkurti“ir pažiūrėti, kaip užsidega „Advance“šviesos diodas, kai esate sustojimo atstume.
2 žingsnis: pritvirtinkite krepšelį
Pritvirtinkite krepšį naudodami 6-32 varžtus. Aš ką tik pritvirtinau krepšį prie „Create“roboto viršaus. Taip pat stumkite galinį ratą taip, kad svoris būtų ant „Create“roboto nugaros.
Pastabos: - Robotas gali atlaikyti nemažą apkrovą, mažiausiai 30 svarų. - Mažas dydis atrodė sunkiausias dalykas, norint jį gabenti bet kokį bagažą - IR yra labai temperamentingas. Galbūt geriau naudoti vaizdus, bet tai daug brangiau
3 veiksmas: atsisiųskite šaltinio kodą
Šaltinio kodas yra pridėtas prie teksto failo:
/************************************************ ******************** sekti. c ** -------- ** veikia pagal komandų kūrimo modulį ** uždengti visą, išskyrus mažą, angą priekyje IR jutiklis ** „Create“seka virtualią sieną (arba bet kokį IR, siunčiantį ** jėgos lauko signalą) ir, tikiuosi, išvengs kliūčių šiame procese ***************** ************************************************* **/#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) // state#define Ready 0#define Toliau 1#define WasFollowing 2 #define SearchingLeft 3#define SearchingRight 4#define TracingLeft 5#define TracingRight 6#define BackingTraceLeft 7#define BackingTraceRight 8 // Visuotiniai kintamiejiv nepastovus uint16_t timer_cnt = 0; nepastovus uint8_t timer_on = 0; nepastovus uint8_t sensor_flag = 0; nepastovus uint8_t sensor_index = 0; nepastovus uint8_t sensor_in [Sen6Size]; nepastovus uint8_t jutiklis [Sen6Size 0t; = nepastovus volatile uint8_t inRange = 0; // Funkcijos void byteTx (uint8_t vertė); void delayMs (uint16_t time_ms); void delayAndCheckIR (uint16_t time_ms); void delayAndUpdateSensors (unsigned int time_ms); void void; void void; void void; void baud (uint8_t baud_code); void drive (int16_t greitis, int16_t spindulys); uint16_t randomAngle (void); void defineSongs (void); int main (void) {// būsenos kintamasis 0; // Nustatyti Sukurti ir modulį inicijuoti (); LEDBothOff; powerOnRobot (); byteTx (CmdStart); baud (Baud28800); byteTx (CmdControl); byteTx (CmdFull); // nustatyti i/o antrajam IR jutikliuiDDRB & = ~ 0x01; // nustatykite krovinių skyriaus ePort 3 kaištį kaip įvestįPORTB | = 0x01; // nustatyti krovinį „ePort pin3 pullup“įjungtas // programos ciklas (TRUE) {// Sustabdyti kaip atsargumo priemonę vairuoti (0, RadStraight); // nustatyti LEDsbyteTx (CmdLeds); byteTx (((jutikliai [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (jutikliai [SenCharge1]); byteTx (64); IRDetected? LED2On: LED2Off; inRange? LED1On: LED1Off; // ieško vartotojo mygtuko, patikrinkite oftendelayAndUpdateSensors (10); delay (10); if (UserButtonPressed) {delayAndUpdateSensors (1000); // active loop while (! (UserButtonPressed) && (! Sensoriai [SenCliffL]) && (! Sensoriai [SenCliffFL]) && (! jutikliai [SenCliffR])) {byteTx (CmdLeds); byteTx (((jutikliai [SenVWall])? LEDPlay: 0x00) | (inRange? LEDAdvance: 0x00)); byteTx (jutikliai [SenCharge1]); byteTx (255); IRDetected ? LED2On: LED2Off; inRange? LED1On: LED1Off; jungiklis (būsena) {case Ready: if (jutikliai [SenVWall]) {// patikrinkite, ar arti lyderio (inRange) {drive (0, RadStraight);} else {// važiuoti tiesiai („SlowSpeed“, „RadStraight“); būsena = stebima;}} else {// ieškoti spindulio kampo = 0; atstumas = 0; laukti_skaitiklis = 0; rasta = FALSE; diskas (SearchSpeed, RadCCW); state = SearchingLeft;} pertrauka; atvejis Sekantis: if (jutikliai [SenBumpDrop] & BumpRight) {atstumas = 0; kampas = 0; pavara (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (jutikliai [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (jutikliai [SenVWall]) {// patikrinti proximity to leaderif (inRange) {drive (0, RadStraight); state = Ready;} else {// drive straightdrive (FullSpeed, RadStraight); state = Follow;}} else {// ką tik praradęs signalą, toliau lėtai ciklo atstumas = 0; pavara („SlowSpeed“, „RadStraight“); būsena = „WasFollowing“;} pertrauka; atvejis „WasFollowing“: jei (jutikliai [SenBumpDrop] & BumpRight) {atstumas = 0; kampas = 0; pavara (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (jutikliai [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (-SlowSpeed, RadStraight); state = BackingTraceRight;} else if (jutikliai [SenVWall]) {// patikrinkite, ar arti lyderio (inRange) {diskas (0, RadStraight); būsena = R eady;} else {// važiuoti tiesiai („FullSpeed“, „RadStraight“); state = „Follow“;}} else if (distance> = CoastDistance) {drive (0, RadStraight); state = Ready;} else {drive (SlowSpeed, RadStraight);} pertrauka; atvejis SearchingLeft: if (rasta) {if (kampas> = ExtraAngle) {diskas (SlowSpeed, RadStraight); state = Follow;} else {drive (SearchSpeed, RadCCW);}} else if (jutikliai [SenVWall]) {found = TRUE; kampas = 0; if (inRange) {drive (0, RadStraight); state = Ready;} else {drive (SearchSpeed, RadCCW);}} else if (kampas> = SearchLeftAngle) {diskas (SearchSpeed, RadCW); wait_counter = 0; state = SearchingRight;} else {drive (SearchSpeed, RadCCW);} break; case SearchingRight: if (found) {if (-angle> = ExtraAngle) {drive (SlowSpeed, RadStraight); state = Stebima;} else {drive (SearchSpeed, RadCW);}} else if (jutikliai [SenVWall]) {found = TRUE; kampas = 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 (kampas = paieška RightAngle) {drive (0, RadStraight); wait_counter = 5000; angle = 0;} else {drive (SearchSpeed, RadCW);} break; case TracingLeft: if (sensoriai [SenBumpDrop] & BumpRight) {distance = 0; angle = 0; diskas (-SlowSpeed, RadStraight); state = BackingTraceLeft;} else if (jutikliai [SenBumpDrop] & BumpLeft) {drive (0, RadStraight); state = Ready;} else if (sensoriai [SenVWall]) {// check artumas lyderiui (inRange) {diskas (0, RadStraight); state = Ready;} else {// drive straightdrive (SlowSpeed, RadStraight); state = Follow;}} else if (! (distance> = TraceDistance)) { drive (SlowSpeed, RadStraight);} else if (! (-kampas> = TraceAngle)) {drive (SearchSpeed, RadCW);} else {distance = 0; angle = 0; drive (SlowSpeed, RadStraight); state = Ready; } break; case TracingRight: if (sensoriai [SenBumpDrop] & BumpRight) {drive (0, RadStraight); state = Ready;} else if (jutikliai [SenBumpDrop] & BumpLeft) {distance = 0; angle = 0; drive (- SlowSpeed, RadStraight); state = BackingTraceRight;} else if (jutikliai [SenVWall]) {// patikrinkite, ar arti lyderio (inRang 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; kampas = 0; diskas (SlowSpeed, RadStraight); state = Ready;} pertrauka; case BackingTraceLeft: if (jutikliai [SenVWall] && inRange) {drive (0, RadStraight); state = Ready;} else if (kampas> = TraceAngle) {distance = 0; kampas = 0; diskas (SlowSpeed, RadStraight); state = TracingLeft; } else if (-distance> = BackDistance) {drive (SearchSpeed, RadCCW);} else {drive (-SlowSpeed, RadStraight);} break; case BackingTraceRight: if (sensoriai [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);} // aptikta uolos ar vartotojo mygtukas, leiskite sąlygai stabilizuotis (pvz., mygtukas turi būti atleistas) diskas (0, RadStraight); delayAndUpdateSensors (2000);}}} // Serijinis priėmimo pertraukimas jutiklio reikšmėms išsaugoti į laiko uždelsimą msSIGNAL (SIG_OUTPUT_COMPARE1A) {if (timer_cnt) timer_cnt-; elsetimer_on = 0;} // Perduokite baitą per nuoseklųjį portvoid byteTx (uint8_t vertė) {while (! (UCSR0A & _BV (UDRE0))) UDR0 = vertė;} // Vėlavimas nurodytą laiką ms, neatnaujinant jutiklio reikšmių IR detektorius neturi vėlavimoAndCheckIR (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));} // Vėluoja nurodytą laiką ms ir atnaujina jutiklio reikšmesvėl 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 ++) jutikliai [temp] = sensor_in [temp]; // Atnaujinti bėgimo atstumų ir kampinių atstumų sumas += (int) ((jutikliai [SenDist1] 8) | jutikliai [SenDist0]); kampas += (int) ((jutikliai [SenAng1] 8) | jutikliai [SenAng0]); byteTx (CmdSensors); byteTx (6); // Nustatykite įvesties/išvesties kaiščiusDDRB = 0x10; PORTB = 0xCF; DDRC = 0x00; PORTC = 0xFF; DDRD = 0xE6; PORTD = 0x7D; // Nustatykite 1 laikmatį, kad kas 1 ms būtų sukurtas pertraukimasTCCRCR1A = 0x00; TCCR1B = (_BV (WGM12) | _BV (CS12)); OCR1A = 71; TIMSK1 = _BV (OCIE1A); // Nustatykite nuoseklųjį prievadą su rx interruptUBRR0 = 19; UCSR0B = (_BV (RXCIE0) | _BV (TXEN0) | _BV (RXEN0)); UCSR0C = (_BV (UCSZ00) | _BV (UCSZ01)); // Įjungti interruptssei ();} void powerOnRobot (void) {// Jei „Create & aposs“maitinimas išjungtas, įjunkite jį, jei (! RobotIsOn) {while (! RobotIsOn) {RobotPwrToggleLow; delayMs (500); // Vėlavimas šioje būsenojeRobotPwrToggleHigh; // Nuo žemo iki aukšto perėjimo į perjungimo galiąlayMs (100); // Delsimas šioje būsenojeRobotPwrToggleLow;} delayMs (3500); // Paleidimo atidėjimas}} // Įjunkite duomenų perdavimo spartą „Create“ir „modulvoid baud“(uint8_t baud_code) {if (baud_code = 11) {byteTx (CmdBaud); UCSR0A | = _BV (TXC0); byteTx (baud_code);/ / Palaukite, kol perdavimas bus baigtas (! (UCSR0A & _BV (TXC0))); cli (); // Perjunkite duomenų perdavimo spartos registrą (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 == 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) if UBR00; baud_code == Baud600) UBRR0 = Ubrr600; else if (baud_code == Baud300) UBRR0 = Ubrr300; sei (); delayMs (100);}} // Siųsti Sukurti disko komandas pagal greitį ir spindulinį diską (int16_t greitis, int16_t spindulys) {byteTx (CmdDrive); byteTx ((uint 8_t) ((greitis >> 8) & 0x00FF)); baitasTx ((uint8_t) (greitis & 0x00FF)); baitasTx ((uint8_t) ((spindulys >> 8) ir 0x00FF)); baitasTx ((uint8_t) (spindulys & 0x00FF));}
Rekomenduojamas:
Kaip pasidaryti LED garso spektro analizatorių: 7 žingsniai (su nuotraukomis)
Kaip sukurti LED garso spektro analizatorių: LED garso spektro analizatorius sukuria gražų apšvietimo modelį pagal muzikos intensyvumą. Rinkoje yra daug „pasidaryk pats“LED muzikos spektro rinkinių, tačiau čia mes ketiname sukurti LED garso spektrą Analizatorius naudojant „NeoPixe“
Kaip pasidaryti „Arduino“gitaros imtuvą: 4 žingsniai
Kaip pasidaryti „Arduino“gitaros imtuvą: Tai instrukcijos, kaip iš „Arduino“ir kelių kitų komponentų pagaminti gitaros imtuvą. Turėdami pagrindines elektronikos ir kodavimo žinias, galėsite sukurti šį gitaros derintuvą. Pirmiausia turite žinoti, kokios medžiagos yra. Ma
Kaip pasidaryti suoliuką TinkerCAD: 5 žingsniai
Kaip pasidaryti suoliuką „TinkerCAD“: Šioje instrukcijoje nurodysiu, kaip žingsnis po žingsnio paruošti suoliuką tinkerCAD
Kaip pasidaryti „Raspberry Pi“nešiojamąjį kompiuterį: 8 žingsniai
Kaip pasidaryti nešiojamąjį kompiuterį „Raspberry Pi“: šioje instrukcijoje parodysiu, kaip pasidaryti „Raspberry Pi“nešiojamąjį kompiuterį su jutikliniu ekranu. Turėsiu visą programavimą ir žingsnis po žingsnio instrukcijas, kaip sukurti šį lengvai naudojamą nešiojamąjį kompiuterį. Ši pamoka parodys, kaip atsisiųsti minkštą
„Pasidaryk pats“Kaip pasidaryti šauniai atrodantį laikrodį - „StickC“- lengva padaryti: 8 žingsniai
„Pasidaryk pats“, kaip pasidaryti šauniai atrodantį laikrodį - „StickC“- lengva padaryti: šioje pamokoje sužinosime, kaip užprogramuoti „ESP32 M5Stack StickC“su „Arduino IDE“ir „Visuino“rodyti laiką LCD ekrane, taip pat nustatyti laiką naudojant „StickC“mygtukus