- LM393 Сензорен модул за скорост (H206)
- Разположение на монтажа на сензора H206
- DIY Arduino LM393 Датчик за скорост Роботна схема
- Логика зад измерването на скоростта с модул LM393 сензор за скорост
- Логика зад измерването на изминатото разстояние от колелото
- Логика зад измерването на ъгъла на бота
- Код на робота Arduino
- Тестване на робота Arduino за измерване на разстояние, скорост и ъгъл
Роботите бавно започнаха да пълзят в нашето общество, за да направят живота ни по-опростен. Вече можем да намерим шестте колесни роботи за доставка на храна от Starship по пътищата на Обединеното кралство, умно навигиращи сред цивилните, за да стигнат до местоназначението си. Всеки мобилен робот, който навигира в околната среда, винаги трябва да е наясно със своето положение и ориентация по отношение на реалния свят. Има много начини да се постигне това чрез използване на различни технологии като GPS, RF триангулация, акселерометри, жироскопи и др. Всяка техника има свое предимство и е уникална сама по себе си. В този урок за сензор за скорост на Arduino LM393 ще използваме простия и лесно достъпен модул за сензор за скорост LM393за измерване на някои жизненоважни параметри като скорост, изминато разстояние и ъгъл на робота, използвайки Arduino. С тези параметри роботът ще може да знае реалното си състояние и може да го използва за безопасна навигация.
Arduino е най-популярният избор сред любителите за изграждане на роботи, от обикновен последовател на линия до по-сложен самобалансиращ се или робот за почистване на пода. Можете да проверите всички видове роботи в секцията „Роботика“.
Ще изградим малък робот, който се захранва от литиева батерия и ще го караме с помощта на джойстик. По време на изпълнение можем да измерваме скоростта, разстоянието и ъгъла на робота и да го показваме в реално време на LCD дисплея, свързан към Arduino. Този проект просто ви помага при измерването на тези параметри, след като приключите с това, можете да използвате тези параметри, за да управлявате вашия бот автономно, както е необходимо. Звучи интересно нали? Така че нека да започнем.
LM393 Сензорен модул за скорост (H206)
Преди да влезем в електрическата схема и кода на проекта, нека разберем модула LM393 за сензор за скорост, тъй като той играе жизненоважна роля в проекта. Най- H206 Скорост сензорен модул се състои от Infrared Светлинен сензор интегриран със сравнителен LM393 напрежение IC откъдето идва и името LM393 Speed сензора. Модулът също се състои от решетъчна плоча, която трябва да бъде монтирана към въртящия се вал на двигателя. Всички компоненти са етикетирани на изображението по-долу.
В сензора инфрачервена светлина се състои от IR LED и фото-транзистор разделени от малки GAB. Цялото устройство на сензора е поставено в черен корпус, както е показано по-горе. Решетъчната плоча се състои от прорези, плочата е разположена между процепа на инфрачервения сензор за светлина по такъв начин, че сензорът да усеща пролуките в решетъчната плоча. Всяка междина в решетката задейства IR сензора при преминаване през междината; тези тригери след това се преобразуват в сигнали за напрежение с помощта на компаратора. Сравнителят не е нищо друго освен LM393 IC от полупроводници ON. Модулът има три щифта, два от които се използват за захранване на модула, а един изходен щифт се използва за преброяване на броя на задействанията.
Разположение на монтажа на сензора H206
Монтирането на тези видове сензори е малко сложно. Може да се монтира само към двигатели, които имат изпъкнал вал от двете страни. Едната страна на вала е свързана с колелото, докато другата страна се използва за монтиране на решетъчната плоча, както е показано по-горе.
Тъй като колелото и плочата са свързани към един и същи вал, и двете се въртят с еднаква скорост и по този начин чрез измерване на скоростта на плочата можем да измерим скоростта на колелото. Уверете се, че пропуските в решетката преминават през IR сензора, само тогава сензорът ще може да преброи броя на пропуските, които са преминали. Можете също така да излезете със собствено механично устройство за монтиране на сензора, стига да отговаря на определеното условие. IR сензорът обикновено се използва в много проекти по роботика, за да насочва робота към препятствията.
Показаната по-горе решетъчна плоча има 20 слота (решетки). Това означава, че сензорът ще намери 20 празнини за едно цялостно завъртане на колелото. Чрез преброяване на броя на пролуките, които сензорът е открил, можем да изчислим изминатото разстояние от колелото, по същия начин, като измерваме колко бързо сензорът намира пролуките, които можем да открием скоростта на колелото. В нашия робот ще имаме този сензор, монтиран на двете колела и по този начин можем да намерим и ъгъла на робота. Въпреки това ъгълът на въртене може да бъде по-разумно изчислен с помощта на акселерометъра или жироскопа, научете се тук да свързвате акселерометъра и жироскопа с Arduino и да опитате да измерите ъгъла на въртене, използвайки ги.
DIY Arduino LM393 Датчик за скорост Роботна схема
Пълната схема на този робот за определяне на скоростта и разстоянието е показана по-долу. Bot се състои от Arduino Nano като негов мозък, двата DC мотора за колелата се задвижват от модула L298N H-Bridge Motor Driver. Джойстикът се използва за контрол на скоростта и посоката на бота, а двата сензора за скорост H206 се използват за измерване на скоростта, разстоянието и ангела на бота. След това измерените стойности се показват в LCD модула 16x2. Потенциометърът, свързан към LCD, може да се използва за регулиране на контраста на LCD, а резисторът се използва за ограничаване на тока, който тече към подсветката на LCD.
В пълен кръг се захранва от клетка 7.4V литиево. Този 7.4V се подава към 12V щифт на модула на двигателя на двигателя. След това регулаторът на напрежението на модула на двигателя на двигателя преобразува 7.4V в регулирано + 5V, което се използва за захранване на Arduino, LCD, сензори и джойстик.
Двигателят се управлява от цифровите щифтове 8,9,10 и 11 на Arduino. Тъй като скоростта на двигателя също трябва да се контролира, трябва да подаваме ШИМ сигнали към положителния извод на двигателя. Следователно имаме щифтове 9 и 10, които и двете са PWM способни щифтове. Стойностите X и Y от джойстика се четат, като се използват съответно аналоговите щифтове A2 и A3.
Както знаем, сензорът H206 с генерира спусък, когато се открие празнината в решетъчната плоча. Тъй като тези тригери не винаги трябва да се четат точно, за да се изчисли правилната скорост и разстояние, и двата щифта на спусъка (изхода) са свързани към външния прекъсващ щифт 2 и 3 на платката Arduino. Сглобете цялата верига на шаси и монтирайте сензора за скорост, както беше обяснено, ботът ми изглеждаше по-долу след завършване на връзките. Можете също да гледате видеоклипа в края на тази страница, за да знаете как е монтиран сензорът.
След като хардуерната част е завършена, нека да влезем в логиката на това как ще измерваме скоростта, разстоянието и единичния брой на бота и след това да преминем към раздела за програмиране.
Логика зад измерването на скоростта с модул LM393 сензор за скорост
От настройката за монтиране на сензора трябва да знаете, че модулът на сензора за скорост LM393 (H206) измерва само пропуските, присъстващи в решетъчната плоча. По време на монтажа трябва да се уверите, че колелото (чиято скорост трябва да бъде измерена) и решетъчната плоча се въртят със същата скорост. Както тук, тъй като сме монтирали и колелото, и плочата на един и същи вал, и двамата очевидно ще се въртят със същата скорост.
В нашата настройка сме монтирали два сензора за всяко колело за измерване на ъгъла на бота. Но ако целта ви е да измервате само скоростта и разстоянието, можем да монтираме сензора на всяко едно колело. Изходът на сензора (задействащи сигнали) най-често ще бъде свързан към външен прекъсващ щифт на микроконтролер. Всеки път, когато се открие празнината в решетъчната плоча, ще се задейства прекъсване и ще се изпълни кодът в ISR (Прекъсване на рутинната услуга). Ако сме в състояние да изчислим интервала от време между два такива тригера, можем да изчислим скоростта на колелото.
В Arduino можем лесно да изчислим този интервал от време, като използваме функцията millis () . Тази функция за милиони ще продължи да нараства с 1 за всяка милисекунда от момента на включване на устройството. Така че, когато настъпи първото прекъсване, можем да запазим стойността на milis () в фиктивна променлива (като pevtime в този код) и след това, когато настъпи второто прекъсване, можем да изчислим времето, необходимо чрез изваждане на pevtime стойността от milis ().
Необходимото време = текущото време - предишния път timetaken = милисекунди () - pevtime ; // измерване на времето в милисекунди
След като сме изчислили необходимото време, можем просто да изчислим стойността на оборотите в минута, като използваме формулите по-долу, където (1000 / взето време) дава RPS (обороти в секунда) и се умножава по 60 за преобразуване на RPS в RPM (обороти в минута).
обороти в минута = (1000 / време) * 60;
След изчисляване на оборотите в минута можем да изчислим скоростта на автомобила, използвайки формулите по-долу, при условие че знаем радиуса на колелото.
Скорост = 2π × RPS × радиус на колелото. v = радиус на колелото * rpm * 0.104
Забележете, горната формула е за изчисляване на скоростта в m / s, ако искате да изчислите в km / hr, заменете 0,0104 с 0,376. Ако сте любопитни да разберете как е получена стойността 0.104, опитайте да опростите формулата V = 2π × RPS × радиус на колелото.
Същата техника се използва, дори ако сензор на Hall се използва за измерване на скоростта на въртящ се обект. Но за сензора H206 има уловка, решетъчната плоча има 20 слота и следователно за измерване на времето между два интервала на слота ще претовари микроконтролера. Следователно измерваме скоростта само при пълно завъртане на колело. Тъй като ще се генерират две прекъсвания за всяка празнина (едно в началото и друго в края на пролуката) , ще получим общо 40 прекъсвания за колелото, за да извърши едно пълно завъртане. Така че изчакваме 40 прекъсвания, преди действително да изчислим скоростта на колелото. Кодът за същото е показан по-долу
if (въртене> = 40) { timetaken = millis () - pevtime; // време, отчетено в милисек об / мин = (1000 / време) * 60; // формули за изчисляване на rpm pevtime = милис (); въртене = 0; }
Друг недостатък при този метод е, че стойността на скоростта няма да падне до нула, тъй като прекъсването винаги ще чака колелото да завърши едно завъртане за изчисляване на стойността на оборотите. Този недостатък може лесно да бъде преодолян чрез добавяне на прост код, който следи интервала от време между две прекъсвания и ако той надвишава нормалното, тогава можем да принудим стойността на оборотите и скоростта да бъдат нула. Връзка в кода по-долу използвахме променлива dtime, за да проверим разликата във времето и ако тя надвишава 500 мили секунди, стойността на скоростта и оборотите е принудена да бъде нула.
/ * Да падне до нула, ако превозното средство е спряно * / if (millis () - dtime> 500) // не е намерен безпрекъсване за 500ms { rpm = 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 за този робот за измерване на скорост и ъгъл може да бъде намерен в края на тази страница. Целта на програмата е да изчисли скоростта, разстоянието и ъгъла на бота, използвайки горните логики и да го покаже на LCD екрана. Освен това той трябва да предоставя опция за управление на бота с помощта на джойстика.
Стартираме програмата, като дефинираме цифровите I / O щифтове за двата двигателя. Имайте предвид, че ние също трябва да контролираме скоростта на двигателя и следователно трябва да използваме PWM щифтовете на Arduino за управление на двигателите. Тук сме използвали щифтовете 8,9,10 и 11.
#define LM_pos 9 // ляв мотор #define LM_neg 8 // ляв мотор #define RM_pos 10 // десен мотор #define RM_neg 11 // десен мотор #define joyX A2 #define joyY A3
За да измерим скоростта и изминатото разстояние, трябва да знаем радиуса на колелото, да измерим стойността и да го въведем в метри, както е показано по-долу. За моя бот радиусът беше 0,033 метра, но може да се различава за вас в зависимост от вашия бот.
плаващ радиус_ на_колесо = 0,033; // Измерете радиуса на колелото си и го въведете тук в см
Във функцията за настройка ние инициализираме цялата стойност да бъде нула и след това показваме Intro Text на LCD. Също така инициализирахме серийния монитор с цел отстраняване на грешки. Тогава споменахме, че датчиците за скорост H206 са свързани към щифтове 2 и 3 като външни прекъсвания. Това е мястото, където винаги се открие прекъсването, ISR функцията Left_ISR и Right_ISR ще бъдат изпълнени съответно.
void setup () { въртене = rpm = pevtime = 0; // Инициализираме всички променливи до нула Serial.begin (9600); lcd.begin (16, 2); // Инициализиране на 16 * 2 LCD lcd.print ("Bot Monitor"); // Входен ред за съобщение 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 ++; delay (10); } void Right_ISR () { right_intr ++; забавяне (10); въртене ++; dtime = милис (); if (въртене> = 40) { timetaken = millis () - pevtime; // време, отчетено в милисек об / мин = (1000 / време) * 60; // формули за изчисляване на rpm pevtime = милис (); въртене = 0; } }
Вътре в основната функция на безкраен цикъл ние наблюдаваме стойностите на X и Y от джойстика. Въз основа на стойността, ако джойстикът е преместен, ние контролираме съответно бота. Скоростта на бота зависи от това доколко е натиснат джойстика.
int xValue = analogRead (joyX); int yValue = analogRead (joyY); int ускорение = карта (xValue, 500, 0, 0, 200); if (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);
Това ще помогне на потребителя да премести бота и да провери дали получените стойности са според очакванията. Накрая можем да изчислим скоростта, разстоянието и ъгъла на бота, като използваме горните логики и да ги покажем на LCD, използвайки кода по-долу.
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 и използвайте джойстика, за да преместите бота си. скоростта на бота, изминатото от него разстояние и ъгълът ще бъдат показани на LCD, както е показано по-долу.
На LCD термина Lt и Rt представлява съответно брояч на прекъсванията вляво и броя на прекъсванията вдясно. Можете да намерите тези стойности да се увеличават за всяка пролука, открита от сензора. Темпът S показва скоростта на бота в м / сек, а терминът D показва разстоянието, изминато в метри. Ъгълът на бота се показва в края, където 0 ° е за прав и става отрицателен за въртене обратно на часовниковата стрелка и положителен за въртене по часовниковата стрелка.
Можете също да гледате видеоклипа в края на тази страница, за да разберете как работи ботът. Надявам се, че сте разбрали проекта и ви е било приятно да го изградите. Ако имате някакви притеснения, оставете ги в раздела за коментари и аз ще се опитам да отговоря най-добре. Можете също да използвате форуми за бърза техническа помощ.