Поиск по этому блогу
проект робота на микроконтроллере
Загорелся желанием собрать своего робота на микроконтроллере ардуино. Порылся в интернете, посмотрел как другие собирают. И наконец решился....
Работает по такому принципу - едет прямо пока не "увидит" препятствие, останавливается, осматривается нет ли препятствий по сторонам, выбирает лучший маршрут и двигается дальше. Может поворачивать влево и вправо на 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" подключаем эмиттер (Э) транзистора и минусовой контакт от источника питания шасси робота.
Подписаться на:
Сообщения (Atom)
Комментариев нет:
Отправить комментарий