- Модуль датчика швидкості LM393 (H206)
- Розташування кріплення датчика H206
- DIY Arduino LM393 Схема робочого датчика швидкості робота
- Логіка вимірювання швидкості за допомогою модуля датчика швидкості LM393
- Логіка вимірювання відстані, пройденої колесом
- Логіка вимірювання кута бота
- Код робота Arduino
- Тестування робота Arduino для вимірювання відстані, швидкості та кута
Роботи повільно почали повзати в наше суспільство, щоб спростити наше життя. Ми вже можемо знайти шість колісних роботів для доставки їжі від Starship на дорогах Великобританії, які розумно орієнтуються серед цивільних, щоб дістатися до місця призначення. Кожен мобільний робот, який орієнтується у навколишньому середовищі, повинен завжди знати про своє положення та орієнтацію щодо реального світу. Існує багато способів досягти цього за допомогою різних технологій, таких як GPS, радіочастотна тріангуляція, акселерометри, гіроскопи тощо. Кожна техніка має свою перевагу і сама по собі унікальна. У цьому посібнику з датчика швидкості Arduino LM393 ми використаємо простий і легко доступний модуль датчика швидкості LM393для вимірювання деяких життєво важливих параметрів, таких як швидкість, пройдена відстань та кут робота за допомогою Arduino. За допомогою цих параметрів робот зможе дізнатися свій реальний стан і зможе використовувати його для безпечної навігації.
Arduino - найпопулярніший вибір серед любителів будівельних роботів, від простого послідовника лінійки до більш складного робота, що самостійно балансує або чистить підлогу. Ви можете перевірити всі види роботів у розділі Робототехніка.
Ми створимо маленького робота, який живиться від літієвої батареї, і будемо керувати ним за допомогою джойстика. Під час роботи ми можемо виміряти швидкість, відстань і кут робота і відображати його в реальному часі на РК- дисплеї, підключеному до Arduino. Цей проект просто допомагає вам виміряти ці параметри, коли ви закінчите з цим, ви можете використовувати ці параметри для роботи вашого бота автономно, як потрібно. Звучить цікаво, правда? Тож давайте почнемо.
Модуль датчика швидкості LM393 (H206)
Перш ніж ми вникаємо в принципову схему та код проекту, давайте зрозуміємо модуль датчика швидкості LM393, оскільки він відіграє важливу роль у проекті. У модулі H206 датчик швидкості складається з ІК - датчика світла інтегрований з компаратора LM393 напруги IC звідси і назва датчика швидкості LM393. Модуль також складається з сітчастої пластини, яка повинна бути встановлена на обертовому валу двигуна. Всі компоненти позначені на зображенні нижче.
Датчик Інфрачервоне світло складається з ІК - світлодіод і фототранзистор, розділених невеликим балакучості. Вся схема датчика розміщена в чорному корпусі, як показано вище. Пластина сітки складається з прорізів, пластина розташована між зазором інфрачервоного датчика світла таким чином, що датчик може відчувати зазори в сітці пластини. Кожен зазор у сітковій пластині спрацьовує ІЧ-датчик при проходженні через зазор; ці тригери потім перетворюються у сигнали напруги за допомогою компаратора. Порівняльник - це не що інше, як мікросхема LM393 від напівпровідників ON. Модуль має три штирі, два з яких використовується для живлення модуля, а один вихідний штифт використовується для підрахунку кількості тригерів.
Розташування кріплення датчика H206
Монтаж датчиків такого типу трохи складний. Він може бути встановлений лише на двигунах, вал яких виступає з обох боків. Одна сторона вала з'єднана з колесом, а інша сторона використовується для кріплення пластини сітки, як показано вище.
Оскільки колесо і пластина з'єднані з одним валом, обидва обертаються з однаковою швидкістю, і таким чином, вимірюючи швидкість пластини, ми можемо виміряти швидкість колеса. Переконайтесь, що зазори в пластині сітки проходять через ІЧ-датчик, лише тоді датчик зможе підрахувати кількість пропущених проміжків. Ви також можете придумати власну механічну компоновку для кріплення датчика, якщо він відповідає заданим умовам. ІЧ-датчик зазвичай використовується в багатьох робототехнічних проектах для керівництва роботом щодо перешкод.
Наведена вище таблиця сітки має 20 прорізів (сіток). Це означає, що датчик знайде 20 зазорів за одне повне обертання колеса. Підрахувавши кількість зазорів, які виявив датчик, ми можемо розрахувати відстань, пройдену колесом, аналогічно вимірюючи, наскільки швидко датчик знаходить зазори, ми можемо виявити швидкість колеса. У нашому роботі цей датчик буде встановлений на обох колесах, а отже, ми також можемо знайти кут нахилу робота. Однак кут повороту можна більш розумно обчислити за допомогою акселерометра або гіроскопа, навчіться тут взаємодіяти акселерометр і гіроскоп з Arduino і спробувати виміряти кут обертання за їх допомогою.
DIY Arduino LM393 Схема робочого датчика швидкості робота
Повна принципова схема цього робота, що зчитує швидкість і відстань, наведена нижче. Бот складається з Arduino Nano як головного мозку, два двигуни постійного струму для коліс приводиться в дію модулем двигуна H-Bridge L298N. Джойстик використовується для управління швидкістю та напрямком бота, а два датчики швидкості H206 використовують для вимірювання швидкості, відстані та ангела бота. Потім виміряні значення відображаються на РК-модулі 16x2. Потенціометр, підключений до РК-дисплея, може використовуватися для регулювання контрастності РК-дисплея, а резистор - для обмеження струму, що надходить до підсвічування РК-дисплея.
Повна схема харчується від клітини 7.4V літію. Це 7,4 В подається на 12 В висновок модуля драйвера двигуна. Потім регулятор напруги на модулі драйвера двигуна перетворює 7,4 В в регульований + 5 В, який використовується для живлення Arduino, РК-дисплея, датчиків і джойстика.
Двигун управляється цифровими виводами 8,9,10 і 11 Arduino. Оскільки швидкість двигуна також повинна контролюватися, ми повинні подавати ШІМ-сигнали на позитивну клему двигуна. Отже, ми маємо штифти 9 і 10, які обидва є ШІМ-штирками. Значення X і Y утворюють джойстик, зчитується за допомогою аналогових штифтів A2 і A3 відповідно.
Як ми знаємо, датчик H206 генерує тригер при виявленні зазору в сітці. Оскільки ці тригери не завжди слід зчитувати з точністю, щоб розрахувати правильну швидкість і відстань, обидва контактні (вихідні) штирі підключені до зовнішніх виводів переривання 2 і 3 плати Arduino. Зберіть всю схему на шасі і встановіть датчик швидкості, як пояснювалося, мій бот виглядав приблизно так, як показано нижче після завершення підключень. Ви також можете переглянути відео в кінці цієї сторінки, щоб дізнатись, як був встановлений датчик.
Тепер, коли апаратна частина завершена, давайте зайдемо в логіку того, як ми будемо вимірювати швидкість, відстань та одиницю бота, а потім переходимо до розділу програмування.
Логіка вимірювання швидкості за допомогою модуля датчика швидкості LM393
З установки кріплення датчика ви повинні пам’ятати, що модуль датчика швидкості LM393 (H206) вимірює лише зазори, наявні в пластині сітки. Під час монтажу слід переконатися, що колесо (швидкість якого слід вимірювати) та сітка обертаються з однаковою швидкістю. Як і тут, оскільки ми встановили колесо і пластину на одному валу, вони, очевидно, будуть обертатися з однаковою швидкістю.
У нашій установці ми встановили два датчики для кожного колеса для вимірювання кута нахилу бота. Але якщо ваша мета - виміряти лише швидкість і відстань, ми можемо встановити датчик на будь-яке одне колесо. Вихід датчика (тригерні сигнали) найчастіше підключається до зовнішнього виводу переривання мікроконтролера. Кожного разу, коли виявляється проміжок у табличці сітки, спрацьовує переривання і виконується код у ISR (Служба переривання). Якщо ми можемо розрахувати інтервал часу між двома такими тригерами, ми можемо розрахувати швидкість колеса.
В Arduino ми можемо легко розрахувати цей інтервал часу, використовуючи функцію millis () . Ця функція міліс буде збільшуватися на 1 на кожні мілі секунди з моменту включення пристрою. Отже, коли відбувається перше переривання, ми можемо зберегти значення millis () у фіктивній змінній (наприклад, pevtime у цьому коді), а потім, коли настає друге переривання, ми можемо обчислити час, віднімаючи значення pevtime у формі millis ().
Час, витрачений = поточний час - попередній час TimeTaken = Мілліс () - pevtime ; // час, зроблений в мілісекундах
Після того, як ми розрахували зайнятий час, ми можемо просто розрахувати значення об / хв, використовуючи наведені нижче формули, де (1000 / зайняте час) дає RPS (Обертів в секунду), і воно помножується на 60 для перетворення RPS в RPM (Обертів в хвилину).
об / хв = (1000 / зайнятий час) * 60;
Після розрахунку оборотів в хвилину ми можемо розрахувати швидкість транспортного засобу, використовуючи наведені нижче формули, за умови, що ми знаємо радіус колеса.
Швидкість = 2π × RPS × радіус колеса. v = радіус_колеса * об / хв * 0,104
Зверніть увагу, що наведена вище формула призначена для розрахунку швидкості в м / с, якщо ви хочете обчислити в км / год, то замініть 0,0104 на 0,376. Якщо вам цікаво дізнатись, як було отримано значення 0,104, спробуйте спростити формулу V = 2π × RPS × радіус колеса.
Той самий прийом застосовується, навіть якщо датчик Холла використовується для вимірювання швидкості обертається об'єкта. Але для датчика H206 є фіксатор, сітчаста пластина має 20 слотів, а отже, для вимірювання часу між двома шліцевими зазорами мікроконтролер перевантажить. Отже, ми вимірюємо швидкість лише при повному обертанні колеса. Оскільки для кожного зазору буде створено два переривання (одне на початку та інше в кінці зазору), ми отримаємо в цілому 40 переривань для колеса, щоб здійснити один повний оберт. Отже, ми чекаємо 40 переривань, перш ніж насправді розрахувати швидкість колеса. Код для цього наведено нижче
if (обертання> = 40) { timetaken = millis () - pevtime; // час, зроблений в мілісекундах об / хв = (1000 / прийнятий час) * 60; // формули для обчислення об / хв pevtime = міліс (); обертання = 0; }
Іншим недоліком цього методу є те, що значення швидкості не опуститься до нуля, оскільки переривання завжди буде чекати, поки колесо завершить один оберт для обчислення значення об / хв. Цей недолік можна легко подолати, додавши простий код, який контролює інтервал часу між двома перериваннями, і якщо він перевищує норму, тоді ми можемо примусити значення об / хв і швидкості дорівнювати нулю. Посилання в наведеному нижче коді ми використовували змінну dtime, щоб перевірити різницю в часі, і якщо вона перевищує 500 мілі секунд, значення швидкості та об / хв примусово дорівнює нулю.
/ * Впасти до нуля, якщо транспортний засіб зупинився * / if (millis () - dtime> 500) // не знайдено безперебійної дії за 500 мс { об / хв = v = 0; // робимо об / хв і швидкість як нуль dtime = міліс (); }
Логіка вимірювання відстані, пройденої колесом
Ми вже знаємо, що Arduino відчує 40 переривань, коли колесо здійснить один повний оберт. Отже, при кожному обертанні колеса, очевидно, що відстань, пройдена колесом, дорівнює окружності колеса. Оскільки ми вже знаємо радіус колеса, ми можемо легко розрахувати пройдену відстань, використовуючи формулу нижче
Відстань = 2πr * кількість обертань відстань = (2 * 3,141 * радіус_колеса) * (left_intr / 40)
Де окружність колеса обчислюється за формулою 2πr, а потім множиться на кількість обертань, здійснених колесом.
Логіка вимірювання кута бота
Існує багато способів визначити ангела робота. Для визначення цих значень зазвичай використовують акселерометри та гіроскопи. Але ще одним дешевим підходом є використання датчика H206 на обох колесах. Таким чином ми знали б, скільки оборотів зробило кожне колесо. На малюнку нижче показано, як обчислюється кут.
Коли робот ініціалізований, кут, на який він спрямований, вважається 0 °. Звідти він обертається вліво, кут збільшується в мінус, а якщо обертається вправо, ангел збільшується в позитив. Для розуміння давайте розглянемо діапазон від -90 до +90, як показано на малюнку. При такому розташуванні, оскільки обидва колеса мають однаковий діаметр, якщо будь-яке з коліс здійснює повне обертання бота, який ми повертаємо під кутом 90 °.
Наприклад, якщо ліве колесо робить один повний оберт (80 переривань), тоді бот повернеться на 90 ° вліво, і аналогічно, якщо праве колесо зробить один повний оберт (80 переривань), тоді бот повернеться на -90 ° вправо. Тепер ми знаємо, що якщо Arduino виявляє 80 переривань на одному колесі, то бот повернувся на 90 °, і на основі якого колеса ми можемо визначити, чи повернувся бот на позитивний (правий) чи негативний (лівий). Тож лівий і правий кут можна обчислити, використовуючи наведені нижче формули
int angle_left = (left_intr% 360) * (90/80); int angle_right = (right_intr% 360) * (90/80);
Де 90 - кут, охоплений при перериванні 80. Отримане значення помножується на число переривань. Ми також використовували модуль 360, щоб отримане значення ніколи не перевищувало 36. Після того, як ми розрахували і лівий, і правий кут, ефективний кут, під яким бот звернений, можна просто отримати, віднявши лівий кут від прямого кута.
кут = кут_право - кут_ліворуч;
Код робота Arduino
Повний код Arduino для цього робота для вимірювання швидкості та кута можна знайти в кінці цієї сторінки. Метою програми є обчислення швидкості, відстані та кута бота за допомогою вищезазначених логік та відображення його на РК-екрані. Крім цього, він повинен надавати можливість керувати ботом за допомогою джойстика.
Ми розпочинаємо програму з визначення цифрових штифтів вводу-виводу для двох двигунів. Зверніть увагу, що ми також повинні контролювати швидкість двигуна, а отже, ми повинні використовувати ШІМ-штирі на Arduino для управління двигунами. Тут ми використовували штифти 8,9,10 і 11.
#define LM_pos 9 // left motor #define LM_neg 8 // left motor #define RM_pos 10 // right motor #define RM_neg 11 // right motor #define joyX A2 #define joyY A3
Для вимірювання швидкості та пройденої відстані нам потрібно знати радіус колеса, виміряти значення та ввести його в метрах, як показано нижче. Для мого бота радіус був 0,033 метра, але він може відрізнятися для вас залежно від вашого бота.
поплавковий радіус_колеса = 0,033; // Виміряйте радіус свого колеса і введіть його сюди в см
Усередині функції налаштування ми ініціалізуємо все значення рівним нулю, а потім відображаємо на РК-дисплеї текст вступу. Ми також ініціалізували послідовний монітор для налагодження. Тоді ми вже згадували, що датчики швидкості H206 підключені до виводів 2 і 3 як зовнішні переривачі. Саме там коли-небудь виявляється переривання, функція ISR Left_ISR та Right_ISR буде виконана відповідно.
void setup () { обертання = rpm = pevtime = 0; // Ініціалізуємо всю змінну до нуля Serial.begin (9600); lcd.begin (16, 2); // Ініціалізація 16 * 2 рідкокристалічного друку на РК- екрані ("Монітор ботів"); // Вступний рядок повідомлення 1 lcd.setCursor (0, 1); lcd.print ("- CircuitDigest"); // Затримка вступного рядка повідомлення 2 (2000); lcd.clear (); lcd.print ("Lt: Rt:"); lcd.setCursor (0, 1); lcd.print ("S: D: A:"); pinMode (LM_pos, OUTPUT); pinMode (LM_neg, OUTPUT); pinMode (RM_pos, OUTPUT); pinMode (RM_neg, OUTPUT); digitalWrite (LM_neg, LOW); digitalWrite (RM_neg, LOW); attachInterrupt (digitalPinToInterrupt (2), Left_ISR, CHANGE); // Left_ISR викликається, коли спрацьовує датчик лівого колеса attachInterrupt (digitalPinToInterrupt (3), Right_ISR, CHANGE); // Right_ISR викликається, коли спрацьовує датчик правого колеса }
Усередині процедури Left_ISR ми просто збільшуємо змінну з назвою left_intr, яка згодом буде використана для вимірювання кута бота. Всередині Right_ISR ми робимо те саме, але потім додатково ми також обчислюємо швидкість тут. Змінна швидкість обертання збільшується для кожного переривання, а потім вищевказана логіка використовується для обчислення швидкості.
void Left_ISR () { left_intr ++; затримка (10); } void Right_ISR () { right_intr ++; затримка (10); обертання ++; dtime = міліс (); if (обертання> = 40) { timetaken = millis () - pevtime; // час, зроблений в мілісекундах об / хв = (1000 / прийнятий час) * 60; // формули для обчислення об / хв pevtime = міліс (); обертання = 0; } }
Усередині головної функції нескінченного циклу ми відстежуємо значення X та Y за допомогою джойстика. Виходячи зі значення, якщо джойстик переміщений, ми відповідно керуємо ботом. Швидкість бота залежить від того, наскільки натиснуто джойстик.
int xValue = analogRead (joyX); int yValue = analogRead (joyY); int прискорення = карта (xValue, 500, 0, 0, 200); якщо (xValue <500) { analogWrite (LM_pos, прискорення); analogWrite (RM_pos, прискорення); } else { analogWrite (LM_pos, 0); analogWrite (RM_pos, 0); } if (yValue> 550) analogWrite (RM_pos, 80); if (yValue <500) analogWrite (LM_pos, 100);
Це допоможе користувачеві перемістити бота і перевірити, чи отримані значення відповідають очікуваним. Нарешті, ми можемо розрахувати швидкість, відстань і кут бота, використовуючи наведені вище логіки, і відобразити його на РК-дисплеї, використовуючи наведений нижче код.
v = радіус_колеса * об / хв * 0,104; //0.033 - радіус колеса в метровій відстані = (2 * 3,141 * радіус_колеса) * (left_intr / 40); int angle_left = (left_intr% 360) * (90/80); int angle_right = (right_intr% 360) * (90/80); кут = кут_право - кут_ліворуч; lcd.setCursor (3, 0); lcd.print (""); lcd.setCursor (3, 0); lcd.print (left_intr); lcd.setCursor (11, 0); lcd.print (""); lcd.setCursor (11, 0); lcd.print (right_intr); lcd.setCursor (2, 1); lcd.print (""); lcd.setCursor (2, 1); lcd.print (v); lcd.setCursor (9, 1); lcd.print (""); lcd.setCursor (9, 1); lcd.print (відстань); lcd.setCursor (13, 1); lcd.print (""); lcd.setCursor (13, 1); lcd.print (кут);
Тестування робота Arduino для вимірювання відстані, швидкості та кута
Після того, як ваше обладнання буде готове, завантажте код у свій Arduino і використовуйте джойстик для переміщення бота. швидкість бота, відстань, яку він подолав, і кут відображатимуться на РК-дисплеї, як показано нижче.
На РК-дисплеї термін Lt і Rt представляє лівий переривання підрахунку і правильний підрахунок переривань відповідно. Ви можете знайти ці значення, що збільшуються для кожного розриву, виявленого датчиком. Температура S позначає швидкість бота в м / с, а термін D - відстань, пройдену в метрах. Кут бота відображається в кінці, де 0 ° - для прямого, і він стає негативним для обертання проти годинникової стрілки та позитивним для обертання за годинниковою стрілкою.
Ви також можете переглянути відео в кінці цієї сторінки, щоб зрозуміти, як працює бот. Сподіваюся, ви зрозуміли проект і сподобалось його будувати. Якщо у вас є якісь занепокоєння, залиште їх у розділі коментарів, і я спробую найкраще відповісти. Ви також можете скористатися форумами для швидкої технічної допомоги.