Набор-конструктор для сборки "умной" машинки на Arduino.

  • Цена: 52.19 $. На момент покупки была выше.

Как-то раз возникло у меня желание на практике узнать что такое Arduino и был заказан данный набор. Он предназначен для сборки машинки с ультразвуковым сенсором, которая объезжает препятствия.

Покупать можно, хотя набор и не без недостатков.

Подробнее под катом.


Да, тем кто не в курсе, что такое Arduino, рекомендую почитать сдесь, а также заглянуть сюда.

В квартире мне автоматизировать нечего, а сваять что-нибудь интересное хотелось, поэтому заказал этот конструктор.

Это не самое выгодное предложение на Али, но самое недорогое, которое было на тот момент с возможностью доставки почтой Сингапура(быстрее доставка).

О нелегкой судьбе посылки
Оформлен заказ был 22.07.2013г., прибыло в почтовое отделение 14.08.2013г.

Это моя первая посылка, которая пришла в таком состоянии:



Хотя продавец не поскупился на «пупырку», это не спасло некоторые детали воздействия почты России — сломалась одна из пластиковых площадок для крепления электроники:



Ну не беда, клей в доме есть.



На пластиковые площадки наклеена бумага, чтобы они не царапались при транспортировке.

В комплекте присутствовало всё, что было указано в описании лота:

— два мотора с редукторами,
— пара колес,
— ролик (типа мебельного, только маленький),
— две пластиковых площадки,
— сервопривод,
— поворотный кронштейн для крепления датчика расстояния,
— набор латунных стоек и винтиков-гаечек,
— ультразвуковой датчик расстояния,
— электронная плата управления двигателями,
— маленькая макетная плата,
— держатель для 6 батарей формата АА,
— держатель для батареи типа «Крона»,
— плата с микроконтроллером, Arduino-совместимая Funduino. Версия Duemilanove с небольшими доработками.
— интерфейсный USB-кабель для подключения к ПК,
— комплект соединительных проводков типа мама-мама.

Вот полезное содержимое посылки, нет только поломанной верхней площадки:



При сборке мне дополнительно понадобилось около десятка проводков типа папа-мама.

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

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

Качество изготовления электронных компонентов особых нареканий не вызывает, качество скажем так «хорошее китайское».

А вот качество изготовления пластиковых площадок могло бы быть получше — размечены кривовато. Есть смещение крепежных отверстий одной площадки относительно другой.
Кроме того стойки для крепления площадок между собой были разной длины.

Идущий в комплекте кронштейн для крепления ультразвукового датчика не предназначен для крепления этого самого датчика, он предназначен для использования вместе с парой сервоприводов для крепления камеры. Не беда — применим стальную проволоку и все будет ОК:





Также пришлось подрезать-подточить пластиковую крестовину крепления сервопривода (думаю сервопривод тоже должен быть другой модели).



Но все эти недостатки не мешают собрать вполне работоспособное устройство.

Идущие в комплекте держатели для батареек я использовать не стал — запитал всю схему от пары литиевых аккумуляторов типа 18650. Также добавил в схему вольтметр и кнопку запуска программы.
Вот что получилось в итоге:



Еще немного фото










Поскольку, как я уже упоминал, продавец не вложил никаких инструкций, пришлось всю информацию искать в интернете самому. Готовые библиотеки для управления сервоприводом и УЗ-датчиком я не использовал, все писал сам. Вот немного ссылок, которые могут помочь разобраться в работе этих устройств:

Плата управления двигателями.
УЗ-сенсор.
Сервопривод.

Алгоритм работы машинки простой:

— едем вперед, УЗ-сенсор отслеживает расстояние до препятствия,
— если препятствие близко останавливаемся и отъезжаем назад,
— вертим УЗ-сенсором по сторонам и определяем где до препятствий наибольшее расстояние,
— разворачиваемся в ту сторону и едем,
— все повторяется.

Несмотря на то, что после сборки остались лишние винтики все работает. Вот видео с демонстрацией работы устройства:



Видно, что машинка не очень хорошо определяет наличие препятствий, особенно если плоскость препятствия находится не перпендикулярно направлению движения машинки. Это связано с тем, что во-первых звук может отражаться от препятствия и сенсор неверно определяет расстояние до предмета, во-вторых у сенсора достаточно узкий рабочий угол — 15 градусов. Также звук может просто поглощаться некоторыми предметами, например мягкими игрушками. Частично эту проблему можно решить установкой спереди машинки дополнительных датчиков, направленных под углом к направлению движения.

В общем игрушкой я доволен, мозг размял и вообще.

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

Ссылка на скетч (программу для контроллера) — вот.

Благодарю за внимание.
Планирую купить +59 Добавить в избранное +77 +152
+
avatar
+4
Спасибо, очень интересно! Плюс!
+
avatar
+2
Присоединяюсь, может и не самая практичная, но очень интересная тема, побольше бы таких обзоров… :)
+
avatar
+4
Завидую белой завистью, спасибо за обзор!!! :)
+
avatar
  • igo
  • 14 сентября 2013, 13:59
+9
Мне аж животинку жалко стало, куда не сунься везде тупик… В конце напала на хозяина))))
+
avatar
  • Soorin
  • 14 сентября 2013, 14:29
0
Как так — в квартире нечего автоматизировать??? А освещение, отопление, охрана, вентиляция, погода, кормёжка и т.д. и т.п.?
+
avatar
  • M-Max
  • 14 сентября 2013, 21:33
0
Нужно уточнить — мне ничего не нужно автоматизировать. В малокомнатной квартире, где я проживаю, мне не влом делать все самому — включать свет, открывать форточки, смотреть прогноз погоды. А кормить мне некого, а меня кормит жена ) С охраной конечно можно заморочиться, но это когда прокачаюсь и разбогатею.
+
avatar
  • asdfg
  • 14 сентября 2013, 14:42
0
почти Валли
+
avatar
  • DiMoS
  • 14 сентября 2013, 15:08
+8

Вспомнилось почему-то.
+
avatar
  • resident
  • 14 сентября 2013, 16:09
+1
шасси с 4 колесами по-моему интереснее dx.com/p/dual-layer-4-motor-smart-car-chassis-w-speed-measuring-coded-disc-black-yellow-151803
все хотел его взять, но взял лего
Но из виш листа еще не удаляю
+
avatar
  • Baton72
  • 14 сентября 2013, 17:48
0
А я вот не пойму, а моторки в этих конструкторах с энкодерами или нет?
+
avatar
0
Вроде бы обычный электромотор с механическим редуктором, без наворотов: 2 контакта, подаешь напряжение — крутиться…
Хотя в описании, по моей ссылке, значиться «2 x Speed Encoder», но как это работает не понимаю, может отдельно надо оптический датчик крепить?
+
avatar
+1
Энкодеры в представлении китайцев — это перфорированные темной пластмассы диски. Надеваются на противоположный от колеса конец оси редуктора. Но чтобы снимать импульсы с этого энкодера необходимы открытые оптопары. На чем, естественно, китайцы люто экономят. Вложить пару пластиковых дисков они могут, ибо они идут комплектом к движку и редуктору. А оптопары — ищи, клиент, сам…
+
avatar
0
Самое смешное, что китайцы производят недостающую деталь подобных конструкторов:
Одной деталью на Ebay:
ebay.com/itm/230982155813 :)
некоторые варианты от DX:
dx.com/p/hc-020k-double-speed-measuring-module-w-photoelectric-encoders-black-green-2-pcs-219416
dx.com/p/smart-car-speed-detecting-sensor-module-for-arduino-149108
dx.com/p/speed-detection-encoder-pcb-module-for-arduino-green-152665
+
avatar
+3
У кого «начинка»(arduino, sonic, servo, motordriver) есть в наличии могут поэкспериментировать с отдельными компонентами, на BIC видел шасси аналогичное представленному в обзоре buyincoins.com/item/34695.html за $11.59
А на aliexpress, есть полная(для 2-х сервоприводов) версия кронштейна aliexpress.com/item/Freeshipping-FPV-aerial-camera-micro-nylon-plastic-FPV-biaxial-servo-pan-tilt/1065792469.html за 3,85 (в данной комплектации servo в комплект не входят, в оригинале называется FPV aerial camera micro nylon plastic FPV biaxial servo pan-tilt, встречается еще и на ebay, причем существует и в более дорогой комплектации, включающей 2 servo)
+
avatar
  • paper
  • 15 сентября 2013, 13:23
+1
Я такое шасси с БИКа получил в поломанном виде. Несущая пластина на несколько частей поломана, все остальное целое. Их стандартная упаковка не очень подходит для такого рода товаров.
+
avatar
  • ankver
  • 14 сентября 2013, 18:16
0
по принципу робота пылесоса, но с меньшим интеллектом ))) Можно к этой штуке тряпку присобачить мокрую и может и польза будет даже ))) Забавная игрушка!
+
avatar
+1
ИМХО, вся прелесть подобных конструкторов как раз в том, что уровень интеллекта полностью в ваших руках, ничего не мешает соединить arduino с современным мобильником или даже с полноценным сервером с вполне серьезной конфигурацией и «сложные поведенческие алгоритмы» обсчитывать на них… Оставив на arduino только общение с датчиками/моторами и поддержание «канала связи с интеллектом» :)
+
avatar
  • AlexZZZ
  • 14 сентября 2013, 22:46
0
Клево. А чтоб не сделать постоянное «сканирование» пространства и корректировать маршрут. А то «шаговое» движение какое-то.
Или вот (для экономии энергии): постоянно мониторим только прямолинейное направление, если появляется препятствие, то смещаемся, к примеру, градусов на 30 в обе стороны. Где расстояние больше, туда и правим. Если одинаково или разница не значительна либо еще чего, то увеличиваем угол, скажем уже 60 градусов в обе стороны и т.д.
+
avatar
  • M-Max
  • 15 сентября 2013, 12:11
0
В принципе постоянное сканирование пространства можно сделать, только придется уменьшить скорость движения, чтобы не пропустить препятствие. Либо оптимизировать алгоритм и уменьшать время на определение расстояния.
+
avatar
0
ну если расширять возможности Вашей машинки, тогда не просто сканировать пространство нужно, а запоминать уже отсканированное т.е. строить карту лабиринта ;)
+
avatar
  • Romans
  • 15 сентября 2013, 00:52
0
Посмотрел видео — интересно… Но иак как он промахивается и врезается в низколежащие предметы, то подумал, что лучше сонар расположить ниже, почти возле земли — тогда наверняка не промахнется.
+
avatar
  • M-Max
  • 15 сентября 2013, 12:03
0
Прикрепить сонар снизу не позволит клиренс (. Если только дополнительно установить датчик без возможности поворота.
+
avatar
  • Romans
  • 15 сентября 2013, 16:02
0
Ну можно вынести вперед и ниже… Куча вариантов для творчества :)
+
avatar
  • di_ba
  • 15 сентября 2013, 13:16
+1
Классная тема. Ардуино уверенно продвигается вперед.
+
avatar
0
да еще лет 10 и такие игрушки будут по всеместнее не дорогие и еще и умнее станут.
+
avatar
0
А можно увидеть скетч к вашей машинке я купил аналогичную на четырех колесах.
+
avatar
  • M-Max
  • 09 октября 2013, 08:28
0
Да, конечно. Только код дилетантский, где вспомнил что и как работает прокомментировал.

Скетч
int SlPin=12; //назначение входного пина на который вешается кнопка запуска основного алгоритма

int EchoPin=10; //Echo-пин на УЗ-датчике
int TrigPin=9; //Trig-пин на УЗ-датчике

float DIST=0; //Дистанция
int CRS=0; //Курс (угол поворота машинки).

int ServoPin=11; //Сигнальный контакт сервопривода

int POS=0; //Необходимое значение угла поворота.
int OLDPOS=0; //Предыдущее значение угла поворота.

//далее идет назначение номеров выводов в соответствии с
//подключением к плате управления двигателями
int ENA=5;
int IN1=6;
int IN2=7;
int ENB=3;
int IN3=4;
int IN4=2;

//установка максимального и минимального значения ШИМ
//для ограничения напряжения питания двигателей.
//минимальные значения подбираем опытным путем,
//необходимо чтобы при этих значениях машинка смогла двигаться
int MinPWML=0;
int MinPWMR=0;
int MaxPWML=150;
int MaxPWMR=125;

int CD[9];
int DT=0;

void setup()
{
pinMode(SlPin, INPUT);

digitalWrite(SlPin, HIGH);
pinMode(13, OUTPUT);
pinMode(ServoPin, OUTPUT);
pinMode(ENA, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
digitalWrite(EchoPin, LOW);
}

void loop()
{//Проверка нажатия кнопки исполнения алгоритма.
if(digitalRead(SlPin))
{
// — // Начало кода основной программы.
// — DIST=sonar();
//Serial.print(«DIST = „);
//Serial.println(DIST);
if (DIST<20){
roll('stp');
roll('bck');
delay(200);
roll('stp');
CRS=course();
rotate(CRS);
ServoPos(90);
}else{roll('fwd');;}
// — // Конец кода основной программы.
// — }else{
OLDPOS=0;
roll('stp');
ServoPos(90);

}
}

//----------------------------------------------
// Процедуры управления движением конструкции.
//----------------------------------------------

void steer(int l, int r) //установка направления вращения колес и скорости
{
//задаем направление движения колес
if(l>0)
{
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
}else{
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
}
if(r>0)
{
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
}else{
digitalWrite(IN3, LOW);
digitalWrite(IN4, HIGH);
}
//рассчитываем абсолютные значения параметров скорости
l=abs(l);
r=abs®;
//ограничиваем значения входных параметров
if(l>254){l=254;}
if(r>254){r=254;}

//подгоняем значения входных параметров под нужный диапазон
l=map(l, 0, 254, MinPWML, MaxPWML);
r=map(r, 0, 254, MinPWMR, MaxPWMR);
// ограничиваем значения входных параметров, иначе при их низких значениях
// на двигатели будет подаваться ток меньше, чем требуется для вращения колес.
if(l<=MinPWML){l=0;}
if(r<=MinPWMR){r=0;}
analogWrite(ENA, l);
analogWrite(ENB, r);
}

void roll(char c) //указываем направление движения.
{
switch©
{
case 'fwd':
steer(254, 254);
break;
case 'bck':
steer(-254, -254);
break;
case 'stp':
steer(0, 0);
break;
}
}

void rotate(int a) //поворот конструкции на заданный угол
{
int t=0;
int s=254; //скорость вращения колес.
if (a<90)
{
t=(90-a)*4,16; //Число 4,16 — время поворота конструкции на 1 градус при данных аргументах steer(), подобрано опытным путем.
steer(-s, s);
delay(t);
steer(0, 0);
}else{
t=(a-90)*4,16;
steer(s, -s);
delay(t);
steer(0, 0);
}
}

//--------------------------------------
// Процедуры управления сервоприводом.
//--------------------------------------

void ServoPos(int angle)
{
//Функция выставления движка сервопривода на заданный угол.
//Параметр-значение угла.
int PD; //длительность управляющего импульса
PD=2560-(angle)*11,11;
//Производим рассчет количества циклов позиционирования.
float DAN; //Разность предыдующего и устанавливаемого значений угла.
DAN=OLDPOS-angle;
DAN=abs(DAN);
OLDPOS=angle;
int CP; //Количество циклов позиционирования
CP=DAN/1.8; //Оптимальное значение 1.8. Подбирается опытным путем.
//посылаем управляющие импульсы
//Обеспечиваем сервопривод работой в зависимости
//от количаства циклов позиционирования.
for(int i=0; i<CP; i++) //i=100 for 180 degree
{
digitalWrite(ServoPin, HIGH);
delayMicroseconds(PD);
digitalWrite(ServoPin, LOW);
delayMicroseconds(23000);
}

}
//------------------------------------------
// Процедуры работы с датчиком расстояния.
//------------------------------------------

float sonar() //Измерение расстояния до обьекта.
{
int cnt=0; //Значение счетчика количества запросов. 2 запроса.
float c1=0; //Переменные для хранения результатов замеров.
float c2=0;
repson:
cnt++;
//Посылаем стартовый импульс 10 мкс.
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
//Принимаем ответ

float c=0;
for(long t=0; t<40000; t=t+10)
{
if(digitalRead(EchoPin)){c=c+10;}
delayMicroseconds(10);
}
if(cnt==1){c1=c; goto repson;}
if(cnt==2){c2=c;}
if(abs(c1-c2)>35000){c=38000;}else{c=(c1+c2)/2;}
//Рассчитываем расстояние.
float d=0;
d=2*c/58;
return d;
}

int course()
{
int d=0;
int dt=0;
int cs=0;
int p=0;
for (p=0; p<7; p++)
{
ServoPos(p*30);
dt=sonar();
if (dt>d){d=dt; cs=p*30;}
}
return cs;
}
+
avatar
0
Большущее спасибо за Скетч. А можно схемку вольтметра и подключения кнопки?
У меня во такой набор aliexpress.com/snapshot/256403144.htmlВот что получилось.
+
avatar
  • M-Max
  • 14 октября 2013, 23:03
0
Через кнопку 12-й пин соединяется с минусом, когда кнопка нажата машинка остановлена. Вольтметр такой — buyincoins.com/item/27888.html
+
avatar
0
Спасибо. Я тут насмотрел вольтметрик подешевле aliexpress.com/item/New-Mini-Digital-Voltmeter-3-20-30V-Voltage-Panel-Meter-Display-Color-Red-10-pieces-lot/896651510.html
+
avatar
  • max_box
  • 31 января 2014, 16:02
0
У Вас именно этот код работает? Все собрал как и здесь, но вот только не хочет робот ехать правильно как у Вас, УЗ датчиками постоянно вертит и двигается отрывисто.
+
avatar
  • M-Max
  • 07 февраля 2014, 09:34
0
Код должен быть рабочим. Вы еще не устранили проблему?
+
avatar
  • max_box
  • 10 февраля 2014, 12:24
0
Пытался разобраться, в программировании я не очень, по логике все вроде правильно, но не работает как надо, не могли бы Вы скинуть на почту файл скетча? [email protected]
+
avatar
  • M-Max
  • 10 февраля 2014, 16:00
0
Позже проверю скетч на железке, на всякий случай, потом пришлю.
+
avatar
  • max_box
  • 11 февраля 2014, 09:28
0
спасибо, жду
+
avatar
  • M-Max
  • 16 февраля 2014, 17:07
+1
Знаете, а ведь действительно не работает. У муськи свое мнение насчет того, как должен выглядеть скетч, поэтому при публикации в него добавилось немного лишнего. Рабочий скетч лежит тут.

Продублировал на почту.
+
avatar
  • san73
  • 21 февраля 2016, 10:29
0
Скетч не рабочий. Кнопка не нужна, В скетче заменить void roll(char c) на void roll(int c) Тогда заработает.
+
avatar
  • M-Max
  • 21 февраля 2016, 18:43
0
Как так не рабочий? Машинка на нем ездит. Кнопка ставилась для выключения машинки, точнее для ее остановки. Если Вам кнопка не нужна — не ставьте, хозяин — барин.
+
avatar
  • san73
  • 22 февраля 2016, 18:19
0
Собрал на arduino nano и L298N. Включаю, машина стоит. Ставлю препятствие, она сервой крутит, затем поворачивается и опять стоит. Ни вперед ни назад. Нашел что char может принимать значения от -128 до 127. В программе числа используются больше. Заменил на int, все заработало. Идея хорошая, спасибо за код. Под себя поправил, добавил звуковой сигнал.