RC Robot (Wall-e)


Первый мой робот.
Видео (общий вид)

Состоит из:
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);
  }
  
}


Вот собственно говоря и всё.
  • +3
  • 7 марта 2012, 21:36
  • neon

Комментарии (1)

RSS свернуть / развернуть
+
+1
Спасибо за проект и участие в конкурсе КиберВесна!
Правда, описание получилось несколько сумбурное и по блок-схеме не видно как подключаются радиоуправление :)
Я немножко подредактировал статью — самую малость подправив грамматику ;)
Если блок-схема большого разрешения, то можете сбросить её на admin[AT]robocraft.ru и я залью её на сервер.
avatar

admin

  • 8 марта 2012, 08:15

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.