Прототип мобильного робота на Arduino mega

Резко возросшая, в последнее время, популярность платформы Arduino дала о себе знать, и я тоже захотел приобщиться к культуре ардуино-радиолюбителей. Необходимо только было определиться, что именно я хочу получить от своего первого опыта работы с этим устройством. Решив не мелочиться и не мигать светодиодом в качестве "Hello, World", было принято решение собрать основу мобильного робота с возможностью расширять выполняемые им функции в будущем. И вот что получилось...

 

 

Поскольку проект имеет позновательно-развлекательную цель, я не стал придумывать красивого корпуса. Да и соеденительные провода торчат во все стороны. Но ведь это только прототип ;-) Ну обо всём по порядку.


Используемые детали и модули

Arduino Mega 2560 R3
Самое главное - "мозги" робота. Собственно, предмет изучения.

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

Вот краткая характеристика платформы:
Микроконтроллер:  ATmega2560
Количество цифровых входов/выходов:  54
Объём Flash-памяти (кб):  256
Объём SRAM-памяти (кб):  8
Объём EEPROM-памяти (кб):  4
Тактовая частота (МГц): 16

Её малый размер, при большой мощности микроконтроллера, и малом энергопотреблении прекрасно подходят для данной задачи.


Мотор - колесо Arduino (DC 3-6V) 4 штуки

Для передвижения, роботу нужны шасси. Этот электродвигатель с редуктором и колесом представляет хорошее готовое решение. Необходимое питание - 3V.


Motor Drive Shield-L293D
Драйвер подключения двигателей.

Коллекторные элетродвигатели всегда являлись причиной головной боли для робототехников. Огромное энергопотребление, просадка напряжения во всей схеме при старте - лишь верхушка айзберга проблем, вызываемых включением их в архитектуру робота. В данном случае, проблемы решаются использованием этого шилда.
Он включает в себя два драйвера для управления слаботочными моторами L293D. Возможно раздельное питание логической части микросхемы и силовой части питания двигателей, что ограничит негативное влияние электродвигателей на микроконтроллер.
2 выходных канала для шаговых двигателей и 4 для коллекторных
, на каждый выдаётся по 600mA. Как раз то что нужно!
Несомненным плюсом также является то, что его не нужно "хитро" коннектить к платформе используя метры проводов. Он просто "одевается" на Arduino проксируя не используемые им каналы наружу.


Модуль понижающего напряжения DSN259

Робот питается от 4 батареей типа АА - 6V. Но Ардуино нужно всего 5V. Чтобы "обрезать лишнее" используется этот маленький модуль, на вход которого можно подать до 15V. На выходе он будет стабильно выдавать 5. К тому же это сгладит просадки напряжения в схеме во время работы двигателей.


Датчик HC-SR04

 

Что бы робот мог объезжать препядствия, ему нужно их видеть. К нему подсоединён ультразвуковой датчик измерения расстояния. Дальность действия датчика - 180 см.

Собственно, всё. Теперь необходимо соеденить всё это вместе.


Сборка робота

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

Драйвер двигателей, как я уже отмечал выше, необходимо установить в коннекторы с соответствующими номерами на Ардуинке.

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

 

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

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

HC-SR04 коннектится к Ардуинке посредством четырёх контактов - Vcc, Gnd, Trig и Echo. Vcc и Gnd - это плюс и база соответственно. Trig и Echo соединяем с 51 и 53 портами.

Теперь, осталось только описать действия и поведение робота и написать программу!


Алгоритм действий робота

Самую простую задачу, которую я смог придумать для робота, можно описать следующим алгоритмом:

1. Ехать вперёд, пока не встретится препядствие
3. Отъехать назад N миллисекунд
2. Поворот в сторону на N миллисекунд
4. goto 1


Код программы

Для управления драйвером двигателей необходимо скачать и подключить библиотеку с официального сайта Adafruit.
https://learn.adafruit.com/adafruit-motor-shield/library-install

//Коннекторы для датчика HC-SR04
#define trigPin 51
#define echoPin 53
 
//Инициализация двигателей
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);
 
//основные комманды двигателей
void forward(int time) {
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
 
  delay(time);
}
 
void backward(int time) {
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);
 
  delay(time);
}
 
void right(int time) {
  motor1.run(BACKWARD);
  motor2.run(BACKWARD);
  motor3.run(FORWARD);
  motor4.run(FORWARD);
 
  delay(time);
}
 
void left(int time) {
  motor1.run(FORWARD);
  motor2.run(FORWARD);
  motor3.run(BACKWARD);
  motor4.run(BACKWARD);
 
  delay(time);
}
 
//Определение расстояния до впереди стоящего объекта
long read_len() {
  long duration, distance;
 
  //Отправляем звуковой сигнал
  digitalWrite(trigPin, LOW); 
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
 
  //Считывание показаний приёмника
  duration = pulseIn(echoPin, HIGH);
 
  //Преобразование паказаний в длинну в сантиметрах
  distance = (duration/2)/29.1; // 1/скорость_звука = 1/0.03435 = 29.1мс/см
 
  return distance;
}
 
void setup() {
  motor1.setSpeed(255);
  motor1.run(RELEASE);
 
  motor2.setSpeed(255);
  motor2.run(RELEASE);
 
  motor3.setSpeed(255);
  motor3.run(RELEASE);
 
  motor4.setSpeed(255);
  motor4.run(RELEASE);
 
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}
 
void loop() {  
  long distance = read_len();
  if (distance > 15) {
    forward(10);
  }
  else {
    backward(200);
    right(1000);
  }
}

 

Всё! Остаётся только скомпилировать код и загрузить его в робота.


 

Результат


 

Подведение итогов

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


Ссылки на ресурсы

Код написанной программы

https://github.com/lon10/arduino-mobile-bot-prototype

Arduino Mega R3

RU http://arduino.ru/Hardware/ArduinoBoardMega2560

EN http://arduino.cc/en/Main/arduinoBoardMega2560

Ultrasonic HC-SR04

www.micropik.com/PDF/HCSR04.pdf

Motor Drive Shield-L293D

https://learn.adafruit.com/downloads/pdf/adafruit-motor-shield.pdf


11.11.2014
Обсуждение недоступно