- Modul snímača rýchlosti LM393 (H206)
- Montážne usporiadanie snímača H206
- DIY Arduino LM393 Schéma zapojenia snímača rýchlosti robota
- Logika merania rýchlosti s modulom snímača rýchlosti LM393
- Logika za meraním vzdialenosti prejdenej kolesom
- Logika za meraním uhla robota
- Arduino Robot Code
- Testovanie robota Arduino na meranie vzdialenosti, rýchlosti a uhla
Roboti sa pomaly začali plaziť do našej spoločnosti, aby nám uľahčili život. Na cestách vo Veľkej Británii už nájdeme šesť kolesových robotov na rozvoz jedla z Hviezdnej lode, ktoré inteligentne navigujú medzi civilistami, aby dosiahli cieľ. Každý mobilný robot, ktorý naviguje do prostredia, by si mal vždy uvedomovať svoju polohu a orientáciu vzhľadom na skutočný svet. Existuje mnoho spôsobov, ako to dosiahnuť použitím rôznych technológií, ako sú GPS, RF triangulácia, akcelerometre, gyroskopy atď. Každá technika má svoju vlastnú výhodu a je sama o sebe jedinečná. V tomto návode na meranie rýchlosti Arduino LM393 použijeme jednoduchý a ľahko dostupný modul snímača rýchlosti LM393na meranie niektorých dôležitých parametrov, ako sú rýchlosť, prejdená vzdialenosť a uhol robota pomocou Arduina. Vďaka týmto parametrom bude robot schopný poznať svoj skutočný stav v reálnom svete a môže ho pomocou neho bezpečne navigovať.
Arduino je najobľúbenejšou voľbou medzi amatérskymi robotmi na stavbu robotov, od jednoduchého sledovača liniek po zložitejšieho samovyvažovacieho robota alebo robota na čistenie podláh. Všetky druhy robotov môžete skontrolovať v sekcii Robotika.
Postavíme malého robota, ktorý je napájaný lítiovou batériou, a poháňame ho pomocou joysticku. Počas behu môžeme merať rýchlosť, vzdialenosť a uhol robota a zobrazovať ho v reálnom čase na LCD displeji pripojenom k Arduinu. Tento projekt vám pomôže s meraním týchto parametrov. Po dokončení môžete tieto parametre podľa potreby použiť na samostatnú obsluhu robota. Znie to zaujímavo, že? Tak poďme na to.
Modul snímača rýchlosti LM393 (H206)
Predtým, ako sa dostaneme do schémy zapojenia a kódu projektu, porozumieme modulu snímača rýchlosti LM393, ktorý hrá v projekte zásadnú úlohu. Modul snímača rýchlosti H206 sa skladá zo snímača infračerveného svetla integrovaného s integrovaným obvodom komparátora napätia LM393, preto sa volá snímač otáčok LM393. Modul tiež pozostáva z mriežkovej dosky, ktorá musí byť pripevnená k otočnému hriadeľu motora. Všetky komponenty sú označené na obrázku nižšie.
Snímač infračerveného svetla sa skladá z IR LED a fototranzistor oddelená malým výrečnosti. Celé usporiadanie snímačov je umiestnené v čiernom kryte, ako je to znázornené vyššie. Mriežková doska sa skladá zo štrbín, doštička je umiestnená medzi medzerou senzora infračerveného svetla tak, aby senzor snímal medzery v mriežkovej doske. Každá medzera v mriežkovej doske spúšťa pri prechode medzerou infračervený senzor; tieto spúšťače sa potom prevedú na napäťové signály pomocou komparátora. Komparátor nie je nič iné ako IC LM393 od ON polovodičov. Modul má tri piny, z ktorých dva slúžia na napájanie modulu a jeden výstupný pin slúži na počítanie počtu spúšťačov.
Montážne usporiadanie snímača H206
Montáž týchto typov senzorov je trochu zložitá. Môže byť namontovaný iba na motory, ktoré majú na oboch stranách vyčnievajúci hriadeľ. Jedna strana hriadeľa je spojená s kolesom, zatiaľ čo druhá strana sa používa na namontovanie mriežkovej dosky, ako je to znázornené vyššie.
Pretože koleso a doska sú spojené s rovnakým hriadeľom, obe sa otáčajú rovnakou rýchlosťou, a teda meraním rýchlosti dosky môžeme merať rýchlosť kolesa. Uistite sa, že medzery v mriežkovej doske prechádzajú infračerveným snímačom, až potom bude snímač schopný spočítať počet medzier, ktoré prešli. Môžete tiež prísť s vlastným mechanickým usporiadaním na namontovanie snímača, pokiaľ to vyhovuje stanoveným podmienkam. IR senzor sa zvyčajne používa v mnohých projektoch robotiky na vedenie robota okolo prekážok.
Mriežková doska zobrazená vyššie má 20 slotov (mriežky). To znamená, že senzor nájde 20 medzier na jedno úplné otočenie kolesa. Počítaním počtu medzier, ktoré snímač zistil, môžeme vypočítať vzdialenosť prejdenú kolesom, podobne ako zmeraním toho, ako rýchlo snímač zistí medzery, môžeme zistiť rýchlosť kolesa. V našom robote budeme mať tento snímač namontovaný na oboch kolesách, a preto nájdeme tiež uhol robota. Uhol otočenia sa však dá rozumnejšie vypočítať pomocou akcelerometra alebo gyroskopu, tu sa naučte prepojiť akcelerometer a gyroskop s Arduinom a skúsme pomocou nich zmerať uhol rotácie.
DIY Arduino LM393 Schéma zapojenia snímača rýchlosti robota
Kompletná schéma zapojenia tohto robota so snímaním rýchlosti a vzdialenosti je uvedená nižšie. Bot sa skladá z Arduino Nano ako jeho mozgu, dva jednosmerné motory kolies sú poháňané modulom L298N H-Bridge Motor Driver. Joystick slúži na ovládanie rýchlosti a smeru robota a dva snímače rýchlosti H206 sa používajú na meranie rýchlosti, vzdialenosti a anjela robota. Namerané hodnoty sa potom zobrazia na 16x2 LCD module. Potenciometer pripojený k LCD sa môže použiť na nastavenie kontrastu LCD a odpor sa používa na obmedzenie prúdu tečúceho do podsvietenia LCD.
Kompletný obvod je napájaný 7,4 lítiového článku. Toto 7,4 V je napájané na 12V kolík modulu budiča motora. Regulátor napätia na module budiča motora potom prevádza napätie 7,4 V na regulovaných + 5 V, ktoré sa používajú na napájanie Arduina, LCD, senzorov a joysticku.
Motor je ovládaný digitálnymi pinmi 8,9,10 a 11 Arduina. Pretože je tiež potrebné regulovať rýchlosť motora, mali by sme dodávať signály PWM na kladnú svorku motora. Preto máme kolíky 9 a 10, ktoré sú obidva kolíky schopné PWM. Hodnoty X a Y z joysticku sa načítajú pomocou analógových pinov A2 a A3.
Ako vieme, snímač H206 s generuje spúšť, keď sa zistí medzera v mriežkovej doske. Pretože tieto spúšťače by sa nemali vždy čítať presne, aby sa mohla vypočítať správna rýchlosť a vzdialenosť, obidva spúšťacie (výstupné) piny sú pripojené k pinom 2 a 3 externého prerušenia na doske Arduino. Zostavte celý okruh na šasi a namontujte snímač rýchlosti, ako bolo vysvetlené, môj robot vyzeral po dokončení pripojení asi ako dole. Môžete si tiež pozrieť video na konci tejto stránky, aby ste zistili, ako bol snímač namontovaný.
Teraz, keď je hardvérová časť dokončená, poďme sa dostať k logike toho, ako budeme merať rýchlosť, vzdialenosť a jednotlivé body robota, a potom pokračovať do programovacej časti.
Logika merania rýchlosti s modulom snímača rýchlosti LM393
Z nastavenia pre montáž snímača by ste si mali uvedomiť, že modul snímača rýchlosti LM393 (H206) meria iba medzery v mriežkovej doske. Pri montáži by ste sa mali ubezpečiť, že koleso (ktorého rýchlosť by sa mala merať) a mriežka sa otáčajú rovnakou rýchlosťou. Rovnako ako tu, keďže sme koleso aj dosku namontovali na jeden hriadeľ, budú sa evidentne otáčať rovnakou rýchlosťou.
V našom nastavení sme namontovali dva senzory pre každé koleso na meranie uhla robota. Ak je ale vaším cieľom merať iba rýchlosť a vzdialenosť, môžeme snímač namontovať na jedno koleso. Výstup zo snímača (spúšťacie signály) bude najčastejšie pripojený k externému prerušovaciemu kolíku mikrokontroléra. Zakaždým, keď sa zistí medzera v mriežkovej doske, spustí sa prerušenie a vykoná sa kód v ISR (rutina služby prerušenia). Ak dokážeme vypočítať časový interval medzi dvoma takými spúšťačmi, môžeme vypočítať rýchlosť kolesa.
V Arduine môžeme tento časový interval ľahko vypočítať pomocou funkcie millis () . Táto funkcia millis sa bude zvyšovať o 1 za každú milisekundu od okamihu zapnutia zariadenia. Takže keď dôjde k prvému prerušeniu, môžeme uložiť hodnotu millis () do fiktívnej premennej (ako napríklad pevtime v tomto kóde) a potom, keď dôjde k druhému prerušeniu, môžeme vypočítať čas potrebný odpočítaním hodnoty pevtime od millis ().
Doba potrebná = aktuálny čas - skorší čas timetaken = Millis () - pevtime ; // naplánovaný v milisekundách
Po vypočítaní času môžeme jednoducho vypočítať hodnotu otáčok za minútu pomocou nasledujúcich vzorcov, kde (1 000 / čas) dáva RPS (otáčky za sekundu) a vynásobí sa 60 na prevod RPS na RPM (otáčky za minútu).
ot./min = (1 000 / časový rozvrh) * 60;
Po výpočte otáčok môžeme vypočítať rýchlosť vozidla pomocou nasledujúcich vzorcov za predpokladu, že poznáme polomer kolesa.
Rýchlosť = 2π × RPS × polomer kolesa. v = polomer_kolo * rpm * 0,104
Vyššie uvedený vzorec slúži na výpočet rýchlosti v m / s. Ak chcete počítať v km / h, nahraďte 0,0104 číslom 0,376. Ak vás zaujíma, ako bola získaná hodnota 0,104, skúste zjednodušiť vzorec V = 2π × RPS × polomer kolesa.
Rovnaká technika sa používa aj v prípade, že sa na meranie rýchlosti rotujúceho objektu používa Hallov snímač. Ale pre snímač H206 je tu zachytenie, mriežková doska má 20 štrbín, a preto na meranie času medzi dvoma štrbinami štrbiny preťaží mikrokontrolér. Preto meriame rýchlosť iba pri úplnom otočení kolesa. Pretože sa pre každú medzeru vygenerujú dve prerušenia (jedno na začiatku a druhé na konci medzery) , dostaneme celkovo 40 prerušení, aby koleso vykonalo jednu úplnú rotáciu. Počkáme teda na 40 prerušení, kým skutočne vypočítame rýchlosť kolesa. Kód rovnakého kódu je uvedený nižšie
if (rotácia> = 40) { timetaken = millis () - pevtime; // časovo rozvrhnutý v milisekundách rpm = (1000 / časovo rozvrhnutý) * 60; // vzorce na výpočet rpm pevtime = millis (); rotácia = 0; }
Ďalšou nevýhodou tejto metódy je, že hodnota rýchlosti neklesne na nulu, pretože prerušenie bude vždy čakať na to, kým koleso dokončí jednu rotáciu na výpočet hodnoty otáčok. Túto nevýhodu je možné ľahko prekonať pridaním jednoduchého kódu, ktorý monitoruje časový interval medzi dvoma prerušeniami, a ak presahuje normálne hodnoty, môžeme vynútiť hodnotu rpm a rýchlosti na nulu. Prepojením v nižšie uvedenom kóde sme použili premennú dtime na kontrolu rozdielu v čase, a ak prekročí 500 milisekúnd, hodnota rýchlosti a otáčok je vynútená na nulu.
/ * K poklesu na nulu, ak sa vozidlo zastavilo * / if (millis () - dtime> 500) // počas 500ms nebol nájdený žiadny prerušovač { rpm = v = 0; // urobit rpm a rychlost ako nulu dtime = millis (); }
Logika za meraním vzdialenosti prejdenej kolesom
Už vieme, že Arduino vycíti 40 prerušení, keď koleso vykoná jednu úplnú rotáciu. Takže pri každej jednej rotácii vykonanej kolesom je zrejmé, že vzdialenosť prejdená kolesom sa rovná obvodu kolesa. Pretože už poznáme polomer kolesa, môžeme ľahko vypočítať prekonanú vzdialenosť pomocou nasledujúceho vzorca
Vzdialenosť = 2πr * počet otáčok vzdialenosť = (2 * 3,141 * polomer_kolesa) * (left_intr / 40)
Ak sa obvod kolesa vypočíta pomocou vzorca 2πr, potom sa vynásobí počtom otáčok kolesa.
Logika za meraním uhla robota
Existuje mnoho spôsobov, ako určiť anjela robota. Na stanovenie týchto hodnôt sa zvyčajne používajú akcelerometre a gyroskopy. Ďalším lacným prístupom je ale použitie snímača H206 na oboch kolesách. Takto by sme vedeli, koľko zákrut má každé koleso. Na nasledujúcom obrázku je znázornené, ako sa uhol počíta.
Keď je robot inicializovaný, uhol, proti ktorému stojí, sa považuje za 0 °. Odtiaľ sa otáča doľava, uhol sa zvýši záporne a ak sa otočí doprava, anjel sa zvýši o kladné. Pre pochopenie zvážme rozsah -90 až +90, ako je to znázornené na obrázku. V takomto usporiadaní, pretože obe kolesá majú rovnaký priemer, ak ktorékoľvek z kolies vykoná úplné otočenie, otočíme robot o 90 °.
Napríklad ak ľavé koleso vykoná jednu úplnú rotáciu (80 prerušení), potom sa robot otočí o 90 ° doľava a podobne, ak pravé koleso vykoná jedno úplné otočenie (80 prerušení), potom sa robot otočí o 90 ° doprava. Teraz vieme, že ak Arduino detekuje 80 prerušení na jednom kolese, potom sa robot otočil o 90 ° a na základe ktorého kolieska zistíme, či sa robot otočil kladným (vpravo) alebo záporným (vľavo). Ľavý a pravý uhol teda možno vypočítať pomocou nasledujúcich vzorcov
int angle_left = (left_intr% 360) * (90/80); int angle_right = (right_intr% 360) * (90/80);
Pri 90 je uhol zakrytý pri prerušení 80. Výsledná hodnota je vynásobený počtom prerušení. Použili sme tiež modul 360, aby výsledná hodnota nikdy nepresiahla 36. Keď sme vypočítali ľavý aj pravý uhol, efektívny uhol, pod ktorým je robot otočený, je možné jednoducho získať odpočítaním ľavého uhla od pravého uhla.
uhol = uhol_vpravo - uhol_vľavo;
Arduino Robot Code
Kompletný Arduino kód pre tohto robota na meranie rýchlosti a uhla nájdete na konci tejto stránky. Cieľom programu je vypočítať rýchlosť, vzdialenosť a uhol robota pomocou vyššie uvedenej logiky a zobraziť ju na obrazovke LCD. Okrem toho by mal poskytovať možnosť ovládať robota pomocou joysticku.
Program začneme definovaním pinov digitálnych I / O pre dva motory. Nezabudnite, že musíme tiež ovládať rýchlosť motora, a preto na ovládanie motorov musíme používať piny PWM na Arduine. Tu sme použili kolík 8,9,10 a 11.
#define LM_pos 9 // ľavý motor #define LM_neg 8 // ľavý motor #define RM_pos 10 // pravý motor #define RM_neg 11 // pravý motor #define joyX A2 #define joyY A3
Na meranie prekonanej rýchlosti a vzdialenosti potrebujeme poznať polomer kolesa, zmerať hodnotu a zadať ju v metroch, ako je to znázornené nižšie. Pre môjho robota bol polomer 0,033 metra, ale mohol by sa pre vás líšiť na základe vášho robota.
float radius_of_wheel = 0,033; // Zmerajte polomer svojho kolesa a zadajte ho tu v cm
Vnútri nastavenie funkcie, sme inicializovať všetky hodnoty za nulové a potom zobrazí textovú Intro na displeji. Inicializovali sme tiež sériový monitor na účely ladenia. Potom sme spomenuli, že snímače rýchlosti H206 sú pripojené k pinom 2 a 3 ako externé prerušenia. To je miesto, kde sa kedykoľvek zistí prerušenie, podľa toho sa vykoná funkcia ISR Left_ISR a Right_ISR .
void setup () { rotation = rpm = pevtime = 0; // Inicializuje všetky premenné na nulu Serial.begin (9600); lcd.začiatok (16, 2); // Inicializácia 16 * 2 LCD lcd.print ("Bot Monitor"); // Úvod Riadok správy 1 lcd.setCursor (0, 1); lcd.print ("- CircuitDigest"); // Úvod oneskorenia riadku správy 2 (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), Left_ISR, CHANGE); // Left_ISR sa volá, keď sa aktivuje snímač ľavého kolesa attachInterrupt (digitalPinToInterrupt (3), Right_ISR, CHANGE); // Right_ISR sa vyvolá, keď je aktivovaný senzor pravého kolesa }
Vo vnútri rutiny Left_ISR jednoducho zvýšime premennú nazvanú left_intr, ktorá sa neskôr použije na meranie uhla robota. Vo vnútri Right_ISR robíme to isté, ale potom tu tiež vypočítame rýchlosť. Premenlivá rotácia sa zvyšuje pre každé prerušenie a potom sa na výpočet rýchlosti použije vyššie uvedená logika.
void Left_ISR () { left_intr ++; delay (10); } void Right_ISR () { right_intr ++; oneskorenie (10); rotácia ++; dtime = millis (); if (rotácia> = 40) { timetaken = millis () - pevtime; // časovo rozvrhnutý v milisekundách rpm = (1000 / časovo rozvrhnutý) * 60; // vzorce na výpočet rpm pevtime = millis (); rotácia = 0; } }
Vo vnútri hlavnej funkcie nekonečnej slučky sledujeme hodnoty X a Y pomocou joysticku. Na základe hodnoty, ak sa pohne joystickom, robota zodpovedajúcim spôsobom ovládame. Rýchlosť robota závisí od toho, ako ďaleko je joystick zatlačený.
int xValue = analogRead (joyX); int yValue = analogRead (joyY); int akcelerácia = mapa (xValue, 500, 0, 0, 200); if (xValue <500) { analogWrite (LM_pos, acceleration); analogWrite (RM_pos, zrýchlenie); } else { analogWrite (LM_pos, 0); analogWrite (RM_pos, 0); } if (yValue> 550) analogWrite (RM_pos, 80); if (yValue <500) analogWrite (LM_pos, 100);
To pomôže používateľovi presunúť robota a skontrolovať, či sú získané hodnoty podľa očakávania. Nakoniec môžeme pomocou vyššie uvedenej logiky vypočítať rýchlosť, vzdialenosť a uhol robota a pomocou nižšie uvedeného kódu ho zobraziť na LCD displeji.
v = polomer_kolo * rpm * 0,104; //0.033 je polomer kolesa v metrickej vzdialenosti = (2 * 3,141 * polomer_kolesa) * (left_intr / 40); int angle_left = (left_intr% 360) * (90/80); int angle_right = (right_intr% 360) * (90/80); uhol = uhol_vpravo - uhol_vľavo; 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 (vzdialenosť); lcd.setCursor (13, 1); lcd.print (""); lcd.setCursor (13, 1); lcd.print (uhol);
Testovanie robota Arduino na meranie vzdialenosti, rýchlosti a uhla
Keď je váš hardvér pripravený, nahrajte kód do svojho Arduina a pomocou joysticku presuňte robota. rýchlosť robota, ním prekonaná vzdialenosť a uhol sa zobrazia na LCD displeji, ako je to znázornené nižšie.
Na LCD pojem Lt a Rt predstavuje počet prerušení vľavo, respektíve počet prerušení vľavo. Tieto hodnoty sa postupne zvyšujú pre každú medzeru zistenú senzorom. Tem S označuje rýchlosť robota vm / s a výraz D označuje vzdialenosť prekonanú v metroch. Uhol robota je zobrazený na konci, kde 0 ° je pre priamy smer a je negatívny pre rotáciu proti smeru hodinových ručičiek a kladný pre rotáciu v smere hodinových ručičiek.
Môžete si tiež pozrieť video na konci tejto stránky, aby ste pochopili, ako robot funguje. Dúfam, že ste pochopili projekt a páčilo sa vám jeho zostavenie. Ak máte akékoľvek obavy, nechajte ich v sekcii komentárov a pokúsim sa čo najlepšie odpovedať späť. Môžete tiež použiť fóra na rýchlu technickú pomoc.