- Модуль датчика скорости LM393 (H206)
- Монтажная схема датчика H206
- Принципиальная схема робота с датчиком скорости DIY Arduino LM393
- Логика измерения скорости с помощью модуля датчика скорости LM393
- Логика измерения расстояния, пройденного рулем
- Логика измерения угла наклона бота
- Код робота Arduino
- Тестирование робота Arduino для измерения расстояния, скорости и угла
Роботы медленно начали проникать в наше общество, чтобы сделать нашу жизнь проще. Мы уже можем найти шестиколесных роботов для доставки еды от Starship на дорогах Великобритании, которые ловко перемещаются среди мирных жителей, чтобы добраться до места назначения. Каждый мобильный робот, который перемещается в окружающую среду, всегда должен знать свое положение и ориентацию по отношению к реальному миру. Есть много способов добиться этого, используя различные технологии, такие как GPS, радиочастотная триангуляция, акселерометры, гироскопы и т. Д. Каждый метод имеет свои преимущества и уникален сам по себе. В этом руководстве по датчику скорости Arduino LM393 мы будем использовать простой и легко доступный модуль датчика скорости LM393.для измерения некоторых жизненно важных параметров, таких как скорость, пройденное расстояние и угол робота с помощью Arduino. Благодаря этим параметрам робот сможет узнать свое состояние в реальном мире и сможет использовать его для безопасной навигации.
Arduino - самый популярный выбор среди любителей строить роботов, от простого последователя линии до более сложного самобалансирующегося робота или робота для мытья полов. Вы можете проверить все виды роботов в разделе Робототехника.
Мы построим маленького робота, который питается от литиевой батареи и будет управлять им с помощью джойстика. Во время работы мы можем измерять скорость, расстояние и угол движения робота и отображать их в реальном времени на ЖК- дисплее, подключенном к Arduino. Этот проект просто помогает вам измерить эти параметры, как только вы закончите с этим, вы можете использовать эти параметры для автономной работы вашего бота по мере необходимости. Звучит интересно, правда? Итак, приступим.
Модуль датчика скорости LM393 (H206)
Прежде чем мы перейдем к принципиальной схеме и коду проекта, давайте разберемся с модулем датчика скорости LM393, поскольку он играет жизненно важную роль в проекте. Модуль датчика скорости H206 состоит из инфракрасного светового датчика, интегрированного с микросхемой компаратора напряжения LM393, отсюда и название «Датчик скорости LM393». Модуль также состоит из решетки, которая должна быть установлена на вращающийся вал двигателя. Все компоненты обозначены на изображении ниже.
Датчик Инфракрасный свет состоит из ИК - светодиод и фототранзистор, разделенных небольшим болтливости. Вся конструкция датчика помещена в черный корпус, как показано выше. Пластина решетки состоит из прорезей, пластина расположена между зазором инфракрасного датчика света таким образом, чтобы датчик мог определять зазоры в пластине сетки. Каждый зазор в решетке вызывает срабатывание ИК-датчика при прохождении через зазор; затем эти триггеры преобразуются в сигналы напряжения с помощью компаратора. Компаратор представляет собой не что иное, как микросхему LM393 от ON semiconductors. Модуль имеет три контакта, два из которых используются для питания модуля, а один выходной контакт используется для подсчета количества триггеров.
Монтажная схема датчика 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 значения образуют Миллис ().
Затраченное время = текущее время - предыдущее время timetaken = millis () - pevtime ; // время в миллисекундах
После того, как мы вычислили затраченное время, мы можем просто рассчитать значение оборотов в минуту, используя приведенные ниже формулы, где (1000 / timetaken) дает RPS (количество оборотов в секунду), и оно умножается на 60 для преобразования RPS в RPM (обороты в минуту).
об / мин = (1000 / затраченное время) * 60;
После расчета оборотов в минуту мы можем рассчитать скорость транспортного средства, используя приведенные ниже формулы, если нам известен радиус колеса.
Скорость = 2π × RPS × радиус колеса. v = радиус_колеса * об / мин * 0,104
Обратите внимание, что приведенная выше формула предназначена для расчета скорости в м / с. Если вы хотите рассчитать скорость в км / ч, замените 0,0104 на 0,376. Если вам интересно узнать, как было получено значение 0,104, попробуйте упростить формулу V = 2π × RPS × радиус колеса.
Тот же метод используется, даже если датчик Холла используется для измерения скорости вращающегося объекта. Но для датчика H206 есть загвоздка, пластина сетки имеет 20 слотов, и, следовательно, измерение времени между двумя зазорами слота приведет к перегрузке микроконтроллера. Следовательно, мы измеряем скорость только при полном обороте колеса. Поскольку для каждого промежутка будет сгенерировано два прерывания (одно в начале, а другое в конце промежутка), мы получим в общей сложности 40 прерываний для колеса, чтобы сделать один полный оборот. Итак, мы ждем 40 прерываний, прежде чем фактически вычислить скорость колеса. Код для того же показан ниже
если (вращение> = 40) { timetaken = millis () - pevtime; // время в миллисекундах rpm = (1000 / timetaken) * 60; // формулы для расчета оборотов в минуту pevtime = millis (); вращение = 0; }
Другой недостаток этого метода заключается в том, что значение скорости не упадет до нуля, поскольку прерывание всегда будет ждать, пока колесо совершит один оборот для вычисления значения оборотов в минуту. Этот недостаток можно легко преодолеть, добавив простой код, который отслеживает временной интервал между двумя прерываниями, и если он превышает нормальный, то мы можем принудительно установить значение оборотов в минуту и скорость равными нулю. Ссылка в приведенном ниже коде мы использовали переменную dtime для проверки разницы во времени, и если она превышает 500 миллисекунд, значение скорости и об / мин принудительно равно нулю.
/ * Сбрасывается до нуля, если транспортное средство остановлено * / if (millis () - dtime> 500) // inetrrupt не обнаружено в течение 500 мс { rpm = v = 0; // обнуляем обороты и скорость dtime = millis (); }
Логика измерения расстояния, пройденного рулем
Мы уже знаем, что 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. После того, как мы вычислили и левый, и правый угол, эффективный угол, под которым смотрит бот, можно просто получить, вычтя левый угол из правого.
angle = angle_right - угол_левый;
Код робота Arduino
Полный код Arduino для этого робота для измерения скорости и угла можно найти в конце этой страницы. Цель программы - рассчитать скорость, расстояние и угол полета бота, используя вышеупомянутую логику, и отобразить ее на ЖК-экране. Кроме того, он должен предоставлять возможность управлять ботом с помощью джойстика.
Мы начинаем программу с определения контактов цифрового ввода-вывода для двух двигателей. Обратите внимание, что мы также должны контролировать скорость двигателя, и, следовательно, мы должны использовать контакты 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 метра, но он может отличаться для вас в зависимости от вашего бота.
float radius_of_wheel = 0,033; // Измерьте радиус вашего колеса и введите его здесь в см
Внутри функции настройки мы инициализируем все значения равными нулю, а затем отображаем вводный текст на ЖК-дисплее. Мы также инициализировали серийный монитор для отладки. Затем мы упомянули, что датчики скорости H206 подключены к контактам 2 и 3 как внешние прерывания. Именно там, где обнаруживается прерывание, будут выполняться функции ISR Left_ISR и Right_ISR соответственно.
void setup () { вращение = об / мин = pevtime = 0; // Инициализировать все переменные нулями Serial.begin (9600); lcd.begin (16, 2); // Инициализируем ЖК-дисплей 16 * 2 lcd.print ("Бот-монитор"); // Вступительное сообщение, строка 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, ВЫХОД); pinMode (LM_neg, ВЫХОД); pinMode (RM_pos, ВЫХОД); pinMode (RM_neg, ВЫХОД); digitalWrite (LM_neg, LOW); digitalWrite (RM_neg, LOW); attachInterrupt (digitalPinToInterrupt (2), Left_ISR, ИЗМЕНИТЬ); // 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 = миллис (); если (вращение> = 40) { timetaken = millis () - pevtime; // время в миллисекундах rpm = (1000 / timetaken) * 60; // формулы для расчета оборотов в минуту pevtime = millis (); вращение = 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, ускорение); } еще { analogWrite (LM_pos, 0); analogWrite (RM_pos, 0); } if (yValue> 550) analogWrite (RM_pos, 80); если (yValue <500) analogWrite (LM_pos, 100);
Это поможет пользователю переместить бота и проверить, соответствуют ли полученные значения ожидаемым. Наконец, мы можем рассчитать скорость, расстояние и угол полета бота, используя приведенную выше логику, и отобразить ее на ЖК-дисплее, используя приведенный ниже код.
v = радиус_колеса * об / мин * 0,104; //0.033 - радиус колеса в метрах distance = (2 * 3.141 * radius_of_wheel) * (left_intr / 40); int angle_left = (left_intr% 360) * (90/80); int angle_right = (right_intr% 360) * (90/80); angle = angle_right - угол_левый; 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 ° для прямого, отрицательный для вращения против часовой стрелки и положительный для вращения по часовой стрелке.
Вы также можете посмотреть видео в конце этой страницы, чтобы понять, как работает бот. Надеюсь, вы поняли проект и получили удовольствие от его создания. Если у вас есть какие-либо проблемы, оставьте их в разделе комментариев, и я постараюсь ответить. Вы также можете использовать форумы для быстрой технической помощи.