Обзор робота RT0008 на Arduino Uno

Обзор робота RT0008 на Arduino Uno

RT0008 — Робот на Arduino Uno

 

Представляю обзор набора для самостоятельной сборки робота. Набор представляет собой платформу и набор модулей с деталями — все это при желании можно приобрести отдельно. Подробности, скетчи, проблемы при сборке, а также видео в работе смотрите далее.

Пришла коробка. Довольно большая. Открываем

Для простоты восприятия информации и чтобы самому не путаться, я буду разбирать содержимое, параллельно рассказывать о нем, и собирать робота.

Основная платформа, к которой уже зачем-то прикрутили двигатели, кроватку под 2*18650 и модуль драйвера L298N. Сама платформа из прозрачного акрила. Достаточно толстая. Защитную бумагу отдирать не стал.

Множество отверстий позволят (при желании) навесить на платформу дополнительные сенсоры, светодиоды, камеру или вообще что угодно. Ну или ничего не вешать))

Драйвер шагового двигателя и двигателя постоянного тока L298N

Схема подключения

Двигатели постоянного тока. Питание от 3 до 12 вольт. Рекомендованное от 6 до 8 вольт.

Заднее колесо. На шарикоподшипнике.

Вставил в клеммники провода от движков. Полярность должна быть одинаковая. в моем случае я неправильно вставил провода от левого двигателя. Фотал сразу после распаковки, доки изучал уже потом.

Колеса. Просто одеваются на вал двигателя. При желании можно просверлить в центре отверстие и притянуть к валу саморезом.

Идем дальше. Шлейф. Должно быть 40 проводов мама-мама. Обычный, не лучше и не хуже тех что можно купить отдельно. В процессе сборки попались пара хреновых коннекторов.

Также в комплекте парочка говенных аккумов. Емкость где-то 500 mAh, сойдут как тестовые, не более.

Хороший кабель USB-miniUSB, только короткий.

Мозг нашего робота Funduino UNO

Отличие от обычной ардуины уно в том что для каждого аналогового и цифрового входа распаяны по три пина: сигнал-питание-земля. Благодаря чему можно повесить на плату множество внешних датчиков (серв, экранов) без использования сенсор-шилда. Также на плате есть переключатель питания 5 или 3.3 вольта. Подключение через миниUSB, а не через USB-b, что тоже довольно удобно.

Экран 1602 с синей подсветкой. Модуль IIC / I2C уже запаян. Благодаря чему дисплей будет проще подключать и регулировать контрастность.

Ультразвуковой датчик HC — SR04

Верхняя платформа. Сделана из черного акрила. Единственная деталь в наборе, которую будет проблематично найти отдельно в продаже. (хотя может просто плохо искал). С нее бумагу решил убрать

Остальное.

Платформа для сервомотора

IR пульт

IR приемник

Сам сервик. Достаточно популярный SG90.

Колеса для оптических сенсоров. Видимо в комплекте с платформой. Повесил чтоб не потерялись

Приступим к сборке. Прикручиваю стойки к экрану. Экран прикручиваем к платформе

Теперь прикрутим ардуину, из-за особенности расположения стоек и отверстий на платформе, ее можно прикрутить только с одной стороны. С первой попытки дисплей у меня оказался не на той стороне.

Теперь прикручиваю стойки к платформе

И ставим на наше шасси

Теперь будем припиливать серву

Подвижная платформа рассчитана на использование с этими серводвигателями, поэтому все собирается без проблем. Сама платформа предназначена для двух сервомоторов — для движения в горизонтальной и вертикальной плоскостях. Вертикальное вращение нам без надобности, поэтому вставляем только один сервомотор.

Обкусываем крепление

Теперь влезает

Прикручиваю комплектными винтами

И крепим на шасси

Подключаем питание на двигатели и на драйвер

Подключаем драйвер к ардуине

Подключаем все остальное

Ультразвуковой сенсор сначала повесил на нижнюю рамку. Не фотал. При тестировании робота проявилась проблема (проблем на самом деле было много, но рассмотрю конкретную) Робот периодически начинал дебилировать, кружиться на месте и т.д.

Выяснил что в показания сенсора вносит помехи серводвигатель. Робот думает что впереди препятствии и выполняет алгоритм разворота. Не важно что и на каких входах висит, помехи есть даже если крутить отключенную серву. Сенсоры и сервы менял (имеются в запасе). Проблему решил подняв сенсор. Как раз использовал оставшееся детали от крепежа под вертикальный сервик.

ИК приемник прикрутил сзади

Готовый робот

Программа.

Скетч и мануал нашел на банггуде))) Саппорт давал ссылки на дропбокс, в данный момент ссылка мертва. Там универсальная инструкция, библиотеки, примеры, сам скетч.

Библиотеки устаревшие и в Arduino 1.6.5. не работают. Скетч основной программы тоже так и не открылся. Сам текст программы содержит достаточно много ошибок и опечаток.

В общем разбирал эту китайскую грамоту долго. Ардуиной я раньше игрался, но забросил после рождения дочки, поэтому пришлось все вспоминать, а тут еще и косяки))

Коды ик пульта были перепутаны, один код лишний, ничего на него не вешал, но и удалять не стал.
Сомнительная польза дисплея, на нем отображаются текущие действия (стоп, вперед, назад). Добавил немного текста и функцию очистки, а то все наслаивалось друг на друга.

Функцию регулирования скорости не реализовали, думаю вернуться к этому позже.
Еще уменьшил время поворота в два раза, потому что с исходными значениями робот поворачивал на слишком большой угол. Ну и так по мелочи, сильно ничего не менял.

Скетч

 

Код:
#include
#include
#include
#include
int MotorRight1=8;
int MotorRight2=9;
int MotorLeft1=7;
int MotorLeft2=6;
int counter=0;

const int irReceiverPin = 2;
long IRfront=0x00FF629D; //Forward code
long IRback=0x00FFA857; //Backward
long IRturnright=0x00FFC23D;//Right
long IRturnleft=0x00FF22DD; //Left
long IRstop=0x00FF02FD; //Stop
long IRAutorun=0x00FF6897; //Ultrasonic Self-propelled mode
long IRturnsmallleft=0x00FFB04F;
IRrecv irrecv(irReceiverPin); // Define IRrecv thing receive IR signal
decode_results results;
int inputPin =A0; // define ultrasonic receive pin rx
int outputPin =A1; // define ultrasonic transmit pin tx
int Fspeedd = 0; // Front distance
int Rspeedd = 0; // right distance
int Lspeedd = 0; // left distance
int directionn = 0; // front=8 back=2 left=4 right=6
Servo myservo; // define myservo
int delay_time = 250; // servo turn back steady time
int Fgo = 8; // forward
int Rgo = 6; // right
int Lgo = 4; // left
int Bgo = 2; // backward

LiquidCrystal_I2C lcd(0x27,16,2);
void setup()
{
Serial.begin(9600);
pinMode(MotorRight1, OUTPUT); // pin8 (PWM)
pinMode(MotorRight2, OUTPUT); // pin9 (PWM)
pinMode(MotorLeft1, OUTPUT); //pin10 (PWM)
pinMode(MotorLeft2, OUTPUT); // pin11 (PWM)
irrecv.enableIRIn(); // Start infrared decoding
digitalWrite(3,HIGH);
pinMode(inputPin, INPUT); // define ultrasonic input foot
pinMode(outputPin, OUTPUT); // define ultrasonic output foot
myservo.attach(5); // define servo output to pin 5(PWM)
lcd.init(); // initialize the lcd
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print(«Im CRAZY ROBOT»);
lcd.setCursor(0,1);
lcd.print(«Kill All Humans!»);
}
void advance(int a) // Forward
{
digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,HIGH);
digitalWrite(MotorLeft1,LOW);
digitalWrite(MotorLeft2,HIGH);
delay(a * 100);
}
void right(int b) //right(Single wheel )
{
digitalWrite(MotorLeft1,LOW);
digitalWrite(MotorLeft2,HIGH);
digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,LOW);
delay(b * 50);
}
void left(int c) //left (Single wheel)
{
digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,HIGH);
digitalWrite(MotorLeft1,LOW);
digitalWrite(MotorLeft2,LOW);
delay(c * 50);
}
void turnR(int d) //right(double wheel)
{
digitalWrite(MotorRight1,HIGH);
digitalWrite(MotorRight2,LOW);
digitalWrite(MotorLeft1,LOW);
digitalWrite(MotorLeft2,HIGH);
delay(d * 100);
}
void turnL(int e) //left(double wheel)
{
digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,HIGH);
digitalWrite(MotorLeft1,HIGH);
digitalWrite(MotorLeft2,LOW);
delay(e * 100);
}
void stopp(int f) //stop
{
digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,LOW);
digitalWrite(MotorLeft1,LOW);
digitalWrite(MotorLeft2,LOW);
delay(f * 100);
}
void back(int g) //backward
{
digitalWrite(MotorRight1,HIGH);
digitalWrite(MotorRight2,LOW);
digitalWrite(MotorLeft1,HIGH);
digitalWrite(MotorLeft2,LOW);;
delay(g * 100);
}
void detection() //Measuring three angles (front,left,right)
{
int delay_time = 350; // servo turn back steady time
ask_pin_F(); // read forward distance
if(Fspeedd < 10) // If the forward distance is less than 10 cm
{
stopp(1); // Clear Output Data
directionn = Bgo; // backward 0.2 s

}
if(Fspeedd Rspeedd) //If left distance is more than right distance
{
directionn = Lgo; //Turn left
}
if(Lspeedd

Оставить комментарий

Вы можете использовать следующие теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>