- Materiale necesare
- Se calculează viteza și se afișează pe vitezometru analog
- Diagrama circuitului și conexiunile
- Explicație de programare
Măsurarea vitezei / rpm-ului unui vehicul sau a unui motor a fost întotdeauna un proiect fascinant de încercat. În acest proiect, vom construi un vitezometru analogic folosind Arduino. Vom folosi modulul senzor IR pentru a măsura viteza. Există alte modalități / senzori pentru acest lucru, cum ar fi senzorul de hol pentru măsurarea vitezei, dar utilizarea unui senzor IR este ușoară, deoarece modulul senzor IR este un dispozitiv foarte comun și îl putem obține cu ușurință de pe piață și, de asemenea, poate fi utilizat pe orice tip de vehicul cu motor.
În acest proiect, vom arăta viteza atât în formă analogică, cât și digitală. Realizând acest proiect, ne vom îmbunătăți și abilitățile în învățarea motorului Arduino și Stepper, deoarece acest proiect implică utilizarea întreruperilor și cronometrelor. La sfârșitul acestui proiect, veți putea calcula viteza și distanțele parcurse de orice obiect rotativ și le puteți afișa pe un ecran LCD de 16x2 în format digital și, de asemenea, pe un contor analogic. Deci, să începem cu acest Vitezometru și Circuitul Odometrului cu Arduino
Materiale necesare
- Arduino
- Un motor pas cu pas bipolar (4 fire)
- Driver motor pas cu pas (modul L298n)
- Modul senzor IR
- Afisaj LCD 16 * 2
- Rezistor de 2.2k
- Conectarea firelor
- Breadboard.
- Alimentare electrică
- Imprimare imagine vitezometru
Se calculează viteza și se afișează pe vitezometru analog
Un senzor IR este un dispozitiv care poate detecta prezența unui obiect în fața acestuia. Am folosit două rotor cu lamă (ventilator) și am plasat senzorul IR lângă el în așa fel încât de fiecare dată când palele se rotesc, senzorul IR îl detectează. Apoi folosim ajutorul cronometrelor și întreruperilor din Arduino pentru a calcula timpul necesar unei rotații complete a motorului.
Aici, în acest proiect, am folosit întreruperea cu cea mai mare prioritate pentru a detecta rpm și l-am configurat în modul ascendent. Astfel, de fiecare dată când ieșirea senzorului scade LOW la High, funcția RPMCount () va fi executată. Și, deoarece am folosit două rotor cu lamă, înseamnă că funcția va fi numită de 4 ori într-o singură rotație.
Odată cunoscut timpul necesar, putem calcula RPM utilizând formulele de mai jos, unde 1000 / timpul luat ne va oferi RPS (revoluție pe secundă) și înmulțirea acestuia cu 60 vă va oferi RPM (revoluție pe minut)
rpm = (60/2) * (1000 / (milis () - timp)) * REV / bladesInFan;
După obținerea RPM, viteza poate fi calculată prin formula dată:
Viteza = rpm * (raza 2 * Pi *) / 1000
Știm că Pi = 3,14 și raza este de 4,7 inch
Dar mai întâi trebuie să convertim raza în metri de la inci:
raza = ((raza * 2,54) / 100,0) metri Viteza = rpm * 60,0 * (2,0 * 3,14 * raza) / 1000,0) în kilometri pe oră
Aici am înmulțit rpm cu 60 pentru a converti rpm în rph (revoluție pe oră) și împărțit la 1000 pentru a converti metri / oră în Kilometri / oră.
După ce avem viteză în kmh, putem afișa aceste valori direct pe ecranul LCD în formă digitală, dar pentru a afișa viteza în formă analogică, trebuie să mai facem un calcul pentru a afla nu. de pași, motorul pas cu pas trebuie să se deplaseze pentru a arăta viteza pe contorul analogic.
Aici am folosit un motor pas cu pas cu 4 fire bipolare pentru contorul analogic, care are 1,8 grade înseamnă 200 de pași pe rotație.
Acum trebuie să afișăm 280 Kmh pe vitezometru. Deci, pentru a afișa motorul pas cu pas de 280 Kmh trebuie să se deplaseze 280 de grade
Deci avem maxSpeed = 280
Și maxSteps va fi
maxSteps = 280 / 1,8 = 155 de pași
Acum avem o funcție în codul nostru Arduino și anume funcția de hartă care este utilizată aici pentru a mapa viteza în pași.
Pași = hartă (viteză, 0, maxSpeed , 0, maxSteps);
Așa că acum avem
pași = hartă (viteză, 0,280,0,155);
După calcularea pașilor, putem aplica direct acești pași în funcția motorului pas cu pas pentru a muta motorul pas cu pas. De asemenea, trebuie să avem grijă de pașii sau unghiul curent al motorului pas cu pas folosind calculele date
currSteps = Pași pași = currSteps-preSteps preSteps = currSteps
aici currSteps este pașii actuali care provin din ultimul calcul, iar preSteps sunt ultimii pași efectuați.
Diagrama circuitului și conexiunile
Diagrama circuitului pentru acest vitezometru analogic este simplă, aici am folosit LCD 16x2 pentru a arăta viteza în formă digitală și un motor pas cu pas pentru a roti acul vitezometrului analogic.
16x2 LCD este conectat la următorii pini analogici ai Arduino.
RS - A5
RW - GND
EN - A4
D4 - A3
D5 - A2
D6 - A1
D7 - A0
Un rezistor de 2,2 k este utilizat pentru a seta luminozitatea ecranului LCD. Un modul senzor IR, care este utilizat pentru a detecta lama ventilatorului pentru a calcula rpm, este conectat pentru a întrerupe 0 înseamnă pinul D2 al Arduino.
Aici am folosit un driver de motor pas cu pas și anume modulul L293N. Pinul IN1, IN2, IN3 și IN4 al driverului motorului pas cu pas este conectat direct la D8, D9, D10 și D11 din Arduino. Restul conexiunilor sunt date în Diagrama circuitului.
Explicație de programare
Codul complet pentru Arduino Speedomete r este dat la sfârșit, aici explicăm câteva părți importante ale acestuia.
În partea de programare, am inclus toate bibliotecile necesare, cum ar fi biblioteca cu motor pas cu pas, biblioteca LCD LiquidCrystal și pini declarați pentru acestea.
#include
După aceasta, am luat câteva variabile și macrocomenzi pentru efectuarea calculelor. Calculele sunt deja explicate în secțiunea anterioară.
octet volatil REV; rpm lunar nesemnat, RPM; st lung nesemnat = 0; mult timp nesemnat; int ledPin = 13; int led = 0, RPMlen, prevRPM; int flag = 0; int flag1 = 1; #define bladesInFan 2 float radius = 4,7; // inch int preSteps = 0; float stepAngle = 360.0 / (float) stepsPerRevolution; float minSpeed = 0; float maxSpeed = 280,0; float minSteps = 0; float maxSteps = maxSpeed / stepAngle;
După aceasta, inițializăm LCD, Serial, întrerupere și motorul Stepper în funcția de configurare
void setup () { myStepper.setSpeed (60); Serial.begin (9600); pinMode (ledPin, OUTPUT); lcd.inceput (16,2); lcd.print ("Vitezometru"); întârziere (2000); attachInterrupt (0, RPMCount, RISING); }
După aceasta, citim funcția rpm în buclă și efectuăm un calcul pentru a obține viteza și transformăm aceasta în pași pentru a rula motorul pas cu pas pentru a arăta viteza în formă analogică.
bucla void () { readRPM (); raza = ((raza * 2,54) / 100,0); // convergerea în metru int Viteza = ((float) RPM * 60,0 * (2,0 * 3,14 * raza) /1000,0); // RPM în 60 de minute, diametrul anvelopei (2pi r) r este raza, 1000 pentru a converti în km int Pași = hartă (Viteză, 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 ("Viteză:"); lcd.print (Speed); lcd.print („Km / h”); steag1 = 0; } int currSteps = Pași;int steps = currSteps-preSteps; preSteps = currSteps; myStepper.step (pași); }
Aici avem funcția reapRPM () pentru a calcula RPM.
int readRPM () { if (REV> = 10 sau millis ()> = st + 1000) // VA ACTUALIZA AFETR LA FIECARE 10 CITURI sau 1 secundă inactiv { if (flag == 0) flag = 1; rpm = (60/2) * (1000 / (milis () - timp)) * REV / bladesInFan; timp = milis (); REV = 0; int x = rpm; while (x! = 0) { x = x / 10; RPMlen ++; } Serial.println (rpm, DEC); RPM = rpm; întârziere (500); st = milis (); steag1 = 1; } }
În cele din urmă, avem rutina de întrerupere care este responsabilă pentru măsurarea revoluției obiectului
void RPMCount () { REV ++; if (led == LOW) { led = HIGH; } else { led = LOW; } digitalWrite (ledPin, led); }
Acesta este modul în care puteți construi pur și simplu un vitezometru analogic folosind Arduino. Acest lucru poate fi, de asemenea, construit folosind senzorul Hall și viteza poate fi afișată pe telefonul inteligent, urmați acest tutorial Arduino Speedometer pentru același lucru.