Поиск по этому блогу

проект робота на микроконтроллере


Загорелся желанием собрать своего робота на микроконтроллере ардуино. Порылся в интернете, посмотрел как другие собирают. И наконец решился....

Работает по такому принципу - едет прямо пока не "увидит" препятствие, останавливается,  осматривается нет ли препятствий по сторонам, выбирает лучший маршрут и двигается дальше. Может поворачивать влево и вправо на 45и 90 градусов, или разворачиваться на 180.

Прикупил в интернет-магазине микроконтроллер Iteaduino аналог ардуино,

ультразвуковой датчик (сразу приладил его к сервоприводу который остался от разбитого вертолета),

 и держатель для батареек (как потом оказалось зря, лучше использовать обычную крону, не такая громоздкая и намного легче).
Во многих проектах колесная база для робота тоже покупная, но она слишком дорогая, и я решил сделать ее сам. Купил пару одинаковых китайских игрушек (машинок "перевертышей") по 60р. штука, выкинул верхнюю часть и откусил кусачками часть оси так чтобы осталось по два колеса с одной стороны и склеил клеем то что осталось от машинок вместе как на фото (кстати машинки лучше брать с обычными колесами, а то с такими как на фото робот скачет словно "НИВА" по Российским дорогам). Когда будете выводить проводки от моторчиков на одном не забудте поменять полярность (красный с синим).
 Верхнюю крышку вырезал из ДВП, можно и из толстого картона (прямоугольное отверстие слева на фото сместите так чтобы ось сервопривода, вставленного в это отверстие, смотрелась симметрично), в отверстие посередине крышки будем выводить провода от сервы и моторов.

Вот и все база готова, теперь займемся начинкой......
Для питания шасси робота желательно использовать отдельный источник питания, так как для питания микроконтроллера используется 9 вольт, а моторчики потребляют по 3 вольта.
Можно воспользоваться батарейными держателями встроенными в шасси, если соединить их параллельно.
Для подключения моторчиков к микроконтроллеру (без использования моторшилда - стоит как сам микроконтроллер), я использовал транзисторы D882 P (вытащил со старой машинки на пульту управления). Лучше использовать силовые транзисторы TIP120Б, но как в моем случае подойдут любые примерно похожие по характеристикам.
Подключаем их вот по такой схеме для каждого мотора (я сопротивление как по схеме не ставил):


В микроконтроллер загружаем скетч:
_________________________________________________________________________________
#include <Servo.h>
Servo myservo;
const int dangerThresh = 20; //расстояние до барьера (в cm)
int leftDistance, leftDistance45, rightDistance, rightDistance135; //distances on either side
const int pingPin = 7;
int leftMotor = 11;
int rightMotor = 10;
long duration;//time it takes to recieve PING))) signal

void setup()
{
pinMode(leftMotor, OUTPUT);
pinMode(rightMotor, OUTPUT);
myservo.attach(3);
}

void loop()
{
  myservo.write(90);//держим серву прямо
int distanceFwd = ping();
   if (distanceFwd>dangerThresh) //if path is clear
   {
     digitalWrite(leftMotor,HIGH);
     digitalWrite(rightMotor,HIGH);
   }
   else //if path is blocked (остановимся и осмотримся)
   {
     digitalWrite(leftMotor,LOW);
     digitalWrite(rightMotor,LOW);
     myservo.write(45);
     delay(200);
     leftDistance45 = ping(); //scan to the right
     delay(200);
     myservo.write(10);
     delay(200);
     leftDistance = ping(); //scan to the left
     delay(200);
     myservo.write(135);
     delay(200);
     rightDistance135 = ping(); //scan to the right
     delay(200);
     myservo.write(170);
     delay(200);
     rightDistance = ping(); //scan to the left
     delay(200);
     myservo.write(90); //return to center
     delay(100);
     compareDistance();
   }
}

void compareDistance()
 {
   if (leftDistance45>rightDistance135, leftDistance45>leftDistance, leftDistance45>rightDistance) //if left is less obstructed
   {
     digitalWrite(leftMotor,LOW);
     digitalWrite(rightMotor,HIGH);
     delay(400);//поворот в лево на 45гр.
   }
   else if (leftDistance>rightDistance135, leftDistance>leftDistance45, leftDistance>rightDistance) //if left is less obstructed
   {
     digitalWrite(leftMotor,LOW);
     digitalWrite(rightMotor,HIGH);
     delay(700);//поворот в лево на 90гр.
   }
   else if (rightDistance135>leftDistance45, rightDistance135>leftDistance, rightDistance135>rightDistance) //if right is less obstructed
   {
     digitalWrite(leftMotor,HIGH);
     digitalWrite(rightMotor,LOW);
     delay(400);//поворот направо на45гр.
   }
   else if (rightDistance>leftDistance45, rightDistance>leftDistance, rightDistance>rightDistance135) //if right is less obstructed
   {
     digitalWrite(leftMotor,HIGH);
     digitalWrite(rightMotor,LOW);
     delay(700);//поворот направо на90гр.
   }
    else //if they are equally obstructed
   {
     digitalWrite(leftMotor,LOW);
     digitalWrite(rightMotor,HIGH);
     delay(1500);//разворот
   }
 }

long ping()//вычисления для ультразвукового датчика
 {
   // Send out PING))) signal pulse
   pinMode(pingPin, OUTPUT);
   digitalWrite(pingPin, LOW);
   delayMicroseconds(2);
   digitalWrite(pingPin, HIGH);
   delayMicroseconds(5);
   digitalWrite(pingPin, LOW);
 
   //Get duration it takes to receive echo
   pinMode(pingPin, INPUT);
   duration = pulseIn(pingPin, HIGH);
 
   //Convert duration into distance
   return duration / 29 / 2;
 }
__________________________________________________________________________________
Есле необходимо, время работы моторчиков в выделенных строках скетча подбираем индивидуально (время за которое робот успевает повернуть на 45, 90 градусов или развернуться).

Теперь займемся подключением:
ультразвуковой датчик подключаем к 7 цифровому выходу микроконтроллера; серву к 3 цифровому выходу; базу (Б) транзистора левого мотора к 11 и правого к 10 цифровым выходам.
Есле будете использовать крону как источник питания микроконтроллера, то подключаем минус к разъему  "GND", а плюс к "VIN". Также к "GND" подключаем эмиттер (Э) транзистора и минусовой контакт от источника питания шасси робота.

Комментариев нет:

Отправить комментарий