Машинка-Ардуинка

Для компьютера — программа,
Для смартфона — приложение,
Для ардуино — скетч

В процессе сборки квадрокоптера F450 я удивлялся, как маленькая электронная плата может успевать получать данные, поступающие от всех датчиков (пульт управления, гироскопы, акселерометры, барометр, компас и GPS), обрабатывать их и на их основании управлять тягой каждого из моторов в отдельности, не давая при этом аппарату опрокинуться и заставляя его перемещаься в нужную точку! Оказывается вполне даже может, т.к. собран его полётный контроллер на базе микроконтроллера Arduino Mega.

Разновидности Arduino: Mega, Uno, Nano, Micro (Pro).

Что же такое Arduino — можно почитать в отдельной старой статье, а если вкратце — это микроконтроллер — печатная плата со своим процессором и памятью, к которой можно подключить множество устройств (датчики, модули, сенсоры, сервоприводы, двигатели, реле, другие контроллеры и т.д.), а затем при помощи особой программной среды (IDE) задать ему программу — посделовательность действий при определённых условиях.

Набор деталей для сборки робота-автомобиля

Для более глубокого изучения вопроса, в Китае был заказан набор деталей для сборки робота-автомобиля на базе Arduino Uno.

Комплектность

Прибыл набор довольно быстро, на таможне вопросов не вызвал. В комплекте обнаружились:

  • Детали для сборки шасси — рама, винты, гайки.
  • Два желтых двигателя с понижающими редукторами, два жёлтых колеса для них
  • Третье колесо-ролик на подшипнике, свободно поворачивающееся в любую сторону
  • Контроллер Arduino Uno (большая синяя на фото)
  • Короткий USB-шнур для подключения Arduino к компьютеру
  • Плата-щит Sensor Shied 5.0 для более удобного подключения  проводов к контроллеру (зелёная плата на фото)
  • Плата-драйвер для подключения моторов L298 (красная на фото)
  • Ультразвуковой дальномер (синяя маленькая плата с двумя круглыми деталями)
  • Сервомотор (синяя деталь с мотком провода) и комплект насадок для него
  • Контейнер для четырёх AAA-батареек (батареек в комплекте нет)
  • Поворотный кронштейн с местами под сервопривод
  • Выключатель
  • Краткая инструкция на китайском языке с картинками для сборки ШАССИ!

специальные провода для соединения компонентов Arduino

Несмотря на такую обширную комплектацию, это всё же не полный набор необходимых для сборки деталей. И я сейчас говорю не про батарейки! Прежде всего очень не хватает соединительных проводов. Нет, конечно обычные куски проводов можно найти даже на стройрынке, но сейчас я говорю о проводах со специальными штекерами на концах, для соединения компонентов Arduino между собой. Конечно кто-то может со мной поспорить, что всё можно соединить и при помощи паяльника если бы не два но: Во-первых, такую тонкую электронику нужно паять очень аккуратно, а это непросто. Во-вторых, в процессе сборки и настройки иногда возникает необходимость подключить провода по-другому, или просто отключить, а многократная пайка, пусть даже аккуратная на пользу платам не пойдёт. Также в комплекте не нашлось штекера питания самого контроллера, но я решил эту проблему по-своему…

Сборка

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

Совсем немного поискав по интернету, я нашёл, скачал и установил среду программирования IDE, однако при подключении через USB компьютер увидел только «неизвестное устройство». Ещё немного танцев с бубном, поиск по интернету, скачивание определённого драйвера и вот, устройство появилось в системе в видео последовательного порта COM10.

Cхема подключения двух двигателей

Самой первой, и наверное, самой сложной задачей явилось подключение двигателей. Подключение по задумке китайцев должно происходить через плату MotorShield (драйвер двигателей) L298. Это позволит разделить цепь питания самого контроллера Arduino (стабильные 5вольт, а если через круглый штекер, то до 9вольт) от цепи питания двигателей (до 30 вольт). Наши двигатели способны питаться от напряжения от 3 до 12вольт, так что наш контейнер батареек выдающий 6 вольт вполне подходит. Схему подключения двигателей я нашёл на сайте Zelectro.cc (не забудьте снять две перемычки с красной платы!), там же пример программы для управления двигателями. Дальше было подключено питание к самому контроллеру, и вот, автомобиль уже поехал по ковру! Беспорядочно… вернее не оценивая окружающую обстановку, вращал поочерёдно каждым колесом сначала вперёд, затем назад! И это уже был первый успех которому я радовался как ребёнок!

Вторым этапом, поверх контроллера был установлен щит SensorShield 5.0 по принципу бутерброда. Штекера расположены таким образом, что ошибиться в установке трудно, если конечно не применять медвежью силу.

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

Отдельно приводить программу управления каждым устройством в отдельности не буду, без труда найдёте их на zelectro.cc, лучше я не напишу. А вот полную получившуюся программу приведу. Она заставляет машину ехать вперёд, постоянно вращая «головой» (дальномером) и определяя, есть ли препятствия справа и слева по ходу движения. И в случае обнаружения препятствия машинка останавливается, и для разворота вращает назад одно из колёс — либо правое либо левое, смотря с какой стороны обнаружено препятствие.

Итоги

Бегает автомобильчик довольно резво и весело, но как работает ультразвуковой сенсор мне не понравилось. Иногда не замечает мягких препятствий (подушка или мягкое кресло) и просто утыкается в них носом. Поэтому на будущее я заказал несколько инфракрасных датчиков, чтобы определение препятствий происходило оптическим путём. Также заказал инфракрасный пульт с приёмником — хочу заставить робота подчиняться командам с пульта!

А вообще — пробуйте, собирайте, программируйте, и придумывайте свои схемы взаимодействия электронных компонентов! Его возможности ограничиваются только вашей фантазией!

А теперь, обещанный текст программы:

#include <Servo.h>
Servo myservo;

int IN1 = 7; // Input1 моторшилда подключен к выводу 7
int IN2 = 6;
int IN3 = 5;
int IN4 = 4
int EN1 = 8; //9
int EN2 = 3;
int i;
#define Trig A0
#define Echo A1
// #define ledPin 13

void setup()
{
pinMode (EN1, OUTPUT);
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);
pinMode (EN2, OUTPUT);
pinMode (IN4, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode(Trig, OUTPUT); //инициируем как выход
pinMode(Echo, INPUT); //инициируем как вход
Serial.begin(9600);
// pinMode(ledPin, OUTPUT); // светодиод для отладки
myservo.attach(13);
}

unsigned int impulseTime=0;
unsigned int dist1=0;
unsigned int dist2=0;
unsigned int dist3=0;
void loop()
{

myservo.write(0); // Поворачиваем голову на ПРАВО
digitalWrite(Trig, HIGH); // Посылаем ультразвуковой импульс
delayMicroseconds(10); // равный 10 микросекундам
digitalWrite(Trig, LOW); // Отключаем
impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса
dist1=impulseTime/58; // Пересчитываем в сантиметры
delay(100);
if (dist1<30) // Если расстояние менее 30 сантиметром
{
analogWrite (EN1, 0); // Остановить двигатели
analogWrite (EN2, 0);

digitalWrite (IN1, HIGH); // поменять полярность на обратную
digitalWrite (IN2, LOW); // то есть задни ход
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
analogWrite(EN1, 250); // правое колесо назад
// analogWrite(EN2, 180); // левое не двигаем
delay(150);
analogWrite (EN1, 0);
analogWrite (EN2, 0);
}
myservo.write(90); // поворачиваем голову налево
digitalWrite(Trig, HIGH);
delayMicroseconds(10); // равный 10 микросекундам
digitalWrite(Trig, LOW); // Отключаем
impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса
dist3=impulseTime/58; // Пересчитываем в сантиметры
delay(100);

if (dist3<30) // Если расстояние менее 30 сантиметром
{
analogWrite (EN1, 0);
analogWrite (EN2, 0);

digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
// analogWrite(EN1, i);
analogWrite(EN2, 250); // левое колесо назад
delay(150);
analogWrite (EN1, 0);
analogWrite (EN2, 0);
}

if ((dist1>30) and (dist3>30))
{
// digitalWrite(ledPin, LOW);
digitalWrite (IN2, HIGH);
digitalWrite (IN1, LOW);
digitalWrite (IN4, HIGH);
digitalWrite (IN3, LOW);
analogWrite(EN1, 130); // Правое
analogWrite(EN2, 180); // ЛЕВОЕ
delay(100);
}
delay(100);
/* ждем 0.1 секунды, Следующий импульс может быть излучён, только после исчезновения эха от предыдущего.
Это время называется периодом цикла (cycle period).
Рекомендованный период между импульсами должен быть не менее 50 мс. */
}

 

22 марта, 2017 by