Как сделать робота своими руками

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

Чтобы сделать  робота на Arduino, и из подручных средств: скрепки и бусины, нам необходим сам микроконтроллер Arduino UNO и ультразвуковой сенсор HC-SR04. Если сенсор обнаружит препятствие, сервопривод позволит избежать столкновения. Сканируя пространство, робот выберет наиболее подходящее направления для объезда.

Помимо платы и сенсора для настоящего робота, нам необходимы материалы:

  • Красный диод
  • Зуммер
  • Функциональная кнопка
  • Макетная плата (мини)
  • Драйвер двигателя
  • Два электромотора с колесами
  • Микросервопривод
  • Кнопка
  • Резистор 220 Ом
  • Отсек для элемента питания 9В (можно с, ничего если и без коннектора)
  • 8 гаек, 8 винтиков, 8 стоек для макетных плат с резьбой наружной и внутренней
  • Большая металлическая скрепка
  • Бусина для заднего опорного колеса.
  • Оргстекло (12х9,5 см)

Так же с инструментов вам понадобятся дрель, суперклей, отвертка, клеевой пистолет.

Запитаем нашего робота 9В батарейкой (крона),  она компактная и дешевая , но через час она разрядится, потому, по желанию, вы можете запитать от аккумулятора на 6-7В. Он дороже, да и больше по габаритам, но все же мощнее. Решать вам!

Начнем с каркаса.

Для начала необходимо разложить электронику на оргстекло и маркер поставить отметки, где нужно просверлить отверстия(рис.1).

Рис.1

С помощью линейки-угольника начертите линию параллельно краю вашей поверхности, с которой работаете, для электромоторов. Она послужит вам проверкой, чтобы вы не ошиблись , ведь моторы должны быть параллельными. Когда вы будете уверены

что они параллельны, можно клеить на суперклей отсек для батарейки(рис.2).

Рис.2

Также просверлим отверстия под провода и питание.

Теперь мы спокойно можем монтировать электронику.

Закрепляем на каркасе Arduino и драйвер двигателя, при этом используя стойки, винты и гайки. Макетную плату прикрепим на ее нижний липкий слой.

Дальше сделаем заднее опорное колесо из бусины и скрепки (рис.3).

Рис.3

Концы проволоки нужно закрепить суперклеем или термоклеем на нижней стороне основы (рис.4).

Рис.4

Следующим этапом установим «глазки»  нашего робота.

Спереди каркаса приклейте сервопривод на суперклей. Внимательно рассмотрите, как плата ультразвукового датчика крепится  к сервоприводу с помощью маленького вала (рис.5).

Рис.5

Внешний вид конечного результата вы можете посмотреть на рис.6 и рис.7.

Рис.6
Рис.7

Давайте разберемся с схемой подключения.

Подключаем компоненты по схеме на рис.8.

Рис.8

На мини макетную плату установим диод, зуммер и кнопку. Плата значительно упростит схему и позволит подключать больше новых устройств в будущем.

Приступим к написанию кода.

Можно использовать браузерный вариант IDE – Codebender или скачать программу Arduino IDE.

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

//Библиотеки

 #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);

 }

 

Если робот не двигается, просто измените контакты электромоторов на motorA1, или  motorB1. motorB2.

Наш самодельный робот из подручных материалов готов.

 

Построить робота сможет даже ребенок дома по схеме, написанной вверху. Также если вам интересно создавать роботов или у вас есть идеи по созданию новых, приглашаем вас на курсы по робототехнике.

Пробное занятие