- Простой робот, который объезжает препятствия
Простой робот на Arduino UNO с ультразвуковым дальномером HC-SR04 для объезда препятствий
Практика для студентов. Мясищев А.А.
Рассмотрим построение простого робота на Arduino UNO, который объезжает препятствия. На рисунке 1 представлено фото этого робота. На рисунке 2 - фото Arduino motor drive shield-L298N, который управляет двумя двигателями, установленными на двухколесной платформе. На рисунке показаны положение трех переключателей, а также соединение motor drive с двигателями. Питание двигателей с motor drive и сервопривода выполняется отдельным источником питания - Li-ion 18650 аккумуляторами, а питание контроллера Arduino - плоским li-ion аккумулятором напряжением ~4 вольт малой емкости. Целесообразно использовать два источника питания - отдельно Arduino и motor drive с двигателями, так как Arduino начинает работать очень неустойчиво.
Рис. 1. Фото робота
Рис.2. Фото Arduino motor drive shield-L298N
На роботе установлен ультразвуковой дальномер HC-SR04 с помощью которого определяется расстояние до препятствия с последующим объездом его. В свою очередь дальномер установлен на сервоприводе. В случае, если расстояние до препятствия менее 25 см, робот останавливается, перемещается назад, а сервопривод поворачивает дальномер примерно на 60 градусов для поиска расстояния, больше 25 см. Далее робот поворачивается в этом направлении и продолжает движение пока опять не встретит препятствие. На рисунке 3 представлена схема соединений контроллера Arduino UNO, Arduino motor drive shield-L298N ,ультразвукового дальномера HC-SR04, сервопривода и двух двигателей.
Рис.3. Схема соединений
Ниже представлен текст программы в среде Arduino IDE с описанием:
#include "Ultrasonic.h"
//motor A
int dir1PinA = 13; // 13-й и 12 выводы Ардуино контролируют направление вращения
int dir2PinA = 12; // двигателя А
int speedPinA = 10; // 10-й вывод Ардуино контролирует скорость врашения двигателя А
//motor B
int dir1PinB = 11; // Аналогично для мотора В
int dir2PinB = 8;
int speedPinB = 9;
float ab=0,bb=0;
Ultrasonic ultrasonic(4,5);
void setup()
{
pinMode (dir1PinA, OUTPUT); // Выводы 13,12,10,11,8,9 назначаются выводными
pinMode (dir2PinA, OUTPUT);
pinMode (speedPinA, OUTPUT);
pinMode (dir1PinB, OUTPUT);
pinMode (dir2PinB, OUTPUT);
pinMode (speedPinB, OUTPUT);
pinMode(7,OUTPUT);
analogWrite (speedPinA,153); // Устанавливается максимальная скорость вращения
analogWrite (speedPinB,150);
delay(4000);
step(1400); // Устанавливаем Ultrasonic прямо
/* задаем скорость общения. В нашем случае с компьютером */
// Serial.begin(9600);
}
unsigned int impulseTime=0;
float a=0;
void step(unsigned int imp){ //Функция работы с сервоприводом
digitalWrite(7,HIGH);
for(int i=0;i<25;i++)
{
digitalWrite(7, HIGH); //Запись высокого уровня в вывод 7 Ардуино
delayMicroseconds(imp);
digitalWrite(7, LOW);
delay(20);
}
}
void loop()
{
a=ultrasonic.Ranging(CM);
// Serial.println(a);
if (a<25) // Если расстояние менее 25 сантиметров
{
//Стоп
sto(); delay(1000);
backw();
delay(300);
sto();
step(800); // Поворачиваем Ultrasonic вправо (если смотреть сзади робота)
ab=ultrasonic.Ranging(CM); // Определение расстояния
delay(1000);
if(ab >25 ) {right(); delay(300); forw(); step(1400); goto aa;}
else {step(2100); }// Поворачиваем Ultrasonic влево (если смотреть сзади робота)
bb=ultrasonic.Ranging(CM);
delay(1000);
if(bb>25) { left(); delay(300); forw(); step(1400); goto aa;}
else {step(1400); delay(1000);}
backw();
delay(500);
sto();
delay(1000);
right(); delay(300);
}
else
{
//Вперед
forw();
}
aa: ;
delay(100);
}
void forw() // Вперед
{
digitalWrite (dir1PinA, LOW);
digitalWrite (dir2PinA, HIGH);
digitalWrite (dir1PinB, LOW);
digitalWrite (dir2PinB, HIGH);
}
void right() // Вправо
{
digitalWrite (dir1PinA, LOW);
digitalWrite (dir2PinA, HIGH);
digitalWrite (dir1PinB, HIGH);
digitalWrite (dir2PinB, LOW);
}
void left() // Влево
{
digitalWrite (dir1PinA, HIGH);
digitalWrite (dir2PinA, LOW);
digitalWrite (dir1PinB, LOW);
digitalWrite (dir2PinB, HIGH);
}
void sto() // Стоп
{
digitalWrite (dir1PinA, LOW);
digitalWrite (dir2PinA, LOW);
digitalWrite (dir1PinB, LOW);
digitalWrite (dir2PinB, LOW);
}
void backw() // Назад
{
digitalWrite (dir1PinA, HIGH);
digitalWrite (dir2PinA, LOW);
digitalWrite (dir1PinB, HIGH);
digitalWrite (dir2PinB, LOW);
}
В программе использована библиотека Ultrasonic для работы с датчиком расстояний HC-SR04, которую легко найти в Интернете.
Видео демонстрация работы робота представлена здесь
19.11.2017