Если в детстве у тебя не было велосипеда, а теперь у тебя Бентли,
то всё равно в детстве у тебя велосипеда не было.


Так уж получилось, что в моём детстве не было Лунохода. А тут ещё и ребёнок родился. В общем, я подумал, и решил сделать игрушку нам обоим.


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

Версия 1




Под рукой было недорогое шасси с Ebay и Arduino Uno.



Для управления моторчиками я взял PWM Servo Shield и на макетной плате спаял L293D + PCF8574:



Для считывания с клавиатуры взял PCF8574 и горсть диодов:



Саму клавиатуру сделал печатной платой:



Дабы клавиатура не разваливалась в руках, закрепил сверху накладку. Её пришлось заказать у «фрезеровщиков» :)



Для отображения программы используется обычный дисплей 20 на 4 символа. Да, тоже через PCF8574 ;)

Для питания сначала использовал 4 батарейки, но они слишком быстро садились, и я заменил их на пару аккумуляторов 18650:



Для зарядки использовал модули TP4056, которые присоединил через реле к аккумуляторам, правда, не очень успешно.

Быстрее всего получилось написать прошивку. К сожалению, оказалось, что библиотека I2C LCD имеет лицензию GPL, и код отправился в корзину. Примерно тогда же я понял, что Arduino Uno не самый удачный вариант, и что горсть PCF8574 очень неудобно паять.

И я решил начать сначала.

Версия 2




Учёл предыдущий опыт, который подсказывал, что есть несколько проблем:

  • Шасси с Ebay сделано из оргстекла и очень (!) хрупкое (я перетянул винт крепления редукторов и крепление просто сломалось).
  • На шасси много крепёжных отверстий, но ни одного подходящего.
  • Вместе с шасси идут редукторы 1:48, но они слишком шустрые.
  • И вообще шасси маловато.
  • У Arduino Uno мало «ног».
  • Нет звукового модуля (а он нужен для команды «огонь»).
  • Про Li-ion в интернете пишут страшилки, давать ребёнку потенциально опасное устройство не хочется.

В результате купил:


Кроме того:


Achtung! Warning! Attention! Данные ссылки приведены исключительно для иллюстрации и упрощения дальнейшего поиска деталек. Я не могу гарантировать, что продавец внезапно не поменяет лот на какой-то другой, не изменит цену, количество и т.п.

Железо


Клавиатуру я перенёс на печатную плату (пожалуй, это единственный сложный для повторения элемент). Накладку на клавиатуру мне отфрезеровали на заказ.

Оставался вопрос: из чего же сделать шасси? Пластика подходящего не было, металл тяжело обрабатывать… А если взять фанеру? «Но это же не эстетично!», подумал было я. Но когда через полчаса я получил нормальное шасси, то изменил мнение. Шасси было не очень презентабельно и отправилось в корзину, но скорость обработки так понравилась, что я решил и дальше использовать фанеру.

Правда, второй лист я начал пилить только после того, как нарисовал примерный план:



Для крепления моторов отрезал кусок алюминиевого уголка и высверлил:



Платы закрепил на шестигранных стойках и соединил между собой шлейфами.


(здесь же можно заметить стабилизатор на 5В и немного контактов питания).

Проводов питания оказалось многовато, поэтому я сделал из stripboard плату питания (подробности здесь). Подозреваю, что можно взять обычный sensor shield, у которого выводов питания с избытком.



Так как расширителей ввода-вывода больше не было, клавиатуру пришлось переделать (исходники). Я перенёс на неё диоды и резисторы подтяжки:





В качестве датчика оборотов использовал щелевую оптопару и шестерню (раскрасил её перманентным маркером):



В качестве третьего колеса использовал шарик:



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

Схема соединений


Лучше всего посмотреть файлы consts.h и lcd.ino, они содержат самую актуальную информацию. Соединения, как они есть сейчас, выглядят так:

Картинка кликабельна.

Прошивка


Прошивка, по сути своей, представляет обыкновенную программу, написанную в Arduino IDE. Режимов работы два: редактирование и выполнение. В процессе редактирования с клавиатуры принимается команда + количество повторений. Всё это упаковывается в 16-битное значение и складывается в массив в RAM. При выполнении программы из массива выгребаются значения и выполняются. Выполнение одного шага (в очень упрощённой форме) выглядит так:

если (уже работаем)
  проверить счётчик пройденного пути
  если (счётчик >= требуемая дистанция),
    подождать немного
        перейти к следующей команде
  иначе
    инкремент счётчика
иначе
  выключить двигатели
  взять очередную команду
  включить двигатели
  требуемая дистанция = константа*число повторений из команды


Пройденный путь определяется по количеству импульсов с оптопары, которая проверяется в прерывании таймера.

Единственное исключение — проигрывание звука. Если встречается команда «выстрел», то запускается простейший цикл for, который выгребает значения из wav-файла (он прошит в той же flash-памяти, что и программа) и выдаёт их на ЦАП R-2R. Когда значения заканчиваются, происходит возврат к обычному процессу выполнения программы.

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

Я сознательно поставил MIT-лицензию. В моём понимании прошивку с такой лицензией можно свободно использовать как угодно, без необходимости публиковать дальнейшие изменения (не хочу никого ни к чему принуждать).

Руководство по эксплуатации ;)


Клавиатура слегка отличается от «классического» Лунохода:



  • Слева расположен блок команд (зелёные — куда ехать, красная — пауза, снизу — Out, огонь, повтор).
  • В середине — цифры с количеством повторений.
  • Справа 8 клавиш управления (чёрная — удалить последнюю команду, красная — удалить всё, зелёная — запуск, жёлтая — запуск последней команды, синие — тест, серые — запасные).

Ещё раз табличкой:
На картинке Перевод Смысл
Fwd Ехать вперёд
Bwd Ехать назад
Left Повернуть налево
Right Повернуть направо
Pause Замереть
Out Не реализовано, оставлено на будущее Сделал как в Луноходе
Fire Огонь Издаёт звук «пиу!»
Loop Цикл Повторить несколько предыдущих команд один раз
0-9 Число шагов Максимум 20
Bsp Удалить последнюю команду
Del Удалить всю программу Требуется подтверждение кнопкой Go!
T1, T2 Тест Запустить тестовую программу
Check Выполнить последний шаг
Go! Выполнить все шаги

Программа вводится поочерёдным нажатием «Команда» и «Цифра». Потом жмём зелёный «Запуск» и смотрим на результат. Удаление происходит по нажатию красной кнопки, но не сразу: надо подтвердить своё решение нажатием зелёной кнопки «Запуск». При выключении питания программа удаляется.

Команда «Повтор» содержит один параметр: сколько шагов нужно повторить [один раз]. Пример: Fwd1, Pause1, Bwd1, Loop3; в результате команды Fwd1, Pause1, Bwd1 будут выполнены два раза. Первый раз потому, что они есть в программе, второй — потому что так указано в команде «Цикл».

На всякий случай контролируется заряд аккумулятора. Если он слишком мал, то выводится предупреждение и игрушка не едет.

GUI


Держать в голове всю программу тяжко, поэтому я прикрутил простейший индикатор, на котором дублируется вводимая информация.

После запуска отображается приглашение:



При вводе команды в левом верхнем углу отображается значок команды и количество повторений:



Если введено больше одной команды, снизу будет список (по сути, программа), а сверху всё так же будет отображаться вводимая команда:



Почему получилось именно так


Игрушка создавалась из того, что было под руками или легко достать. Отдельно хочется сказать про Arduino. Она выбрана по нескольким причинам:

  • У неё подходящее количество выводов, а их надо много (43):
    • 6 для управления моторами;
    • 8+4 для клавиатуры;
    • 11 для LCD;
    • 3 для ЦАП;
    • 8 для УЗ-датчиков;
    • 2 для датчиков оборотов;
    • 1 для замера напряжения на аккумуляторе.
  • Я знаком с этой платформой.
  • Она прошивается в один клик.
  • От микроконтроллера не требуется каких-то гигантских скоростей или объёмов памяти.
  • И особой экономичности тоже не требуется, т.к. 90 % тока потребляют моторы.

Что можно улучшить


Шасси. При резком старте колёса «шлифуют» и игрушка сбивается с курса. Можно попробовать сделать шестиколёсное шасси, или вообще гусеничное (на Aliexpress есть, но я пока не пробовал).

GUI. Сейчас на индикатор выводится только минимальный объём информации, и делается это самым простым способом.

Код. Пулитцера я точно не получу.

Звук. Есть дешевые и очень мелкие mp3-плееры. Можно смело выкинуть ЦАП R-2R и заменить его на готовый плеер.

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

Кнопка Out. На данный момент не реализована. Можно прикрутить что-то типа реле/сервы к одному из выводов Arduino.

Благодарности


  • Ребёнку, который мотивировал меня всё это время.
  • Жене, которая терпеливо ждала, пока я наиграюсь, и помогала с Corel Draw!
  • Сергею Дудникову, который отрисовал накладку на клавиатуру.
  • Андрею Шишкову, который эту самую накладку фрезеровал.
  • Антону, который сделал мне отличный mp3 со звуком «пиу!».
  • hudbrog, за идею реализовать ПИД-регулятор!
  • Чатику самодельщиков, которые меня морально поддерживали и вынужденно смотрели на промежуточные итоги работы ;)

Неудачные дубли


Мне нравятся фильмы с Джеки Чаном, потому что в конце есть нарезка неудачных дублей. У меня без них тоже не обошлось. Больше всего меня удивил тот факт, кто круглое сверло с двумя канавками даёт треугольное отверстие ;)








Комментарии (34)


  1. anfield343
    05.10.2018 10:36

    Спасибо, очень интересно) А какие еще на Ваш взгляд есть добротные микроконтроллеры, например для подключения 2 и более различных датчиков, чтобы была возможность объеденить все в одну систему?


    1. JustMoose Автор
      05.10.2018 10:52

      Тысячи их. На любой вкус. Можно в сторону stm8/stm32 посмотреть.


  1. 8street
    05.10.2018 12:21
    -1

    Ну это, конечно, не луноход. И даже не вездеход. Советую автору присмотреться к роверу с открытым исходным кодом от NASA. https://github.com/nasa-jpl/open-source-rover


    1. JustMoose Автор
      05.10.2018 12:27
      +2

      Спасибо, посмотрю. А «Луноход» — это название оригинальной игрушки, родом из СССР (можно вот здесь глянуть: ru.wikipedia.org/wiki/Big_Trak). На неё я и «смотрел», когда делал свою.


      1. 8street
        05.10.2018 13:20
        +1

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


        1. JustMoose Автор
          05.10.2018 14:01
          +1

          Да, в оригинальном Луноходе действительно было 3 пары колёс.
          Но кажется, что только одна пара была ведущей.

          ЗЫ: мысль про 6 колёс мне тоже в голову приходила, и прям сейчас я пилю версию 3.0. См. фото!
          image


          1. 8street
            05.10.2018 14:37

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


            1. JustMoose Автор
              05.10.2018 14:45

              Знаю, долго возился с задачей «а как бы заставить это ехать ровно». В итоге взял моторчики с двумя валами, поставил энкодеры прям на них и написал код ПИД-регулятора, который стабилизирует скорость. Помогло, но лишь отчасти. Оказалось, что при старте колёса «срываются в букс» и игрушку сносит в произвольную сторону ;) Поэтому код ПИД-регулятора так и не вошёл в конечную прошивку (и тоже остался на версию 3.0). Зато я нашёл другую резину, которая сильно мягче. Экспериментирую. Фоточка с энкодерами:
              image


              1. 8street
                05.10.2018 15:03

                Чтобы не было букса попробуйте использовать задатчик интенсивности. Т.е. плавно повышать задание, на входе ПИД регулятора, до номинала. Точнее, не на входе самого ПИД, а перед его сумматором ошибки.


          1. Pyhesty
            05.10.2018 15:40

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


        1. Crevice
          05.10.2018 18:35

          А я понимаю что двигало автором.
          В детстве тоже видел эту игрушку в магазине и читал про нее в журнале Наука и Жизнь. И зацепили тогда не 6 колес, а возможность программировать движение лунохода. Это в те времена для школьника было почти на одном уровне реальности с полетом на луну.


          1. JustMoose Автор
            05.10.2018 19:30

            Я ещё и в журнале Радио читал, про какой-то аналог а-ля 145ИК19xx :)
            Спасибо, что напомнили, пойду погуглю!


    1. 4public
      06.10.2018 14:58

      А программа советского лунохода где нибудь выставлена?
      Там же наверное все было довольно примитивно
      Чтоб можно было бы через байфай посылать такие же команды как и настоящему
      Создать полный эмулятор — а не игушку?


      1. JustMoose Автор
        06.10.2018 15:01

        Привет. Я нигде не встречал прошивки от советского лунохода, увы.

        Чтоб можно было бы через байфай посылать такие же команды как и настоящему

        Оригинальная игрушка была полностью автономной, никакого «дистанционного управления» (ты же в этом смысле вайфай упомянул?) у неё не было.


        1. 4public
          07.10.2018 06:16

          Имел ввиду посылать и принимать «типа» тех радиосигналов управления, которыми управлялись советские луноходы, но через wifi
          Создать полный мини аналог настоящих луноходов
          Какие у них в тех 70х были характеристики? наверное все примитивное и вполне повторимое


  1. Serge78rus
    05.10.2018 13:00
    +1

    К сожалению, оказалось, что библиотека I2C LCD имеет лицензию GPL, и код отправился в корзину.
    А почему Вас тогда не смутила LGPL лицензия библиотек самого Arduino:
    /*
      Arduino.h - Main include file for the Arduino SDK
      Copyright (c) 2005-2013 Arduino Team.  All right reserved.
    
      This library is free software; you can redistribute it and/or
      modify it under the terms of the GNU Lesser General Public
      License as published by the Free Software Foundation; either
      version 2.1 of the License, or (at your option) any later version.
    
      This library is distributed in the hope that it will be useful,
      but WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      Lesser General Public License for more details.
    
      You should have received a copy of the GNU Lesser General Public
      License along with this library; if not, write to the Free Software
      Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
    */
    


    1. JustMoose Автор
      05.10.2018 13:02

      Если я правильно понял, LGPL устанавливает гораздо меньше ограничений, чем GPL.
      Впрочем, я не юрист, могу ошибаться.


      1. Serge78rus
        05.10.2018 13:26
        +1

        Да, ограничения LGPL существенно мягче, но в данном случае, так как используется статическая линковка, Вы и те, кто на основе Вашей прошивки будет создавать гипотетические производные работы, все равно должны публиковать свои исходники для выполнения условия: «должна быть возможность линковки программного обеспечения с новой версией продукта, лицензируемого под LGPL». А если так, то принципиального отличия от GPL в данном случае нету, так как нет возможности закрыть свой исходный код.


        1. JustMoose Автор
          05.10.2018 14:03

          Как всё сложно.
          Ну, мои исходники всё-равно на github лежат, надеюсь этого достаточно для выполнения требований LGPL.


          1. Serge78rus
            05.10.2018 15:29
            +2

            Просто не работают Ваши благие намерения дать максимальную свободу последователям:

            Я сознательно поставил MIT-лицензию. В моём понимании прошивку с такой лицензией можно свободно использовать как угодно, без необходимости публиковать дальнейшие изменения (не хочу никого ни к чему принуждать).
            А вообще, Вы, наверное, один из первых пользователей Arduino, удосужившихся не только прочитать лицензии сторонних библиотек, но даже отказаться от части проделанной работы по лицензионным соображениям.


  1. marckel
    05.10.2018 14:29

    Завтра в Питере начинается очередной «Робофинист». Можно потырить кучу идей по части проходимости. Скажем там одна из задач — заставить робота забираться по лестнице

    например что-то типа:


    1. JustMoose Автор
      05.10.2018 14:47

      Спасибо, посмотрю :)


  1. aml
    05.10.2018 15:04

    Круто получилось!
    А что не так с лицензией GPL, если вы все равно исходники опубликовали?


    1. JustMoose Автор
      05.10.2018 15:17

      Спасибо!

      GPL «заразна»: если кто-то что-то взял из GPL кода, то он тут же должен и свой код опубликовать (если я правильно её понял).

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

      В принципе, эти два утверждения между собой не связаны ;)


      1. lorc
        05.10.2018 18:53

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


      1. vovafit161
        05.10.2018 19:14

        благое дело делаете ) прикольно почитать было такие мысли, сам не смог бы наверное додуматься )


        1. JustMoose Автор
          05.10.2018 19:14

          Спасибо, что читаете!


  1. MagisterLudi
    05.10.2018 17:50

    Если у вас в детстве не было реактивного ранца…


    1. JustMoose Автор
      05.10.2018 19:27

      Меня жена из дома выгонит!


      1. MagisterLudi
        05.10.2018 23:03

        image


      1. MagisterLudi
        05.10.2018 23:03

        Я скоро сделаю, прилечу :)))


  1. Dream117
    05.10.2018 19:14

    Не могли бы вы скетч указать?)Сам делаю нечто подобное только на гусеницах
    w-YCRmZJhMU.jpg


    1. JustMoose Автор
      05.10.2018 19:17

      Все исходники лежат здесь:
      github.com/TheJustMoose/JustCreeper

      Нажми правую зелёную кнопку Clone or dowload, потом Download ZIP.
      Внутри ахапка файлов с расширением ino.
      В Arduino IDE надо открыть JustCreeper.ino.


  1. iig
    05.10.2018 21:45
    +1

    Круто!
    Но это игрушка не для детей, а для тех, у кого лунохода не было. :)