Захотелось мне увлечь своего ребенка техникой и приобщить к программированию. Чтобы не только виртуальные дома в Майнкрафте строил, но и ручками поработал. Просто программировать абстрактные задачи — для взрослых людей не увлекательное занятие, что уж говорить про детей. Надо чтобы для наглядности все моргало и шевелилось по нашему желанию.
Было решено взять Ардуинку, а там видно будет...
В первую очередь оговорюсь, что ребенок тут чисто для присказки, самому давно Ардуинку и железки потрогать хотелось. А тут такой комфорт настал — заказывай, что пожелаешь, паять практически ничего не надо. Только глаза разбегаются, и дурные идеи спать не дают.
Для начала была куплена сама плата Arduino UNO, плюс ворох всякой мелочи россыпью, чтобы было под рукой. Все это, за копейки, в ожидаемые сроки, приехало от известных китайских друзей.
Потратив вечер на объяснение основ электричества с проводами, выключателями, светодиодами и простейшими датчиками стало понятно — тупик близок. Интереса у ребенка хватило на первые 30 минут. Дальше задор таял на глазах. Надо переходить к решению более сложных вопросов.
Делаем робота! (чтобы за пивом в кладовку бегал)
Примеров в интернете куча, как-нибудь справимся. Все-таки папа — Инженер (ИТ). Была бы цель и вера в светлое роботизированное будущее.
Опять шерстим магазин — стандартные колесные платформы — "как у всех" или уже из разряда не бюджетных игрушек. Итог будет как с управляемыми машинками — несколько дней поиграть да потом еще раз от раза. Неспортивно как-то.
"Да у нас леговских деталей — вагон" — говорит мое второе я, не желающее выходить из детского возраста.
Ок, па-проблем, вот задача минимум:
- Будем строить робоплатформу на леговских деталях с Ардуино мозгами.
- Только стандартные наборы кубиков, да россыпь от Лего-техник, планки и соединения. (Нет, майндсторма у нас нету. Жаба душит.)
- Мотоциклетные колеса будем крутить индивидуально, плюс третье — мелкое, для поддержки.
- Как-то адаптируем бюджетные степ и серво моторы от Али под Лего.
- Что б был автономным насколько это возможно, а не разряжался через 10 минут.
- Во. И управлять что б с телефона.
Как оружие проектируют под патрон, так и мы начали от имеющихся составляющих, подбивая их к конечной цели.
1) Андроид телефон по блютуфу будет управлять роботом. Все просто.
Берем блютуф HC-06 платку с приемо-передатчиком. На телефоне запускаем приложение из Маркета — "Bluetooth RC Controller".
Команд — более чем достаточно для начала. Будем ловить нажатые на телефоне кнопки и что-нибудь программить.
2) Питание. Попробовали колодки с 6-ю АА батарейками, адаптер под Крону...
От Кроны Ардуина уходила в ребут (может конечно не контакт в разъеме). Блок с батарейками как-то много места занимал, да и батареек/аккумуляторов не на пасешься. В итоге взяли блок под два Li-ion аккумулятора. Пишут 9900 mAh 3.7V. Получилось питание чуть больше 7 вольт на Ардуинку с обвесом на ХЗ сколько-то Ампер-часов.
3) Были самые дешевые степ моторы 28BYJ-48 и микро серво SG90. Их то и стали адаптировать под Лего.
Спиливаем мушки ушки у серво. Они нам только мешают определиться с выравниваем.
Строим выравнивающий стенд. Размеры бокса у серво SG90 вписываются:
- по высоте идеально совпадает с высотой 2-х стандартных лего-блоков и еще пластинка высотой 1/3 блока,
- по ширине чуть меньше 2-х лего-клеток. Центруем с помощью выступов "ракетниц" (LEGO Part 61184 — Technic Pin 1/2 with 2L Bar Extension),
- по глубине чуть меньше 3-х лего-клеток. Выравниваем по лицевой рабочей части серво.
Ось серво совпадает при этом с дырчатыми лего-блоками. Значит, исходя из геометрии — совпадет и с зубчатыми передачами. Это на будущее.
Последние замеры и сажаем на клей лего-крепеж:
- вниз 2х2 гладкую пластинку (LEGO Part 3068 — Tile 2 x 2),
- на верх 2х3 пластинку (LEGO Part 3021 — Plate 2 x 3).
Разбираем стенд до следующего раза, сохраняя предварительно инструкции.
В итоге серво может уже встать на любую площадку из лего-блоков или прикрепиться к планкам лего-техникс через переходники.
У моторчика металлические крепежные ушки. Основная проблема была найти "золотое" сечение для ушек и собрать устойчивый к стрессам каркас. Крепится без клея. "Ракетницы" вставленные в черный круглый соединитель (LEGO Part 2780 — Technic Pin) дают необходимую жесткость. По периметру обстраивается каркас из уголков лего-техникс.
Зеркально строится каркас на 2-е колесо.
4) Ось степ мотора жестко вставляется в круглые дырки лего-техникс.
Я использовал LEGO Part 32523 — Technic Beam 1 x 3 Thick для передачи момента на мотоколеса. Крепим колеса на степ моторы. Исходя из их радиуса — прикидываем размеры нашего будущего робота.
5) Собираем робоплатформу.
- Соединяем мотоколеса площадкой для батарейного отсека.
- Платки с ULN2003 для степ моторов встают в распор между деталями.
- Добавляем третье колесо для опоры.
- Делам впереди посадочное место под серво.
- Сверху крепим на площадку Deek-Robot шилд с Arduino NANO, а UNO пока оставим про запас.
6) Разбираемся с управлением этим всем хозяйством с Ардуинки.
В основном все по примерам. Достаточно просто. Приняли команду — выполнили действие. Колеса решено было крутить с независимыми скоростями. Этим добились эффекта, что платформа может и на месте развернуться и по дуге поворачивать.
Вот неприятные мелочи, что решились параллельно со строительством Лего-платформы:
Ну как фонит. Если блютуф в ожидании/поиске, то все нормально. При установленном соединении — серво начинает "дрожать".
Как советуют в интернете — повесить серво мотор на отдельное питание, и там что-то еще с резисторами, мне не помогло.
Если блютуф присоединен на Serial RX/TX, то никакого побочного эффекта не наблюдается вовсе. На этом пока и остановились.
Проблема, как оказалось, известная. Надо использовать корректные последовательности для переключения шагов.
Решается без заморочек с помощью http://playground.arduino.cc/Main/CustomStepper
Это из разряда мистики. Одинаковый код, одинаковое (внешне) подключение.
Один крутится по часовой стрелке, другой против часовой стрелки...
Итог:
Поигрались в Лего. Поразобрались с Ардуино и некоторой периферией. Нашли дешевую альтернативу лего-майндсторму.
Получилась вполне рабочая платформа для дальнейших игрушек с Ардуино.
Что дальше?
Прицепить на серво карандаш и научить тележку рисовать. Благо, что степ моторы позволяют сориентировать платформу на местности с минимальными погрешностями.
Минутка видео с покатушками:
#include <CustomStepper.h>
int lSpeed = 4;
int rSpeed = 4;
int maxSpeed = 16;
const char bNone = 0;
const char bFwd = 2;
byte tSteps[] = {8, B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001};
CustomStepper stepR(4, 5, 6, 7, (byte *)&tSteps, 4075.7728395, maxSpeed, STOP);
CustomStepper stepL(8, 9, 10, 11, (byte *)&tSteps, 4075.7728395, maxSpeed, STOP);
#define BT Serial
enum {
jF = 'F', // Forward
jB = 'B', // Back
jL = 'L', // Left
jR = 'R', // Right
};
int incSpeed(int I, int i)
{
I = I + i;
if (I > maxSpeed) I = maxSpeed;
else if (I < -maxSpeed) I = -maxSpeed;
return I;
}
// Process steppers
void stepRun()
{
if (!stepL.isDone()) stepL.run();
if (!stepR.isDone()) stepR.run();
}
// change steppers speeds independently
void stepRotate(char L, char R)
{ // owercode here
if (L != bNone)
{
lSpeed = incSpeed(lSpeed, L);
if (lSpeed == 0)
stepL.setDirection(STOP);
else
{
stepL.setRPM((lSpeed > 0) ? lSpeed : - lSpeed);
stepL.setDirection((lSpeed > 0) ? CW : CCW);
if (stepL.isDone())
stepL.rotate();
}
}
if (R != bNone)
{
rSpeed = incSpeed(rSpeed, R);
if (rSpeed == 0)
stepR.setDirection(STOP);
else
{
stepR.setRPM((rSpeed > 0) ? rSpeed : - rSpeed);
stepR.setDirection((rSpeed > 0) ? CCW : CW);
if (stepR.isDone())
stepR.rotate();
}
}
stepRun();
}
void setup() {
BT.end();
BT.begin(9600);
}
void loop() {
switch (BT.read())
{
case jF: stepRotate( bFwd, bFwd); break;
case jB: stepRotate(-bFwd, -bFwd); break;
case jL: stepRotate(-bFwd, bFwd); break;
case jR: stepRotate( bFwd, -bFwd); break;
}
stepRun();
}
PS. Да, вижу что не идеально. Есть к чему стремиться и что переписать.
Комментарии (17)
QuickJoey
22.06.2016 19:04может быть скажу глупость, моторы в разные стороны, возможно потому, что они стоят на платформе сориентированные в противоположные стороны.
offtopic: буквально сегодня шарил по китайским магазинам собирая похожий набора, и именно с такой же целью – чтобы ребёнок что-то потрогал руками. просто программирование на питоне в каком-то виде учит давно, пора освоить си-подобный язык, и заодно воплотить связку кода с железом.shape
22.06.2016 19:11На платформе, при движении прямо, один мотор работает на реверс, при условии что моторы одинаковые.
Я то имел ввиду, что 2 степ-мотора из разных поставок, при одинаковых условиях и программировании — один сразу крутит в противоположную сторону.
shape
23.06.2016 01:43Спасибо за первые отзывы. Немного причесал грамматику и орфографию. Немного сленга и русифицированные обороты оставил намеренно. Отвык писать так много на русском.
osmanpasha
23.06.2016 01:43Буквально пару дней назад столкнулись с такой же проблемой с моторами 28BYJ-48 — код из примера стандартной библиотеки Stepper, который должен крутить его туда-сюда, крутит его только в одну сторону. Оказалось, в примере не в том порядке указаны пины: там что-то вроде
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
а для нашего мотора оказалось 8, 10, 9, 11. То ли китайцы каждый раз по-разному припаивают провода внутри мотора, то ли что.shape
23.06.2016 01:49Переставлять пины тоже пробовал. Проблема не в пинах и их перестановке, а в шагах. В стандартной библиотеке Stepper для 4-х управляющих проводов — 4 шага. В CustomStepper шаги прописываются по желанию. В приложенном коде 8 шагов для 28BYJ-48 с 4-мя управляющими проводами.
SkylinedRu
23.06.2016 01:51Что то напоминает конечно историю про радиоуправляемый вертолет и ребенка…
Но на самом деле при должном подходе — неплохой бюджетный аналог Mindstorms.
Кстати, не было мысли попробовать разработать набор «переходников» с известных комплектующих (типа того же 28BYJ-48 и сервы SG90) в форм-фактор «лего», учитывая крепежные особенности компонентов — для печати на том же 3D принтере? Чтобы не мучиться с напильником и термоклеем. Да, термоклей быстрее — но так надо пожертвовать имеющиеся детали… Надеюсь идея понятна?shape
23.06.2016 02:00Полностью согласен, почему бы не лить из пластмассы боксы типа как для батареек для наиболее распространенных моторчиков?
Но Лего пин соединения запатентованы вдоль и поперек. Стоит только выйти на большой рынок, как набегут патентные представители.drobzik
23.06.2016 11:15Насколько я знаю, срок действия их патента истек несаколько лет назад, и многие уже вовсю штампуют и продают «аналоги». Вот только что взял у детей и попробовал сложить детальки от конструктора Cobi (Польша, по-моему) и Lego — идеально сошлись, если бы не надписи на кубиках — вообще бы не различил, где какие детали.
SkylinedRu
23.06.2016 13:39Про большой рынок и речи нет, чисто как модель для домашней 3D печати — у Lego есть Mindstorms — и им не нужен дешевый аналог.
VIPDC
23.06.2016 07:43Вопрос один сколько лет ребёнку? Моему 6 лет.
Mindstorms купили в 5 лет. Пробую с ним программировать объяснять, очень тяжело. Причём основная проблема это таблица умножения и скорость чтения.
Всякие простые программы по звукам изображению и движению легко, но дальше без умножения, деления, понимания что такое градусы и т.д. ничего толком не получается. И ведь ещё надо грань тонкую соблюсти, между аккуратностью и интересом.
roman12rus
23.06.2016 16:24Дальше 3D-принтер нужен и фантазию не остановить.
Мои дети пока мелкие, поэтому я играю в железную дорогу «ЛЕГО» и машинки «ЛЕГО». Сейчас у нас этап франкенштейнизма — из нескольких сломанных игрушек собираем одну-две, адские корчи получаются. Да и в сборке я использую всё вплоть до кусков плинтуса и шуруповёрта.
Через пару лет дорастём до роботов.
casuss
Вот за «Bluetooth RC Controller» спасибо! Мы с сыном через Bluetooth Terminal серии команд на ардуинку пуляли (WASD и скорость). Осталось найти приемлемый вариант написания кода, типа LegoBlock или как он там… Си-подобный вариант сыну пока еще сложновато осиливать…
Да, взаимные помехи между модулями (движки, ардуинка, датчики, etc… ) надо конденсаторами фильтровать по питанию. И провода питания потолще и покороче.
IronHead
Держите http://ai2.appinventor.mit.edu/
практически тот же лего, только для андроид приложений
примеры работы с bluetooth гуглятся
casuss
Тут немного речь про Ардуино, конечно… Но все равно спасибо!
IronHead
Сорри, из комментария понял, что у вас проблема была в том, что используете Bluetooth Terminal в качестве «посылателя» команд, поэтому и подкинул конструктор приложений.
А для дуинки есть же http://flprog.ru/, это если хочется именно «визуального программирования» под дуину. Автор этой среды разработки есть и на гиктаймсе.
cawaleb
Я тоже с сыном скрещиваю Arduino и Lego. Как задачу максимум скрестить lego9398+Смартфон(wifi+Камера)+Ардуино(управление моторами), но это когда подрастет, задача пока не по силам, первый класс.
Для програмирования arduino в понятном ребенку формате используем:
S4A так как изменение в программе сразу видны на устройстве.
Потом он сам переписывает программы на ardublock.
В интернете находил более старый но руссифицированый ardublock.
На сайте амперки есть цикл обучающих видео для детей.
На днях нашел еще одну подобную программу makeblock, но пока не пробывал.
vvzvlad
http://s4a.cat/
UPD: Уже сказали.