- Інфрачервоний щілинний оптичний модуль датчика швидкості LM-393
- Вимірювання швидкості та пройденої відстані для розрахунку вартості проїзду
Сьогодні цифрові лічильники замінюють аналогові лічильники в будь-якому секторі, будь то лічильник електроенергії або лічильник таксі. Основною причиною цього є аналогові лічильники, які мають механічні деталі, які, як правило, зношуються при тривалому використанні, і вони не такі точні, як цифрові лічильники.
Хорошим прикладом цього є аналоговий спідометр та одометр, які використовуються у старих мотоциклах для вимірювання швидкості та пройденої відстані. Вони мають спеціальні деталі, які називаються шестернею та стійкою, в яких трос використовується для обертання штифта спідометра при обертанні колеса. Це зношується при тривалому використанні, а також потребує заміни та обслуговування.
У цифровому лічильнику замість механічних деталей для обчислення швидкості та відстані використовуються деякі датчики, такі як оптичний переривник або датчик Холла. Це точніше, ніж аналогові лічильники, і не вимагає технічного обслуговування протягом тривалого періоду часу. Раніше ми побудували багато проектів цифрового спідометра з використанням різних датчиків:
- DIY спідометр за допомогою Arduino та обробки додатка Android
- Цифровий контур спідометра та одометра за допомогою мікроконтролера PIC
- Вимірювання швидкості, відстані та кута для мобільних роботів за допомогою датчика LM393 (H206)
Сьогодні в цьому підручнику ми зробимо прототип цифрового таксі з використанням Arduino. Цей проект обчислює швидкість і відстань, пройдену колесом таксі, і постійно відображає його на РК-дисплеї 16x2. І на основі пройденої відстані це генерує суму тарифу, коли ми натискаємо кнопку.
Внизу на зображенні показано повне налаштування проекту Digital Taxi Meter
Цей прототип має автомобільне шасі RC з модулем датчика швидкості та колесом кодера, прикріпленим до двигуна. Після вимірювання швидкості ми можемо виміряти пройдену відстань і знайти значення вартості проїзду, натискаючи кнопку. Ми можемо встановити швидкість колеса за допомогою потенціометра. Щоб дізнатись більше про використання модуля датчика швидкості LM-393 з Arduino, перейдіть за посиланням. Побачимо коротке введення модуля датчика швидкості.
Інфрачервоний щілинний оптичний модуль датчика швидкості LM-393
Це модуль шліцевого типу, який можна використовувати для вимірювання швидкості обертання коліс кодера. Цей модуль датчика швидкості працює на основі оптичного переривача типу щілини, також відомого як датчик оптичного джерела. Цей модуль вимагає напруги від 3,3 В до 5 В і виробляє цифровий вихід. Тож його можна зв’язати з будь-яким мікроконтролером.
Датчик інфрачервоного світла складається з джерела світла (ІЧ-світлодіод) та фототранзисторного датчика. Обидва розміщені з невеликим зазором між ними. Коли об'єкт розміщений між зазором ІЧ-світлодіода та фототранзистором, він перериває світловий промінь, змушуючи фототранзистор припиняти пропускання струму.
Таким чином, з цим датчиком використовується щілинний диск (колесо кодера), який можна приєднати до двигуна, і коли колесо обертається разом з мотором, воно перериває світловий промінь між ІЧ-світлодіодом і фототранзистором, що робить вихідний сигнал увімкненим і вимкненим (створення імпульсів).
Таким чином, він виробляє ВИСОКИЙ вихід, коли між джерелом і датчиком є переривання (коли будь-який об'єкт поміщений між ними) і видає НИЗКИЙ вихід, коли немає розміщеного об'єкта. У модулі ми маємо світлодіод, який вказує на спричинене оптичне переривання.
Цей модуль постачається з компаратором IC LM393, який використовується для отримання точних сигналів ВИСОКОГО і НИЗЬКОГО на ВИХІДІ. Таким чином, цей модуль іноді називають датчиком швидкості LM393.
Вимірювання швидкості та пройденої відстані для розрахунку вартості проїзду
Для вимірювання швидкості обертання нам потрібно знати кількість слотів, присутніх на колесі кодера. У мене є колесо кодера з 20 слотами. Коли вони обертаються на одне повне обертання, на виході ми маємо 20 імпульсів. Отже, для обчислення швидкості нам потрібно кількість імпульсів, що виробляються в секунду.
Наприклад
Якщо за одну секунду є 40 імпульсів, то
Швидкість = Noo. Імпульсів / Кількість слотів = 40/20 = 2RPS (Обертання в секунду)
Для обчислення швидкості в об / хв (обертів на хвилину) помножте на 60.
Швидкість об / хв = 2 X 60 = 120 об / хв (обертів в хвилину)
Вимірювання відстані
Виміряти відстань, пройдену колесом, так просто. Перед розрахунком відстані слід знати окружність колеса.
Окружність колеса = π * d
Де d - діаметр колеса.
Значення π дорівнює 3,14.
У мене є колесо (автомобільне колесо RC) діаметром 6,60 см, тож окружність (20,7 см).
Тож для обчислення пройденої відстані просто помножте кількість виявлених імпульсів на окружність.
Пройдена відстань = окружність колеса x (кількість імпульсів / кількість слотів)
Отже, коли колесо з окружністю 20,7 см приймає 20 імпульсів, що становить один оберт колеса кодера, тоді відстань, пройдене колесом, обчислюється за
Пройдена відстань = 20,7 x (20/20) = 20,7 см
Для того, щоб розрахувати відстань у метрах, розділіть відстань у значенні см на 100.
Примітка: Це невелике колесо автомобіля RC, в режимі реального часу машини мають більші колеса, ніж це. Отже, я припускаю, що окружність колеса становить 230 см у цьому підручнику.
Розрахунок вартості проїзду на основі пройденої відстані
Щоб отримати загальну суму проїзду, помножте пройдену відстань на тариф (сума / метр).
Timer1.initialize (1000000); Timer1.attachInterrupt (timerIsr);
Далі прикріпіть два зовнішні переривання. Перше переривання робить штифт Arduino 2 виводом переривання і викликає ISR (count), коли на штифті 2 виявлено RISING (LOW TO HIGH). Цей вивід 2 підключений до виходу D0 модуля датчика швидкості.
А другий робить вивід Arduino 3 виводом переривання і викликає ISR (генерування тарифу), коли HIGH виявляється на виводі3. Цей штифт з'єднаний з кнопковою кнопкою висувним резистором.
attachInterrupt (digitalPinToInterrupt (2), count, RISING); attachInterrupt (digitalPinToInterrupt (3), generatedfare , HIGH);
5. Далі давайте подивимось на ISR, який ми використовували тут:
ISR1- count () ISR викликається, коли на штифті 2 (підключеному до датчика швидкості) відбувається RISING (LOW TO HIGH).
void count () // ISR для відліків від датчика швидкості { counter ++; // збільшення значення лічильника на один оберт ++; // Збільшити значення обертання на одну затримку (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 ("Відстань (м):"); lcd.print (rotainmm); lcd.setCursor (0,1); lcd.print ("Швидкість (об / хв):"); 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, оскільки у нас є оператори друку РК всередині ISR.
Для обчислення ШВИДКОСТІ в об / хв ми використовуємо код нижче, де 20,0 - це кількість слотів, попередньо встановлених в колі кодера.
плаваюча швидкість = (лічильник / 20,0) * 60,0;
А для розрахунку відстані нижче використовується код:
повороти поплавка = 230 * (обертання / 20);
Тут окружність колеса приймається як 230 см (як це нормально для автомобілів реального часу)
Далі перетворіть відстань у м, поділивши відстань на 100
rotainmm = обертання / 100;
Після цього ми відображаємо швидкість і відстань на РК-дисплеї
lcd.setCursor (0,0); lcd.print ("Відстань (м):"); lcd.print (rotainmm); lcd.setCursor (0,1); lcd.print ("Швидкість (об / хв):"); lcd.print (швидкість);
ВАЖЛИВО: Ми повинні скинути лічильник на 0, тому що нам потрібно отримати кількість плюсів, виявлених за секунду, тому ми використовуємо цей рядок
лічильник = 0;
Далі прочитайте аналоговий штифт A0 і перетворіть його в цифрове значення (від 0 до 1023), а потім відображте ці значення до 0-255 для ШІМ-виходу (налаштування швидкості двигуна) і, нарешті, напишіть ці значення ШІМ за допомогою функції analogWrite, яка підключена до ULN2003 ІС двигуна.
int analogip = analogRead (A0); int motorspeed = map (analogip, 0,1023,0,255); analogWrite (5, швидкість двигуна);
ISR3: generatedfare () ISR використовується для формування суми тарифу на основі пройденої відстані. Цей ISR викликається, коли штифт 3 переривання виявляється ВИСОКО (При натисканні кнопки). Ця функція від'єднує переривання на виводі 2 і таймер переривання, а потім очищає РК-екран.
недійсний generatefare () { 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 ("5 рупій за метр"); }
Після цього пройдена відстань множиться на 5 (я використав 5 для тарифу 5 INR / метр). Ви можете змінити за своїм бажанням.
плаваючі рупії = обертанняinm * 5;
Після обчислення значення суми виведіть його на РК-дисплей, підключений до Arduino.
lcd.setCursor (0,0); lcd.print ("FARE Rs:"); lcd.print (рупії); lcd.setCursor (0,1); lcd.print ("5 рупій за метр");
Повний код та демонстраційне відео наведено нижче.
Ви можете ще більше вдосконалити цей прототип, збільшивши точність, надійність та додавши більше функцій, таких як додаток для Android, цифрові платежі тощо, і розробити його як продукт.