- „LM393“ greičio jutiklio modulis (H206)
- H206 jutiklio montavimo išdėstymas
- Pasidaryk pats „Arduino LM393“ greičio jutiklio roboto schema
- Loginio greičio matavimo su LM393 greičio jutiklio moduliu logika
- Logika vertinant rato nuvažiuotą atstumą
- Loginio matavimo roboto kampas
- „Arduino“ robotų kodas
- „Arduino“ roboto testavimas matuojant atstumą, greitį ir kampą
Robotai pamažu pradėjo ropštis į mūsų visuomenę, kad mūsų gyvenimas būtų paprastesnis. JK keliuose jau galime rasti šešis ratų maisto pristatymo robotus iš „Starship“, kurie protingai naršo tarp civilių, kad pasiektų tikslą. Kiekvienas mobilus robotas, naršantis aplinkoje, visada turėtų žinoti savo padėtį ir orientaciją realaus pasaulio atžvilgiu. Yra daug būdų, kaip tai pasiekti naudojant įvairias technologijas, tokias kaip GPS, RF trikampis, akselerometrai, giroskopai ir kt. Kiekviena technika turi savo pranašumą ir yra unikali. Šioje „ Arduino LM393“ greičio jutiklio pamokoje naudosime paprastą ir lengvai prieinamą „ LM393“ greičio jutiklio modulįnorint išmatuoti kai kuriuos gyvybiškai svarbius parametrus, tokius kaip greitis, nuvažiuotas atstumas ir roboto kampas naudojant „Arduino“. Turėdamas šiuos parametrus robotas galės sužinoti savo realaus pasaulio statusą ir galės jį naudoti saugiai naršydamas.
„Arduino“ yra populiariausias pasirinkimas tarp mėgėjų statyti robotus, nuo paprasto linijos sekėjo iki sudėtingesnio savaiminio balansavimo ar grindų valymo roboto. Skyriuje „Robotika“ galite patikrinti visų rūšių robotus.
Pastatysime mažą robotą, kurį maitina ličio baterija, ir vairuosime jį su vairasvirte. Vykdymo metu galime išmatuoti roboto greitį, atstumą ir kampą ir realiuoju laiku jį parodyti LCD ekrane, prijungtame prie „Arduino“. Šis projektas tiesiog padeda jums matuoti šiuos parametrus, kai tai padarysite, galite naudoti šiuos parametrus, kad galėtumėte autonomiškai valdyti savo robotą, jei reikia. Skamba įdomiai, tiesa? Taigi pradėkime.
„LM393“ greičio jutiklio modulis (H206)
Prieš patekdami į projekto schemą ir kodą, supraskime „ LM393“ greičio jutiklio modulį, nes jis vaidina gyvybiškai svarbų vaidmenį projekte. Į H206 SPARTA jutiklio modulis susideda iš infraraudonųjų spindulių jutiklis integruotas su LM393 įtampos komparatoriaus IC taigi pavadinimas LM393 Speed jutikliu. Modulis taip pat susideda iš tinklelio plokštės, kuri turi būti pritvirtinta prie variklio besisukančio veleno. Visi komponentai pažymėti žemiau esančiame paveikslėlyje.
Infraraudonųjų spindulių jutiklis susideda iš IR LED ir foto-tranzistorius atskirtos nedidelis gab. Visas jutiklio išdėstymas dedamas į juodą korpusą, kaip parodyta aukščiau. Tinklelio plokštė susideda iš lizdų, plokštė yra išdėstyta tarp infraraudonųjų spindulių jutiklio tarpų taip, kad jutiklis galėtų pajusti tinklo plokštės spragas. Kiekvienas tinklelio plokštės tarpas suveikia IR jutiklį eidamas per tarpą; šie paleidikliai paskui paverčiami įtampos signalais, naudojant komparatorių. Lyginamasis yra ne kas kita, o LM393 IC iš ON puslaidininkių. Modulis turi tris kaiščius, du iš jų naudojami moduliui maitinti, o vienas išvesties kaištis naudojamas trigerių skaičiavimui.
H206 jutiklio montavimo išdėstymas
Šio tipo jutiklių montavimas yra šiek tiek keblus. Jį galima montuoti tik prie variklių, kurių velenas išsikišęs iš abiejų pusių. Viena veleno pusė yra prijungta prie rato, o kita pusė naudojama tinklelio plokštei montuoti, kaip parodyta aukščiau.
Kadangi ratas ir plokštė yra prijungti prie to paties veleno, abu sukasi tuo pačiu greičiu, taigi, matuodami plokštės greitį, galime išmatuoti rato greitį. Įsitikinkite, kad tinklelio plokštės spragos praeina per IR jutiklį, tik tada jutiklis galės suskaičiuoti praleistų spragų skaičių. Taip pat galite sugalvoti savo mechaninį įrenginį, kad pritvirtintumėte jutiklį tol, kol jis atitinka nurodytą sąlygą. IR jutiklis paprastai naudojamas daugelyje robotikos projektų, norint nukreipti robotą apie kliūtis.
Aukščiau pateiktoje tinklelio plokštelėje yra 20 angų (tinklelių). Tai reiškia, kad jutiklis suras 20 tarpų visam rato pasukimui. Suskaičiavę jutiklio aptiktų spragų skaičių, galime apskaičiuoti rato nueitą atstumą, panašiai matuodami, kaip greitai jutiklis suranda spragas, kurias galime aptikti rato greičiu. Mūsų robote turėsime šį jutiklį, pritvirtintą prie abiejų ratų, taigi galime rasti ir roboto kampą. Tačiau pasukimo kampą galima protingiau apskaičiuoti naudojant akselerometrą ar giroskopą. Čia išmokite susieti akselerometrą ir giroskopą su „Arduino“ ir pabandykite išmatuoti sukimosi kampą jais.
Pasidaryk pats „Arduino LM393“ greičio jutiklio roboto schema
Visa šio greičio ir atstumo jutimo roboto schema parodyta žemiau. „Bot“ sudaro „ Arduino Nano“ smegenys, du nuolatinės srovės variklius ratams varo „L298N H-Bridge“ variklio modulis. Vairasvirtė naudojama roboto greičiui ir krypčiai valdyti, o du greičio jutikliai H206 naudojami boto greičiui, atstumui ir angelui matuoti. Išmatuotos vertės tada rodomos 16x2 LCD modulyje. Su LCD prijungtu potenciometru galima reguliuoti LCD kontrastą, o rezistorius naudojamas norint apriboti srovę, tekančią į LCD apšvietimą.
Visiškai grandinės yra powered by 7.4V ličio elementų. Šis 7,4 V įtampa tiekiama į variklio tvarkyklės modulio 12 V kontaktą. Tada variklio vairuotojo modulio įtampos reguliatorius konvertuoja 7,4 V į reguliuojamą + 5 V, kuris naudojamas „Arduino“, LCD, jutiklių ir vairasvirtės maitinimui.
Variklį valdo „Arduino“ skaitmeniniai kaiščiai 8, 9, 10 ir 11. Kadangi variklio greitis taip pat turi būti kontroliuojamas, PWM signalus turėtume tiekti į teigiamą variklio gnybtą. Taigi mes turime kaiščius 9 ir 10, kurie abu yra PWM galintys kaiščiai. X ir Y reikšmės sudaro tai, kad vairasvirtė nuskaitoma naudojant analoginius kaiščius A2 ir A3.
Kaip žinome, H206 jutiklis generuoja trigerį, kai aptinkamas tinklo plokštės tarpas. Kadangi šie trigeriai ne visada turėtų būti tiksliai skaitomi, norint apskaičiuoti teisingą greitį ir atstumą, abu gaiduko (išvesties) kaiščiai yra prijungti prie „Arduino“ plokštės išorinio pertraukimo kaiščių 2 ir 3. Sumontuokite visą grandinę ant važiuoklės ir pritvirtinkite greičio jutiklį, kaip paaiškinta, mano botas atrodė panašus į žemiau po to, kai buvo baigtos jungtys. Taip pat galite žiūrėti vaizdo įrašą šio puslapio pabaigoje, kad sužinotumėte, kaip buvo sumontuotas jutiklis.
Dabar, kai aparatinė dalis bus baigta, pereikime prie logikos, kaip matuosime roboto greitį, atstumą ir vieną, tada pereikite prie programavimo skyriaus.
Loginio greičio matavimo su LM393 greičio jutiklio moduliu logika
Iš jutiklio tvirtinimo sąrankos turėtumėte žinoti, kad greičio jutiklio modulis LM393 (H206) matuoja tik tinklelio plokštelėje esančius tarpus. Montuojant reikia įsitikinti, kad ratas (kurio greitį reikia išmatuoti) ir tinklelio plokštė sukasi tuo pačiu greičiu. Kaip ir čia, kadangi mes sumontavome ir ratą, ir plokštę ant to paties veleno, jie akivaizdžiai suksis tuo pačiu greičiu.
Savo sąrankoje mes sumontavome du jutiklius kiekvienam ratui, kad matuotumėte boto kampą. Bet jei jūsų tikslas yra išmatuoti tik greitį ir atstumą, mes galime pritvirtinti jutiklį ant vieno rato. Jutiklio išvestis (suveikimo signalai) dažniausiai bus sujungta su išoriniu mikrovaldiklio pertraukimo kaiščiu. Kiekvieną kartą, kai aptinkamas tinklo plokštės tarpas, bus suaktyvintas pertraukimas ir bus įvykdytas ISR („Interrupt service Routine“) kodas. Jei sugebėsime apskaičiuoti laiko intervalą tarp dviejų tokių veiksnių, galime apskaičiuoti rato greitį.
„Arduino“ galime lengvai apskaičiuoti šį laiko intervalą naudodamiesi funkcija milis () . Ši milis funkcija toliau didės 1 kiekviena mili sekunde nuo to laiko, kai įjungsite įrenginį. Taigi, kai įvyksta pirmasis pertraukimas, mes galime išsaugoti milis () vertę manekeno kintamajame (kaip šiame kode - pevtime ), o tada, kai įvyksta antrasis pertraukimas, galime apskaičiuoti laiką, atimamą atimant pevtime reikšmę iš milis ().
Laikas imtis = Dabartinis laikas - Ankstesnis kartą timetaken = Millis () - pevtime ; // timetaken į millisec
Apskaičiavę laiką, mes galime paprasčiausiai apskaičiuoti aps / min vertę naudodami toliau pateiktas formules, kur (1000 / timetaken) pateikia RPS (apsisukimai per sekundę) ir jis padauginamas iš 60, kad RPS būtų paverstas RPM (apsisukimai per minutę).
aps./min = (1000 / timetaken) * 60;
Apskaičiavę apsisukimus, galime apskaičiuoti transporto priemonės greitį naudodami toliau pateiktas formules, jei žinome rato spindulį.
Greitis = 2π × RPS × rato spindulys. v = rato spindulys * aps / min * 0,104
Atkreipkite dėmesį, kad pirmiau pateikta formulė skirta greičiui m / s apskaičiuoti, jei norite apskaičiuoti km / h, tada 0,0104 pakeiskite 0,376. Jei norite sužinoti, kaip gauta vertė 0,104, pabandykite supaprastinti formulę V = 2π × RPS × rato spindulys.
Ta pati technika naudojama net ir tuo atveju, jei besisukančio objekto greičiui matuoti naudojamas salės jutiklis. Tačiau H206 jutikliui yra fiksatorius, tinklelio plokštėje yra 20 angų, taigi, norint išmatuoti laiką tarp dviejų angų tarpų, mikrovaldiklis bus perkrautas. Taigi mes matuojame greitį tik sukant ratą. Kadangi kiekvienam tarpui bus sugeneruoti du pertraukimai (vienas paleidimo pradžioje, kitas - tarpo pabaigoje), iš viso gausime 40 pertraukimų, kad ratas atliktų vieną pilną pasukimą. Taigi, kol iš tikrųjų apskaičiuosime rato greitį, laukiame 40 pertraukimų. To paties kodas parodytas žemiau
if (sukimas> = 40) { timetaken = millis () - pevtime; // suimtas milisekais aps / min = (1000 / timetaken) * 60; // formulės aps./min pevtime = millis (); sukimas = 0; }
Kitas šio metodo trūkumas yra tas, kad greičio vertė nesumažės iki nulio, nes pertraukimas visada laukia, kol ratas atliks vieną apsisukimą, kad apskaičiuotų apsukų skaičių. Šį trūkumą galima lengvai įveikti pridėjus paprastą kodą, kuris stebi laiko tarpą tarp dviejų pertraukimų ir, jei jis viršija įprastą, mes galime priversti apsukų ir greičio vertę nuliui. Nuoroda žemiau esančiame kode mes naudojome kintamą dtime, kad patikrintume laiko skirtumą, o jei jis viršija 500 mili sekundžių, greičio ir apsisukimų dažnio vertė yra lygi nuliui.
/ * Sumažinti iki nulio, jei transporto priemonė sustabdyta * / if (milis () - dtime> 500) // 500ms { 0 / r = v = 0 nenustatyta pertraukimo ; // padarykite apsukas ir greitį kaip nulį dtime = milis (); }
Logika vertinant rato nuvažiuotą atstumą
Mes jau žinome, kad „Arduino“ pajus 40 pertraukimų, kai ratas sukasi vieną kartą. Taigi akivaizdu, kad kiekvieno rato pasukimo metu rato nuvažiuotas atstumas yra lygus rato apskritimui. Kadangi mes jau žinome rato spindulį, galime lengvai apskaičiuoti nuvažiuotą atstumą pagal žemiau pateiktą formulę
Atstumas = 2πr * apsisukimų skaičius atstumas = (2 * 3,141 * rato spindulys) * (kairysis_intr / 40)
Kai rato apskritimas apskaičiuojamas pagal formulę 2πr, tada jis padauginamas iš rato pasisukimų skaičiaus.
Loginio matavimo roboto kampas
Yra daugybė būdų, kaip nustatyti roboto angelą. Paprastai šioms vertėms nustatyti naudojami akselerometrai ir giroskopai. Tačiau kitas pigus būdas yra naudoti H206 jutiklį ant abiejų ratų. Tokiu būdu mes žinotume, kiek posūkių padarė kiekvienas ratas. Žemiau pateiktame paveikslėlyje parodyta, kaip apskaičiuojamas kampas.
Inicializavus robotą, kampas, su kuriuo jis susiduria, laikomas 0 °. Nuo tada jis sukasi kairėn, kampas didinamas neigiamai, o jei jis sukasi dešinėn, angelas yra teigiamas. Norėdami suprasti, apsvarstykime diapazoną nuo -90 iki +90, kaip parodyta paveikslėlyje. Tokiu būdu, nes abu ratai yra vienodo skersmens, jei kuris nors iš ratų sukasi visiškai, mes pasukame 90 ° kampu.
Pvz., Jei kairysis ratas sukasi visiškai (80 pertraukimų), botas pasisuks 90 ° į kairę ir panašiai, jei dešinysis ratas pasuks vieną kartą (80 pertraukimų), tada botas pasuks -90 ° į dešinę. Dabar mes žinome, kad jei „Arduino“ aptinka 80 pertraukimų ant vieno rato, botas pasisuko 90 ° ir pagal kurį ratą galime pasakyti, ar botas pasisuko teigiamai (dešinėje), ar neigiamai (kairėje). Taigi kairįjį ir dešinįjį kampus galima apskaičiuoti naudojant toliau pateiktas formules
int kampo_kairė = (left_intr% 360) * (90/80); int angle_right = (right_intr% 360) * (90/80);
Kur 90 yra kampas, įveikiamas pertraukiant 80. Gauta vertė yra padauginta iš skaičiaus pertraukimų. Mes taip pat panaudojome 360 modulį, kad gautoji vertė niekada neviršytų 36. Apskaičiavus kairįjį ir dešinįjį kampus, efektyvųjį kampą, kuriuo botas yra nukreiptas, galima paprasčiausiai gauti atėmus kairįjį kampą nuo stačiojo.
kampas = kampas_dešinėn - kampas_kairė;
„Arduino“ robotų kodas
Visą šio greičio ir kampo matavimo roboto „ Arduino“ kodą rasite šio puslapio pabaigoje. Programos tikslas yra apskaičiuoti roboto greitį, atstumą ir kampą, naudojant aukščiau pateiktą logiką, ir parodyti jį LCD ekrane. Be to, tai turėtų suteikti galimybę valdyti robotą naudojant vairasvirtę.
Mes pradedame programą apibrėždami dviejų variklių skaitmeninius įvesties / išvesties kaiščius. Atkreipkite dėmesį, kad mes taip pat turime valdyti variklio greitį, taigi varikliams valdyti turime naudoti „Arduino“ PWM kaiščius. Čia mes panaudojome kaiščius 8,9,10 ir 11.
# define LM_pos 9 // kairėje variklio # define LM_neg 8 // kairėje variklio # define RM_pos 10 // teisę variklio # define RM_neg 11 // teisę variklio # define joyX A2 # define joyY A3
Norėdami išmatuoti greitį ir nuvažiuotą atstumą, turime žinoti rato spindulį, išmatuoti vertę ir įvesti ją metrais, kaip parodyta žemiau. Mano roboto spindulys buvo 0,033 metrai, tačiau jis gali skirtis, atsižvelgiant į jūsų botą.
plūduriuojantis rato spindulys = 0,033; // Išmatuokite savo rato spindulį ir įveskite jį čia cm
Vykdydami sąrankos funkciją, mes inicijuojame visą vertę iki nulio, tada LCD ekrane rodome įvadinį tekstą. Mes taip pat inicializavome serijinį monitorių derinimo tikslais. Tada mes paminėjome, kad greičio jutikliai H206 yra prijungti prie 2 ir 3 kaiščių kaip išoriniai pertraukimai. Tuomet kada nors aptinkamas pertraukimas, atitinkamai bus vykdomos ISR funkcijos „ Left_ISR“ ir „ Right_ISR“ .
negaliojanti sąranka () { rotation = rpm = pevtime = 0; // Inicializuokite visus kintamuosius iki nulio Serial.begin (9600); lcd.begin (16, 2); // Pradėkite 16 * 2 LCD lcd.print („Bot Monitor“); // Įvadinė pranešimų eilutė 1 lcd.setCursor (0, 1); lcd.print ("- CircuitDigest"); // Intro Message line 2 delay (2000); lcd.clear (); lcd.print ("Lt: Rt:"); lcd.setCursor (0, 1); lcd.print ("S: D: A:"); pinMode (LM_pos, OUTPUT); pinMode (LM_neg, OUTPUT); pinMode (RM_pos, OUTPUT); pinMode (RM_neg, OUTPUT); „digitalWrite“ (LM_neg, LOW); „digitalWrite“ (RM_neg, LOW); attachInterrupt (digitalPinToInterrupt (2), kairysis_ISR, CHANGE); // Kairysis_ISR iškviečiamas, kai suveikia kairiojo rato jutiklis attachInterrupt (digitalPinToInterrupt (3), Right_ISR, CHANGE); // Right_ISR iškviečiamas, kai suveikia dešiniojo rato jutiklis }
„Left_ISR“ rutinoje mes tiesiog padidiname kintamąjį, pavadintą left_intr, kuris vėliau bus naudojamas matuojant roboto kampą. „Right_ISR“ viduje mes darome tą patį, bet tada papildomai čia apskaičiuojame ir greitį. Kiekvieno pertraukimo metu kintamasis sukimasis yra padidinamas, tada greičiui apskaičiuoti naudojama pirmiau pateikta logika.
negaliojantis Left_ISR () { left_intr ++; delsa (10); } negalioja Right_ISR () { right_intr ++; vėlavimas (10); sukimas ++; dtime = milis (); if (pasukimas> = 40) { timetaken = millis () - pevtime; // suimtas milisekais aps / min = (1000 / timetaken) * 60; // formulės aps./min pevtime = millis (); sukimas = 0; } }
Pagrindinės begalinės kilpos funkcijos viduje mes stebime X ir Y reikšmes iš vairasvirtės. Pagal vertę, jei vairasvirtė perkelta, mes atitinkamai valdome robotą. Boto greitis priklauso nuo to, kiek toli bus paspausta vairasvirtė.
int xValue = analogRead (džiaugsmasX); int yValue = analogRead (džiaugsmasY); int pagreitis = žemėlapis (xValue, 500, 0, 0, 200); if (xValue <500) { analogWrite (LM_pos, pagreitis); analogWrite (RM_pos, pagreitis); } else { analogWrite (LM_pos, 0); analogWrite (RM_pos, 0); } if (yValue> 550) analogWrite (RM_pos, 80); if (yValue <500) analogWrite (LM_pos, 100);
Tai padės vartotojui perkelti robotą ir patikrinti, ar gautos vertės yra tikėtinos. Galiausiai mes galime apskaičiuoti roboto greitį, atstumą ir kampą, naudodamiesi aukščiau pateikta logika, ir parodyti jį LCD, naudodami žemiau pateiktą kodą.
v = rato spindulys * aps / min * 0,104; //0.033 yra rato spindulys metru atstumu = (2 * 3,141 * rato spindulys) * (kairysis_intr / 40); int kampo_kairė = (left_intr% 360) * (90/80); int angle_right = (right_intr% 360) * (90/80); kampas = kampas_dešinėn - kampas_kairė; lcd.setCursor (3, 0); lcd.print (""); lcd.setCursor (3, 0); lcd.print (left_intr); lcd.setCursor (11, 0); lcd.print (""); lcd.setCursor (11, 0); lcd.print (right_intr); lcd.setCursor (2, 1); lcd.print (""); lcd.setCursor (2, 1); lcd.print (v); lcd.setCursor (9, 1); lcd.print (""); lcd.setCursor (9, 1); lcd.print (atstumas); lcd.setCursor (13, 1); lcd.print (""); lcd.setCursor (13, 1); lcd.print (kampas);
„Arduino“ roboto testavimas matuojant atstumą, greitį ir kampą
Kai jūsų aparatinė įranga bus paruošta, įkelkite kodą į „Arduino“ ir naudokite vairasvirtę norėdami perkelti robotą. boto greitis, jo įveiktas atstumas ir kampas bus rodomi skystųjų kristalų ekrane, kaip parodyta žemiau.
Skystųjų kristalų ekrane terminai Lt ir Rt reiškia atitinkamai kairio ir dešiniojo pertraukimo skaičių. Galite pastebėti, kad šios vertės didėja kiekvienam jutiklio aptiktam tarpui. Tem S nurodo roboto greitį m / sek, o terminas D - atstumą metrais. Boto kampas rodomas gale, kur 0 ° yra tiesi, ir neigiama, kai sukama prieš laikrodžio rodyklę, ir teigiama, kai sukama pagal laikrodžio rodyklę.
Taip pat galite žiūrėti vaizdo įrašą šio puslapio pabaigoje, kad suprastumėte, kaip veikia robotas. Tikiuosi, kad supratote projektą ir patiko jį kurti. Jei turite kokių nors klausimų, palikite juos komentarų skiltyje, ir aš stengsiuosi geriausiai atsakyti. Norėdami greitai gauti techninę pagalbą, taip pat galite naudoti forumus.