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);
  }

}

Вот собственно говоря и всё.


0 комментариев на «“RC Robot (Wall-e)”»

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

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна конкурс манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение