Захотелось мне увлечь своего ребенка техникой и приобщить к программированию. Чтобы не только виртуальные дома в майнкрафте строил, но и ручками поработал. Просто программировать абстрактные задачи — для взрослых людей не увлекательное занятие, что уж говорить про детей. Надо чтобы для наглядности все моргало и шевелилось по нашему желанию.
Было решено взять ардуинку, а там видно будет…
В первую очередь оговорюсь, что ребенок тут чисто для присказки, самому давно Ардуинку и железки потрогать хотелось. А тут такой комфорт настал — заказывай, что пожелаешь, паять практически ничего ненадо. Только глаза разбегаются и дурные идеи спать не дают.
Для начала была куплена сама плата 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 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. Да, вижу что не идеально. Есть к чему стремиться и что переписать.