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


Было решено взять Ардуинку, а там видно будет...


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


Для начала была куплена сама плата Arduino UNO, плюс ворох всякой мелочи россыпью, чтобы было под рукой. Все это, за копейки, в ожидаемые сроки, приехало от известных китайских друзей.


Потратив вечер на объяснение основ электричества с проводами, выключателями, светодиодами и простейшими датчиками стало понятно — тупик близок. Интереса у ребенка хватило на первые 30 минут. Дальше задор таял на глазах. Надо переходить к решению более сложных вопросов.


Делаем робота! (чтобы за пивом в кладовку бегал)


Примеров в интернете куча, как-нибудь справимся. Все-таки папа — Инженер (ИТ). Была бы цель и вера в светлое роботизированное будущее.


Опять шерстим магазин — стандартные колесные платформы — "как у всех" или уже из разряда не бюджетных игрушек. Итог будет как с управляемыми машинками — несколько дней поиграть да потом еще раз от раза. Неспортивно как-то.


"Да у нас леговских деталей — вагон" — говорит мое второе я, не желающее выходить из детского возраста.


Ок, па-проблем, вот задача минимум:


  • Будем строить робоплатформу на леговских деталях с Ардуино мозгами.
  • Только стандартные наборы кубиков, да россыпь от Лего-техник, планки и соединения. (Нет, майндсторма у нас нету. Жаба душит.)
  • Мотоциклетные колеса будем крутить индивидуально, плюс третье — мелкое, для поддержки.
  • Как-то адаптируем бюджетные степ и серво моторы от Али под Лего.
  • Что б был автономным насколько это возможно, а не разряжался через 10 минут.
  • Во. И управлять что б с телефона.

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


1) Андроид телефон по блютуфу будет управлять роботом. Все просто.


Берем блютуф HC-06 платку с приемо-передатчиком. На телефоне запускаем приложение из Маркета — "Bluetooth RC Controller".
Команд — более чем достаточно для начала. Будем ловить нажатые на телефоне кнопки и что-нибудь программить.


2) Питание. Попробовали колодки с 6-ю АА батарейками, адаптер под Крону...


От Кроны Ардуина уходила в ребут (может конечно не контакт в разъеме). Блок с батарейками как-то много места занимал, да и батареек/аккумуляторов не на пасешься. В итоге взяли блок под два Li-ion аккумулятора. Пишут 9900 mAh 3.7V. Получилось питание чуть больше 7 вольт на Ардуинку с обвесом на ХЗ сколько-то Ампер-часов.


3) Были самые дешевые степ моторы 28BYJ-48 и микро серво SG90. Их то и стали адаптировать под Лего.


Micro Servo 9g SG90 Lego-адаптация.

Спиливаем мушки ушки у серво. Они нам только мешают определиться с выравниваем.


Строим выравнивающий стенд. Размеры бокса у серво 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).


Разбираем стенд до следующего раза, сохраняя предварительно инструкции.


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



Step Motor 28BYJ-48 5V Lego-адаптация

У моторчика металлические крепежные ушки. Основная проблема была найти "золотое" сечение для ушек и собрать устойчивый к стрессам каркас. Крепится без клея. "Ракетницы" вставленные в черный круглый соединитель (LEGO Part 2780 — Technic Pin) дают необходимую жесткость. По периметру обстраивается каркас из уголков лего-техникс.



Зеркально строится каркас на 2-е колесо.


4) Ось степ мотора жестко вставляется в круглые дырки лего-техникс.


Я использовал LEGO Part 32523 — Technic Beam 1 x 3 Thick для передачи момента на мотоколеса. Крепим колеса на степ моторы. Исходя из их радиуса — прикидываем размеры нашего будущего робота.


5) Собираем робоплатформу.


  • Соединяем мотоколеса площадкой для батарейного отсека.
  • Платки с ULN2003 для степ моторов встают в распор между деталями.
  • Добавляем третье колесо для опоры.
  • Делам впереди посадочное место под серво.
  • Сверху крепим на площадку Deek-Robot шилд с Arduino NANO, а UNO пока оставим про запас.

Фото




6) Разбираемся с управлением этим всем хозяйством с Ардуинки.


В основном все по примерам. Достаточно просто. Приняли команду — выполнили действие. Колеса решено было крутить с независимыми скоростями. Этим добились эффекта, что платформа может и на месте развернуться и по дуге поворачивать.


Вот неприятные мелочи, что решились параллельно со строительством Лего-платформы:


Блютуф фонит на всех GPIO портах (кроме Serial RX/TX).

Ну как фонит. Если блютуф в ожидании/поиске, то все нормально. При установленном соединении — серво начинает "дрожать".
Как советуют в интернете — повесить серво мотор на отдельное питание, и там что-то еще с резисторами, мне не помогло.
Если блютуф присоединен на Serial RX/TX, то никакого побочного эффекта не наблюдается вовсе. На этом пока и остановились.


Степ-мотор 28BYJ-48 на стандартной stepper - библиотеке не работает на реверс

Проблема, как оказалось, известная. Надо использовать корректные последовательности для переключения шагов.
Решается без заморочек с помощью http://playground.arduino.cc/Main/CustomStepper


Степ-моторы 28BYJ-48 из разных партий или поставщиков крутятся в разные стороны

Это из разряда мистики. Одинаковый код, одинаковое (внешне) подключение.
Один крутится по часовой стрелке, другой против часовой стрелки...


Итог:


Поигрались в Лего. Поразобрались с Ардуино и некоторой периферией. Нашли дешевую альтернативу лего-майндсторму.
Получилась вполне рабочая платформа для дальнейших игрушек с Ардуино.


Что дальше?


Прицепить на серво карандаш и научить тележку рисовать. Благо, что степ моторы позволяют сориентировать платформу на местности с минимальными погрешностями.


Минутка видео с покатушками:



Небольшой скетч - покрутить асинхронно колесами
#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)


  1. casuss
    22.06.2016 14:34

    Вот за «Bluetooth RC Controller» спасибо! Мы с сыном через Bluetooth Terminal серии команд на ардуинку пуляли (WASD и скорость). Осталось найти приемлемый вариант написания кода, типа LegoBlock или как он там… Си-подобный вариант сыну пока еще сложновато осиливать…
    Да, взаимные помехи между модулями (движки, ардуинка, датчики, etc… ) надо конденсаторами фильтровать по питанию. И провода питания потолще и покороче.


    1. IronHead
      22.06.2016 14:44

      Держите http://ai2.appinventor.mit.edu/
      практически тот же лего, только для андроид приложений
      примеры работы с bluetooth гуглятся


      1. casuss
        22.06.2016 15:45

        Тут немного речь про Ардуино, конечно… Но все равно спасибо!


        1. IronHead
          22.06.2016 15:50
          +1

          Сорри, из комментария понял, что у вас проблема была в том, что используете Bluetooth Terminal в качестве «посылателя» команд, поэтому и подкинул конструктор приложений.
          А для дуинки есть же http://flprog.ru/, это если хочется именно «визуального программирования» под дуину. Автор этой среды разработки есть и на гиктаймсе.


    1. cawaleb
      23.06.2016 09:11

      Я тоже с сыном скрещиваю Arduino и Lego. Как задачу максимум скрестить lego9398+Смартфон(wifi+Камера)+Ардуино(управление моторами), но это когда подрастет, задача пока не по силам, первый класс.
      Для програмирования arduino в понятном ребенку формате используем:
      S4A так как изменение в программе сразу видны на устройстве.
      Потом он сам переписывает программы на ardublock.
      В интернете находил более старый но руссифицированый ardublock.
      На сайте амперки есть цикл обучающих видео для детей.
      На днях нашел еще одну подобную программу makeblock, но пока не пробывал.


    1. vvzvlad
      23.06.2016 17:12

      Осталось найти приемлемый вариант написания кода, типа LegoBlock или как он там… Си-подобный вариант сыну пока еще сложновато осиливать…

      http://s4a.cat/
      UPD: Уже сказали.


  1. QuickJoey
    22.06.2016 19:04

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

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


    1. shape
      22.06.2016 19:11

      На платформе, при движении прямо, один мотор работает на реверс, при условии что моторы одинаковые.
      Я то имел ввиду, что 2 степ-мотора из разных поставок, при одинаковых условиях и программировании — один сразу крутит в противоположную сторону.


  1. shape
    23.06.2016 01:43

    Спасибо за первые отзывы. Немного причесал грамматику и орфографию. Немного сленга и русифицированные обороты оставил намеренно. Отвык писать так много на русском.


  1. osmanpasha
    23.06.2016 01:43

    Буквально пару дней назад столкнулись с такой же проблемой с моторами 28BYJ-48 — код из примера стандартной библиотеки Stepper, который должен крутить его туда-сюда, крутит его только в одну сторону. Оказалось, в примере не в том порядке указаны пины: там что-то вроде

    Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);

    а для нашего мотора оказалось 8, 10, 9, 11. То ли китайцы каждый раз по-разному припаивают провода внутри мотора, то ли что.


    1. shape
      23.06.2016 01:49

      Переставлять пины тоже пробовал. Проблема не в пинах и их перестановке, а в шагах. В стандартной библиотеке Stepper для 4-х управляющих проводов — 4 шага. В CustomStepper шаги прописываются по желанию. В приложенном коде 8 шагов для 28BYJ-48 с 4-мя управляющими проводами.


  1. SkylinedRu
    23.06.2016 01:51

    Что то напоминает конечно историю про радиоуправляемый вертолет и ребенка…
    Но на самом деле при должном подходе — неплохой бюджетный аналог Mindstorms.

    Кстати, не было мысли попробовать разработать набор «переходников» с известных комплектующих (типа того же 28BYJ-48 и сервы SG90) в форм-фактор «лего», учитывая крепежные особенности компонентов — для печати на том же 3D принтере? Чтобы не мучиться с напильником и термоклеем. Да, термоклей быстрее — но так надо пожертвовать имеющиеся детали… Надеюсь идея понятна?


    1. shape
      23.06.2016 02:00

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

      Но Лего пин соединения запатентованы вдоль и поперек. Стоит только выйти на большой рынок, как набегут патентные представители.


      1. drobzik
        23.06.2016 11:15

        Насколько я знаю, срок действия их патента истек несаколько лет назад, и многие уже вовсю штампуют и продают «аналоги». Вот только что взял у детей и попробовал сложить детальки от конструктора Cobi (Польша, по-моему) и Lego — идеально сошлись, если бы не надписи на кубиках — вообще бы не различил, где какие детали.


      1. SkylinedRu
        23.06.2016 13:39

        Про большой рынок и речи нет, чисто как модель для домашней 3D печати — у Lego есть Mindstorms — и им не нужен дешевый аналог.


  1. VIPDC
    23.06.2016 07:43

    Вопрос один сколько лет ребёнку? Моему 6 лет.
    Mindstorms купили в 5 лет. Пробую с ним программировать объяснять, очень тяжело. Причём основная проблема это таблица умножения и скорость чтения.
    Всякие простые программы по звукам изображению и движению легко, но дальше без умножения, деления, понимания что такое градусы и т.д. ничего толком не получается. И ведь ещё надо грань тонкую соблюсти, между аккуратностью и интересом.


  1. roman12rus
    23.06.2016 16:24

    Дальше 3D-принтер нужен и фантазию не остановить.
    Мои дети пока мелкие, поэтому я играю в железную дорогу «ЛЕГО» и машинки «ЛЕГО». Сейчас у нас этап франкенштейнизма — из нескольких сломанных игрушек собираем одну-две, адские корчи получаются. Да и в сборке я использую всё вплоть до кусков плинтуса и шуруповёрта.
    Через пару лет дорастём до роботов.