В сегодняшней статье я расскажу вам, как сделать робота, обходящего препятствия, на базе микроконтроллера Ардуино своими руками.
Чтобы сделать робота в домашних условиях вам понадобится собственно сама плата микроконтроллера и ультразвуковой сенсор. Если сенсор зафиксирует препятствие, сервопривод позволит ему обогнуть препятствие. Сканируя пространство справа и слева, робот выберет наиболее предпочтительный путь для обхода препятствия.
У робота есть индикаторный диод, зуммер, сигнализирующий об обнаружении препятствия, и функциональная кнопка.
Самодельный робот очень простой в исполнении.
Шаг 1: Необходимые материалы
- Arduino UNO
- Мини макетная плата
- Драйвер двигателя L298N
- Два электромотора с колесами
- Ультразвуковой датчик измерения расстояния HC — SR04
- Микросервопривод
- Кнопка
- Красный диод
- Резистор 220 Ом
- Отсек для элемента питания 9В (с/без коннектора)
- 8 стоек для макетных плат с наружной и внутренней резьбой, 8 винтов и 8 гаек
Также вам понадобится одна большая металлическая скрепка и бусина (для заднего опорного колеса).
Для изготовления каркаса робота использован кусок плексигласа (оргстекла) 12х9,5 см. Можно сделать каркас из дерева или металла, или даже из компакт-дисков.
Инструменты:
- Дрель
- Суперклей
- Отвертка
- Клеевой пистолет (опционально)
Питание:
Для питания робота используется батарейка 9В (крона), она достаточно компактная и дешевая, но разрядится уже примерно через час. Возможно, вы захотите сделать питание от аккумулятора на 6 В (минимум) или 7 В (максимум). Аккумулятор мощнее батарейки, но и дороже и больше по габаритам.
Шаг 2: Делаем каркас робота
Положите всю электронику на плексиглас и маркером отметьте места, где нужно будет просверлить монтажные отверстия (фото 1).
На нижней стороне пластины плексигласа приклейте на суперклей электромоторы. Они должны быть параллельны друг другу, с помощью линейки-угольника проверьте их положение прежде чем клеить (фото 2). Затем приклейте на суперклей отсек для батарейки.
Можно также просверлить отверстия под провода электромоторов и питания.
Шаг 3: Монтируем электронику
Закрепите на каркасе плату контроллера и драйвер двигателей, используя стойки для печатных плат, винты и гайки. Миниатюрная макетная плата клеится на липкий слой (уже есть на нижней стороне) (фото 1).
Теперь делаем заднее опорное колесо из скрепки и бусины (фото 2). Концы проволоки закрепите на нижней стороне каркаса суперклеем или термоклеем.
Шаг 4: Устанавливаем «глаза» робота
На передней части каркаса приклейте на суперклей миниатюрный сервопривод. Рассмотрите на первом фото, как крепится плата ультразвукового датчика к сервоприводу с помощью маленького вала.
На втором фото показано, как выглядит завершенное соединение датчика и сервопривода.
Шаг 5: Схема подключений
Теперь приступаем к подключению электронных компонентов. Подключение компонентов происходит согласно схеме на рисунке 1.
На макетную плату устанавливайте только диод, зуммер и кнопку, это упрощает схему и позволяет добавить дополнительные устройства в дальнейшем.
Шаг 6: Код
Код, который приведен ниже, сделан с помощью Codebender.
Codebender – это браузерный IDE, это самый простой способ программировать вашего робота из браузера. Нужно кликнуть на кнопку «Run on Arduino» и все, проще некуда.
Вставьте батарейку в отсек и нажмите на функциональную кнопку один раз, и робот начнет движение вперед. Для остановки движения нажмите на кнопку еще раз.
/* Arduino Obstacle Avoiding Robot
with a servo motor and an ultrasonic sensor HC-SR04
LED and buzzer */
//Библиотеки
#include
#include "Ultrasonic.h"
//Константы
const int button = 2; //Пин кнопки на пин 2
const int led = 3; //Пин светодиода (через резистор) на пин 3
const int buzzer = 4; //Пин пищалки на пин 4
const int motorA1= 6; //позитивный (+) пин мотора A на пин 6 (PWM) (от модуля L298!)
const int motorA2= 9; //негативный пин (-) мотора A на пин 9 (PWM)
const int motorB1=10; // позитивный (+) пин мотора B на пин 10 (PWM)
const int motorB2=11; // негативный пин (-) мотора B на пин 11 (PWM)
Ultrasonic ultrasonic(A4 ,A5); //Создаем объект ultrasonic(trig pin,echo pin)
Servo myservo; //Создаём объект Servo, чтобы контролировать сервоприводы
//Переменные
int distance; //Переменная для хранения дистанции до объекта
int checkRight;
int checkLeft;
int function=0; //Переменная для хранения функции робота: '1' – движение или '0' - остановлен. По умолчанию остановлен
int buttonState=0; //Переменная для хранения состояния кнопки. По умолчанию '0'
int pos=90; //переменная для хранения позиции серво. По умолчанию 90 градусов- датчик будет смотреть вперёд
int flag=0; //полезный флаг для хранения состояния кнопки, когда кнопка отпущена
void setup()
{
myservo.attach(5); //Серво-пин соединён с пином 5
myservo.write(pos); // говорит сервоприводу идти на позицию в переменной 'pos'
pinMode(button, INPUT_PULLUP);
pinMode(led, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(motorA1,OUTPUT);
pinMode(motorA2,OUTPUT);
pinMode(motorB1,OUTPUT);
pinMode(motorB2,OUTPUT);
}
void loop()
{
//Проверка состояния кнопки
buttonState = digitalRead(button);
unsigned long currentMillis = millis(); //считаем...
//Меняет главную функцию (остановлен/двигается) когда кнопка нажата
if (buttonState == LOW) {//Если кнопка нажата единожды...
delay(500);
if ( flag == 0){
function = 1;
flag=1; //меняем переменную флага
}
else if ( flag == 1){ //Если кнопка нажата дважды
function = 0;
flag=0; //меняем переменную флага снова
}
}
if (function == 0){ //Если кнопка отжата или нажата дважды, то:
myservo.write(90); //установить для серво 90 градусов – датчик будет смотреть вперёд
stop(); //робот остаётся неподвижным
noTone(buzzer); //пищалка выключена
digitalWrite(led, HIGH);// и диод горит
}
else if (function == 1){//Если кнопка нажата, то:
//Считываем дистанцию...
distance = ultrasonic.Ranging(CM); //Совет: Используйте 'CM' для сантиметров и 'INC' для дюймов
//Проверяем на наличие объектов...
if (distance > 10){
forward(); //Всё чисто, двигаемся вперёд!
noTone(buzzer);
digitalWrite(led,LOW);
}
else if (distance <=10){
stop(); //Обнаружен объект! Останавливаемся и проверяем слева и справа лучший способ обхода!
tone(buzzer,500); // издаём звук
digitalWrite(led,HIGH); // включаем светодиод
//Начинаем сканировать...
for(pos = 0; pos =0; pos-=1){ //идём от 180 градусов к 0
myservo.write(pos); // говорим серво пройти на позицию в переменной 'pos'
delay(10); // ждём 10 мс, пока сервопривод достигнет нужной позиции
}
checkRight= ultrasonic.Ranging(CM);
myservo.write(90); // Датчик снова смотрит вперёд
//Принимаем решение – двигаться влево или вправо?
if (checkLeft checkRight){
right();
delay(400); // задержка, меняем значение при необходимости, чтобы заставить робота повернуться.
}
else if (checkLeft <=10 && checkRight <=10){
backward(); //Дорога перекрыта... возвращаемся и идём налево;)
left();
}
}
}
}
void forward(){
digitalWrite(motorA1, HIGH);
digitalWrite(motorA2, LOW);
digitalWrite(motorB1, HIGH);
digitalWrite(motorB2, LOW);
}
void backward(){
digitalWrite(motorA1, LOW);
digitalWrite(motorA2, HIGH);
digitalWrite(motorB1, LOW);
digitalWrite(motorB2, HIGH);
}
void left(){
digitalWrite(motorA1, HIGH);
digitalWrite(motorA2, LOW);
digitalWrite(motorB1, LOW);
digitalWrite(motorB2, HIGH);
}
void right(){
digitalWrite(motorA1, LOW);
digitalWrite(motorA2, HIGH);
digitalWrite(motorB1, HIGH);
digitalWrite(motorB2, LOW);
}
void stop(){
digitalWrite(motorA1, LOW);
digitalWrite(motorA2, LOW);
digitalWrite(motorB1, LOW);
digitalWrite(motorB2, LOW);
}
Нажав кнопку «Edit», вы можете редактировать скетч для своих нужд.
Например, изменив значение «10» измеряемого расстояния до препятствия в см, вы уменьшите или увеличите дистанцию, которую будет сканировать robot Arduino в поисках препятствия.
Если робот не двигается, может изменить контакты электромоторов (motorA1 и motorA2 или motorB1 и motorB2).
Шаг 7: Завершенный робот
Ваш самодельный робот, обходящий препятствия, на базе микроконтроллера Arduino готов.
