то всё равно в детстве у тебя велосипеда не было.
Так уж получилось, что в моём детстве не было Лунохода. А тут ещё и ребёнок родился. В общем, я подумал, и решил сделать игрушку нам обоим.
Создавать точную копию не хотелось, да и не умею я печатать корпуса дома, поэтому решил ограничиться воссозданием похожей функциональности. Кроме того, мне показалось негуманным вводить «программу» движения по памяти и не понимать, что именно получилось ввести, поэтому добавил дисплей.
Версия 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 в интернете пишут страшилки, давать ребёнку потенциально опасное устройство не хочется.
В результате купил:
- Редукторы 1:120.
- Моторы с двумя валами (в надежде установить потом ПИД-регулятор).
- Модуль L293.
- Arduino Mega.
- Много цветных шлейфов!
- Свинцово-кислотный аккумулятор на 6В (он не так быстро садится, отдаёт больший ток, и он тяжелый — колёса меньше «шлифуют»).
- УЗ-датчики в качестве датчиков препятствий.
- Третье колесо в виде шарика.
- Тактовые кнопки.
- Толкатель кнопки.
- Щелевой датчик.
Кроме того:
- Дисплей LCD 2004 (5В) остался от версии 1.
- Спаял ЦАП R-2R на монтажной плате (вот здесь есть схема в KiCAD и 3D-модель).
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)
8street
05.10.2018 12:21-1Ну это, конечно, не луноход. И даже не вездеход. Советую автору присмотреться к роверу с открытым исходным кодом от NASA. https://github.com/nasa-jpl/open-source-rover
JustMoose Автор
05.10.2018 12:27+2Спасибо, посмотрю. А «Луноход» — это название оригинальной игрушки, родом из СССР (можно вот здесь глянуть: ru.wikipedia.org/wiki/Big_Trak). На неё я и «смотрел», когда делал свою.
8street
05.10.2018 13:20+1Мое мнение, луноход, и игрушка, и настоящий, отличает именно высокопроходимая ходовая часть, а именно 3 пары колес. Мне, конечно, не указывать что нужно делать, но я ожидал именно этого, заходя в статью с таким названием.
JustMoose Автор
05.10.2018 14:01+1Да, в оригинальном Луноходе действительно было 3 пары колёс.
Но кажется, что только одна пара была ведущей.
ЗЫ: мысль про 6 колёс мне тоже в голову приходила, и прям сейчас я пилю версию 3.0. См. фото!
8street
05.10.2018 14:37Знакомые моторы. У них большой рассинхрон, поэтому не забудьте энкодеры, хотя бы по штуке на каждую сторону. Я уже наступал на эти грабли, когда игрушку все время тянет в сторону.
JustMoose Автор
05.10.2018 14:45Знаю, долго возился с задачей «а как бы заставить это ехать ровно». В итоге взял моторчики с двумя валами, поставил энкодеры прям на них и написал код ПИД-регулятора, который стабилизирует скорость. Помогло, но лишь отчасти. Оказалось, что при старте колёса «срываются в букс» и игрушку сносит в произвольную сторону ;) Поэтому код ПИД-регулятора так и не вошёл в конечную прошивку (и тоже остался на версию 3.0). Зато я нашёл другую резину, которая сильно мягче. Экспериментирую. Фоточка с энкодерами:
8street
05.10.2018 15:03Чтобы не было букса попробуйте использовать задатчик интенсивности. Т.е. плавно повышать задание, на входе ПИД регулятора, до номинала. Точнее, не на входе самого ПИД, а перед его сумматором ошибки.
Pyhesty
05.10.2018 15:40все колёса у ведущего Лунохода были ведущими мотор-колёсами, специальным пиропатроном можно было перебить связь колеса и мотора, что бы в случае проблем с мотором механически его отключить и колесо продолжало вращаться свободно. На одном из двух Луноходов — это пригодилось.
Crevice
05.10.2018 18:35А я понимаю что двигало автором.
В детстве тоже видел эту игрушку в магазине и читал про нее в журнале Наука и Жизнь. И зацепили тогда не 6 колес, а возможность программировать движение лунохода. Это в те времена для школьника было почти на одном уровне реальности с полетом на луну.JustMoose Автор
05.10.2018 19:30Я ещё и в журнале Радио читал, про какой-то аналог а-ля 145ИК19xx :)
Спасибо, что напомнили, пойду погуглю!
4public
06.10.2018 14:58А программа советского лунохода где нибудь выставлена?
Там же наверное все было довольно примитивно
Чтоб можно было бы через байфай посылать такие же команды как и настоящему
Создать полный эмулятор — а не игушку?JustMoose Автор
06.10.2018 15:01Привет. Я нигде не встречал прошивки от советского лунохода, увы.
Чтоб можно было бы через байфай посылать такие же команды как и настоящему
Оригинальная игрушка была полностью автономной, никакого «дистанционного управления» (ты же в этом смысле вайфай упомянул?) у неё не было.4public
07.10.2018 06:16Имел ввиду посылать и принимать «типа» тех радиосигналов управления, которыми управлялись советские луноходы, но через wifi
Создать полный мини аналог настоящих луноходов
Какие у них в тех 70х были характеристики? наверное все примитивное и вполне повторимое
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 */
JustMoose Автор
05.10.2018 13:02Если я правильно понял, LGPL устанавливает гораздо меньше ограничений, чем GPL.
Впрочем, я не юрист, могу ошибаться.Serge78rus
05.10.2018 13:26+1Да, ограничения LGPL существенно мягче, но в данном случае, так как используется статическая линковка, Вы и те, кто на основе Вашей прошивки будет создавать гипотетические производные работы, все равно должны публиковать свои исходники для выполнения условия: «должна быть возможность линковки программного обеспечения с новой версией продукта, лицензируемого под LGPL». А если так, то принципиального отличия от GPL в данном случае нету, так как нет возможности закрыть свой исходный код.
JustMoose Автор
05.10.2018 14:03Как всё сложно.
Ну, мои исходники всё-равно на github лежат, надеюсь этого достаточно для выполнения требований LGPL.Serge78rus
05.10.2018 15:29+2Просто не работают Ваши благие намерения дать максимальную свободу последователям:
Я сознательно поставил MIT-лицензию. В моём понимании прошивку с такой лицензией можно свободно использовать как угодно, без необходимости публиковать дальнейшие изменения (не хочу никого ни к чему принуждать).
А вообще, Вы, наверное, один из первых пользователей Arduino, удосужившихся не только прочитать лицензии сторонних библиотек, но даже отказаться от части проделанной работы по лицензионным соображениям.
marckel
05.10.2018 14:29Завтра в Питере начинается очередной «Робофинист». Можно потырить кучу идей по части проходимости. Скажем там одна из задач — заставить робота забираться по лестнице
например что-то типа:
anfield343
Спасибо, очень интересно) А какие еще на Ваш взгляд есть добротные микроконтроллеры, например для подключения 2 и более различных датчиков, чтобы была возможность объеденить все в одну систему?
JustMoose Автор
Тысячи их. На любой вкус. Можно в сторону stm8/stm32 посмотреть.