- Инфрачервен модул с оптичен сензор за скорост LM-393
- Измерване на скорост и изминато разстояние за изчисляване на тарифата
Днес цифровите измервателни уреди заменят аналоговите измервателни уреди във всеки сектор, независимо дали неговият електромер или таксиметров таксиметър. Основната причина за това е, че аналоговите измервателни уреди имат механични части, които са склонни да се износват, когато се използват дълго време и те не са толкова точни, колкото цифровите измервателни уреди.
Добър пример за това са аналоговите скоростомер и одометър, които се използват в стари мотоциклети за измерване на скорост и изминато разстояние. Те имат специални части, наречени зъбно колело и зъбна рейка, при които се използва кабел за завъртане на щифта на скоростомера при завъртане на колелото. Това ще се износва при продължителна употреба и също се нуждае от подмяна и поддръжка.
В цифровия измервателен уред, вместо да се използват механични части, се използват някои сензори като оптичен прекъсвач или сензор на Хол за изчисляване на скоростта и разстоянието. Това е по-точно от аналоговите измервателни уреди и не изисква поддръжка за дълъг период от време. Преди това изградихме много проекти за цифров скоростомер, използвайки различни сензори:
- Направи си сам скоростомер, използвайки Arduino и приложението за обработка на Android
- Цифрова верига на скоростомера и одометъра с помощта на PIC микроконтролер
- Измерване на скорост, разстояние и ъгъл за мобилни роботи с помощта на сензор LM393 (H206)
Днес в този урок ще направим прототип на цифров таксиметров такси с помощта на Arduino. Този проект изчислява скоростта и изминатото разстояние от колелото на таксито и непрекъснато го показва на 16x2 LCD дисплей. И въз основа на изминатото разстояние генерира сума на тарифата, когато натиснем бутона.
По-долу изображението показва пълната настройка на проекта за цифрови таксимери
Този прототип има RC шаси за кола с модул за сензор за скорост и енкодер колело, прикрепено към мотора. След като се измери скоростта, можем да измерим изминатото разстояние и да намерим стойността на цената на билета, като натиснем бутона. Можем да настроим скоростта на колелото с помощта на потенциометър. За да научите повече за използването на модула LM-393 Speed Sensor с Arduino, следвайте връзката. Нека видим кратко представяне на модула за сензор за скорост.
Инфрачервен модул с оптичен сензор за скорост LM-393
Това е модул от слот, който може да се използва за измерване на скоростта на въртене на колелата на енкодера. Този модул за сензор за скорост работи въз основа на оптичен прекъсвач от тип слот, известен още като сензор за оптичен източник. Този модул изисква напрежение от 3.3V до 5V и произвежда цифров изход. Така че той може да бъде свързан с всеки микроконтролер.
Сензорът за инфрачервена светлина се състои от източник на светлина (IR-LED) и фототранзисторен сензор. И двете са поставени с малка разлика между тях. Когато обектът се постави между пролуката на инфрачервения светодиод и фототранзистора, той ще прекъсне светлинния лъч, карайки фототранзистора да спре да преминава ток.
По този начин с този сензор се използва слот с диск (Encoder Wheel), който може да бъде прикрепен към мотор и когато колелото се върти с мотор, то прекъсва светлинния лъч между IR LED и фототранзистора, който прави изхода включен и изключен (Създаване на импулси).
По този начин той произвежда HIGH изход, когато има прекъсване между източника и сензора (Когато някой обект е поставен между тях) и произвежда LOW изход, когато няма поставен обект. В модула имаме светодиод за индикация на причиненото оптично прекъсване.
Този модул се доставя с LM393 Comparator IC, който се използва за получаване на точни ВИСОКИ и НИСКИ сигнали на ИЗХОДА. По този начин този модул понякога се нарича LM393 сензор за скорост.
Измерване на скорост и изминато разстояние за изчисляване на тарифата
За да измерим скоростта на въртене, трябва да знаем броя слотове в колелото на енкодера. Имам кодиращо колело с 20 слота в него. Когато завъртят едно пълно завъртане, имаме 20 импулса на изхода. За да изчислим скоростта, се нуждаем от броя импулси, произведени в секунда.
Например
Ако има 40 импулса за една секунда, тогава
Скорост = Не. От импулси / брой слотове = 40/20 = 2RPS (обороти в секунда)
За изчисляване на скоростта в RPM (обороти в минута) умножете с 60.
Скорост в RPM = 2 X 60 = 120 RPM (обороти в минута)
Измерване на разстояние
Измерването на изминатото разстояние от колелото е толкова просто. Преди да се изчисли разстоянието, трябва да се знае обиколката на колелото.
Обиколка на колелото = π * d
Където d е диаметърът на колелото.
Стойността на π е 3,14.
Имам колело (RC колело за кола) с диаметър 6,60 см, така че обиколката е (20,7 см).
Така че, за да изчислите изминатото разстояние, просто умножете броя на импулсите, открити с обиколката.
Изминато разстояние = обиколка на колелото x (брой импулси / брой слотове)
Така че, когато колело с обиколка 20,7 cm отнема 20 импулса, което е едно завъртане на колелото на енкодера, изминатото разстояние от колелото се изчислява
Изминато разстояние = 20,7 x (20/20) = 20,7 cm
За да се изчисли разстоянието в метър, разделете разстоянието в cm стойност на 100.
Забележка: Това е малко RC колело, в реално време автомобилите имат по-големи колела от това. Така че предполагам, че обиколката на колелото е 230 см в този урок.
Изчисляване на тарифата въз основа на изминатото разстояние
За да получите общата сума на тарифата, умножете изминатото разстояние с тарифата (сума / метър).
Timer1.initialize (1000000); Timer1.attachInterrupt (timerIsr);
След това прикачете две външни прекъсвания. Първото прекъсване прави щифта Arduino 2 като прекъсващ щифт и извиква ISR (брой), когато има издигане (НИСКО ДО ВИСОКО), открито на щифта 2. Този щифт 2 е свързан към изхода D0 на модула на сензора за скорост.
И второто прави Arduino pin 3 като прекъсващ щифт и извиква ISR (генериране на такси), когато HIGH се открие на pin3. Този щифт е свързан с бутон с падащ резистор.
attachInterrupt (digitalPinToInterrupt (2), count, RISING); attachInterrupt (digitalPinToInterrupt (3), generatedfare , HIGH);
5. След това нека видим за ISR, който използвахме тук:
ISR1- count () ISR се извиква, когато се случи RISING (LOW TO HIGH) на щифт 2 (свързан към сензор за скорост).
void count () // ISR за отчитания от сензора за скорост { брояч ++; // увеличаване на стойността на брояча с едно завъртане ++; // Увеличете стойността на въртене с едно забавяне (10); }
ISR2- timerIsr () ISR се извиква всяка секунда и изпълнява тези редове, присъстващи вътре в ISR.
void timerIsr () { detachInterrupt (digitalPinToInterrupt (2)); Timer1.detachInterrupt (); lcd.clear (); плаваща скорост = (брояч / 20,0) * 60,0; ротации с поплавък = 230 * (въртене / 20); rotainmm = завъртания / 100; lcd.setCursor (0,0); lcd.print ("Разстояние (m):"); lcd.print (rotainmm); lcd.setCursor (0,1); lcd.print ("Скорост (RPM):"); lcd.print (скорост); брояч = 0; int analogip = analogRead (A0); int motorspeed = map (analogip, 0,1023,0,255); analogWrite (5, скорост на двигателя); Timer1.attachInterrupt (timerIsr); attachInterrupt (digitalPinToInterrupt (2), count, RISING); }
Тази функция съдържа редовете, които всъщност първо отделят таймера1 и прекъсването pin2, защото имаме отчети за LCD печат вътре в ISR.
За изчисляване на SPEED в RPM използваме кода по-долу, където 20.0 е броят на слотовете, предварително зададени в колелото на енкодера.
плаваща скорост = (брояч / 20,0) * 60,0;
И за изчисляване на разстоянието се използва код:
ротации с поплавък = 230 * (въртене / 20);
Тук обиколката на колелото се приема като 230cm (тъй като това е нормално за автомобили в реално време)
След това преобразувайте разстоянието в m, като разделите разстоянието на 100
rotainmm = завъртания / 100;
След това показваме СКОРОСТТА и РАЗСТОЯНИЕТО на LCD дисплей
lcd.setCursor (0,0); lcd.print ("Разстояние (m):"); lcd.print (rotainmm); lcd.setCursor (0,1); lcd.print ("Скорост (RPM):"); lcd.print (скорост);
ВАЖНО: Трябва да нулираме брояча на 0, защото трябва да получим броя на откритите плюсове за секунда, така че използваме този ред
брояч = 0;
След това прочетете аналоговия щифт A0 и го преобразувайте в цифрова стойност (0 до 1023) и допълнително картографирайте тези стойности на 0-255 за PWM изход (настройка на скоростта на двигателя) и накрая напишете тези PWM стойности, използвайки функцията analogWrite, която е свързана към ULN2003 Схема на двигателя.
int analogip = analogRead (A0); int motorspeed = map (analogip, 0,1023,0,255); analogWrite (5, скорост на двигателя);
ISR3: generatedfare () ISR се използва за генериране на сумата на тарифата въз основа на изминатото разстояние. Този ISR се извиква, когато прекъсващият щифт 3 бъде открит HIGH (при натискане на бутон). Тази функция отделя прекъсването на щифт 2 и таймерът прекъсва и след това изчиства LCD.
void generatedfare () { detachInterrupt (digitalPinToInterrupt (2)); щифт на 2 Timer1.detachInterrupt (); lcd.clear (); lcd.setCursor (0,0); lcd.print ("FARE Rs:"); плаващи рупии = ротацияinm * 5; lcd.print (рупии); lcd.setCursor (0,1); lcd.print ("Rs 5 на метър"); }
След това изминатото разстояние се умножава с 5 (използвал съм 5 за INR 5 / метър). Можете да промените според вашето желание.
плаващи рупии = въртенеinm * 5;
След изчисляване на стойността на сумата го покажете на LCD дисплея, свързан към Arduino.
lcd.setCursor (0,0); lcd.print ("FARE Rs:"); lcd.print (рупии); lcd.setCursor (0,1); lcd.print ("Rs 5 на метър");
Пълният код и демонстрационното видео е дадено по-долу.
Можете допълнително да подобрите този прототип, като увеличите точността, здравината и добавите повече функции като приложение за Android, цифрово плащане и т.н. и го развиете като продукт.