Smart robot car kit инструкция на русском

Набор для сборки Smart Car Kit позволит вам собрать полноприводного (4WD) колесного робота на базе Arduino-совместимого контроллера. Управление роботом можно организовать с помощью ИК-сенсора или с использованием Bluetooth модуля. С помощью функциональных модулей, входящих в набор, робот может работать в режиме следования по линии, режиме избегания препятствий, режиме охранной сигнализации и др.

Для сборки вам потребуется только самый простой ручной инструмент, паяльник и немного воображения.

Состав набора:

1) Платформа-основа — 2 шт. (верх, низ);

2) Колесо для робота 66 мм — 4 шт.

3) Мотор-редуктор для робота — 4 шт.

4) Контроллер UNO R3 — 1 шт.

5) Плата расширения Sensor Shield V5.0 — 1 шт.

6) Кабель USB 2.0 (A-B) — 1 шт.

7) Драйвер двигателя L298N — 1 шт.

8) Батарейный отсек 6*АА без разъема — 1 шт.

9) Отсек для батарейки «Крона» 9В с разъемом питания — 1 шт.

10) ИК пульт управления (21 кнопка) с батарейкой — 1 шт.

11) Модуль инфракрасного датчика VS1838B — 1 шт.

12) Breadboard mini — 1 шт.

13) Сервопривод SG90 (180 град) или ES08MAII — 1 шт.

14) Кронштейн для сервопривода SG90 и HC-SR04 с крепежом — 1 шт.

15) Датчик линии TCRT5000 4 канала — 2 шт.

16) Bluetooth модуль HC-06 — 1 шт.

17) Ультразвуковой датчик измерения расстояния HC-SR04 — 1 шт.

18) Шлейф из 40 проводов П-П 20см — 1 шт.

19) Шлейф из 40 проводов П-М 20см — 1 шт.

20) Крепления для мотор-редукторов на платформе — 8 шт.

21) Крепеж (стойки М-М M3*30 — 6 шт., винты с потайной головкой M3*30 — 8 шт., винты М3*5 — 12 шт., винты М3*10 — 8 шт., винты М3*8 c потайной головкой -2 шт., винт 2*12 — 4 шт, гайки М3 — 18 шт., гайка М2 — 4 шт.)

Внешний вид деталей может отличаться от представленного на фото.

Пример скетча для колесного робота Smart Car Kit — в данном скетче реализована возможность ручного управления роботом через ИК-канал. А также есть автоматический режим, в котором робот «гуляет» сам, избегая столкновений с препятствиями.

Бумажной инструкции по сборке в комплекте нет.

Инструкция по сборке набора Smart Car.

Смотреть Видео-инструкцию

Инструкция по установке и настройке Arduino_IDE

Для работы робота не забудьте приобрести 4 батарейки АА и 1 батарейку «Крона».

Обратите внимание! Набор представляет собой конструктор и предполагает наличие у пользователя базовых навыков конструирования, программирования и отладки.

Набор предполагает самостоятельную сборку управляющего устройства на базе микроконтроллера и набора датчиков с последующим программированием законченного устройства в целях развития и формирования у пользователя инженерного мышления и умений программирования робототехнических систем.

Схема сборки колесного робота

  • Роман 17.04.2019 20:26

    хороший магазин качественные товары

    Оценка:

Логотип ЭЛЕГООПАНТОН 7626УП

Ezoic

Список материалов

Автомобильный комплект умного робота ELEGOO OwlBot -

Установите двигатель

Автомобильный комплект умного робота ELEGOO OwlBot - двигатель

Установите батарейный отсек

Автомобильный комплект умного робота ELEGOO OwlBot - батарейный отсек

Установить шины

ELEGOO OwlBot Smart Robot Car Kit - инсталл пытается

Установите модуль слежения за линиями

ELEGOO OwlBot Smart Robot Car Kit - модель отслеживания

Установите светодиодный матричный модуль

Автомобильный комплект умного робота ELEGOO OwlBot - матрица

Примечание. Сначала пропустите два кабеля RJ25 через отверстие в головной части автомобиля, а затем установите матричный светодиодный модуль.
Подключите один из кабелей RJ25 к точечно-матричному светодиодному модулю.

Установите ультразвуковой датчик

Автомобильный комплект умного робота ELEGOO OwlBot - matrix2Примечание. Ультразвуковой датчик установлен за панелью экспрессии.
Подключите другой кабель RJ25 к ультразвуковому датчику.

Установите медный цилиндр

Автомобильный комплект умного робота ELEGOO OwlBot - медный

Предупреждение

а. Левая моторная линия
б. Линия модулей слежения
в. Линия ультразвуковых датчиков
д. Правая моторная линия
е. Линейка светодиодных матричных модулей
ф. Линия батарейного отсека

ELEGOO OwlBot Smart Robot Car Kit - ПредупреждениеПропустите все провода через соответствующее отверстие, как показано на рисунке.

Схема подключения

Автомобильный комплект умного робота ELEGOO OwlBot - Схема

Подключите модуль слежения к интерфейсу

  1. Подключите светодиодный матричный модуль к интерфейсу
  2. Ультразвуковой модуль можно подключить к любому из интерфейсов 1-4.

Затем подключите провод каждого модуля к плате управления.

Автомобильный комплект умного робота ELEGOO OwlBot - схема 2

Установите главную плату управления

ELEGOO OwlBot Smart Robot Car Kit - плата управления

Окончательное изображение

На изображении справа показаны два других метода сборки, которые вы можете попробовать.

Автомобильный комплект умного робота ELEGOO OwlBot — финальное изображение

Использование учебника

Сброс: кнопка сброса

H: Кнопка переключения Bluetooth и загрузки программ («B» означает Bluetooth, а «U» означает загрузку программы. При подключении к Bluetooth наберите кнопку «B», при загрузке программы наберите «U»).
Автомобильный комплект умного робота ELEGOO OwlBot - usb : USB-интерфейс для зарядки (во время зарядки светодиод рядом с ним горит желтым цветом, при полной зарядке светодиод становится зеленым.)
ВЫКЛ ВКЛ: Выключатель
Батарея: Интерфейс батареи
Режим: Кнопка переключения режимовАвтомобильный комплект умного робота ELEGOO OwlBot - 1

Интерфейс M1: подключение к левому двигателю
Интерфейс S1: подключение к сервоприводу (не оснащен сервоприводом)
Интерфейс 1: подключение к модулю слежения
Интерфейс 2: подключение к ультразвуковому датчику
Точка строительного блока: здесь можно строить строительные блоки для расширения множества форм. (Не оснащен строительными блоками)

Автомобильный комплект умного робота ELEGOO OwlBot - Автомобильный комплект умного робота ELEGOO OwlBot

Интерфейс M2: подключение к правому двигателю
Интерфейс S2: подключение к сервоприводу (не оснащен сервоприводом)
Интерфейс 3: подключение к светодиодному матричному модулю
Интерфейс 4: для зарезервированного расширения
Интерфейс USB: для загрузки программы

Автомобильный комплект умного робота ELEGOO OwlBot - 3

Использование учебника

Обратите внимание: Мы загрузили некоторые необходимые программы ранее, поэтому вы можете пропустить загрузку программ. Однако, если вы измените коды, вам нужно будет загрузить их повторно.
Прежде всего, пожалуйста, перейдите на наш webсайт ниже, чтобы загрузить учебные пособия OwlBot: http://www.elegoo.com/download/
Заводская программа находится в «Lesson 8 OwlBot /OwlBot_Driver».
А затем выберите правильный учебник fileв зависимости от используемой вами компьютерной системы.
Для системы Windows см. «Для Windows Урок 0 Настройка среды разработки.pdf».
Информацию о системе ОС см. в «Урок 0 для Mac. Настройка среды разработки.pdf».

Введение функции
ELEGOO OwlBot Smart Robot Car Kit - значок режима* Когда переключатель питания включен, OwlBot должен быть установлен устойчиво, чтобы избежать неточного начального контрольного значения модуля gy-521, что приводит к плохой работе OwlBot на прямой линии.
Кнопка переключения режимов После включения питания 5 RGB мигает с эффектом бегущего света и звучит стартовая музыка.
Режим отслеживания линии
При первом нажатии кнопки переключения режимов всегда горит зеленый индикатор RGB, а на панели выражений отображается выражение, указывающее на то, что устройство перешло в режим слежения, и OwlBot будет следовать по черной дорожке. Когда датчик на модуле отслеживания обнаруживает черную линию, на панели выражений отображается другое выражение. Когда OwlBot поднимается в режиме слежения, колесо перестает вращаться.
Режим обхода препятствий
При втором нажатии кнопки переключения режимов обычно горит желтый индикатор RGB, на панели выражений отображается выражение, и OwlBot движется прямо. А когда в пределах 25 см есть препятствия, на панели выражений будет отображаться другое выражение, и OwlBot автоматически избегает препятствий впереди и ищет маршрут без препятствий, чтобы продолжить движение вперед.
Режим ожидания
Нажмите кнопку переключения режима в третий раз, чтобы переключиться в режим ожидания, и 8 выражений по умолчанию автоматически переключатся.

Мобильный контроль
ШАГ 1: Установите приложение.
Вы можете загрузить последнюю версию приложения «ELEGOO Owl Robot» в App Store, а также в Google Play.
Автомобильный комплект умного робота ELEGOO OwlBot - icon2 ШАГ 2: Настройки приложения. Прежде всего, переключите кнопку «B II» на OwlBot на «B».
Откройте приложение «ELEGOO Owl Robot». (Пожалуйста, включите мобильный GPS при использовании приложения).
Нажмите на «OwlBot». Нажмите » Режим Bluetooth », чтобы войти в интерфейс поиска Bluetooth.

ELEGOO OwlBot Smart Robot Car Kit - с помощью приложенияПоднесите телефон к OwlBot (в пределах 10 см), приложение автоматически подключится к OwlBot.
Вы также можете открыть список устройств Bluetooth, коснувшись значка меню » Автомобильный комплект умного робота ELEGOO OwlBot - Автомобильный комплект умного робота ELEGOO OwlBot » в верхнем левом углу и выберите «ELEGOO BT16», чтобы подключить OwlBot вручную.
После успешного подключения OwlBot значок состояния Bluetooth изменится с красного на коричневый.
Автомобильный комплект умного робота ELEGOO OwlBot - режим

Нажмите «Управление ракетой», чтобы войти в интерфейс управления.

ELEGOO OwlBot Smart Robot Car Kit - управление кулисой Автомобильный комплект умного робота ELEGOO OwlBot - качающееся управление2
Кулисное управление
Управляйте OwlBot вперед и назад, поворачивайте налево и поворачивайте направо. Пожалуйста, обратитесь к предыдущему разделу «Введение в функции», чтобы узнать о конкретных характеристиках режима обхода препятствий, режима слежения и режима ожидания.
Режим управления линией
Сначала щелкните значок запуска » Govee H6071 Светодиодный напольный Lamp-YouTube », затем щелкните точку на экране и щелкните другую точку, чтобы соединить их в линию, после чего автомобиль будет следовать направлению линии. Когда вы используете эту функцию, поверните голову OwlBot вправо, удерживая ее параллельно вашему телефону.
ELEGOO OwlBot Smart Robot Car Kit - режим управления ELEGOO OwlBot Smart Robot Car Kit - ночное управление
Режим управления экспрессией
Левая сторона — это установленное по умолчанию выражение или различные шаблоны, которые можно сделать своими руками. Нажмите OK, чтобы отобразить соответствующий шаблон на панели выражений.
Режим управления светом
Выберите цвет в цветовом кольце, и верхний левый угол всплывающего окна, и RGB на OwlBot могут отображать текущий выбранный цвет, «-» и регулировать яркость света.
ELEGOO OwlBot Smart Robot Car Kit - датчик отслеживания ELEGOO OwlBot Smart Robot Car Kit - управление линией
Порог датчика слежения
Поскольку на датчик сильно влияет окружающая среда, при использовании режима слежения за линией вы должны визуально отрегулировать порог датчика, чтобы он работал правильно, если OwlBot выбегает за пределы взлетно-посадочной полосы или работает неправильно. (Заводской порог по умолчанию — 700.)
Режим управления звуком
Вы можете заставить машину звучать из основных слогов так же, как играть на пианино.

Графическое программирование

Автомобильный комплект умного робота ELEGOO OwlBot - программирование

  •  Движение: Графические модули для управления движением автомобиля.
  • Голос и свет: Графические модули для управления звуком и светом.
  • Зондирование: Графические модули для электронных компонентов сенсорного типа.
  • Переменная: Графические модули для переменной работы.
  • Математика: Графические модули для математических операций.
  • Контроль: Графические модули для управления ходом программы.

Меры предосторожности

  • Аккумулятор должен быть полностью заряжен перед использованием. 5 RGB будут мигать красным, когда батарея разряжена. Зарядить аккумулятор можно через USB-кабель.
  • OwlBot нельзя использовать в местах с сильным солнечным светом или светом. Инфракрасные лучи воздействуют на датчики модуля слежения.
  • В режиме обхода препятствий OwlBot чем светлее цвет препятствий, тем лучше эффект обхода препятствий.

Если вам сложно собрать OwlBot, посмотрите обучающее видео по сборке из https://www.elegoo.com/download/ or https://www.youtube.com/eteg000fficial/.
Если у вас возникнут какие-либо вопросы во время сборки или тестирования, пожалуйста, свяжитесь с нами по адресу service@elegoo.com (североамериканские клиенты) или euservice@elegoo.com (Европейские и азиатские клиенты).
Команда ЭЛЕГОО

Это устройство соответствует требованиям части 15 правил FCC. Эксплуатация возможна при соблюдении следующих двух условий: (1) это устройство не должно вызывать вредных помех, и (2) это устройство должно принимать любые принимаемые помехи, включая помехи, которые могут вызвать нежелательную работу.
ПРИМЕЧАНИЕ: Это оборудование было протестировано и признано соответствующим ограничениям для цифровых устройств класса B в соответствии с частью 15 правил FCC. Эти ограничения разработаны для обеспечения разумной защиты от вредных помех при установке в жилых помещениях. Это оборудование генерирует, использует и может излучать радиочастотную энергию и, если оно установлено и используется не в соответствии с инструкциями, может создавать вредные помехи для радиосвязи. Однако нет гарантии, что помехи не возникнут при конкретной установке. Если это оборудование действительно создает недопустимые помехи для приема радио или телевидения, что можно определить путем включения и выключения оборудования, пользователю рекомендуется попытаться устранить помехи одним или несколькими из следующих способов:
— Изменить ориентацию или местоположение приемной антенны.
— Увеличьте расстояние между оборудованием и приемником.
— Подключить оборудование к розетке в цепи, отличной от той, к которой подключен приемник.
— Обратиться за помощью к дилеру или опытному радио / ТВ технику.
Внимание! Изменения или модификации, прямо не одобренные стороной, ответственной за соответствие, могут лишить пользователя права на эксплуатацию оборудования.
Устройство было проверено на соответствие общим требованиям к радиочастотному излучению. Устройство можно без ограничений использовать в условиях портативного воздействия.

Документы / Ресурсы

Introduction: 4WD SMART ROBOT CAR

Don’t you have a car to ride? Do not worry. maybe you will not be able to ride but you will have a car you can use :)

If you want to enjoy the pleasure of using yourself or leave it…

And no more words. Ladies and Gentlemen Please Welcome “4WD SMART ROBOT CAR”

Step 1: Quick Info

Hi Makers,

We have good news for you. In this tutorial, we are now a classic model. 4WD SMART ROBOT CAR. If you have this car, you will be able to avoid obstacles and follow the necessary lines to reach your destination and protect the distances. You can do this autonomously. If you want to have control with your hands, you will be able to control your car with APK via the Bluetooth module.

Step 2: Features of the 4WD SMART ROBOT CAR?

You know, or you’ve seen, car kits usually have a plastic chassis. We have designed as PCB. This will save you from the unnecessary cable crowds. You’ll also have a more elegant and simple look.

4WD SMART ROBOT CAR is exactly a «plug and play» kit. You won’t need cable connections too much. Because of the PCB we designed, we made the necessary paths for you.

What are the main features of the 4WD SMART ROBOT CAR?

— Bluetooth Control

— Obstacle Avoiding

— Line tracking or following

— Ultrasonic distance

Step 3: Equipments and Materials

We talk about before we need a PCB for car. So you have to 25*15 cm dimention PCB. And next;

— Arduino UNO & USB Cable

— L298N Motor Driver

— HC05 Bluetooth Module

— HSR04 Ultrasonic Distance Sensor

— TCRT5000 Line Tracking Sensor

— IR Infrared Obstacle Avoidance Sensor

— 6V DC Gear Motor and Wheel

— LEDs

— Header Pins

— Jumpers

— LiPo Rechargeable Battery

Step 4: Built a Car Chassis

We are using Proteus with ISIS for PCB drawing. As you can see in pic, we put a sample . And than ve cut it with CNC Lazer engraver.

Step 5: Start to Kit

We designed non cable a PCB. So, we are using header pins for sensor and modules. As you see in pics, we put many header pin.

Step 6: Lamps — Signalling — On-Off

You can see below timestamp details.

Step 7: Motor and Wheel Assembly

as you can see, we used a 3d Printed part as motor holder. And of course we designed it again :D You can find 3d printer files on last steps.

Step 8: Sensors and Modules Assembly

We explained that we are using some sensors and modules.

Features are line , avoiding , distance and bluetooth.

So What is line tracking or follower ?

The Line Tracking Sensor is most useful for detecting a contrast between dark and light objects. This makes it particularly well suited for tracking dark lines on light surfaces. For best results when using the Line Tracking

Sensors, it is best to mount the sensors between 1/8 and 1/4 of an inch away from the surface it is measuring. It is also important to keep lighting in the room consistent, so sensors’ readings remain accurate.

Code Sample :

if(digitalRead(11)==1 && digitalRead(12)==0)
{ right(); //

digitalWrite(4,LOW);

}

if(digitalRead(11)==0&& digitalRead(12)==1)

{ left(); //

digitalWrite(4,LOW);

}

if(digitalRead(11)==1 && digitalRead(12)==1)

{ forward(); //

digitalWrite(4,LOW);

}

if(digitalRead(11)==0 && digitalRead(12)==0)

{ timer++; if (timer<100)

{ left(); // digitalWrite(4,LOW); timer=0;

}

Step 9:

What is Obstacle Avoidance Sensor ?

This Infrared Obstacle Avoidance Sensor returns a signal when it detects an object in range. The range of the sensor is around 2-40 cm is distance. It operates at 3.5 to 5 volts at around 20 milliamps. The Obstacle Avoidance Sensors usually come in two types — with 3 and 4 pins. The 3 pin version does not have the ability to be enabled/disabled. The 4 pin version has optional Enable pin. Infrared obstacle avoidance sensor is designed to detect obstacles or the difference in reflective services. One application is to help a wheeled robot avoid obstacles with a sensor to react to adjustable distance settings. This device has an infrared transmitter and receiver, that forms the sensor pair. The transmitter LED emits a certain frequency of infrared, which the receiver LED will detect. The receiving LED will detect some of the signal back and will trigger the digital on/off “signal” pin when a specific threshold “distance” has been detected. Most boards will have 2 potentiometers, one of which is to adjust how sensitive the sensor is. You can use it to adjust the distance from the object at which the sensor detects it. Typically, the other potentiometer, which changes the transmitter IR frequency is not adjusted.

Code Sample:

float getDistance(int trig,int echo)

{
pinMode(trig,OUTPUT);

digitalWrite(trig,LOW);

delayMicroseconds(2);

digitalWrite(trig,HIGH);

delayMicroseconds(10);

digitalWrite(trig,LOW);

pinMode(echo, INPUT);

return pulseIn(echo,HIGH,30000)/58.0;

}

Step 10:

What is Bluetooth Module ?

HC-05 Bluetooth Module is an easy to use Bluetooth SPP (Serial Port Protocol) module, designed for transparent wireless serial connection setup. Its communication is via serial communication which makes an easy way to interface with controller or PC. HC-05 Bluetooth module provides switching mode between master and slave mode which means it able to use neither receiving nor transmitting data.

VCC  Arduino 5V

GND  Arduino GND

TXD  Arduino Pin RX

RXD  Arduino Pin TX

Step 11:

What is Motor Driver ?

The L298N Motor Driver Module is a high voltage Dual H-Bridge manufactured by ST company. It is designed to accept standard TTL voltage levels. H-bridge drivers are used to drive inductive loads that requires forward and reverse function with speed control such as DC Motors, and Stepper Motors. This Dual H-Bridge driver is capable of driving voltages up to 46V and continuous current up to 2A in each channels.

1-DC motor 1 «+» or stepper motor A+

2-DC motor 1 «-» or stepper motor A-

3-12V jumper — remove this if using a supply voltage greater than 12V DC. This enables power to the onboard 5V regulator

4-Connect your motor supply voltage here, maximum of 35V DC. Remove 12V jumper if >12V DCGND5V output if 12V jumper in place, ideal for powering your Arduino (etc)

5-DC motor 1 enable jumper. Leave this in place when using a stepper motor.

6-Connect to PWM output for DC motor speed control.

7-IN1

8-IN2

9-IN3

10-IN4

11-DC motor 2 enable jumper. Leave this in place when using a stepper motor.

12-Connect to PWM output for DC motor speed control.

13-DC motor 2 «+» or stepper motor B+

14-DC motor 2 «-» or stepper motor B

Step 12:

What is Ultrasonic Distance Sensor?

An ultrasonic sensor is an instrument that measures the distance to an object using ultrasonic sound waves.
An ultrasonic sensor uses a transducer to send and receive ultrasonic pulses that relay back information about an object’s proximity. High-frequency sound waves reflect from boundaries to produce distinct echo patterns.

Ultrasonic sound vibrates at a frequency above the range of human hearing.
Transducers are the microphones used to receive and send the ultrasonic sound.

Step 13: Arduino and Wheel Assembly

We are going to last steps. And now in arduino step. We designed some pins for » plug «. Thus , Easy to install and remove arduino. And we put it undet the PCB as you see in pic.

And we assemble all wheels and now we have a car :D

Step 14: Sample Pictures

Step 15: Showcases

Step 16: Files

We share files below. Include, arduino codes and 3d Printer files.

Thanks For Patience

Good Luck….

Время на прочтение
12 мин

Количество просмотров 62K

Вы понимаете, — втолковывал редактор, — это должно быть занимательно, свежо, полно интересных приключений… Так, чтобы читатель не мог оторваться.
И.Ильф, Е.Петров «Как создавался Робинзон».

Начинать работу с Arduino, как и с любой другой платформой программной или аппаратной, всегда интереснее с какого-нибудь реального проекта. Программисты при этом пишут код выводящий «Hello, world», ардуинисты моргают светодиодом. И все радуются как дети.

Я же решил начать с продвинутого проекта, в том числе с тайной надеждой оторвать молодое поколение от Counter-Strike (не получилось).

Как можно догадаться из названия RoboCar4W, первым проектом стал робот-машина о четырех колесах. Начиная работу я уже имел опыт программирования, умел когда-то давно паять, но совершенно не знал даже распиновки Arduino и документацию совершенно не читал. Все премудрости изучал по ходу пьесы и Гугл в помощь.

Поскольку сам проект принципиально не нов, подобных описаний в сети достаточно, все компоненты известны, то никаких неожиданностей не предполагалось. Поэтому задумка была сформулирована в самых общих чертах и главной целью являлось погружение в «мир вещей» с помощью Arduino, как платформы для быстрого прототипирования. В этом опусе возможно кто-то узнает себя в самом начале пути.

Всё «железо» приобреталось на ebay, и по своему опыту хочу сказать, что проще приобрести сразу стартер кит (ищите по словам Arduino Starter Kit), а не собирать подетально. Да и приедет все сразу вместе. Решено было не мелочиться, купить нормальное шасси, нормальные колеса, нормальные моторы, чтоб было «дорохобохато».

Главный секрет успешных покупок на eBay — покупать у продавцов с высоким рейтингом и при этом внимательно читать описание товара. Об этом есть много статей в интернете.

Какую плату семейства Arduino выбрать?

Я взял Arduino UNO, под нее много проектов с описаниями. Но сейчас бы взял Arduino Mega 2560, у нее больше цифровых и аналогов выводов и полная совместимость по проектам с UNO.

Общее описание проекта

В мире разработки программного обеспечения это называют еще «требования к системе».

Задумка проекта была следующей. Первый вариант машины-робота под названием RoboCar4W должен выполнять незамысловатые действия:

  • двигаться вперед, назад, выполнять повороты
  • измерять расстояние до препятствий
  • уметь автоматически объезжать препятствия находящиеся впереди.

Второй вариант машины должен управляться вручную по bluetooth с Android телефона.

Чтобы вам лучше работалось вот весь финальный проект RoboCar4W в сборе (тут без блютуза).

Arduino. RoboCar4W

Вот видео ходовых испытаний.

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

Робот-машина RoboCar4W

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

Робот-машина RoboCar4W

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

Робот-машина RoboCar4W

Алгоритм управления движением

Ошибочно называть наш способ «алгоритм объезда препятствий» или «поиском пути». Это отдельные математические дисциплины, чистая математика. Если вам очень-очень сильно нравится математика, то погуглите указанные словосочетания, чтивом на полгода будете обеспечены.

Пока же нас интересуют вещи гораздо проще. Поэтому мы назовем это просто — алгоритм управления движением 4-х колёсного робота. Разумеется речь идет об автоматическом управлении без участия человека.

Вот этот простой алгоритм записанный словами, для более сложных алгоритмов придется (хочется или нет) составлять блок-схемы.

Сейчас одновременно смотрите в исходник скетча RoboCar4W-1.ino.

  1. Измеряем расстояние до препятствия впереди.
  2. Если это измеренное расстояние меньше значения DST_TRH_BACK (сокращение от distance threshold), то останавливаемся и едем задним ходом одновременно поворачивая. Направление поворота выбираем так: если ранее уже поворачивали влево, то поворачиваем вправо и наоборот.
  3. Если измеренное расстояние больше чем DST_TRH_BACK, но меньше чем DST_TRH_TURN, то просто поворачиваем. Направление поворота выбираем случайно.
  4. Если до препятствия далеко, то просто едем вперед.
  5. Повторяем все сначала.

Чем хорошо, что у нас 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 требует небольшой доработки, чтобы можно было после него хоть что-нибудь подключить. Я подпаял сверху необходимые разъемы, получилось вот что.

Motor Drive Shield

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

4-х канальный L293D Motor Drive Shield. Перемычка для внешнего питания

В этом случае питание 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 <AFMotor.h> // подключить библиотеку Adafruit
#include <Servo.h>  // подключить библиотеку для сервомотора

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. Распиновка выводов:

  • Vcc
  • Trig (T)
  • Echo ( R )
  • GND

Время затрачиваемое ультразвуковым дальномером на измерения (определено опытным путем):

  • максимум 240 мсек, если расстояние слишком велико (out of range)
  • минимум 1 мсек, если расстояние слишком мало
  • расстояние в 1.5 м определяется примерно за 10 мсек

Ультразвуковой измеритель расстояния HC-SR04 Ultrasonic Module

Ультразвуковой датчик дальномер, в силу своей физической природы, а не потому что Китай, в некоторых случаях плохо определяет расстояние до препятствия:

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

Другими словами, для ультразвукового дальномера в идеале было бы отлично, если бы все препятствия имели вид твёрдой плоскости, перпендикулярной направлению излучения ультразвука.

Некоторые проблемы можно решить с помощью инфракрасного датчика расстояния. Но он тоже не идеален:

  • небольшая максимальная дальность по сравнению с ультразвуковым: 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 простой скетч:

int count = 0;

void setup() {
  Serial.begin(9600);
  Serial.println("Test Arduino + Bluetooth. http://localhost");
}

void loop() {
  count++;
  Serial.print("Count = ");
  Serial.println(count);
  delay(1000);
}

На Android телефон устанавливаем Bluetooth Terminal. Подключаемся к устройству HC-05 и наблюдаем на экране телефона бегущие строки с увеличивающимся счетчиком.

Чтобы модуль мог принимать AT-команды, нужно его перевести в соответствующий режим — для этого нужно установить вывод KEY (PIO11) в логическую 1. На некоторых Breakout/Base Board вместо вывода KEY есть вывод EN (ENABLE), который может или не может быть припаян к выводу на самом чипе. Это касается только чипов HC05. Вот как раз у меня вывод EN платы никуда не припаян. Поэтому его можно припаять отдельным проводом к выводу KEY(PIO11) чипа. Либо во время работы, чтобы перевести HC05 в режим AT-команд на пару секунд закоротить вывод чипа KEY(PIO11) на вывод питания Vcc. Для HC06 вывод KEY не нужен.

Программное обеспечение

Примечание. Каждый раз перед загрузкой программы в Arduino, убедитесь, что модуль Bluetooth не подключен к Arduino. Это вызовет проблемы заливки скетча. Просто отсоедините питание от Bluetooth модуля или провода, соединяющие Arduino и RX, TX контакты модуля.

В начале скетча измените номера моторов в строках типа:

AF_DCMotor motor(…);

Скетч для автоматического режима с объездом препятствий скачать здесь.

Если заменить строку

byte debug = 0;

на

byte debug = 10;

то включится режим отладки.

В режиме отладки робот RoboCar4W реально ездить или крутить колесами не будет. Вместо этого активируйте монитор последовательного порта и там увидите как он «ездит» виртуально. Вместо реальной езды вперед в монитор последовательного порта будет писаться строка «Forward», вместо заднего хода с поворотом влево — «Turn Back L(eft)» и т.д. Датчик ультразвукового измерения расстояния тоже ничего не делает, вместо этого расстояния до препятствий генерируются программно и случайно.

Этот режим отладки удобен, если вы меняете алгоритм движения и вместо того, чтобы ловить машинку по комнате, просто проверяете всё на «холостом» ходу.

Скетч для ручного управления по блютуз скачать здесь. Скетч не имеет режима отладки, так как там всё прозрачно. Вы нажимаете кнопку — робот едет.

Программа для Adnroid Bluetooth RC Car.

Ну вот и все! Счастливой дороги!

Счастливой дороги!

Данная статья устарела 1 января 2018 года. Есть смысл рассматривать её только как инструкцию по сборке. Вопросы программирования гораздо лучше освещены в новой статье.

Возникла задача реализовать роботизированную машинку на колёсах. Обзор опубликованных в свободном доступе решений позволил сразу отказаться от рудиментов и выработать уникальные технические требования:

  • Для всей системы должен быть только один источник питания. Желательно, аккумуляторы. Любимый формат — 18650.
  • Простая и надёжная силовая часть. Никаких гипер-сложных «силовых шилдов«.
  • Поведение, целиком определяемое прошивкой
  • Отладка в результате натурных испытаний (смена режимов сопровождается звуковым сигналом).

Рассмотрим этапы решения.

В первую очередь был заказан набор для сборки механической части шасси из Китая. Через месяц пришёл хорошо укомплектованный набор.

Состав набора:

  • Две акриловые пластины корпуса
  • Четыре мотора
  • Четыре колеса
  • Футляр для аккумуляторов
  • Метизы

Далее пришлось открывать верхний ящик стола и на ощупь искать дополнительные комплектующие. Нам пригодятся:

  • Микроконтроллерный модуль
  • Плата расширения Sensor Shield v.5
  • Модуль драйвера моторов на базе L298N
  • Сонар HC-SR04 с крепёжной скобой
  • Соединительные провода

В качестве микроконтроллерного модуля был выбран один из клонов платформы Arduino на базе Atmel ATmega 328/P. После долгих размышлений и взглядов в сторону Raspberry Pi или «голого» PIC16 с аскетичным ассемблером решено было остановиться именно на этой платформе, т.к. она обеспечивает простоту сопряжений с другими блоками, имеет массу примеров кода, опубликованных в свободном доступе, унифицирована с колоссальным количеством датчиков — другими словами, развязывает руки разработчику и позволяет сосредоточиться на воплощении задумки.

Более того, неоспоримый дополнительный плюс — это масштабируемость.

Исполнение выбиралось с точки зрения дизайна: я постарался выдержать всю конструкцию в жёлто-чёрной палитре.

Фактически, вся сборка начинается с модуля драйвера моторов на базе L298N и крутится вокруг него. На мой взгляд, именно этот модуль следовало бы назвать ядром всей системы. Фактически, это умощнённая версия выпускаемой ранее микросхемы/платы L293D. Совместимость сохранена.

L298N

Важно отметить, что входы ENABLE A/B отвечают за возможность вращения моторов, причём на них можно подавать как логические уровни («низкий» — запрет, «высокий» — разрешено), так и аналоговые сигналы (например, посредством ШИМ) для регулировки скорости вращения. Разработчики предусмотрели два пятивольтовых вывода рядом с ENABLE A/B — они позволяют установить «намертво» перемычки на плату, тогда всегда будет разрешена полная скорость вращения; таким образом можно сэкономить две выходные линии микроконтроллера. Подавать отдельно +5В на эти вспомогательные выводы не требуется!

Ещё одна перемычка видна вблизи колодки питания, в глубине платы: она должна быть установлена, если питание модуля L298N будет превышать +12В. Можно запитывать модуль L298N и большим напряжением (вплоть до 30 вольт), тогда придётся снять данный джампер, а также придётся дополнительно подводить к модулю +5В. В моём случае планируется применение аккумуляторов на 7-8 вольт, поэтому я смело оставил джампер установленным и радостно воспользовался имеющимися пятью вольтами для питания логики.

Сборка робота начинается с подготовки модуля L298N: он с трудом влезает на шасси, а очень хочется установить его по центру. Кроме того, клеммы выходов на моторы оказываются расположены совершенно впритык к корпусам моторов, как туда впихнуть провода — остаётся загадкой. Было принято решение всё же зафиксировать драйвер строго по центру (радиатор будет смотреть назад), для чего пришлось выпаивать колодки, заменяя их проводами. В итоге вся силовая часть оказалась пропаяна, что лично меня весьма устраивает.

Стойки для драйвера оказались слишком высоки (радиатор не влезал), поэтому пришлось изготовить собственные низкопрофильные стоечки.

Все тонкости пайки показаны на рисунке выше. Моторы запаиваем крест-накрест между собой, затем припаиваем выходные (красные) провода от драйвера.

Собираем первый этаж. Никаких приключений, только винты, гайки и отвёртка. Ну вот только с запайкой клемм двигателей пришлось повозиться.

И, да, не забываем, что редукторы у нас не железные, колёса придётся насаживать нежно! Есть смысл капнуть каплю клея на оси, так как практика показала, что колёса имеют тенденцию отваливаться на поворотах по ковру.

Теперь выполняем соединения. Самое главное правило: присоединить шлейф красиво к драйверу — то есть все шесть проводов выстраиваются в ряд. Это очень важно, ибо туда мы больше не полезем, скорее всего.

Сведём все коммуникации в один понятный рисунок.

 

Собираем второй этаж.

Теперь заложим в нашего робота простой алгоритм, который позволит машине самостоятельно перемещаться, избегая соударения с препятствиями.

Суть алгоритма:

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

Листинг программы для прошивки.

// 4WD RoboCar
// With Sonar
// 2017-July-24

long randomNumber;

// Описываем подключение драйвера к микроконтроллеру
// A - правый борт
// В - левый борт

int pinB1 = 1;
int pinB2 = 2;
int enableB = 3;
int pinA2 = 4;
int pinA1 = 5;
int enableA = 6; // Setup Ultrasonic Sensor pins #define trigPin 8 #define echoPin 9 // Setup passive buzzer pins int tonePin = 12; void setup() { // Направление работы портов: pinMode (enableA, OUTPUT); pinMode (pinA1, OUTPUT); pinMode (pinA2, OUTPUT); pinMode (enableB, OUTPUT); pinMode (pinB1, OUTPUT); pinMode (pinB2, OUTPUT); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(13 , OUTPUT); // Warming-up movement midi(); // play song enableMotors(); pisk(); delay(500); forward(1300); delay(500); pisk(); backward(1300); delay(500); pisk(); right(1300); delay(500); pisk(); left(1300); disableMotors(); delay(1000); pisk(); digitalWrite(13, LOW); // Выключаем встроенный диод } // Управление моторами void motorAforward() { digitalWrite (pinA1, HIGH); digitalWrite (pinA2, LOW); } void motorBforward() { digitalWrite (pinB1, LOW); digitalWrite (pinB2, HIGH); } void motorAbackward() { digitalWrite (pinA1, LOW); digitalWrite (pinA2, HIGH); } void motorBbackward() { digitalWrite (pinB1, HIGH); digitalWrite (pinB2, LOW); } void motorAstop() { digitalWrite (pinA1, HIGH); digitalWrite (pinA2, HIGH); } void motorBstop() { digitalWrite (pinB1, HIGH); digitalWrite (pinB2, HIGH); } void motorAcoast() { digitalWrite (pinA1, LOW); digitalWrite (pinA2, LOW); } void motorBcoast() { digitalWrite (pinB1, LOW); digitalWrite (pinB2, LOW); } void motorAon() { digitalWrite (enableA, HIGH); } void motorBon() { digitalWrite (enableB, HIGH); } void motorAoff() { digitalWrite (enableA, LOW); } void motorBoff() { digitalWrite (enableB, LOW); } // Управление движениями void forward (int duration) { motorAforward(); motorBforward(); delay (duration); } void backward (int duration) { motorAbackward(); motorBbackward(); delay (duration); } void right (int duration) { motorAbackward(); motorBforward(); delay (duration); } void left (int duration) { motorAforward(); motorBbackward(); delay (duration); } void coast (int duration) { motorAcoast(); motorBcoast(); delay (duration); } void breakRobot (int duration) { motorAstop(); motorBstop(); delay (duration); } void disableMotors() { motorAoff(); motorBoff(); } void enableMotors() { motorAon(); motorBon(); } // Setup Ultrasonic Sensor distance measuring int distance() { int duration, distance; digitalWrite(trigPin, HIGH); delayMicroseconds(1000); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; return distance; } // Setup the main car function void launch() { int distance_0; distance_0 = distance(); // Debugging: Serial.print(distance_0); Serial.println(" inch. "); // Keep moving forward in a straight line while distance of objects in front > 12 cm away while(distance_0 > 12) { motorAon(); motorBon(); forward(10); // Сколько ехать вперёд? distance_0 = distance(); } breakRobot(0); } void avoid() { // Go back and turn slightly right to move car in new direction if object detected tone(tonePin, 999, 400); delay (1000); randomNumber = random(1,2); backward(randomNumber); tone(tonePin, 900, 400); delay (400); randomNumber = random(1,10); if (randomNumber < 5) { right(random(50,460)); } else { left(random(50,460)); }; } void pisk(){ tone(tonePin, 700, 350); delay(350); tone(tonePin, 900, 350); delay(350); tone(tonePin, 1100, 750); delay(550); noTone(tonePin); } void midi() { tone(tonePin, 174, 249.99975); delay(277.7775); tone(tonePin, 233, 499.9995); delay(555.555); tone(tonePin, 174, 374.999625); delay(416.66625); tone(tonePin, 195, 124.999875); delay(138.88875); tone(tonePin, 220, 499.9995); delay(555.555); tone(tonePin, 146, 249.99975); delay(277.7775); tone(tonePin, 146, 249.99975); delay(277.7775); tone(tonePin, 195, 499.9995); delay(555.555); tone(tonePin, 174, 374.999625); delay(416.66625); tone(tonePin, 155, 124.999875); delay(138.88875); tone(tonePin, 174, 499.9995); delay(555.555); tone(tonePin, 116, 249.99975); delay(277.7775); tone(tonePin, 116, 249.99975); delay(277.7775); tone(tonePin, 130, 499.9995); delay(555.555); tone(tonePin, 130, 374.999625); delay(416.66625); tone(tonePin, 146, 124.999875); delay(138.88875); tone(tonePin, 155, 499.9995); delay(555.555); tone(tonePin, 155, 374.999625); delay(416.66625); tone(tonePin, 174, 124.999875); delay(138.88875); tone(tonePin, 195, 499.9995); delay(555.555); tone(tonePin, 220, 374.999625); delay(416.66625); tone(tonePin, 233, 124.999875); delay(138.88875); tone(tonePin, 261, 749.99925); delay(833.3325); tone(tonePin, 174, 249.99975); delay(277.7775); } void loop() { randomNumber = random(2,5); // increase randomization :) launch(); // function keeps moving car forward while... avoid(); // function makes car go back, turn slightly right to move forward in new direction }

Фрагмент реального заезда на видео прекрасно иллюстрирует поведение подопытного.

В результате имеем работающую машинку, которая способна самостоятельно избегать соударения!

Хотелось бы отметить, что очень тщательно выбиралась пара переменных: критическое расстояние Distance и время движения вперёд, т.е. параметр для Forward(). Дело в том, что от пары этих переменных будет очень сильно зависеть поведение робота вблизи препятствий. Я постарался сделать максимально точный аппарат, который будет тормозить в самый последний миг, останавливаясь в миллиметрах от преграды. С другой стороны, ударов тоже допускать нельзя (домашнюю мебель жалко).

Для программирования и прошивки использовалась интегрированная среда разработки UECIDE. Крайне рекомендую данную ИСР, т.к. во-первых, она бесплатна. Во-вторых, она обладает развитым функционалом текстового редактора кода, после которого тяжело перейти на любой другой пакет. Иллюстрирую феноменальную разметку с помощью одного скриншота:

uecide

Не прошло и полгода, а уже захотелось доработать поделку.

Ниже приведён листинг доработанной программы для прошивки. Добавлен фотосенсор, теперь в темноте зажигаются фары, а скорость моторов немного снижена, чтобы машинка была не такой резвой. Встроенный светодиод теперь сигнализирует об обнаружении препятствия и о движении назад или развороте.

// 4WD RoboCar
// Sonar (NO Servo) + fara + LED13
// 2017-December-10
// v.0.4 (хорошая версия)

// Global variables:
long randomNumber;
int velocity = 220;

int light = 0; // Сюда подключены фары

// Описываем подключение драйвера к микроконтроллеру
// A - правый борт
// В - левый борт

int pinB1   = 1;
int pinB2   = 2;
int enableB = 3;
int pinA2   = 4;
int pinA1   = 5;
int enableA = 6;

// Подключаем ультразвуковой датчик
#define trigPin 8
#define echoPin 9

// Фоторезистор висит на А0
#define PHOTO_SENSOR A0 

// Подключаем зуммер
int tonePin = 12;

void setup() {
  
  // Определяем направление работы линий
   pinMode (enableA, OUTPUT);
   pinMode (pinA1, OUTPUT);
   pinMode (pinA2, OUTPUT);
   pinMode (enableB, OUTPUT);
   pinMode (pinB1, OUTPUT);
   pinMode (pinB2, OUTPUT); 
   pinMode(trigPin, OUTPUT);
   pinMode(echoPin, INPUT);
   pinMode(13 , OUTPUT);

// Warming-up
midi();
enableMotors();
pisk();
delay(2000);
digitalWrite(13,  LOW); // Выключаем встроенный диод
// Serial.begin(9600);     // Отправляем данные на ПЭВМ
}

// Описываем варианты работы моторов
void motorAforward() {
 digitalWrite (pinA1, HIGH);
 digitalWrite (pinA2, LOW);
}
void motorBforward() {
 digitalWrite (pinB1, LOW);
 digitalWrite (pinB2, HIGH);
}
void motorAbackward() {
 digitalWrite (pinA1, LOW);
 digitalWrite (pinA2, HIGH);
}
void motorBbackward() {
 digitalWrite (pinB1, HIGH);
 digitalWrite (pinB2, LOW);
}
void motorAstop() {
 digitalWrite (pinA1, HIGH);
 digitalWrite (pinA2, HIGH);
}
void motorBstop() {
 digitalWrite (pinB1, HIGH);
 digitalWrite (pinB2, HIGH);
}
void motorAon() {
 digitalWrite (enableA, HIGH);
}
void motorBon() {
 digitalWrite (enableB, HIGH);
}
void motorAoff() {
 digitalWrite (enableA, LOW);
}
void motorBoff() {
 digitalWrite (enableB, LOW);
}

// Описываем варианты движения машины
void forward (int duration) {
 motorAforward();
 motorBforward();
 delay (duration);
}
void backward (int duration) {
 motorAbackward();
 motorBbackward();
 delay (duration);
}
void right (int duration) {
 motorAbackward();
 motorBforward();
 delay (duration);
}
void left (int duration) {
 motorAforward();
 motorBbackward();
 delay (duration);
}
void FullStop (int duration) {
 motorAstop();
 motorBstop();
 delay (duration);
}
void disableMotors() {
 motorAoff();
 motorBoff();
}
void enableMotors() {
 motorAon();
 motorBon();
}

// Пользуемся УЗ датчиком расстояния
int distance() {
  int duration, distance;
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(1000);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1; // Переводим в сантиметры
  return distance;
}

// Функция запуска автомобиля
void launch() {
int distance_0;
distance_0 = distance();
// Debugging:
//  Serial.print(distance_0);
//  Serial.println(" сантиметров. ");

// Движемся вперёд, пока расстояние до преграды > 12 cm
while(distance_0 > 12)
  {
     // motorAon();
     // motorBon();
     analogWrite (enableA, velocity);
     analogWrite (enableB, velocity);
     forward(10); // Сколько ехать вперёд?
     distance_0 = distance();
  }
FullStop(0);
}

void avoid()
{
    digitalWrite(13,  HIGH); // Включаем встроенный диод!
    // Сначала откатываемся назад на случайное количество шагов
    tone(tonePin, 999, 400);
    delay (1000);
    randomNumber = random(2,3);
    backward(randomNumber);
    tone(tonePin, 900, 400);
    delay (400);
    // Случайным образом выбираем направление и угол поворота:
    randomNumber = random(1,10);
    if (randomNumber < 5) { right(random(50,460)); } else { left(random(50,460)); };
    digitalWrite(13,  LOW); // Выключаем встроенный диод
}

void pisk(){
    tone(tonePin, 700, 350);
    delay(350);
    tone(tonePin, 900, 350);
    delay(350);
    tone(tonePin, 1100, 750);
    delay(550);
    noTone(tonePin);
}

void midi() {

tone(tonePin, 174, 249.99975);
    delay(277.7775);
    tone(tonePin, 233, 499.9995);
    delay(555.555);
    tone(tonePin, 174, 374.999625);
    delay(416.66625);
    tone(tonePin, 195, 124.999875);
    delay(138.88875);
    tone(tonePin, 220, 499.9995);
    delay(555.555);
    tone(tonePin, 146, 249.99975);
    delay(277.7775);
    tone(tonePin, 146, 249.99975);
    delay(277.7775);
    tone(tonePin, 195, 499.9995);
    delay(555.555);
    tone(tonePin, 174, 374.999625);
    delay(416.66625);
    tone(tonePin, 155, 124.999875);
    delay(138.88875);
    tone(tonePin, 174, 499.9995);
    delay(555.555);
    tone(tonePin, 116, 249.99975);
    delay(277.7775);
    tone(tonePin, 116, 249.99975);
    delay(277.7775);
    tone(tonePin, 130, 499.9995);
    delay(555.555);
    tone(tonePin, 130, 374.999625);
    delay(416.66625);
    tone(tonePin, 146, 124.999875);
    delay(138.88875);
    tone(tonePin, 155, 499.9995);
    delay(555.555);
    tone(tonePin, 155, 374.999625);
    delay(416.66625);
    tone(tonePin, 174, 124.999875);
    delay(138.88875);
    tone(tonePin, 195, 499.9995);
    delay(555.555);
    tone(tonePin, 220, 374.999625);
    delay(416.66625);
    tone(tonePin, 233, 124.999875);
    delay(138.88875);
    tone(tonePin, 261, 749.99925);
    delay(833.3325);
}

void fara () {
  int val = analogRead(PHOTO_SENSOR);
  if (val < 500) {
    // Светло, выключаем фары
    digitalWrite(light, HIGH);
  } else {
    // Темновато, включаем фары
    digitalWrite(light,  LOW);
  }
}

void loop() {
     randomNumber = random(2,5); // вхолостую выбираем псевдо-случайное число
     launch(); // запускаем автомобиль вперёд
     avoid(); // откатываемся от препятствия и как-то поворачиваемся
     fara ();  // проверяем, не пора ли зажигать фары?
}

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

Car Moving

Понравилась статья? Поделить с друзьями:
  • Саротен инструкция по применению цена отзывы аналоги
  • Кондиционер hitachi инструкция к пульту управления
  • Белодерм уколы инструкция по применению цена отзывы
  • Р 330 руководство по квалификации программных инструментов
  • Боевое руководство командира танка pdf