Arduino.ru
как собрать и запрограммировать робота для движения по линии
- Войдите на сайт для отправки комментариев
Пт, 19/04/2019 — 19:17
sarapulov.vas
Зарегистрирован: 19.04.2019
Расскажите как собрать и запрограммировать робота для движения по линии на ардуино.
- Войдите на сайт для отправки комментариев
Пт, 19/04/2019 — 19:33
Зарегистрирован: 14.04.2019
К арудино подключаем мотор шилд, к нему подключаем два мотора, необходимо подключить еще два датчика черной линии
в целом алгоритм такой: считываем значения датчиков , и проверяем если черную линию видит левый датчик, то поврот на один delay влево и наоборот
Left_1 = analogRead (LeftSensor_1); //Считываем данные с левого датчика Right_1 = analogRead (RightSensor_1);//Считываем данные с правого датчика //Если левый датчик видит черныйа правый белый, то поворачиваем налево if ((Left_1 > sl1) && (Right_1
Поподробней о движении робота ардуино можешь посмотреть здесь Движение мобильного робота ардуино по черной линии
- Войдите на сайт для отправки комментариев
Arduino. Проект «Робот-машина RoboCar4W»
Вы понимаете, — втолковывал редактор, — это должно быть занимательно, свежо, полно интересных приключений… Так, чтобы читатель не мог оторваться.
И.Ильф, Е.Петров «Как создавался Робинзон».
Начинать работу с Arduino, как и с любой другой платформой программной или аппаратной, всегда интереснее с какого-нибудь реального проекта. Программисты при этом пишут код выводящий «Hello, world», ардуинисты моргают светодиодом. И все радуются как дети.
Я же решил начать с продвинутого проекта, в том числе с тайной надеждой оторвать молодое поколение от Counter-Strike (не получилось).
Как можно догадаться из названия RoboCar4W, первым проектом стал робот-машина о четырех колесах. Начиная работу я уже имел опыт программирования, умел когда-то давно паять, но совершенно не знал даже распиновки Arduino и документацию совершенно не читал. Все премудрости изучал по ходу пьесы и Гугл в помощь.
Поскольку сам проект принципиально не нов, подобных описаний в сети достаточно, все компоненты известны, то никаких неожиданностей не предполагалось. Поэтому задумка была сформулирована в самых общих чертах и главной целью являлось погружение в «мир вещей» с помощью Arduino, как платформы для быстрого прототипирования. В этом опусе возможно кто-то узнает себя в самом начале пути.
Всё «железо» приобреталось на ebay, и по своему опыту хочу сказать, что проще приобрести сразу стартер кит (ищите по словам Arduino Starter Kit), а не собирать подетально. Да и приедет все сразу вместе. Решено было не мелочиться, купить нормальное шасси, нормальные колеса, нормальные моторы, чтоб было «дорохобохато».
Главный секрет успешных покупок на eBay — покупать у продавцов с высоким рейтингом и при этом внимательно читать описание товара. Об этом есть много статей в интернете.
Какую плату семейства Arduino выбрать?
Я взял Arduino UNO, под нее много проектов с описаниями. Но сейчас бы взял Arduino Mega 2560, у нее больше цифровых и аналогов выводов и полная совместимость по проектам с UNO.
Общее описание проекта
В мире разработки программного обеспечения это называют еще «требования к системе».
Задумка проекта была следующей. Первый вариант машины-робота под названием RoboCar4W должен выполнять незамысловатые действия:
- двигаться вперед, назад, выполнять повороты
- измерять расстояние до препятствий
- уметь автоматически объезжать препятствия находящиеся впереди.
Второй вариант машины должен управляться вручную по bluetooth с Android телефона.
Чтобы вам лучше работалось вот весь финальный проект RoboCar4W в сборе (тут без блютуза).

Вот видео ходовых испытаний.
На первом видео RoboCar4W ездит в автоматическом режиме с объездом препятствий на двух разных версиях «прошивки», т.е. скетча, поэтому, если кто самый зоркий и заметил, что поведение робота в разных эпизодах немного отличается.

На втором видео RoboCar4W передвигается при помощи команд, передаваемых «водителем» по Bluetooth с мобильного телефона под Android. На телефоне установлена программа «Bluetooth RC Car». Причем, если близко впереди оказывается препятствие, то робот останавливается, т.е. протаранить что-нибудь не получится (однако есть «секретная» кнопка, которая отключает безопасный режим).

На третьем видео RoboCar4W показывает заранее запрограммированную демо-программу движения с поворотами. Демо-программа активируется по команде с того же мобильного телефона под Android. Робот просто едет некоторое время и делает повороты.

Алгоритм управления движением
Ошибочно называть наш способ «алгоритм объезда препятствий» или «поиском пути». Это отдельные математические дисциплины, чистая математика. Если вам очень-очень сильно нравится математика, то погуглите указанные словосочетания, чтивом на полгода будете обеспечены.
Пока же нас интересуют вещи гораздо проще. Поэтому мы назовем это просто — алгоритм управления движением 4-х колёсного робота. Разумеется речь идет об автоматическом управлении без участия человека.
Вот этот простой алгоритм записанный словами, для более сложных алгоритмов придется (хочется или нет) составлять блок-схемы.
Сейчас одновременно смотрите в исходник скетча RoboCar4W-1.ino.
- Измеряем расстояние до препятствия впереди.
- Если это измеренное расстояние меньше значения DST_TRH_BACK (сокращение от distance threshold), то останавливаемся и едем задним ходом одновременно поворачивая. Направление поворота выбираем так: если ранее уже поворачивали влево, то поворачиваем вправо и наоборот.
- Если измеренное расстояние больше чем DST_TRH_BACK , но меньше чем DST_TRH_TURN , то просто поворачиваем. Направление поворота выбираем случайно.
- Если до препятствия далеко, то просто едем вперед.
- Повторяем все сначала.
Чем хорошо, что у нас 4 колеса и все ведущие? Мы можем выполнить (запрограммировать) несколько типов поворотов:
- Плавный поворот. Все колеса вращаются, но колеса с одной стороны вращаются быстрее.
- Резкий поворот. Колеса вращаются только с одной стороны.
- Разворот на месте. Как трактор, колеса одной стороны вращаются назад, а другой — вперед.

Во втором варианте программы, при управлении с Android-телефона безопасный режим, когда робот старается не допускать лобовых столкновений, может быть отключен, если в программе два раза нажать кнопку
и включен обратно однократным её нажатием.
Важное примечание. Вся логика находится под управлением Arduino. Android здесь выступает просто как игровой пульт (без мозгов) от консоли, его задача — тупо передавать нажатия кнопок (т.е. команды) посредством Bluetooth в Arduino RoboCar4W.
Компоненты
Первоначально в состав машины входил сервопривод, который поворачивал ультразвуковой измеритель расстояния на определенный угол для измерений по трем направлениям. Но в ходе испытаний из-за неосторожного обращения сервопривод сгорел, поэтому теперь датчик расстояния просто жестко закреплен впереди корпуса.
Нет худа без добра, зато скетч стал немного проще.
На будущее, сервопривод покупайте самый простой и дешевый, особая мощность, скорость и точность поворота на заданный угол не нужны, а вывести серво из строя довольно легко, как оказалось. Вполне подойдет SG90 стоимостью $2.
Итак составные части проекта RoboCar4W, описание на английском дается для облегчения поиска на ebay и ему подобных:
- Arduino UNO R3
- Готовое шасси 4 Wheel Drive Mobile Robot Platform Smart Car Chassis Arduino Compatible
- Моторы постоянного тока (DC) с вращением в обе стороны — 4 шт.
- Колеса — 4 шт.
- Плата для управления 4-мя DC моторами Motor Drive Shield L293D
- Ультразвуковой измеритель расстояния HC-SR04 Ultrasonic Module Distance Measuring Sensor
- Аккумуляторы Ni-MH 1.2 В — 8 шт.
- Пластиковый бокс держатель для батареек, Battery Box holder 4 AA Batteries — 2 шт.
- Аккумулятор типа «Крона» 8.4 В — 1 шт.
- Опционально тумблер — выключатель питания
Шасси, DC моторы и колеса приобретались сразу в комплекте и даже с инструкцией по сборке.
Распиновка
Аналоговые входы могут использоваться как цифровые выводы портов ввода/вывода. Выводы Arduino, соответствующие аналоговым входам, имеют номера от 14 до 19. Это относится только к выводам Arduino, а не к физическим номерам выводов микроконтроллера Atmega.
Рисовать не обязательно, можно просто свести все в таблицу. У меня получилось так.

Пины D4, D7, D8, D12 будут заняты, если используются любые DC моторы или шаговые.
Пины D9 (Servo #1 control), D10 (Servo #2 control) будут заняты, только если используются сервомоторы.
Сама по себе плата для управления моторами Motor Drive Shield L293D пины Arduino не занимает.
Пины питания 3.3 В, 5 В и «земля» дублируются на Motor Drive Shield в достаточном количестве. Поэтому об их нехватке не стоит беспокоиться.
Если все-таки хотите красиво нарисовать, то бесплатная программа Fritzing вам в помощь.
Питание
Это второй очень важный момент. От питания зависит очень многое. Например, серво-мотор при повороте вала на заданный угол начинает потреблять большой ток. При этом если серво подключен по питанию на 5 В Arduino, то происходит «просадка» по напряжению и вся остальная схема начинает глючить, а Arduino даже может перезагружаться при этом.
В любом случае, если в поделке используете моторы, то Motor Drive Shield необходим (или подобная ему схема).
Итак, имеем 4 мотора постоянного тока (DC), сервопривод, саму плату Arduino и несколько датчиков. Моторы самые прожорливые, а вот датчики могут успешно запитываться с разъемов самой платы Arduino, поэтому с ними все просто. Для удобства я свел всё хозяйство в одну таблицу.
| Напряжение рекомендованное или типовое. Потребляемый ток | Максимальное напряжение | Чем планируется питать | Примечания | |
|---|---|---|---|---|
| Плата Arduino UNO R3 | 7 — 12V, 200mA (среднее) | 6 — 20 | «Крона 9V» Li-ion 650mAh, 8.4V | Разъем с плюсом в центре |
| Сервомотор MG-995 | 5—6 V, 0.1 — 0.3A (пиковое) | 4.8 — 7.2 | Аккумуляторы (5) шт. Ni-Mh 1.2V = 6V | Питание только от отдельного источника. Если запитать вместе с Arduino, то будет глючить всё. Напряжения Ni-Mh аккумуляторов 4шт. * 1.2В = 4.8V не хватает. Некоторые утверждают, что данную серву не стоит использовать на 6 вольтах только 4,8 |
| DC двигатели (4 шт.) | 6 — 8V, ток от 70mA до 250mA | 3 — 12 | аккумуляторы (5+3) шт. Ni-Mh 1.2V = 9.6V | Вы не сможете нормально запустить двигатели от 9В батареи, так что даже не тратьте время (и батареи)! |
| Motor Drive Shield L293D | не требуется | 4.5 — 36 | не требуется | |
| Модуль Bluetooth HC-0506 | 3.3 V, 50 mA | 1.8—3.6 | С пина 3.3V платы Arduino | |
| Ультразвуковой измеритель расстояния HC-SR04 | 5 V, 2 mA | 5 | С пина 5V платы Arduino |
DC/DC преобразователя напряжения у меня не было в наличии. Крона 9V оказался не очень хорошим источником питания, просто у меня он уже был.
А вот от использования Li-ion аккумуляторов большой емкости я отказался. Во-первых, из-за высокой стоимости, во-вторых в китайских интернет-шопах легко нарваться на подделку. Точнее не «легко», а «всегда». Кроме этого Li-ion требует особого обращения, и он не безопасен.
Итак, как видим из таблицы, нам требуется 3 независимых источника питания:
- Для платы Arduino и датчиков.
- Для сервомотора.
- Для 4-х DC моторов.
Где ж столько набрать? Саму плату Arduino в любом случае надо питать от отдельного источника, т.к. при «проседании» напряжения, например от включения моторов, плата может перезагружаться или просто глючить. Здесь применяем аккумулятор форм-фактора «Крона 9В», причем разъем который будет подключаться к Arduino должен быть с «плюсом в центре».
Для сервомотора и 4-х DC моторов можно обойтись одним источником питания. Проблема только в том, что сервомотор рассчитан на напряжение 5-6В (максимум 7.2В) и ток 100 — 300мA (пиковое), а DC моторам требуется 6 — 8В (максимум 12В) и ток 250мА.
Для решения проблемы существуют DC-DC преобразователи, но у меня таких не оказалось. В итоге я применил свою «фирменную» схему соединения (безо всяких понижающих электронных схем, только экологически чистые напряжение и ток!): подключил 8 шт. аккумуляторов на 1.2V последовательно и сделал отводы в нужных местах, как показано на схеме.

6В пошло на сервомотор, а 9.6 на DC моторы. Понятно, что аккумуляторы 1—5 будут испытывать повышенную нагрузку.
Для управления серво и DC моторами использовал 4-х канальный Motor Drive Shield на базе микросхемы L293D.
Сборка
Собрать готовое шасси небольшая проблема. Но не думайте, что без допиливания у вас всё сразу соберется. Поэтому приготовьте надфили.


Подключить нормально несколько моторов, сервомотор или шаговый напрямую к Arduino не удастся. Так как пины (выводы) Arduino являются слаботочными. Для решения проблемы существует дополнительный модуль управления приводами — Motor Drive Shield на базе микросхемы L293D, которая является одной из самых распространенных микросхем, предназначенных для этой цели. Чип L293D известен также как H-мост (H-Bridge).
Я использовал плату, которая обеспечивает 4 канала для подключения на двух микросхемах L293D и сдвиговом регистре. Приобретается на eBay за $5.
Данная плата модуля управления приводами имеет следующие характеристики.
- L293D Motor Drive Shield совместим с Arduino Mega 1280 и 2560, UNO, Duemilanove, Diecimila
- 4-х канальное управление
- питание моторов от 4.5В до 36В
- допустимый ток нагрузки 600мА на канал, пиковый ток — 1.2A
- защита от перегрева
- 2 интерфейса с точным таймером Arduino (не будет «дрожания») для подключения сервомоторов на напряжение 5В, если напряжение питания нужно повыше, то подключение по питанию нужно переделать как описано ниже
- можно одновременно управлять 4 двунаправленными DC коллекторными моторами или 2 шаговыми, и 2 сервомоторами
- 4 двунаправленные DC моторы подключены каждый к 8-битной шине для выбора индивидуальной скорости
- подключение до 2 шаговых приводов (однополярных или биполярных), с одной катушкой, двойной катушкой или с чередованием шага
- разъем для подключения внешнего источника для раздельного питания управляющей логики и моторов
- Кнопка RESET Arduino
- для управления используется библиотека Adafruit AFMotor.
Motor Drive Shield требует небольшой доработки, чтобы можно было после него хоть что-нибудь подключить. Я подпаял сверху необходимые разъемы, получилось вот что.

Моторы могут быть подключены к дополнительному по отношению к плате Arduino источнику питания. Я рекомендую именно такой способ подключения. Для этого нужно снять, разомкнуть перемычку, как показано на картинке.

В этом случае питание Arduino и питание моторов производится независимо друг от друга.
Светодиод на мотор-шилде светится при наличии питания для моторов, если он не горит, то моторы работать не будут.
Сервомоторов положение джампера питания не касается, они по прежнему будут запитаны от 5V Arduino. Так как сервомоторы обычно потребляют большой ток и если питания недостаточно, то всё устройство начинает глючить, в «лучшем» случае будет глючить только сервопривод — не будет поворачиваться на заданный угол, либо все время перед каждым поворотом поворачивать сначала в 0 градусов, а уже потом на заданный угол (и если будет успевать). Поэтому я рекомендую питать сервопривод также от дополнительного источника питания. Для этого придется немного переделать схему подключения: откусить плюсовой провод (обычно красный) от стандартного разъема и соединить его с плюсом источника питания напрямую.

При подключении Motor Drive Shield аналоговые пины не используются. Цифровые пины 2, 13 не используются.
Указанные ниже пины используются, только если подключены и используются соответствующие DC двигатели или шаговые двигатели (Stepper):
- D11: DC Motor #1 / Stepper #1 (активация и контроль скорости)
- D3: DC Motor #2 / Stepper #1 (активация и контроль скорости)
- D5: DC Motor #3 / Stepper #2 (активация и контроль скорости)
- D6: DC Motor #4 / Stepper #2 (активация и контроль скорости)
Эти пины будут заняты, если используются любые DC/steppers: D4, D7, D8, D12.
Указанные ниже пины будут заняты, только если используются соответствующие сервомоторы:
- D9: Servo #1 управление
- D10: Servo #2 управление

Для начала работы с Motor Drive Shield необходимо скачать и установить библиотеку Adafruit AFMotor.
Пример кода для управления моторами:
#include // подключить библиотеку Adafruit #include // подключить библиотеку для сервомотора AF_DCMotor motor(1); // создать объект мотор, указав номер разъема DC мотора на плате Motor Shiled и, опционально, частоту frequency Servo servo; // создать объект сервомотор servo.attach(10); // присоединить серво на пин 9 или 10 (крайний разъем на плате Motor Shiled) motor.setSpeed(speed); // установить скорость DC мотора от 0 (останов) до 255 (полный газ) motor.run(RELEASE); // DC мотор стоп motor.run(FORWARD); // DC мотор вперед motor.run(BACKWARD); // DC мотор назад servo.write(90); // повернуть серво на 90 град.
DC мотор у меня начал крутиться только при указании скорости больше 100, если меньше — просто жужжит. Минимальную скорость вашего мотора вам придется определить экспериментально.
Для моторов, подключенных к M1 и M2 можно задать частоту: MOTOR12_64KHZ, MOTOR12_8KHZ, MOTOR12_2KHZ, MOTOR12_1KHZ. Наибольшая скорость вращения достигается при 64KHz эта частота будет слышна, меньшая частота и скорость на 1KHz но и использует меньше энергии. Моторы 3 и 4 всегда работают на 1KHz другие значения игнорируются. По умолчанию везде 1KHz.
После этого необходимо прогнать тест моторов. Скетч для тестирования можно взять здесь. В начале скетча измените номер мотора в строке (или в строках) типа:
AF_DCMotor motor(…);
Скетч некоторое время вращает мотор(ы) вперед по ходу движения робота, а затем назад. Посмотрите внимательно в ту ли сторону вращается мотор, и измените полярность подключения если нужно.
Подключаем ультразвуковой измеритель расстояния HC-SR04 Ultrasonic Module. Распиновка выводов:
Время затрачиваемое ультразвуковым дальномером на измерения (определено опытным путем):
- максимум 240 мсек, если расстояние слишком велико (out of range)
- минимум 1 мсек, если расстояние слишком мало
- расстояние в 1.5 м определяется примерно за 10 мсек

Ультразвуковой датчик дальномер, в силу своей физической природы, а не потому что Китай, в некоторых случаях плохо определяет расстояние до препятствия:
- если препятствие сложной формы, то ультразвук отражается под разными углами и датчик ошибается,
- ультразвук отлично поглощается (т.е. не отражается) мягкой мебелью или игрушками, и датчик считает что перед ним ничего нет.
Другими словами, для ультразвукового дальномера в идеале было бы отлично, если бы все препятствия имели вид твёрдой плоскости, перпендикулярной направлению излучения ультразвука.
Некоторые проблемы можно решить с помощью инфракрасного датчика расстояния. Но он тоже не идеален:
- небольшая максимальная дальность по сравнению с ультразвуковым: 0,3—0,8 м против 4 м
- большое минимальное расстояние по сравнению с ультразвуковым: 10 см против 2 см
- зависимость чувствительности датчика от общей освещенности.
Хотя если установить эти дальномеры в паре, то эффективность их работы заметно повысилась бы.
Подключаем Bluetooth HC-05
Как видим из даташита основные пины «голого» HC-05:
- TX (pin 1) передача
- RX (pin 2) прием
- 3,3V (pin 12) питание 3.3В
- GND (pin 13) земля
- PIO8 (pin 31) индикатор режима
- PIO9 (pin 32) статус соединения, если соединение установлено, то на выходе будет высокий уровень
- PIO11 (pin 34) для включения режима AT-команд
Наш модуль припаян к плате Breakout/Base Board, где уже есть делитель напряжения, поэтому диапазон рабочих напряжений у него от 3.3В до 6В.
Подключаем наш Bluetooth модуль в сборе :
- Arduino (TX) — (RX) HC-05
- Arduino (RX) — (TX) HC-05
- Arduino (+5В) — (VCC) Bluetooth
- Arduino (GND) — (GND) Bluetooth
- пины LED, KEY не используются
После подачи питания на модуль Bluetooth HС-05 на нем должен заморгать светодиод, что означает работоспособность блютуза.
Включаем bluetooth на мобиле, находим устройство с именем HC-05 и подключаемся, пароль 1234.
Для тестирования заливаем в Arduino простой скетч:
Примечание. Каждый раз перед загрузкой программы в Arduino, убедитесь, что модуль Bluetooth не подключен к Arduino. Это вызовет проблемы заливки скетча. Просто отсоедините питание от Bluetooth модуля или провода, соединяющие Arduino и RX, TX контакты модуля.
В начале скетча измените номера моторов в строках типа:
AF_DCMotor motor(…);
Если заменить строку
byte debug = 0;
byte debug = 10;
то включится режим отладки.
В режиме отладки робот RoboCar4W реально ездить или крутить колесами не будет. Вместо этого активируйте монитор последовательного порта и там увидите как он «ездит» виртуально. Вместо реальной езды вперед в монитор последовательного порта будет писаться строка «Forward», вместо заднего хода с поворотом влево — «Turn Back L(eft)» и т.д. Датчик ультразвукового измерения расстояния тоже ничего не делает, вместо этого расстояния до препятствий генерируются программно и случайно.
Этот режим отладки удобен, если вы меняете алгоритм движения и вместо того, чтобы ловить машинку по комнате, просто проверяете всё на «холостом» ходу.
Скетч для ручного управления по блютуз скачать здесь. Скетч не имеет режима отладки, так как там всё прозрачно. Вы нажимаете кнопку — робот едет.
Ну вот и все! Счастливой дороги!
Урок 33. Обучаем Arduino робота ездить по линии

При создании любого робота, его нужно оснастить датчиками (показания которых будет считывать робот), управляющими модулями (для вывода результатов работы робота), и скетчем (по алгоритму которого должен работать робот). В нашем случае, мы оснастим машинку, тремя аналоговыми датчиками линий и одним ультразвуковым датчиком расстояния, а в роли управляющих модулей выступят два закрепленных к каркасе моторчика, с колёсами на валах.
Видео:

Алгоритм работы:
- Если центральный датчик находится на линии, а боковые вне линии, то машинка едет прямо.
- Если левый датчик находится на линии, а правый вне линии, то машинка поворачивает налево (независимо от показаний центрального датчика)
- Если правый датчик находится на линии, а левый вне линии, то машинка поворачивает направо (независимо от показаний центрального датчика)
- Если правый и левый датчики находятся на линии (вне зависимости от показаний центрального датчика), то такое состояние является неопределённым, машинка продолжает предыдущее движение (прямо или с поворотом) в течении 2 секунд (можно менять в скетче). Если в течении этого времени состояние не изменится, то она остановится.
- Если все три датчика находятся вне линии, то такое состояние является неопределённым (потеря линии). Если этому состоянию предшествовал поворот, то машинка продолжит поворот в течении 2 секунд (можно менять в скетче). Если в течении этого времени состояние не изменится, то она остановится. Если этому состоянию не предшествовал поворот (машинка ехала прямо и линия оборвалась), то машинка сразу остановится.
- Если перед машинкой появилось препятствие, на расстоянии менее 10 см (можно менять в скетче), то машинка остановится и продолжит движение, как только препятствие исчезнет.
Скорость движения задаётся в константе valSpeed, от 1 до 255. Крутизна поворотов задаётся в константе valTurning, от 1 до 255. Время продолжения движения, при неопределённом состоянии, задаётся в константе tmrDelay, в микросекундах. Направление движения моторов указывается логическими значениями элементов массива arrRoute (0 элемент — правый мотор, 1 элемент — левый мотор), по умолчанию все элементы равны «1». Если вы перепутали полярность при подключении мотора, то измените значение соответствующего элемента этого массива на «0».
Калибровка для светлых, слабоконтрастных или цветных линий:
Машинка настроена на движение по темной линии, но она может ездить по светлым, слабоконтрастным или цветным линиям. Для этого её нужно откалибровать, указав значения для констант valSensor1 (показание датчика находящегося на линии) и valSensor0 (показание датчика находящегося вне линии). Для чего, в коде setup скетча, предусмотрен вывод показаний центрального датчика в монитор последовательного порта.
- Поместите машинку так, чтобы центральный датчик находился над линией.
- Подключите Arduino Uno по USB кабелю.
- Откройте монитор последовательного порта. В мониторе высветится показание датчика на линии.
- Поместите машинку так, чтобы центральный датчик находился вне линии.
- Нажмите кнопку reset на Motor Shield. В мониторе высветится показание датчика вне линии.
- Укажите первое значение константе valSensor1, а второе значение константе valSensor0 и повторно загрузите скетч.
Код программы:
// БИБЛИОТЕКИ: #include // подключаем библиотеку для работы с датчиком // НОМЕРА ВЫВОДОВ: const uint8_t pinSensorL = A3; // Вывод к которому подключен датчик находящийся слева (по направлению движения) const uint8_t pinSensorC = A4; // Вывод к которому подключен датчик находящийся по центру (по направлению движения) const uint8_t pinSensorR = A5; // Вывод к которому подключен датчик находящийся справа (по направлению движения) const uint8_t pinSens_TRIG = 2; // Вывод к которому подключен датчик расстояния HC_SR04 (вывод обозначенный на датчике как TRIG) const uint8_t pinSens_ECHO = 3; // Вывод к которому подключен датчик расстояния HC_SR04 (вывод обозначенный на датчике как ECHO) const uint8_t pinShield_LH = 7; // Вывод направления к которому подключен левый мотор (по направлению движения) const uint8_t pinShield_LE = 6; // Вывод ШИМ к которому подключен левый мотор (по направлению движения) const uint8_t pinShield_RE = 5; // Вывод ШИМ к которому подключен левый мотор (по направлению движения) const uint8_t pinShield_RH = 4; // Вывод направления к которому подключен левый мотор (по направлению движения) // ОБЪЕКТЫ: iarduino_HC_SR04_int hcsr(pinSens_TRIG, pinSens_ECHO); // Объект hcsr для работы с библиотекой iarduino_HC_SR04 (вывод TRIG, вывод ECHO) // УСТАНАВЛИВАЕМЫЕ ЗНАЧЕНИЯ: const uint16_t valSensor1 = 930; // Показание датчика находящегося на линии (указывается для конкретной трассы) const uint16_t valSensor0 = 730; // Показание датчика находящегося вне линии (указывается для конкретной трассы) const uint8_t valSpeed = 255; // Максимальная скорость (число от 1 до 255) const uint32_t tmrDelay = 2000; // Время в течении которого требуется остановиться (если в течении этого времени состояние остаётся неопределённым (линия не обнаружена), то требуется остановиться) const uint8_t valTurning = 10; // Крутизна поворотов (скорость реакции) (число от 1 до 255) const uint8_t valDistance = 20; // Минимально допустимое расстояние до объекта в сантиметрах (если расстояние будет меньше, то требуется остановитьтся) const bool arrRoute[2] = ; // Направление движения для каждого мотора (зависит от полярности, нулевой элемент - правый мотор, первый элемент - левый мотор) // РАССЧИТЫВАЕМЫЕ ЗНАЧЕНИЯ: uint8_t arrSpeed[2]; // Рассчитываемая скорость для каждого мотора (число от 1 до valSpeed, нулевой элемент - правый мотор, первый элемент - левый мотор) uint16_t valSensorM; // Рассчитываемое среднее значение датчика (значение между цветом линии и цветом вне линии) uint8_t valSensor; // Биты рассчитываемых логических уровней всех датчиков (0bxxxxxLCR) bool flgLine; // Флаг указывающий на то, что используется светлая линия (0 - тёмная линия, 1 - светлая линия) int8_t flgTurning; // Флаг наличия и направления поворота (0 - не поворачиваем, -1 - поворачиваем налево, +1 - поворачиваем направо) bool flgPWM; // Флаг указывающий на то, что требуется изменить ШИМ моторов (0 - тёмная линия, 1 - светлая линия) bool flgStop; // Флаг указывающий на необходимость остановиться (0 - без остановки, 1 - требуется остановиться) bool flgDistance; // Флаг обнаружения препятствия (0 - не обнаружено, 1 - обнаружено) uint32_t tmrMillis; // Время совершения последней операции (в миллисекундах) void setup()< // Узнаём цвет линии используемой на трассе, если он светлый, то устанавливаем флаг lineColor тёмный flgLine = (valSensor0>valSensor1); // Если условие (valSensor0>valSensor1) выполняется значит линия светлая и флаг flgLine установится в 1, иначе он сбросится в 0 // Вычисляем среднее значение между показаниями датчиков на линии и все линии if(flgLine) // Если на трассе используется светлая линия else // Если на трассе используется тёмная линия // Устанавливаем значение скорости обоих моторов arrSpeed[1]=valSpeed; // Максимальная скорость на левом моторе arrSpeed[0]=valSpeed; // Максимальная скорость на правом моторе // Устанавливаем флаг ШИМ, сбрасываем флаг наличия поворота, флаг остановки и флаг обнаружения припятствий flgPWM=1; flgTurning=0; flgStop=0; flgDistance=0; // Устанавливаем режим работы выводов и направление обоих моторов pinMode (pinSensorL, INPUT ); // Конфигурируем вывод pinSensorL как вход (для получения данных от левого датчика линии) pinMode (pinSensorC, INPUT ); // Конфигурируем вывод pinSensorC как вход (для получения данных от центрального датчика линии) pinMode (pinSensorR, INPUT ); // Конфигурируем вывод pinSensorR как вход (для получения данных от правого датчика линии) pinMode (pinShield_LH, OUTPUT ); // Конфигурируем вывод pinShield_LH как выход (для управления направлением движения левого мотора) pinMode (pinShield_LE, OUTPUT ); // Конфигурируем вывод pinShield_LE как выход (для управления скоростью вращения левого мотора, при помощи ШИМ) pinMode (pinShield_RE, OUTPUT ); // Конфигурируем вывод pinShield_RE как выход (для управления скоростью вращения правого мотора, при помощи ШИМ) pinMode (pinShield_RH, OUTPUT ); // Конфигурируем вывод pinShield_RH как выход (для управления направлением движения правого мотора) digitalWrite(pinShield_LH, arrRoute[1]); // Устанавливаем на выходе pinShield_LH уровень arrRoute[1] (направление движения левого мотора) digitalWrite(pinShield_RH, arrRoute[0]); // Устанавливаем на выходе pinShield_RH уровень arrRoute[0] (направление движения правого мотора) // Выводим показания центрального датчика линии Serial.begin(9600); while(!Serial)<> // Инициируем передачу данных по последовательному порту (на скорости 9600 бит/сек) Serial.println(analogRead(pinSensorC)); // Выводим показания центрального датчика линии (для указания значений константам valSensor0 и valSensor1) // Устанавливаем задержку и обновляем время совершения последней операции delay(2000); tmrMillis = millis(); > void loop()< // Читаем показания датчиков и преобразуем их в логические уровни // (1 - датчик на линии, 0 - датчик вне линии) valSensor = 0; // сбрасываем все биты переменной valSensor valSensor |= ((analogRead(pinSensorL)>valSensorM)^flgLine)valSensorM)^flgLine)valSensorM)^flgLine)" вернет "1" если значение analogRead(номер_вывода) больше чем значение valSensorM, а значит датчик находится над объектом, который темнее чем значение valSensorM, // Результат возвращённый оператором сравнения ">" нам подходит если используется тёмная линия, но если используется светлая линия, то результат нужно инвертировать . // Оператор побитового XOR "^" выполнит эту инверсию, только если установлен флаг flgLine, указывающий о том, что используется светлая линия // Оператор побитового сдвига влево " if(tmrMillis>millis()) < tmrMillis=0;>// Избавляемся от переполнения millis(); if(tmrMillis+tmrDelay// Останавливаемся если линия потеряна на более чем tmrDelay мс if(hcsr.distance() // Останавливаемся если обнаружено препятствие else if(flgDistance) < tmrMillis=millis(); flgPWM=1; flgDistance=0; >// Продолжаем движение если препятствие исчезло // Устанавливаем ШИМ для моторов if(flgPWM)0) arrSpeed[0]=valSpeed; break; // Уменьшаем скорость левого мотора (поворачиваем налево) case 0: arrSpeed[1]=valSpeed; arrSpeed[0]=valSpeed; break; // Устанавливаем одинаковую скорость (едим прямо) case 1: arrSpeed[1]=valSpeed; if(arrSpeed[0]>0) break; // Уменьшаем скорость правого мотора (поворачиваем направо) > if(flgStop) < arrSpeed[1]=0; arrSpeed[0]=0;>// Останавливаемся если установлен флаг flgStop if(flgDistance) < arrSpeed[1]=0; arrSpeed[0]=0;>// Останавливаемся если установлен флаг flgDistance // Выводим ШИМ analogWrite(pinShield_LE, arrSpeed[1]); analogWrite(pinShield_RE, arrSpeed[0]); > >
Ссылки:
- Код программы.
- Библиотека iarduino_HC_SR04_int.
- Wiki — Установка библиотек в Arduino IDE .
- Wiki — Датчик линии, аналоговый.
- Wiki — Ультразвуковой датчик расстояния HC-SR04 .
- Wiki — Trema Shield.
Четвероногий микро-робот на Arduino

Из предыдущих проектов на этой странице вы, вероятно, заметили, что я глубоко интересуюсь роботизированными проектами. В одной из моих предыдущих инструкций я построил четвероногого робота, используя большие мощные серводвигатели, и на этот раз я решил попробовать сделать микро-версию четвероногого робота, которая будет значительно более универсальной и маневренной. В этом руководстве я покажу вам конструкцию и сборку компактного четвероногого робота.
Основная цель при создании этого проекта заключалась в том, чтобы сделать систему как можно меньше, но при этом быть надежной, чтобы во время экспериментов с различными походками и бегом мне не приходилось постоянно беспокоиться о сбоях оборудования. Это позволило мне довести оборудование до предела возможностей и поэкспериментировать со сложными походками и движениями. Вторичной целью было сделать четвероногого относительно недорогим, используя легкодоступные детали для хобби и 3D-печать, что позволило быстро создать прототип. Сочетание этих двух целей обеспечивает прочную основу для проведения различных экспериментов, позволяя разрабатывать четвероногих для более конкретных требований, таких как навигация, избегание препятствий и динамическое передвижение.

Следуйте дальнейшей инструкции чтобы создать своего собственного четвероногого микро-робота на Arduino.
Шаг 1: Обзор и процесс проектирования



Для разработки четвероногого робота было использовано программное обеспечение для 3D-моделирования Autodesk Fusion 360 бесплатная версия. Я начал с того, что импортировал в конструкцию микросервомоторы и построил вокруг них ноги и корпус. Дизайн был разработан с учетом простоты и надежности, так как я надеялся поэкспериментировать с различными динамическими походками, которые доведут оборудование до предела. Другой целью при разработке четвероногого робота было сделать модель как можно более компактной, чтобы максимально использовать крутящий момент, обеспечиваемый серводвигателями. Размеры звеньев были сделаны для достижения большого диапазона движения при минимальной общей длине. Если сделать их слишком короткими, детали напечатанные на 3D-принтере столкнутся, уменьшится диапазон движения, а если они будут слишком длинными, то на приводы будет оказываться ненужный крутящий момент. Наконец, я спроектировал корпус робота, на который будет устанавливаться Arduino и другие электронные компоненты. Я также оставил дополнительные точки крепления на верхней панели корпуса, чтобы разместить другие датчики и инструменты и сделать проект масштабируемым для дальнейших улучшений. Можно добавить датчики, такие как датчики расстояния, камеры или другие приводимые в действие механизмы, такие как роботизированные захваты.
Примечание: 3D модели деталей для робота можно загрузить в одном из следующих шагов.
Шаг 2: Необходимые материалы


Вот список всех компонентов и деталей, необходимых для создания вашего собственного четвероногого робота на Arduino. Все детали Вы можете найти в интернет-магазине Robototehnika.ru.
Самая большая стоимость этого проекта — 12 серводвигателей. Я рекомендую выбрать модель серво среднего или высокого уровня качества вместо дешевых с пластиковыми шестернями, так как они легко ломаются. Без учета инструментов общая стоимость этого проекта составляет примерно 60 $.
Шаг 3: Сила Arduino

В этом проекте использовалась Arduino Uno. Данный контроллер отвечает за вычисление траекторий движения различных походок, которые были протестированы, и инструктирует исполнительные механизмы двигаться под точными углами с точной скоростью, чтобы создать плавное движение ходьбы. Arduino — отличный выбор для разработки проектов из-за своей универсальности. Он предоставляет набор контактов ввода-вывода, а также предоставляет интерфейсы связи, такие как последовательный, I2C и SPI, для связи с другими микроконтроллерами и датчиками. Arduino также предоставляет отличную платформу для быстрого прототипирования и тестирования, а также дает разработчикам возможность для улучшений и расширяемости. В этом проекте следующие версии будут включать блок инерциальных измерений для обработки движений, таких как обнаружение падения и динамическое передвижение по неровной местности, а также датчик измерения расстояния для избежания препятствий.
Для этого проекта использовалась среда разработки Arduino IDE. (также существует онлайн-версия Arduino Web Editor)
Примечание: Программы для робота можно загрузить в одном из следующих шагов.
Шаг 4: Изготовление деталей цифровым способом


Детали, необходимые для этого проекта, должны были быть изготовлены по индивидуальному заказу, поэтому для их печати использовался 3D-принтер. Отпечатки были сделаны с заполнением 40%, 2 периметра, соплом 0,4 мм и высотой слоя 0,1 мм с PLA, цветом по вашему выбору. Ниже вы можете найти полный список частей и STL для печати вашей собственной версии робота.
Примечание: С этого момента детали будут упоминаться по именам в списке.
Всего (без проставок) 22 детали. Общее время печати около 20 часов. 3D модели деталей (780k zip).
Шаг 5: Подготовка звеньев


Начните делать звенья, вставьте качалки серво в прорези детали leg2 и используя винты соедините это вместе с leg2 cover.


Затем вставьте сервопривод servo1 в специальный паз на leg1 и надежно закрепите его с помощью двух винтов. Повторите этот процесс с остальными 3 ногами.
Шаг 6: сборка ног


Затем вставьте качалку сервопривода в каждую деталь leg3 и leg3 mirror.


Пропустите провода servo1 прикрепленного к звену leg1 и servo2 (свободного) через специальную прорезь для укладки проводов, между деталью leg3 и leg3 cover. Прикрутите leg3 cover к leg3 (уже с установленной качалкой) с помощью двух винтов.

Вставьте сервопривод servo2 в специальный паз на leg3 и надежно закрепите его с помощью двух винтов. Повторите этот процесс для остальных ног.
Шаг 7: Сборка корпуса


Прикрепите 4 сервомотора servo3 к корпусу винтами изнутри. Хотя установка сервоприводов с помощью винтов изнутри может быть немного сложной, это очень важно, потому что винты, прикрепленные снаружи, будут мешать ногам и уменьшать диапазон движения каждой ноги.
Шаг 8: Собираем все вместе


Присоедините 4 готовых узла leg3 с уже установленными servo2 к каждому из 4 сервоприводов servo3 на корпусе.


Используйте звено leg2, чтобы соединить servo2 прикрепленного к leg3 с servo1 прикрепленного к leg1. Повторите этот процесс для остальных трех ног, и на этом общая сборка вашего компактного четвероногого робота готова.
Шаг 9: Управление проводкой и схема


Я решил использовать плату расширения ввода/вывода для Arduino, которая обеспечивает соединения для серводвигателей. Я бы порекомендовал вам использовать Плата расширения ввода/вывода v5 для Arduino, так как она имеет встроенный разъем внешнего источника питания. Однако ту, которую я использовал, не имела этой опции. Присмотревшись к плате расширения ввода/вывода для Arduino более внимательно, я заметил, что эта плата потребляет питание от 5-вольтового контакта на плате Arduino (что является ужасной идеей, когда речь идет о серводвигателях высокой мощности, поскольку вы рискуете повредить Arduino). Для решения этой проблемы нужно было согнуть вывод 5 В на плате расширения, чтобы он не подключался к выводу 5 В на Arduino. Таким образом, теперь мы можем подавать внешнее питание через вывод 5 В, не повреждая Arduino.


Шаг 10: Начальная настройка


Прежде чем приступить к программированию сложных походок и других движений, нам нужно установить нулевые точки каждого сервопривода. Это дает роботу ориентир, который он использует для выполнения различных движений.
Чтобы избежать повреждений робота, вы можете удалить качалки сервопривода из звеньев.
- Начните с клонирования программы для четвероногого робота из следующего репозитория GitHub: https://github.com/kousheekc/Micro-Quadruped-Robot
- Раскомментируйте 8-ю строку файла main.ino и закомментируйте остальные строки в setup и loop
- Загрузите файл в Arduino
Этот код помещает каждый из сервоприводов под углом 90 градусов. Как только сервоприводы достигли положения 90 градусов, вы можете повторно прикрепить звенья так, чтобы ноги были совершенно прямыми, а сервопривод, прикрепленный к корпусу, был перпендикулярен верхней панели четвероногого робота.

На этом этапе из-за конструкции качалок сервопривода некоторые соединения могут быть не совсем прямыми. Решением является корректировка массива zero_positions, находящегося в 13-й строке файла Quadruped.h. Каждое число представляет собой нулевую позицию соответствующего сервопривода (порядок совпадает с порядком, в котором вы прикрепили сервопривод к Arduino). Немного измените эти значения, пока ноги не станут идеально прямыми.
Примечание: Примечание. Вот значения, которые я использую, хотя эти значения могут вам не подойти:
Также обратите внимание, что эта программа может работать с любым четвероногим роботом, которого вы построите. Просто измените значения в конструкторе, который вызывается в строке 3 main.ino. (Более подробную информацию можно найти в readme на странице GitHub)
Шаг 11: Краткое введение в кинематику


Чтобы четвероногие выполняли полезные действия, такие как бег, ходьба и другие движения, сервоприводы должны быть запрограммированы в виде траекторий движения. Пути движения — это пути, по которым движется конечный эффектор (в данном случае ноги). Этого можно добиться двумя способами:
- Один из подходов — подача углов соединения различных двигателей методом грубой силы. Этот подход может быть трудоемким, утомительным, а также содержать ошибки, поскольку оценка является чисто визуальной. Вместо этого есть более разумный способ достижения желаемых результатов.
- Второй подход заключается в подаче координат концевого эффектора, а не всех углов сочленения. Это то, что известно как обратная кинематика. Пользователь вводит координаты, а углы шарниров регулируются, чтобы расположить конечный эффектор в заданных координатах. Этот метод можно рассматривать как черный ящик, который принимает в качестве входных данных координату и выдает углы сочленения. Те, кому интересно, как были разработаны тригонометрические уравнения этого черного ящика, могут посмотреть на диаграмму выше. Для тех, кому это не интересно, уравнения уже запрограммированы и могут использоваться с помощью функции pos, которая принимает в качестве входных данных x, y, z, которое является декартовым местоположением конечного эффектора, и выводит три угла, соответствующие двигателям.
Программа, содержащая эти функции, может быть найдена на следующем шаге.
Шаг 12: Программирование четвероногих роботов


После завершения подключения и инициализации вы можете запрограммировать робота и создать крутые траектории движения, чтобы робот выполнял интересные задачи. После загрузки программы робот должен начать ходить. Вы можете варьировать параметры походки, используя различные методы, включенные в класс робота.
Шаг 13: Окончательные результаты

Четвероногий робот может делать шаги длиной от 4 до 1 см. Скорость также можно варьировать, сохраняя при этом походку сбалансированной. Этот четвероногий представляет собой надежную платформу для экспериментов с различными другими походками и другими целями, такими как прыжки или выполнение заданий. Я бы порекомендовал вам попробовать изменить траектории движения ног, чтобы создать свои собственные походки и узнать, как различные походки влияют на производительность робота. Я также оставил несколько точек крепления в верхней части робота для дополнительных датчиков, таких как датчики измерения расстояния для задач уклонения от препятствий или IMU для динамической походки по неровной местности. Можно также поэкспериментировать с дополнительным захватом, установленным на верхней части робота, поскольку робот чрезвычайно устойчив и прочен и не может вот так вот легко опрокинуться.
Надеюсь, вам понравилось это руководство, и оно вдохновило вас на создание своего собственного четвероногого робота. Удачи!