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