Авторизация
Зарегистрироваться

RT0008 - Робот на Arduino Uno


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


Пришла коробка. Довольно большая. С дыркой.



Вес



Коробка пробита радиатором от модуля с L298N



Открываем



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

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





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



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





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



Про работу можно почитать например здесь

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







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



Вставил в клеммники провода от движков.





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



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







Колеса на местах





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





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



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





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





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

контроллер ATmega 328p







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







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







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



С нее бумагу решил убрать





Остальное.



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





IR пульт



IR приемник





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







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



Повесил чтоб не потерялись



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



Прикручиваем к платформе



Теперь прикрутим ардуину







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







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



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





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



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





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





Еще



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



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





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











Оставшиеся после сборки винтики, гайки и стойки.



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



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





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









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





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





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



Программа.
Скетч и мануал нашел на банггуде))) Саппорт давал ссылки на дропбокс
Я тоже их приведу www.dropbox.com/s/ao4rzw93iu3v5ox/SKU116898%20Remote%20control%20ultrasonic%20ranging%20smart%20car.rar
Там универсальная инструкция, библиотеки, примеры, сам скетч.
Библиотеки устаревшие и в Arduino 1.6.5. не работают. Скетч основной программы тоже так и не открылся.
Сам текст программы содержит достаточно много ошибок и опечаток.

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

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

скетч
#include <IRremote.h>
#include <Servo.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
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(«I'm 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 < 25) // If the forward distance is less than 25 cm
{
stopp(1); // Clear Output Data
ask_pin_L(); // read left distance
delay(delay_time); // wait servo steady
ask_pin_R(); // read right distance
delay(delay_time); // wait servo steady
if(Lspeedd > Rspeedd) //If left distance is more than right distance
{
directionn = Lgo; //Turn left
}
if(Lspeedd <= Rspeedd) //If left distance is less than or equal to right distance
{
directionn = Rgo; //Turn right
}
if (Lspeedd < 15 && Rspeedd < 15) //If left distance and right distance are less than 10cm
{
directionn = Bgo; //turn back
}
}
else //If front distance is more than 25cm
{
directionn = Fgo; //forward
}
}
void ask_pin_F() // measure front distance
{
myservo.write(96);
digitalWrite(outputPin, LOW); // Let ultrasonic transmitting low voltage 2us
delayMicroseconds(2);
digitalWrite(outputPin, HIGH); // Let ultrasonic transmitting high voltage 10us,here must at least 10us
delayMicroseconds(10);
digitalWrite(outputPin, LOW); // keep ultrasonic transmitting low voltage
float Fdistance = pulseIn(inputPin, HIGH); // read time difference
Fdistance= Fdistance/5.8/10; // transfer time into distance(unit:cm)
Fspeedd = Fdistance; // read distance into Fspeedd(front speed)
}
void ask_pin_L() // measure left distance
{
myservo.write(170);
delay(delay_time);
digitalWrite(outputPin, LOW); // Let ultrasonic transmitting low voltage 2us
delayMicroseconds(2);
digitalWrite(outputPin, HIGH); // Let ultrasonic transmitting high voltage 10us,here must at least 10us
delayMicroseconds(10);
digitalWrite(outputPin, LOW); // keep ultrasonic transmitting low voltage
float Ldistance = pulseIn(inputPin, HIGH); // read time difference
Ldistance= Ldistance/5.8/10; // transfer time into distance(unit:cm)
Lspeedd = Ldistance; // read distance into Lspeedd(left speed)
}
void ask_pin_R() // measure right distance
{
myservo.write(30);
delay(delay_time);
digitalWrite(outputPin, LOW); // Let ultrasonic transmitting low voltage 2us
delayMicroseconds(2);
digitalWrite(outputPin, HIGH); // Let ultrasonic transmitting high voltage 10us,here must at least 10us
delayMicroseconds(10);
digitalWrite(outputPin, LOW); // keep ultrasonic transmitting low voltage
float Rdistance = pulseIn(inputPin, HIGH); // read time difference
Rdistance= Rdistance/5.8/10; // transfer time into distance(unit:cm)
Rspeedd = Rdistance; // read distance into Rspeedd(right speed)
}
void loop()
{
if (irrecv.decode(&results))
{
if (results.value == IRfront)//forward
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(«IR mode»);
lcd.setCursor(0,1);
lcd.print(«advance»);
advance(20);
}
if (results.value == IRback)//backward
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(«IR mode»);
lcd.setCursor(0,1);
lcd.print(«back»);
back(20);//backward
}
if (results.value == IRturnright)//turn right
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(«IR mode»);
lcd.setCursor(0,1);
lcd.print(«right»);
right(10); // turn right
}
if (results.value == IRturnleft)//turn left
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(«IR mode»);
lcd.setCursor(0,1);
lcd.print(«left»);
left(10); // turn left
}
if (results.value == IRstop)//stop
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print(«IR mode»);
lcd.setCursor(0,1);
lcd.print(«stop»);
digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,LOW);
digitalWrite(MotorLeft1,LOW);
digitalWrite(MotorLeft2,LOW);
}
if (results.value ==IRAutorun )
{
while(IRAutorun)
{
myservo.write(90); //Let servo motor return, ready for the next measurement
detection(); //To measure the angle and determine which direction to move
if(directionn == 8)
{
if (irrecv.decode(&results))
{
irrecv.resume();
Serial.println(results.value,HEX);
if(results.value ==IRstop)
{
digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,LOW);
digitalWrite(MotorLeft1,LOW);
digitalWrite(MotorLeft2,LOW);
break;
}
}
results.value=0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(«auto mode»);
lcd.setCursor(0,1);
lcd.print(«Advance»);
advance(1); // normal forward
}
if(directionn == 2) //If directionn(direction) = 2(backward)
{
if (irrecv.decode(&results))
{
irrecv.resume();
Serial.println(results.value,HEX);
if(results.value ==IRstop)
{
digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,LOW);
digitalWrite(MotorLeft1,LOW);
digitalWrite(MotorLeft2,LOW);
break;
}
}
results.value=0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(«auto mode»);
lcd.setCursor(0,1);
lcd.print(«Reverse»);
back(8); // backward
turnL(2); //Move slightly to the left side, to prevent the dead alley
}
if(directionn == 6) //If directionn(direction) = 6(turn right)
{
if (irrecv.decode(&results))
{
irrecv.resume();
Serial.println(results.value,HEX);
if(results.value ==IRstop)
{
digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,LOW);
digitalWrite(MotorLeft1,LOW);
digitalWrite(MotorLeft2,LOW);
break;
}
}
results.value=0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(«auto mode»);
lcd.setCursor(0,1);
lcd.print(«Right»);
back(1);
turnR(3); // turn rirht
}
if(directionn == 4) //directionn(direction) = 4(turn left)
{
if (irrecv.decode(&results))
{
irrecv.resume();
Serial.println(results.value,HEX);
if(results.value ==IRstop)
{
digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,LOW);
digitalWrite(MotorLeft1,LOW);
digitalWrite(MotorLeft2,LOW);

break;
}
}
results.value=0;
lcd.clear();
lcd.setCursor(0,0);
lcd.print(«auto mode»);
lcd.setCursor(0,1);
lcd.print(«Left»);
back(1);
turnL(3); // turn left
}
if (irrecv.decode(&results))
{
irrecv.resume();
Serial.println(results.value,HEX);
if(results.value ==IRstop)
{
digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,LOW);
digitalWrite(MotorLeft1,LOW);
digitalWrite(MotorLeft2,LOW);
break;
}
}
}
results.value=0;
}
else
{
digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,LOW);
digitalWrite(MotorLeft1,LOW);
digitalWrite(MotorLeft2,LOW);
}
irrecv.resume(); // Continue to receive the next set of infrared signals
}
}


Я качал много библиотек, не со всеми все получалось сразу. Например LiquidCrystal_I2C нашел рабочую только с третьего раза.
Поэтому даю ссылку на мою папку libraries

библиотеки

комплектные примеры

файл скетча

Так как заднее колесо вращается на 360 градусов, то это вносит немного рандома в движение робота.



Попробовал зафиксировать колесо стяжками — робот стал ездить более осознанно))





Видео работы



Итог: интересная игрушка. Есть возможность усовершенствовать сабж, повесить камеру, сделать фары. Можно даже замутить клешню. Место на платформе есть. Конструктором назвать сложно, скорее просто набор деталей. Проектов в сети много, как простых так и сложных. Можно купить подходящее шасси и придумывать уже свой проект. В общем ардуина есть ардуина)) Жаль только времени не хватает — вот если бы мне все это лет десять назад, эх… :)
Еще замечания по данному роботу: думаю что четырехколесная версия будет ездить лучше и четче. К тому же в старшей версии реализовано управление скоростью.
Или еще вариант без бестолкового дисплея и с питанием под АА.
gearbest.com/kits/pp_226901.html

Возможно что-то забыл. Если что, спрашивайте.

Спасибо за внимание!
Надеюсь обзор понравился и оказался полезным!
Планирую купить +31 Добавить в избранное +37 +65
свернуть развернуть
Комментарии (42)
RSS
+
avatar
  • Sanja
  • 27 ноября 2015, 18:10
+1
Такие же ардуины, как у вас — с 3 рядами пинов — делает Freaduino: mysku.club/blog/dealextreme/15216.html

Это и вправду гораздо более удобное решение, чем в классическом варианте:

+
avatar
  • dop2000
  • 28 ноября 2015, 05:35
0
У ICStation тоже есть UNO с дополнительными пинами:
www.icstation.com/icstation-atmega328p-board-compatible-arduino-p-3746.html
+
avatar
  • ksiman
  • 27 ноября 2015, 18:16
+4
Бегает быстрее, чем думает :)
+
avatar
  • tykhon
  • 27 ноября 2015, 18:23
+1
Ультразвуковой датчик тупит на мягких ворсистых поверхностях, инфракрасный лучше.
+
avatar
  • zhaba
  • 27 ноября 2015, 18:30
+1
Монументально! Сломал 3 скролла…
Обзор хорош.
Плюсануть, к сожалению, не могу.
+
avatar
  • MIK
  • 27 ноября 2015, 18:41
0
Теперь будем припиливать серву
Прочитал «Теперь дорисуйте сову», испугался )
+
avatar
  • porno
  • 27 ноября 2015, 19:34
0
Ахаха — вся соль обзора в видео!
Видно, что робот тупит, но и видно, что он не тупой.

Нужно поработать над алгоритмами ))
Плюсанул обзорчик.
+
avatar
  • dimmm84
  • 27 ноября 2015, 19:58
+2
Можно изменить расстояние реагирования сенсора. Еще поэкспериментировать со временными отрезками алгоритмов разворота.
+
avatar
  • Johnny
  • 27 ноября 2015, 23:11
+1
Я так понимаю программа решает. Та что автор скачал у китайцев реализует так-себе алгоритм управления.
+
avatar
0
Классная штука. Нужно было поработать с ардуино по учебе, решил собрать похожее чудовище. В моем варианте 4 колеса и нет сервопривода для сонара. Жду не дождусь мотор шилдта и самих датчиков, шасси с прикрученой ардуино платой стоит и скучает
+
avatar
  • dimmm84
  • 27 ноября 2015, 19:55
+1
Кстати в архиве с дропбокса есть мануал на вашего робота.
+
avatar
0
Что-то не обнаружил на 4WD… В архиве «SKU116898 Remote control ultrasonic ranging smart car.rar» или где?
Раз в 4-моторном варианте используется тоже двухканальный драйвер, моторы правого и левого бортов просто параллелятся? Или как?
+
avatar
0
Нет, там используется шилд на 4 мотора
+
avatar
0
Отнюдь не везде. Многие продавцы продают и с двухканальным:
https://aliexpress.com/item/store/product/100pcs-lot-4WD-Robot-Smart-Car-Chassis-Kits-car-L298N-Bluetooth-multi-function-smart-Robotic-car/1078812_1992553853.html

Я вообще не вижу смысла независимо управлять передними и задними колесами на одном борту.
+
avatar
0
Боюсь, от 4*AA будет не очень надёжно — терминальное напряжение 4В и даже ниже, а для норм. работы дуины нужно 5.
+
avatar
  • dimmm84
  • 29 ноября 2015, 10:59
0
Да кроватки по 18650 частенько на аукционах за пару баксов пучок можно урвать.
+
avatar
0
Ну или, накрай, обычные батарейки, не аккумуляторы.
+
avatar
  • Shuzera
  • 27 ноября 2015, 20:02
+1
Я своё чудо все до ума довести не могу, лепил с чего было, управление с телефона.
+
avatar
+1
Не, я не против ардуин и прочего, но кажется за эти деньги можно купить более интересный «набор деталей». Сам с дочерью думаю чем заняться, так решили купить машинку побольше и самим прокачать. Кажется выйдет не хуже.
+
avatar
  • k711
  • 27 ноября 2015, 21:12
+1
серва пугает своей порнографичностью. УЗ модули стоят меньше доллара, не логичнее ли поставить их 4 штуки? да высокая скорость даёт полный хаос. :)
точно шо крези робот кил ол хуманс :)
+
avatar
  • melvin
  • 27 ноября 2015, 21:45
0
Да, решение с сервой удивило… Но он так больше похож на «живого» :)
+
avatar
  • dimmm84
  • 28 ноября 2015, 08:43
0
Ага, Валли))
+
avatar
  • Aloha_
  • 27 ноября 2015, 21:51
0
Серва самая дешевая — меньше бакса =)
Меня вот ролик смутил задний поворотный — от мебели что ли? =) робот инвалид получился, но все равно ЗАЧЕТ!
+
avatar
0
Ну да, похож… Но его назначение — только опора, поэтому дизайн не имеет решающего значения. :)
+
avatar
  • dimmm84
  • 28 ноября 2015, 08:43
0
Возможно от мебели)) Ролик свою задачу выполняет, если зафиксировать.
+
avatar
  • Motto
  • 27 ноября 2015, 22:06
-1
Так и знал, что халява.
За такие деньги могли бы уж крепеж движков с колесами к платформе сделать получше.
Препохабное крепление, нет жесткости.
И лучше брать круглую платформу, меньше цепляется за мебель.
Дальномер можно поставить еще один, ИК от Шарп.
В паре с ультразвуковым нормально работают.
К такому роботу цепляют tp-link3020, прошитый cyberwrt и организовывают передачу видео с робота на комп.
+
avatar
  • Okmor
  • 27 ноября 2015, 23:06
+1
+
avatar
0
так и думал что товар предоставлен бесплатно!!!
+
avatar
  • dop2000
  • 28 ноября 2015, 05:45
0
Так оптические датчики на колесах есть или нет? Лень скетч разбирать.
Edit: посмотрел видео — похоже, что датчиков нет.

Я тоже делал робота на таком шасси, но я его отдельно купил, не набором.
Помню, намучался я с этими датчиками, чтобы корректировать движение по прямой. Основная проблема — очень низкое разрешение у оптических колесиков-счетчиков.
Вот так выглядел самый первый вариант, управляемый с IR-пульта, тут он тоже еще криво ездит.
+
avatar
  • dimmm84
  • 28 ноября 2015, 08:45
0
Датчиков нет. Колеса повесил чтобы не потерять.
+
avatar
  • Aloha_
  • 28 ноября 2015, 10:15
0
все из за того, что нет пропорционального управления двигателями. Там фактически не влияет низкое разрешение энкодера.
+
avatar
  • dop2000
  • 28 ноября 2015, 13:11
0
Что такое «пропорциональное управление двигателями»? Двигатели управляются каждый отдельно, но даже у двух совершенно одинаковых двигателей при подаче одинакового напряжения скорость скорость вращения будет отличаться. Плюс пластиковые редукторы добавляют разницы, покрытие пола и т.п.
+
avatar
  • Aloha_
  • 28 ноября 2015, 17:23
0
Вот есть у вас шуруповерт — нажали чуть чуть — вертится медленно, нажали сильнее — соответственно.
А на машинке этой — либо едет, либо не едет, если грубо — то так.
т.е. с промощью пропорционального управления можно задать любую скорость на любом моторе, компенсируя разницу между ними. машинка поедет прямо. Так же можно при попадании препятствия под колесо скомпенсировать нагрузку (ведь препятствие нас тормозит разворачивая машинку) и увеличить обороты. короче тема обширная софт писать надо, головой думать =)
+
avatar
  • dop2000
  • 28 ноября 2015, 17:37
0
А на машинке этой — либо едет, либо не едет, если грубо — то так.
Нет, не так :)
Здесь тоже можно задать любую скорость на моторе цифирками в скетче. (во всяком случае на моем мотор-шилде так можно делать, я не изучал скетч из этого обзора)
Можно ехать быстро, можно ехать медленно, можно одно колесо крутить быстрее и плавно поворачивать и т.п.

Чтобы компенсировать разницу вращения моторчиков по прямой, нужно считать время между дырками в энкодере. Но из-за того, что разрешение энкодера маленькое (дырки большие и их мало), добиться хорошей точности и плавности сложно. Мой робот по прямой в принципе едет, но прямая получается немного ломаная…
+
avatar
  • Aloha_
  • 28 ноября 2015, 22:32
0
Тогда задайте маленькую скорость — погрешности будете быстрее отрабатывать.
+
avatar
  • dop2000
  • 29 ноября 2015, 04:03
0
Не быстрее, а медленнее. На маленькой скорости энкодеры крутятся тоже медленнее, а их низкое разрешение никуда не денется.
+
avatar
  • tklim
  • 28 ноября 2015, 13:23
0
Как раз приехал 4х-колесный вариант, но только шасси с моторчиками.
Материал корпуса очень хрупкий — немного перетянул винт на креплении мотора и крепление треснуло.
Моторы крепятся ну как-то очень колхозно.
Очень мелкий «дорожный просвет», хотя порог в 5см как-то переезжает.
Колесики для энкодеров есть, а вот сами оптические датчики пришлось искать. Вот это заказал, думаю подойдет: https://aliexpress.com/item/item/HC-020K-Double-Speed-Measuring-Sensor-Module-with-Photoelectric-Encoders-Kit-top/32315960987.html
Без датчиков делать нечего: разбег параметров моторов немного удивляет, просто соединил вместе все 4 мотора — машинка едет криво — на 1м пробега от прямой уходит в сторону сантиметров на 20.
Но вот самая беда, по моему мнению, это как раз драйверы двигателей. В основном все что предлагается готовое — оно на L298 или им подобных выходами на биполярных транзисторах.Если посмотреть на ДШ L299 — то меня сразу пугает VCEsat Total Drop, т.е. напряжение которое упадет на самой микросхеме при выходном токе 1А (а это по 0,5А на каждый двигатель под нагрузкой, в случае 4WD) упадет в среднем на 2,5В. При 2х литиевых банках потери будут 2,5/8*100% = 31,25%. Т.е. треть кпд/скорости/емкости батарей просто уйдет в тепло. И это не считая сопротивления проводов или пружинок в держателе батарей.
Как вариант, нашел такую плату на L9110: https://aliexpress.com/item/item/H-bridge-Stepper-Motor-Dual-DC-Motor-Driver-Controller-Board-HG7881-For-Arduino/1893431539.html Судя по ДШ потери тут будут 0,8В.
Но также нарисовал плату под DRV8837 — по расчетам выйдет не более 0,15В на каждый мотор.
+
avatar
  • dop2000
  • 28 ноября 2015, 15:36
+1
Я оптические датчики выдрал из старого струйного принтера.
+
avatar
  • tklim
  • 28 ноября 2015, 16:15
0
есть такое. Но там всего два и только один подходит по ширине. В принципе, в закромах еще можно найти что-то полезное, но хочется чтоб все было красиво и однородно
+
avatar
  • mirak
  • 02 августа 2016, 04:29
0
А на такой вездеходик можно прилепить этот набор ардуино? Было бы интересно его модернизировать…
+
avatar
  • dimmm84
  • 27 августа 2016, 00:18
0
думаю без проблем. единственное что с напряжением питания движков у знатока я не в курсе.

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