- PVSM.RU - https://www.pvsm.ru -
Если в детстве у тебя не было велосипеда, а теперь у тебя Бентли,
то всё равно в детстве у тебя велосипеда не было.
Так уж получилось, что в моём детстве не было Лунохода [1]. А тут ещё и ребёнок родился. В общем, я подумал, и решил сделать игрушку нам обоим.
Создавать точную копию не хотелось, да и не умею я печатать корпуса дома, поэтому решил ограничиться воссозданием похожей функциональности. Кроме того, мне показалось негуманным вводить «программу» движения по памяти и не понимать, что именно получилось ввести, поэтому добавил дисплей.
Под рукой было недорогое шасси с Ebay и Arduino Uno.
Для управления моторчиками я взял PWM Servo Shield и на макетной плате спаял L293D + PCF8574:
Для считывания с клавиатуры взял PCF8574 и горсть диодов:
Саму клавиатуру сделал печатной платой:
Дабы клавиатура не разваливалась в руках, закрепил сверху накладку. Её пришлось заказать у «фрезеровщиков» :)
Для отображения программы используется обычный дисплей 20 на 4 символа. Да, тоже через PCF8574 ;)
Для питания сначала использовал 4 батарейки, но они слишком быстро садились, и я заменил их на пару аккумуляторов 18650:
Для зарядки использовал модули TP4056, которые присоединил через реле к аккумуляторам, правда, не очень успешно.
Быстрее всего получилось написать прошивку. К сожалению, оказалось, что библиотека I2C LCD имеет лицензию GPL, и код отправился в корзину. Примерно тогда же я понял, что Arduino Uno не самый удачный вариант, и что горсть PCF8574 очень неудобно паять.
И я решил начать сначала.
Учёл предыдущий опыт, который подсказывал, что есть несколько проблем:
В результате купил:
Кроме того:
Achtung! Warning! Attention! Данные ссылки приведены исключительно для иллюстрации и упрощения дальнейшего поиска деталек. Я не могу гарантировать, что продавец внезапно не поменяет лот на какой-то другой, не изменит цену, количество и т.п.
Клавиатуру я перенёс на печатную плату (пожалуй, это единственный сложный для повторения элемент). Накладку на клавиатуру мне отфрезеровали на заказ.
Оставался вопрос: из чего же сделать шасси? Пластика подходящего не было, металл тяжело обрабатывать… А если взять фанеру? «Но это же не эстетично!», подумал было я. Но когда через полчаса я получил нормальное шасси, то изменил мнение. Шасси было не очень презентабельно и отправилось в корзину, но скорость обработки так понравилась, что я решил и дальше использовать фанеру.
Правда, второй лист я начал пилить только после того, как нарисовал примерный план:
Для крепления моторов отрезал кусок алюминиевого уголка и высверлил:
Платы закрепил на шестигранных стойках и соединил между собой шлейфами.
[25]
(здесь же можно заметить стабилизатор на 5В и немного контактов питания).
Проводов питания оказалось многовато, поэтому я сделал из stripboard плату питания (подробности здесь [26]). Подозреваю, что можно взять обычный sensor shield, у которого выводов питания с избытком.
Так как расширителей ввода-вывода больше не было, клавиатуру пришлось переделать (исходники [28]). Я перенёс на неё диоды и резисторы подтяжки:
В качестве датчика оборотов использовал щелевую оптопару и шестерню (раскрасил её перманентным маркером):
В качестве третьего колеса использовал шарик:
Изначально там была опора в виде колёсика на коромысле, которая шла вместе с шасси. Однако при изменении направления движения колёсико начинало разворачиваться в самый неожиданный момент и тележку бросало в сторону.
Лучше всего посмотреть файлы consts.h и lcd.ino, они содержат самую актуальную информацию. Соединения, как они есть сейчас, выглядят так:
[33]
Картинка кликабельна.
Прошивка [34], по сути своей, представляет обыкновенную программу, написанную в Arduino IDE. Режимов работы два: редактирование и выполнение. В процессе редактирования с клавиатуры принимается команда + количество повторений. Всё это упаковывается в 16-битное значение и складывается в массив в RAM. При выполнении программы из массива выгребаются значения и выполняются. Выполнение одного шага (в очень упрощённой форме) выглядит так:
если (уже работаем) проверить счётчик пройденного пути если (счётчик >= требуемая дистанция), подождать немного перейти к следующей команде иначе инкремент счётчика иначе выключить двигатели взять очередную команду включить двигатели требуемая дистанция = константа*число повторений из команды
Пройденный путь определяется по количеству импульсов с оптопары, которая проверяется в прерывании таймера.
Единственное исключение — проигрывание звука. Если встречается команда «выстрел», то запускается простейший цикл for
, который выгребает значения из wav-файла (он прошит в той же flash-памяти, что и программа) и выдаёт их на ЦАП R-2R. Когда значения заканчиваются, происходит возврат к обычному процессу выполнения программы.
К сожалению реальный мир несколько отличается от программной модели, на которую рассчитана прошивка, поэтому я добавил некоторое количество задержек, которые позволяют учесть инерцию шасси.
Я сознательно поставил MIT-лицензию. В моём понимании прошивку с такой лицензией можно свободно использовать как угодно, без необходимости публиковать дальнейшие изменения (не хочу никого ни к чему принуждать).
Клавиатура слегка отличается от «классического» Лунохода:
Ещё раз табличкой:
На картинке | Перевод | Смысл |
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 будут выполнены два раза. Первый раз потому, что они есть в программе, второй — потому что так указано в команде «Цикл».
На всякий случай контролируется заряд аккумулятора. Если он слишком мал, то выводится предупреждение и игрушка не едет.
Держать в голове всю программу тяжко, поэтому я прикрутил простейший индикатор, на котором дублируется вводимая информация.
После запуска отображается приглашение:
При вводе команды в левом верхнем углу отображается значок команды и количество повторений:
Если введено больше одной команды, снизу будет список (по сути, программа), а сверху всё так же будет отображаться вводимая команда:
Игрушка создавалась из того, что было под руками или легко достать. Отдельно хочется сказать про Arduino. Она выбрана по нескольким причинам:
Шасси. При резком старте колёса «шлифуют» и игрушка сбивается с курса. Можно попробовать сделать шестиколёсное шасси, или вообще гусеничное (на Aliexpress есть, но я пока не пробовал).
GUI. Сейчас на индикатор выводится только минимальный объём информации, и делается это самым простым способом.
Код. Пулитцера я точно не получу.
Звук. Есть дешевые и очень мелкие mp3-плееры. Можно смело выкинуть ЦАП R-2R и заменить его на готовый плеер.
Резервные кнопки. Можно сделать запись готовой программы в EEPROM, чтобы она не терялась при выключении питания. Реализация может быть как в магнитолах: при длинном нажатии программу сохраняем, при коротком — запускаем.
Кнопка Out. На данный момент не реализована. Можно прикрутить что-то типа реле/сервы к одному из выводов Arduino.
Мне нравятся фильмы с Джеки Чаном, потому что в конце есть нарезка неудачных дублей. У меня без них тоже не обошлось. Больше всего меня удивил тот факт, кто круглое сверло с двумя канавками даёт треугольное отверстие ;)
[39] | [40] |
[41] | [42] |
[43] | [44] |
[45] |
Автор: JustMoose
Источник [46]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/diy/294845
Ссылки в тексте:
[1] Лунохода: https://ru.wikipedia.org/wiki/Big_Trak
[2] Image: https://habrastorage.org/webt/sm/ay/3l/smay3lbljqcdvzqjzwbu2ttxs_e.jpeg
[3] Image: https://habrastorage.org/webt/kd/cg/cn/kdcgcnk0xciyvdqa5rdxphli7po.jpeg
[4] Image: https://habrastorage.org/webt/u1/ec/kr/u1eckrq4vkehkdeyl-nudkm-9rc.jpeg
[5] Image: https://habrastorage.org/webt/b9/ug/u7/b9ugu7un8he8atkfmhawtrdbqh0.jpeg
[6] Image: https://habrastorage.org/webt/fs/zc/vb/fszcvbs4vgseapjivkxzc5oupug.jpeg
[7] Image: https://habrastorage.org/webt/r_/pu/fs/r_pufsefgkfymv94owyxyxapg5c.jpeg
[8] Image: https://habrastorage.org/webt/bo/hm/mo/bohmmo2cv-vntgmain3xvgen2le.jpeg
[9] Image: https://habrastorage.org/webt/mm/u-/2u/mmu-2u1-lknxojkkfdxn7lu-fge.jpeg
[10] Редукторы 1:120.: https://www.ebay.com/itm/231130151482
[11] Моторы с двумя валами (в надежде установить потом ПИД-регулятор).: https://www.ebay.com/itm/192389719680
[12] Модуль L293.: https://ru.aliexpress.com/item/Mini-Motor-Drive-Shield-Expansion-Board-L293D-Module-For-for-Ar-UNO-MEGA-2560/1859086104.html
[13] Arduino Mega.: https://www.ebay.com/itm/400994708253
[14] Много цветных шлейфов!: https://www.ebay.com/itm/400932483189
[15] Свинцово-кислотный аккумулятор на 6В (он не так быстро садится, отдаёт больший ток, и он тяжелый — колёса меньше «шлифуют»).: https://www.chipdip.ru/product/dt-6033-134x34x60
[16] УЗ-датчики в качестве датчиков препятствий.: https://www.ebay.com/itm/170897438205
[17] Третье колесо в виде шарика.: http://tixer.ru/catalog/robotics/wheels-bearings/sharikovaya_opora/?sphrase_id=643150
[18] Тактовые кнопки.: https://www.ebay.com/itm/400978790341
[19] Толкатель кнопки.: https://ru.aliexpress.com/item/200Pcs-Tactile-Push-Button-Switch-Cap-micro-Switch-button-Cap-6-Color-Fit-6-6-7/1083007608.html?spm=a2g0s.9042311.0.0.274233edVnkrRY
[20] Щелевой датчик.: https://www.ebay.com/itm/263793936483
[21] Дисплей LCD 2004 (5В) остался от версии 1.: https://www.ebay.com/itm/401086753914
[22] вот здесь: https://github.com/TheJustMoose/R-2R
[23] Image: https://habrastorage.org/webt/p4/d5/z6/p4d5z61sdda9ijwdhdyjos3n_v4.jpeg
[24] Image: https://habrastorage.org/webt/i0/rj/vd/i0rjvdxhrq_un4hvjwtawvyazuc.jpeg
[25] Image: https://habrastorage.org/webt/sn/0q/px/sn0qpxiwvkuuklleww7kezhxco8.jpeg
[26] здесь: http://we.easyelectronics.ru/JustMoose/i-esche-raz-pro-stripboard.html
[27] Image: https://habrastorage.org/webt/xh/vq/ju/xhvqju2cwgoay0ppstplz9kcvug.jpeg
[28] исходники: https://github.com/TheJustMoose/JustCreeper/tree/master/pcb
[29] Image: https://habrastorage.org/webt/gi/nx/8t/ginx8toy9ggmhcyna8xspa_1lcc.jpeg
[30] Image: https://habrastorage.org/webt/by/lk/8-/bylk8-lq4iyyyq1irxipnokyco8.jpeg
[31] Image: https://habrastorage.org/webt/d_/im/j9/d_imj9ay5dlaac_nm_6bj2m72co.jpeg
[32] Image: https://habrastorage.org/webt/r3/hg/6g/r3hg6goewxmgqs7gcee1lott-ra.jpeg
[33] Image: https://habrastorage.org/webt/x1/nv/si/x1nvsi4mf5zawo3aczqnln70bay.png
[34] Прошивка: https://github.com/TheJustMoose/JustCreeper/
[35] Image: https://habrastorage.org/webt/ru/f0/-j/ruf0-j1algyiy0vgo6p15eu_k90.jpeg
[36] Image: https://habrastorage.org/webt/o8/ru/v4/o8ruv4tuxzlu-2pgpbkjifumi1i.jpeg
[37] Image: https://habrastorage.org/webt/3i/wb/ve/3iwbve94ihdgrqyqikd8zko-b88.jpeg
[38] hudbrog: https://habr.com/users/hudbrog/
[39] Image: https://habrastorage.org/webt/ro/a4/b8/roa4b8z5f5rjkzziiy7uzusxw3w.jpeg
[40] Image: https://habrastorage.org/webt/pz/vo/-i/pzvo-itf19nqxmtinjz-la6icyw.jpeg
[41] Image: https://habrastorage.org/webt/we/mw/_e/wemw_e1kgcybtxova_zh_rcdc_c.jpeg
[42] Image: https://habrastorage.org/webt/cb/m6/mg/cbm6mgj-jwvxvxx66udrp65vos8.jpeg
[43] Image: https://habrastorage.org/webt/zk/ph/4d/zkph4d0igh8qxwzaphdhlwrzmxc.jpeg
[44] Image: https://habrastorage.org/webt/0t/kc/tv/0tkctvrzqhhawjdk-wiv3qojkck.jpeg
[45] Image: https://habrastorage.org/webt/wi/eo/ee/wieoeemfsnmm519z8otheargj_0.jpeg
[46] Источник: https://habr.com/post/423409/?utm_campaign=423409
Нажмите здесь для печати.