- Szczelinowy optyczny moduł czujnika prędkości LM-393 na podczerwień
- Pomiar prędkości i przebytej odległości w celu obliczenia opłaty
Obecnie liczniki cyfrowe zastępują liczniki analogowe w każdym sektorze, czy to licznik energii elektrycznej, czy licznik opłat za taksówki. Głównym powodem tego jest to, że mierniki analogowe mają części mechaniczne, które zużywają się podczas długotrwałego użytkowania i nie są tak dokładne jak mierniki cyfrowe.
Dobrym przykładem jest analogowy prędkościomierz i licznik kilometrów, które są używane w starych motocyklach do pomiaru prędkości i przebytej odległości. Mają specjalne części zwane zębatką i układem zębatkowym, w których kabel służy do obracania sworznia prędkościomierza podczas obracania koła. Zużyje się podczas długotrwałego użytkowania, a także wymaga wymiany i konserwacji.
W liczniku cyfrowym, zamiast używać części mechanicznych, do obliczania prędkości i odległości wykorzystuje się niektóre czujniki, takie jak przerywacz optyczny lub czujnik Halla. Jest to dokładniejsze niż mierniki analogowe i nie wymaga żadnej konserwacji przez długi okres czasu. Wcześniej stworzyliśmy wiele projektów cyfrowych prędkościomierzy wykorzystujących różne czujniki:
- DIY Prędkościomierz za pomocą Arduino i aplikacji do przetwarzania danych na Androida
- Cyfrowy prędkościomierz i obwód drogomierza za pomocą mikrokontrolera PIC
- Pomiar prędkości, odległości i kąta dla robotów mobilnych przy użyciu czujnika LM393 (H206)
Dziś w tym samouczku wykonamy prototyp cyfrowego licznika opłat za taksówki przy użyciu Arduino. Ten projekt oblicza prędkość i odległość pokonaną przez koło taksówki i stale wyświetla je na wyświetlaczu LCD 16x2. W oparciu o przebytą odległość generuje kwotę taryfy po naciśnięciu przycisku.
Poniższy obraz przedstawia pełną konfigurację projektu Digital Taxi Meter
Ten prototyp ma podwozie samochodu RC z modułem czujnika prędkości i kołem enkodera przymocowanym do silnika. Po zmierzeniu prędkości możemy zmierzyć przebytą odległość i znaleźć wartość taryfy, naciskając przycisk. Prędkość koła możemy ustawić potencjometrem. Aby dowiedzieć się więcej o używaniu modułu czujnika prędkości LM-393 z Arduino, kliknij łącze. Zobaczmy krótkie wprowadzenie do modułu czujnika prędkości.
Szczelinowy optyczny moduł czujnika prędkości LM-393 na podczerwień
Jest to moduł typu slot, który można wykorzystać do pomiaru prędkości obrotowej kół enkodera. Ten moduł czujnika prędkości działa w oparciu o optyczny przerywacz typu szczelinowego, znany również jako czujnik źródła optycznego. Ten moduł wymaga napięcia od 3,3 V do 5 V i wytwarza wyjście cyfrowe. Dzięki temu można go połączyć z dowolnym mikrokontrolerem.
Czujnik światła podczerwonego składa się ze źródła światła (diody IR) i czujnika fototranzystorowego. Oba są umieszczone z niewielką szczeliną między nimi. Gdy obiekt zostanie umieszczony między szczeliną diody LED IR a fototranzystorem, przerwie on wiązkę światła, powodując zatrzymanie przepływu prądu przez fototranzystor.
Tak więc w przypadku tego czujnika stosuje się tarczę szczelinową (koło enkodera), którą można przymocować do silnika, a gdy koło obraca się z silnikiem, przerywa on wiązkę światła między diodą podczerwieni a fototranzystorem, który włącza i wyłącza wyjście (tworzenie impulsów).
W ten sposób generuje WYSOKI poziom wyjściowy, gdy występuje przerwanie między źródłem a czujnikiem (gdy jakikolwiek obiekt jest umieszczony pomiędzy) i wytwarza NISKĄ moc, gdy nie ma umieszczonego przedmiotu. W module mamy diodę LED wskazującą spowodowane przerwanie optyczne.
Moduł ten jest wyposażony w układ scalony komparatora LM393, który jest używany do wytwarzania dokładnych sygnałów WYSOKI i NISKI na WYJŚCIU. Dlatego ten moduł jest czasami nazywany czujnikiem prędkości LM393.
Pomiar prędkości i przebytej odległości w celu obliczenia opłaty
Aby zmierzyć prędkość obrotową, musimy znać liczbę szczelin obecnych w kole enkodera. Mam koło enkodera z 20 gniazdami. Kiedy wykonają jeden pełny obrót, na wyjściu mamy 20 impulsów. Aby obliczyć prędkość, potrzebujemy liczby impulsów wytwarzanych na sekundę.
Na przykład
Jeśli w ciągu jednej sekundy jest 40 impulsów, to
Prędkość = nie. Impulsów / liczba szczelin = 40/20 = 2 obr./s (obroty na sekundę)
Aby obliczyć prędkość w RPM (obrotach na minutę), należy pomnożyć przez 60.
Prędkość w RPM = 2 X 60 = 120 RPM (obroty na minutę)
Pomiar odległości
Pomiar odległości przebytej przez koło jest bardzo prosty. Przed obliczeniem odległości należy znać obwód koła.
Obwód koła = π * d
Gdzie d jest średnicą koła.
Wartość π wynosi 3,14.
Mam koło (koło samochodu RC) o średnicy 6,60 cm, więc obwód wynosi (20,7 cm).
Aby obliczyć przebytą odległość, wystarczy pomnożyć liczbę wykrytych impulsów przez obwód.
Przebyta odległość = Obwód koła x (liczba impulsów / liczba szczelin)
Kiedy więc koło o obwodzie 20,7 cm przyjmuje 20 impulsów, czyli jeden obrót koła enkodera, wówczas odległość przebyta przez koło jest obliczana przez
Przebyta odległość = 20,7 x (20/20) = 20,7 cm
Aby obliczyć odległość w metrach, należy podzielić odległość wyrażoną w cm przez 100.
Uwaga: to jest małe koło samochodu RC, w czasie rzeczywistym samochody mają większe koła niż to. Zakładam więc, że w tym tutorialu obwód koła to 230 cm.
Obliczanie ceny na podstawie przebytej odległości
Aby otrzymać całkowitą kwotę taryfy, należy pomnożyć przebytą odległość przez stawkę taryfy (kwota / metr).
Timer1.initialize (1000000); Timer1.attachInterrupt (timerIsr);
Następnie dołącz dwa zewnętrzne przerwania. Pierwsze przerwanie powoduje, że pin 2 Arduino jest pinem przerwania i wywołuje ISR (licznik), gdy na pinie 2 wykryto WZROST (NISKI DO WYSOKIE). Ten pin 2 jest podłączony do wyjścia D0 modułu czujnika prędkości.
Drugi sprawia, że pin 3 Arduino jest pinem przerwania i wywołuje ISR (generationfare) po wykryciu HIGH na pinie 3. Ten pin jest połączony z przyciskiem za pomocą rezystora obniżającego.
attachInterrupt (digitalPinToInterrupt (2), count, RISING); attachInterrupt (digitalPinToInterrupt (3) generatefare , wysoka);
5. Następnie spójrzmy na ISR, którego tutaj użyliśmy:
ISR1- count () ISR jest wywoływane, gdy WSTĘP (NISKI DO WYSOKIE) ma miejsce na pinie 2 (podłączony do czujnika prędkości).
void count () // ISR dla zliczeń z czujnika prędkości { licznik ++; // zwiększ wartość licznika o jeden obrót ++; // Zwiększ wartość rotacji o jedno opóźnienie (10); }
ISR2- timerIsr () ISR jest wywoływany co jedną sekundę i wykonuje te wiersze, które znajdują się wewnątrz ISR.
void timerIsr () { detachInterrupt (digitalPinToInterrupt (2)); Timer1.detachInterrupt (); lcd.clear (); prędkość pływania = (licznik / 20,0) * 60,0; obroty pływaka = 230 * (obrót / 20); rotacjainm = obrotów / 100; lcd.setCursor (0,0); lcd.print ("Dist (m):"); lcd.print (rotacjainm); lcd.setCursor (0,1); lcd.print ("Prędkość (RPM):"); lcd.print (prędkość); licznik = 0; int analogip = analogRead (A0); int motorspeed = map (analogip, 0,1023,0,255); analogWrite (5, prędkość silnika); Timer1.attachInterrupt (timerIsr); attachInterrupt (digitalPinToInterrupt (2), count, RISING); }
Ta funkcja zawiera linie, które faktycznie najpierw odłączają Timer1 i przerwanie pin2 jako pierwsze, ponieważ mamy instrukcje drukowania LCD wewnątrz ISR.
Do obliczenia PRĘDKOŚCI w RPM używamy poniższego kodu, gdzie 20.0 to liczba zaprogramowanych slotów w kole enkodera.
prędkość pływania = (licznik / 20,0) * 60,0;
A do obliczenia odległości stosuje się poniższy kod:
obroty pływaka = 230 * (obrót / 20);
Tutaj obwód koła przyjmuje się jako 230 cm (jest to normalne dla samochodów czasu rzeczywistego)
Następnie przelicz odległość wm, dzieląc ją przez 100
rotacjainm = obrotów / 100;
Następnie wyświetlamy PRĘDKOŚĆ i ODLEGŁOŚĆ na wyświetlaczu LCD
lcd.setCursor (0,0); lcd.print ("Dist (m):"); lcd.print (rotacja); lcd.setCursor (0,1); lcd.print ("Prędkość (RPM):"); lcd.print (prędkość);
WAŻNE: Musimy zresetować licznik do 0, ponieważ musimy uzyskać liczbę wykrytych plusów na sekundę, więc używamy tej linii
licznik = 0;
Następnie odczytaj analogowy pin A0 i zamień go na wartość cyfrową (od 0 do 1023), a następnie zmapuj te wartości na 0-255 dla wyjścia PWM (ustawienie prędkości silnika) i na koniec zapisz te wartości PWM za pomocą funkcji analogWrite, która jest podłączona do ULN2003 Silnik IC.
int analogip = analogRead (A0); int motorspeed = map (analogip, 0,1023,0,255); analogWrite (5, prędkość silnika);
ISR3: generationfare () ISR służy do generowania kwoty taryfy na podstawie przebytej odległości. Ten ISR jest wywoływany, gdy styk 3 przerwania zostanie wykryty WYSOKI (po naciśnięciu przycisku). Ta funkcja odłącza przerwanie na pinie 2 i przerwanie timera, a następnie czyści wyświetlacz LCD.
nieważne generatefare () { detachInterrupt (digitalPinToInterrupt (2)); pin na 2 Timer1.detachInterrupt (); lcd.clear (); lcd.setCursor (0,0); lcd.print ("FARE Rs:"); rupie zmiennoprzecinkowe = rotacja wm * 5; lcd.print (rupie); lcd.setCursor (0,1); lcd.print ("5 Rs za metr"); }
Następnie przebytą odległość mnoży się przez 5 (ja użyłem 5 dla stawki 5 INR / metr). Możesz zmienić według własnego uznania.
rupie zmiennoprzecinkowe = rotacja wm * 5;
Po wyliczeniu kwoty wyświetl ją na wyświetlaczu LCD podłączonym do Arduino.
lcd.setCursor (0,0); lcd.print ("FARE Rs:"); lcd.print (rupie); lcd.setCursor (0,1); lcd.print ("5 Rs za metr");
Pełny kod i film demonstracyjny znajduje się poniżej.
Możesz dalej ulepszać ten prototyp, zwiększając dokładność, solidność i dodając więcej funkcji, takich jak aplikacja na Androida, płatność cyfrowa itp., I rozwijać go jako produkt.