- Простой робот, который объезжает препятствия

Простой робот на 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