В сегодняшней статье я расскажу вам, как сделать робота, обходящего препятствия, на базе микроконтроллера Ардуино своими руками.





Чтобы сделать робота в домашних условиях вам понадобится собственно сама плата микроконтроллера и ультразвуковой сенсор. Если сенсор зафиксирует препятствие, сервопривод позволит ему обогнуть препятствие. Сканируя пространство справа и слева, робот выберет наиболее предпочтительный путь для обхода препятствия.

У робота есть индикаторный диод, зуммер, сигнализирующий об обнаружении препятствия, и функциональная кнопка.
Самодельный робот очень простой в исполнении.

Шаг 1: Необходимые материалы



Также вам понадобится одна большая металлическая скрепка и бусина (для заднего опорного колеса).

Для изготовления каркаса робота использован кусок плексигласа (оргстекла) 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 готов.