Первый мой робот.
Видео (общий вид)
Состоит из:
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 и я залью её на сервер.