Эта статья о простом роботе который старается избегать столкновений с препятствиями. Мозгом конструкции является arduino. Обнаруживает препятствия ИК бампер. Возможных вариантов поведения не счесть.
Для создания ардуино роботов есть множество готовых платформ. Но я решил сделать свою платформу. На фото показаны все необходимые детали.
Роль основы возложена на кусочек стеклотекстолита 10х15 см. В движение платформа будет приводиться двумя электрическими коллекторными моторами постоянного тока с редукторами. Их рабочее напряжение составляет 3 вольта. Максимальный ток составляет 0.5 ампера. Частота вращения вала составляет 52 оборота в минуту. Еще на фото видно два алюминиевых уголка. Они предназначены для крепления моторов. Также есть два переходника для крепления колес. Колеса от радиоуправляемых моделей автомобилей масштаба 1/10. Их диаметр составляет 65 мм. И последняя деталька это опорное колесо.
Собранную платформу можно увидеть на размещенной ниже картинке.
Всё, что может быть приклеено на двусторонний скотч, приклеено на двусторонний скотч :-) Быстро и просто.
Внешний вид полностью собранного робота показан на фотографии прикрепленной ниже.
У меня используется немного необычная версия Arduino Leonardo. Она достаточно компактна и весьма минималистична.
Роль драйвера двигателей выполняет модуль с двумя L9110S. Эта платка подключается к ардуино согласно приведенным ниже рекомендациям.
Arduino --- Motor Driver
GND --- GND
VCC --- VCC
D8 --- B-IB
D9 --- B-IA
D10 --- A-IB
D11 --- A-IA
Электрические моторчики подключить немного сложнее. Левый двигатель подключаются к клеммам MOTOR-A. Правый двигатель подключается к клеммам MOTOR-B. Вот только, какую клемму мотора с какой клеммой драйвера соединить, нужно определять опытным путем.
У L9110S не предусмотрена возможность работы с ШИМ. Поэтому изменять скорость вращения колес проблематично. Это означает, что скорость передвижения робота постоянна. Неплохо было бы её оценить, хоть приблизительно.
Итак. Длина окружности колеса составляет 0.065 * 3.14 = 0.2041 м. Это то расстояние, которое колесо проедет за один оборот. За секунду колесо сделает около 52 / 60 = 0.87 оборота. Таким образом, скорость составит 0.2041 * 0.87 = 0.177 м/с. За одну секунду робот проедет приблизительно 18 сантиметров.
Важной частью конструкции является датчик препятствий. Я купил готовый ик бампер. С оптимальными настройками этот ик бампер определяет преграды в радиусе 4 сантиметров от своей продольной оси. Ширина собранной мной платформы около 16 сантиметров. Самым простым решением было бы поставить два ик бампера. Только у меня этот датчик один. И судя по всему таких больше не делают. Делают немного другие. Принципиальной разницы между ними нет. Но применять разные ик бампера на одном роботе не очень хотелось. Поэтому я установил ик бампер на сервопривод. Он периодически поворачивает датчик и тем самым увеличивает контролируемую область.
В этом проекте ик бампер подключается к ардуино как написано ниже.
Arduino --- Infrared Obstacle Sensor
GND --- -
VCC --- +
A0 --- S
NC --- EN
Теперь сервопривод. Я использовал HK15288A. Однако, его можно заменить на MG995 или MG996. Подключение. Желтый провод сервопривода соединяется с цифровым выводом 7 ардуино. Красный провод соединяется с VCC. Коричневый провод соединяется с GND.
Всю эту конструкцию обеспечивают энергией три последовательно соединенные батарейки АА.
Скетч робота
В этой программе реализован простой и не самый хороший алгоритм объезда препятствий. Улучшать его можно бесконечно.
В заключении хочу рассказать о некоторых особенностях ик бампера. Расстояние на котором он определяет препятствие сильно зависит от самого препятствия. Светлое и блестящее препятствие определяется с большого расстояния. А черное и матовое препятствие ик бампер в упор не замечает.
И ещё. Нажатие кнопки бытового ик пульта воспринимается ик бампером как обнаружение препятствия :-)
Для создания ардуино роботов есть множество готовых платформ. Но я решил сделать свою платформу. На фото показаны все необходимые детали.
Роль основы возложена на кусочек стеклотекстолита 10х15 см. В движение платформа будет приводиться двумя электрическими коллекторными моторами постоянного тока с редукторами. Их рабочее напряжение составляет 3 вольта. Максимальный ток составляет 0.5 ампера. Частота вращения вала составляет 52 оборота в минуту. Еще на фото видно два алюминиевых уголка. Они предназначены для крепления моторов. Также есть два переходника для крепления колес. Колеса от радиоуправляемых моделей автомобилей масштаба 1/10. Их диаметр составляет 65 мм. И последняя деталька это опорное колесо.
Собранную платформу можно увидеть на размещенной ниже картинке.
Всё, что может быть приклеено на двусторонний скотч, приклеено на двусторонний скотч :-) Быстро и просто.
Внешний вид полностью собранного робота показан на фотографии прикрепленной ниже.
У меня используется немного необычная версия Arduino Leonardo. Она достаточно компактна и весьма минималистична.
Роль драйвера двигателей выполняет модуль с двумя L9110S. Эта платка подключается к ардуино согласно приведенным ниже рекомендациям.
Arduino --- Motor Driver
GND --- GND
VCC --- VCC
D8 --- B-IB
D9 --- B-IA
D10 --- A-IB
D11 --- A-IA
Электрические моторчики подключить немного сложнее. Левый двигатель подключаются к клеммам MOTOR-A. Правый двигатель подключается к клеммам MOTOR-B. Вот только, какую клемму мотора с какой клеммой драйвера соединить, нужно определять опытным путем.
У L9110S не предусмотрена возможность работы с ШИМ. Поэтому изменять скорость вращения колес проблематично. Это означает, что скорость передвижения робота постоянна. Неплохо было бы её оценить, хоть приблизительно.
Итак. Длина окружности колеса составляет 0.065 * 3.14 = 0.2041 м. Это то расстояние, которое колесо проедет за один оборот. За секунду колесо сделает около 52 / 60 = 0.87 оборота. Таким образом, скорость составит 0.2041 * 0.87 = 0.177 м/с. За одну секунду робот проедет приблизительно 18 сантиметров.
Важной частью конструкции является датчик препятствий. Я купил готовый ик бампер. С оптимальными настройками этот ик бампер определяет преграды в радиусе 4 сантиметров от своей продольной оси. Ширина собранной мной платформы около 16 сантиметров. Самым простым решением было бы поставить два ик бампера. Только у меня этот датчик один. И судя по всему таких больше не делают. Делают немного другие. Принципиальной разницы между ними нет. Но применять разные ик бампера на одном роботе не очень хотелось. Поэтому я установил ик бампер на сервопривод. Он периодически поворачивает датчик и тем самым увеличивает контролируемую область.
В этом проекте ик бампер подключается к ардуино как написано ниже.
Arduino --- Infrared Obstacle Sensor
GND --- -
VCC --- +
A0 --- S
NC --- EN
Теперь сервопривод. Я использовал HK15288A. Однако, его можно заменить на MG995 или MG996. Подключение. Желтый провод сервопривода соединяется с цифровым выводом 7 ардуино. Красный провод соединяется с VCC. Коричневый провод соединяется с GND.
Всю эту конструкцию обеспечивают энергией три последовательно соединенные батарейки АА.
Скетч робота
////////////////////////
//
// Arduino Leonardo
//
////////////////////////
//
// Sketch: robot
//
// Arduino ATmega32U4
//
// D13 --- Port C Pin 7
// D12 --- Port D Pin 6
// D11 --- Port B Pin 7
// D10 --- Port B Pin 6
// D9 --- Port B Pin 5
// D8 --- Port B Pin 4
//
// D7 --- Port E Pin 6
// D6 --- Port D Pin 7
// D5 --- Port C Pin 6
// D4 --- Port D Pin 4
// D3 --- Port D Pin 0
// D2 --- Port D Pin 1
// D1 --- Port D Pin 3
// D0 --- Port D Pin 2
//
// A5 --- Port F Pin 0
// A4 --- Port F Pin 1
// A3 --- Port F Pin 4
// A2 --- Port F Pin 5
// A1 --- Port F Pin 6
// A0 --- Port F Pin 7
#include <Servo.h>
const unsigned char SERVO1 = 7; // Digital Pin 7
const unsigned char MOTOR1A = 8; // Digital Pin 8
const unsigned char MOTOR1B = 9; // Digital Pin 9
const unsigned char MOTOR2A = 10; // Digital Pin 10
const unsigned char MOTOR2B = 11; // Digital Pin 11
// Arduino Uno
//const unsigned char SENSOR = 14; // Analog Pin 0
// Arduino Leonardo
const unsigned char SENSOR = 18; // Analog Pin 0
Servo servo1;
unsigned char angle = 60;
void forward( void )
{
digitalWrite(MOTOR1A, LOW);
digitalWrite(MOTOR1B, HIGH);
digitalWrite(MOTOR2A, LOW);
digitalWrite(MOTOR2B, HIGH);
}
void backward( void )
{
digitalWrite(MOTOR1A, HIGH);
digitalWrite(MOTOR1B, LOW);
digitalWrite(MOTOR2A, HIGH);
digitalWrite(MOTOR2B, LOW);
}
void left( void )
{
digitalWrite(MOTOR1A, LOW);
digitalWrite(MOTOR1B, LOW);
digitalWrite(MOTOR2A, HIGH);
digitalWrite(MOTOR2B, LOW);
}
void right( void )
{
digitalWrite(MOTOR1A, HIGH);
digitalWrite(MOTOR1B, LOW);
digitalWrite(MOTOR2A, LOW);
digitalWrite(MOTOR2B, LOW);
}
void stop( void )
{
digitalWrite(MOTOR1A, LOW);
digitalWrite(MOTOR1B, LOW);
digitalWrite(MOTOR2A, LOW);
digitalWrite(MOTOR2B, LOW);
}
void setup()
{
pinMode(SENSOR, INPUT);
pinMode(MOTOR1A, OUTPUT);
pinMode(MOTOR1B, OUTPUT);
pinMode(MOTOR2A, OUTPUT);
pinMode(MOTOR2B, OUTPUT);
servo1.attach(SERVO1);
servo1.write(90);
delay(2000);
}
void loop()
{
if ( angle == 60 ) { angle = 120; }
else { angle = 60; }
servo1.write(angle);
delay(300);
if ( digitalRead(SENSOR) == LOW )
{
stop();
delay(1000);
if ( angle == 60 ) { left(); }
else { right(); }
delay(1000);
stop();
delay(1000);
}
else
{
forward();
}
}
//
// End
//
////////////////////////
В этой программе реализован простой и не самый хороший алгоритм объезда препятствий. Улучшать его можно бесконечно.
В заключении хочу рассказать о некоторых особенностях ик бампера. Расстояние на котором он определяет препятствие сильно зависит от самого препятствия. Светлое и блестящее препятствие определяется с большого расстояния. А черное и матовое препятствие ик бампер в упор не замечает.
И ещё. Нажатие кнопки бытового ик пульта воспринимается ик бампером как обнаружение препятствия :-)
Комментариев нет:
Отправить комментарий