
Первый мой робот.
Видео (общий вид)
Состоит из:
Orduino nano
servo sg-5010
HC-SR04
L293D
RC блок (4 команды)(с той же машинки)
Электромотор с редуктором (с той же машинки)
3 батарейки (пальчиковых аккумуляторов 2300 mAh)
Китайская RC машинка
Видео первая самостоятельная езда
Ну поехали!
Началось всё с того что я насмотрелся как люди делают «роботов» из игрушечных танков и различных RC-машинок. Пошёл на китайский рынок и начал искать танк, наткнулся на высокую цену — в 800 р минимум, ну так как я жадный, то танк сразу отсёкся. Мой взор упал на машинку с крутящейся рулевой осью за 300 р, вполне себе нормальная цена! Дома поигрался, надоело кошку шугать этой машинкой. И принялся разбирать.
Снял двигатель с рулевой оси, переделал серву, вместо него пошел в магазин купил (рассыпуху) диоды резисторы L293D
И начал собирать на макетной плате.
Схема

Схема подобрана экспериментальным путём из-за конфронтации библиотек, возможно будут доработки в будущем.
Вот моя головная боль — всё подбирал экспериментальным путём, но это только проба. Уже есть от чего отталкиваться.
В коментах почти всё описал.
А на мутил я то, что бы он если перед ним препятствие, то он делает задний ход с разворотам а если чисто то в полный газ!
И в любое время можно управлять с пульта в качестве помощи роботу!
Есть проблемы с ложными объектами: датчик даже когда подъезжает не под прямым углом к той же стене и не понимает, что до препятствия уже близко и врезается!
Ещё огромное потребление тока, батареек на пол-часа хватает.
Надо кнопку в заде делать что бы он программу заднего хода останавливал
как в что то упирался, а не садил батарейку лишнее время!
#include <robocraft.h>
#include <Servo.h>
#include "Ultrasonic.h"
Servo myservo; // создаём объект для контроля сервы
int pos = 0; // переменная для хранения позиции сервы
int butl=6; // переменная для хранения номера вывода RC блока ВЛЕВО
int butp=5; // переменная для хранения номера вывода RC блока ВПРАВО
int butb=4; // переменная для хранения номера вывода RC блока ВПЕРЁД
int butn=3; // переменная для хранения номера вывода RC блока НАЗАД
int but; // переменная для опроса выводов RC
int led=13; // Вывод на светодиод
// Trig - 12, Echo - 13
Ultrasonic ultrasonic(12, 9); // Подключаем к данным портам библиотеку
MOTOR MOTOR1 = { 0, 0, 0 };
MOTOR MOTOR2 = { 7, 8, 11 }; // Подключаем к данным портам библиотеку
RoboCraft robot(&MOTOR1, &MOTOR2); // создаём экземпляр нашего класса
void setup()
{
robot.hello(); // говорим "Hello" :)
pinMode(butl,INPUT); //вход RC блока ВЛЕВО
pinMode(butp,INPUT); //вход RC блока ВПРАВО
pinMode(butb,INPUT); //вход RC блока ВПЕРЁД
pinMode(butn,INPUT); //вход RC блока НАЗАД
pinMode(led,OUTPUT); // переменная led это вывод
Serial.begin(9600);
myservo.attach(10); // серва подключена к 9-му пину
}
void loop()
{
vali(); // Функция автономного режима
dist(); // функция дистанционного RC режима
}
void dist (void)
{
while ((digitalRead(butb)==1)|(digitalRead(butn)==1)|(digitalRead(butl)==1)|digitalRead(butp)==1)
// Если нажата любая кнопака на пультеди дистанционном то проверяем какая именно нажата
{
but=digitalRead(butl);//если нажата кнопка в лево то
if (but==1)
{
pos=45; //переменная для сервы
myservo.write(pos);// устанавливаем угол сервы в лево
delay(200);// пауза милисекунды
}
else //иначе
{
myservo.write(90); //устанавливаем угол сервы для выравнивания рулевого моста
}
Serial.println(pos); //выводим значеие угла сервы в порт
but=digitalRead(butp);
if (but==1)
{//если нажата кнопка в право то
pos=135;//переменная для сервы
myservo.write(pos);// устанавливаем угол сервы в право
delay(200);// пауза милисекунды
}
else//иначе
{
myservo.write(90); //устанавливаем угол сервы для выравнивания рулевого моста
}
but=digitalRead(butb);
if (but==1)
{
robot.motor_forward(2,254); // двигатель полный вперёд :)
delay(300);
}
else
{
robot.motor_forward(2,0); // двигатель стоп :)
}
but=digitalRead(butn);
if (but==1)
{
robot.motor_back(2,254); // крутим назад
delay(300);
}
else
{
robot.motor_back(2,0);// крутим назад
}
}
}
void vali(void)
{
float dist_cm = ultrasonic.Ranging(CM); // присваеваем переменую для хранения отдалённости в СМ
Serial.println(dist_cm); // выводим в порт отдалёность в СМ
if (dist_cm>=1 && dist_cm<=100) // Если попадает в промежуто то
{
digitalWrite(led,1); //Зажигаем светодиод
if(dist_cm<=60) // Если значеие меьше или равно то
{
myservo.write(145); //поворачиваем серву для разворота
delay(100);
robot.motor_back(2,254); //крутим мотор назад
delay(1100);
robot.motor_back(2,0);//успокаеваем мотор
myservo.write(90); //ворачиваем серву в горизонтальое положение
delay(100);
}
else
{
robot.motor_forward(2,254); // полный вперёд :)
}
}
else
{
digitalWrite(led,0);
robot.motor_forward(2,254); // полный вперёд :)
delay(300);
}
}
Вот собственно говоря и всё.

0 комментариев на «“RC Robot (Wall-e)”»
Спасибо за проект и участие в конкурсе !
Правда, описание получилось несколько сумбурное и по блок-схеме не видно как подключаются радиоуправление 🙂
Я немножко подредактировал статью — самую малость подправив грамматику 😉
Если блок-схема большого разрешения, то можете сбросить её на admin[AT]robocraft.ru и я залью её на сервер.