- Reikalingos medžiagos
- Greičio apskaičiavimas ir rodymas analoginiame spidometre
- Grandinės schema ir jungtys
- Programavimo paaiškinimas
Transporto priemonės ar variklio greičio / apsisukimų dažnio matavimas visada buvo įdomus projektas. Šiame projekte mes ketiname pastatyti analoginį spidometrą naudodami „Arduino“. Greičio matavimui naudosime IR jutiklio modulį. Tam yra ir kitų būdų / jutiklių, pavyzdžiui, salės jutiklis greičiui matuoti, tačiau naudoti IR jutiklį yra nesudėtinga, nes IR jutiklio modulis yra labai paplitęs prietaisas ir jį galime lengvai gauti iš rinkos, be to, jį galima naudoti bet kokio tipo motorinė transporto priemonė.
Šiame projekte mes parodysime greitį tiek analogine, tiek skaitmenine forma. Vykdydami šį projektą, mes taip pat patobulinsime savo įgūdžius mokytis „ Arduino“ ir „Stepper motor“, nes šis projektas apima pertraukiklių ir laikmačių naudojimą. Šio projekto pabaigoje galėsite apskaičiuoti bet kurio besisukančio objekto įveikiamą greitį ir atstumus bei juos parodyti 16x2 LCD ekrane skaitmeniniu formatu ir analoginiame matuoklyje. Taigi pradėkime nuo šios spidometro ir odometro grandinės su „Arduino“
Reikalingos medžiagos
- Arduino
- Bipolinis žingsninis variklis (4 laidai)
- Žingsninio variklio tvarkyklė (L298n modulis)
- IR jutiklio modulis
- 16 * 2 LCD ekranas
- 2.2k rezistorius
- Jungiamieji laidai
- Bandomoji Lenta.
- Maitinimo šaltinis
- Spidometro paveikslėlis
Greičio apskaičiavimas ir rodymas analoginiame spidometre
IR jutiklis yra prietaisas, galintis aptikti prieš jį esančio objekto buvimą. Mes panaudojome du ašmenų rotorius (ventiliatorius) ir įdėjome IR jutiklį šalia jo taip, kad kaskart, kai ašmenys suktųsi, IR jutiklis jį aptinka. Tada mes naudojame laikmačių ir pertraukimų pagalbą „Arduino“, kad apskaičiuotume laiką, kurį reikia vienam varikliui sukti.
Šiame projekte mes naudojome aukščiausio prioriteto pertraukimą, kad aptiktume apsukas ir sukonfigūravome jį kylančiu režimu. Taigi, kai jutiklio išvestis pereis nuo LOW iki High, bus vykdoma funkcija RPMCount () . Kadangi mes panaudojome du ašmenų rotorius, tai reiškia, kad funkcija bus sukviečiama 4 kartus per vieną apsisukimą.
Kai bus žinomas laikas, mes galėsime apskaičiuoti RPM, naudodami toliau pateiktas formules. Kur 1000 / užimtas laikas suteiks mums RPS (apsisukimas per sekundę), o padauginus iš 60, gausime RPM (apsisukimas per minutę)
aps./min = (60/2) * (1000 / (milis () - laikas)) * REV / peiliukaiInFan;
Gavus RPM, greitį galima apskaičiuoti pagal pateiktą formulę:
Greitis = aps / min * (2 * Pi * spindulys) / 1000
Mes žinome, kad Pi = 3,14, o spindulys yra 4,7 colio
Bet pirmiausia turime konvertuoti spindulį į metrus nuo colių:
spindulys = ((spindulys * 2,54) / 100,0) metrai Greitis = aps / min * 60,0 * (2,0 * 3,14 * spindulys) / 1000,0) kilometrais per valandą
Čia mes padauginome apsukas per minutę iš 60, kad paverstume apsisukimus per minutę į apsisukimus per valandą, ir padalijome iš 1000, kad konvertuotume metrus / valandą į kilometrus / val.
Turėdami greitį kmh, galime šias vertes rodyti tiesiai per skystųjų kristalų ekraną skaitmenine forma, tačiau norėdami parodyti greitį analogine forma, turime atlikti dar vieną skaičiavimą, kad sužinotume ne. žingsnių, žingsninis variklis turėtų judėti, kad būtų rodomas greitis analoginiame matuoklyje.
Analoginiam skaitikliui naudojome 4 laidų bipolinį žingsninį variklį, kurio 1,8 laipsnio reikšmė - 200 žingsnių per apsisukimą.
Dabar spidometre turime parodyti 280 Kmh. Taigi norint parodyti 280 Kmh žingsninį variklį reikia judėti 280 laipsnių kampu
Taigi turime maxSpeed = 280
Ir maxSteps bus
maxSteps = 280 / 1,8 = 155 žingsniai
Dabar „Arduino“ kode turime funkciją, būtent žemėlapio funkciją, kuri čia naudojama greičiui suskirstyti į žingsnius.
Žingsniai = žemėlapis (greitis, 0, maxSpeed , 0, maxSteps);
Taigi dabar mes turime
žingsniai = žemėlapis (greitis, 0,280,0, 155);
Apskaičiavę žingsnius, šiuos žingsnius galime tiesiogiai pritaikyti žingsninio variklio funkcijoje, kad judintumėte žingsninį variklį. Naudodamiesi pateiktais skaičiavimais, mes taip pat turime pasirūpinti dabartiniais žingsninio variklio žingsniais ar kampu
currSteps = žingsniai žingsniai = currSteps-preSteps preSteps = currSteps
čia currSteps yra dabartiniai žingsniai, atliekami atlikus paskutinį skaičiavimą, o preSteps yra paskutiniai atlikti žingsniai.
Grandinės schema ir jungtys
Šio analoginio spidometro schema yra paprasta, čia mes naudojome 16x2 LCD, kad parodytume greitį skaitmenine forma, ir žingsninį variklį, kad pasuktumėte analoginio spidometro adatą.
16x2 LCD yra prijungtas prie šių analogiškų „Arduino“ kaiščių.
RS - A5
RW - GND
LT - A4
D4 - A3
D5 - A2
D6 - A1
D7 - A0
LCD ryškumui nustatyti naudojamas 2,2k rezistorius. IR jutiklio modulis, naudojamas ventiliatoriaus ašmenims aptikti, norint apskaičiuoti apsisukimus, yra prijungtas prie pertraukimo 0 reiškia „Arduino“ D2 kaištį.
Čia mes naudojome žingsninio variklio tvarkyklę, būtent L293N modulį. IN1, IN2, IN3 ir IN4 žingsninio variklio tvarkyklės kaiščiai yra tiesiogiai prijungti prie „Arduino“ D8, D9, D10 ir D11. Likusi jungčių dalis pateikiama grandinės diagramoje.
Programavimo paaiškinimas
Pabaigoje pateikiamas pilnas „Arduino Speedomete r“ kodas, čia mes paaiškiname keletą svarbių jo dalių.
Į programavimo dalį įtraukėme visas reikalingas bibliotekas, tokias kaip „stepper motor library“, „LiquidCrystal LCD“ biblioteka, ir deklaravome joms skirtus kaiščius.
# įtraukti
Po to skaičiavimams atlikti paėmėme keletą kintamųjų ir makrokomandų. Skaičiavimai jau paaiškinti ankstesniame skyriuje.
lakus baitas REV; nepasirašytas ilgas int rpm, RPM; nepasirašytas ilgas st = 0; nepasirašytas ilgas laikas; int ledPin = 13; int led = 0, RPMlen, prevRPM; int vėliava = 0; int vėliava1 = 1; #define BladesInFan 2 plūdės spindulys = 4,7; // colių int preSteps = 0; float stepAngle = 360.0 / (float) stepsPerRevolution; plukdyti minSpeed = 0; plūdė maxSpeed = 280,0; plukdyti minSteps = 0; plūdė maxSteps = maxSpeed / stepAngle;
Po to nustatymo funkcijoje inicijuojame LCD, nuoseklųjį, pertraukiamąjį ir „Stepper“ variklį
negaliojanti sąranka () { myStepper.setSpeed (60); Serijos pradžia (9600); pinMode (ledPin, OUTPUT); lcd.prade (16,2); lcd.print („Spidometras“); vėlavimas (2000); attachInterrupt (0, RPMCount, RISING); }
Po to mes perskaitėme apsisukimų skaičių per ciklo funkciją ir atlikome skaičiavimą, kad gautume greitį, ir paverčiame tai žingsniais, kad paleistumėte žingsninį variklį, kad greitis būtų rodomas analogine forma.
void loop () { readRPM (); spindulys = ((spindulys * 2,54) / 100,0); // konvertavimas metrais int Speed = ((float) RPM * 60.0 * (2.0 * 3.14 * spindulys) / 1000.0); // RPM per 60 minučių, padangos skersmuo (2pi r) r yra spindulys, 1000 konvertuoti km int žingsniai = žemėlapis (greitis, minSpeed, maxSpeed, minSteps, maxSteps); if (flag1) { Serial.print (Speed); Serial.println („Kmh“); lcd.setCursor (0,0); lcd.print ("RPM:"); lcd.print (RPM); lcd.print (""); lcd.setCursor (0,1); lcd.print ("Greitis:"); lcd.print (greitis); lcd.print („Km / h“); vėliava1 = 0; } int currSteps = Žingsniai;int žingsniai = currSteps-preSteps; preSteps = currSteps; myStepper.step (žingsniai); }
Čia mes turime reapRPM () funkciją, kad apskaičiuotume RPM.
int readRPM () { if (REV> = 10 arba milis ()> = st + 1000) // ATNAUJINS AFETR KAS 10 SKAITYMŲ arba 1 sekundę tuščiąja eiga { if (flag == 0) flag = 1; aps./min = (60/2) * (1000 / (milis () - laikas)) * REV / peiliukaiInFan; laikas = milis (); REV = 0; int x = aps / min; o (x! = 0) { x = x / 10; RPMlen ++; } Serial.println (aps./min., DEC); RPM = aps / min; vėlavimas (500); st = milis (); vėliava1 = 1; } }
Galiausiai mes nutraukėme rutiną, kuri yra atsakinga už objekto apsisukimų matavimą
negaliojantis RPMCount () { REV ++; jei (vedė == ŽEMAI) { vedė = AUKŠTAS; } dar { vedė = LOW; } digitalWrite (ledPin, led); }
Taip galite paprasčiausiai susikurti analoginį spidometrą naudodami „Arduino“. Tai taip pat galima sukurti naudojant „Hall“ jutiklį, o greitis gali būti rodomas išmaniajame telefone. Vykdykite tą patį „Arduino“ spidometro pamoką.