Перейти к содержимому
eu_tomat

Проект робота на платформе NodeMCU

Рекомендуемые сообщения

Здравствуйте, товарищи!

 

Я в очередной раз заинтересовался темой микроконтроллеров и на этот раз я намерен перевести свой интерес в практическую плоскость. При выборе платформы я склонялся сначала к Arduino, но потом вспомнил о платформе NodeMCU, с которой нас познакомил @BrightYC. NodeMCU позволяет писать программы на языке Lua, благодаря чему эта тема может стать интересной более широкому кругу форумчан. Поэтому для первого проекта я выбрал NodeMCU.

 

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

 

Ближайшая цель: выбрать комплектующие для проекта и заказать их в Китае. Можно заказать и в России, если это будет не сильно дороже.

 

Конечная цель проекта:
Минимум:

  • Сделать игрушечную машинку на четырёх колёсах с танковым разворотом, способную случайно блуждать по полу, объезжая препятствия. Датчики препятствий нужны какие-то оптические, чтобы не пугать ультразвуком котов. Датчики желательно аналогвые, чтобы знать примерное расстояние до препятствий, если это вообще возможно на типовых модулях. Также требуется подключение по WiFi для отладки скриптов.
  • Датчиков препятствий пока планируется три: один смотрит вперёд, а другие немного в стороны, чтобы выбрать предпочитительное направление для поворота, не вращая корпус машины.
  • Машинка будет иметь четыре колеса с двигателями и редукторами на каждое колесо. Колёса требуются какие-нибудь простые и недорогие. Двигатели будут объединены в две группы, для их управления нужен какой-нибудь модуль драйвера. Драйверы будут управляться либо аналоговым сигналом, либо ШИМ, чтобы машинка могла двигаться с переменной скоростью и делать повороты различного радиуса.
  • Также требуется аккумулятор для питания устройства и контроллер заряда с USB-интерфейсом.

Опционально:

  • Нужна сервомашинка для вращения "глазами" для улучшения ориентации на поворотах.
  • Нужен датчик тепла, скорее всего, на сервоприводах, чтобы искать котов, отличая их от батарей отпления или ног людей. В дальнейшем я предполагаю добавление алгоритма троллинга этих самых котов для большего веселья.
  • Нужен способ воспроизводить звуки из заданного набора с флешки.

 

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

 

Вопросы на текущем этапе:

  • Как выбирать плату контроллера? Установлен ли на плату WiFi, или он устанавливается отдельным модулем?
  • Насколько часты у начинающих самодельщиков случаи "ткнул не туда, плата сгорела"? Имеет ли смысл взять несколько плат на всякий случай?
  • Какие выбрать модули для управления двигателями? По каким критериям?
  • Какие существуют оптические датчики расстояния? Могут ли они выдавать аналоговый сигнал, и есть ли в аналоговом сигнале какой-либо смысл?
  • Как выбрать аккумулятор и контроллер заряда?
  • Как подключаются сервомашинки к контроллеру? Нужны ли им дополнительные модули драйверов?
  • Какая периферия требуется для воспроизведения звуков с флешки?

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
16 минут назад, eu_tomat сказал:

Как выбирать плату контроллера? Установлен ли на плату WiFi, или он устанавливается отдельным модулем?

NodeMCU платы сделаны на основе esp12e, реже esp12f. Этот микроконтроллер по умолчанию имеет Wi-Fi, но он слабоват, если в квартире/доме больше 2 комнат. 

 

16 минут назад, eu_tomat сказал:

Насколько часты у начинающих самодельщиков случаи "ткнул не туда, плата сгорела"? Имеет ли смысл взять несколько плат на всякий случай?

Лично у меня не сгорела ни 1 плата, но для подстраховки имеет смысл взять дубликат, чтобы не брать такую же плату втридорога в России.

 

16 минут назад, eu_tomat сказал:

Какие выбрать модули для управления двигателями? По каким критериям?

В основном потребление двигателей. Для маленькой машинки сойдет такая(Для мощных же двигателей нужно что-то помощнее):

https://ru.aliexpress.com/item/32856351192.html?spm=a2g0s.9042311.0.0.23cb33ed6qFjsr

(Сам брал лично)

 

16 минут назад, eu_tomat сказал:

Какие существуют оптические датчики расстояния? Могут ли они выдавать аналоговый сигнал, и есть ли в аналоговом сигнале какой-либо смысл?

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

 

16 минут назад, eu_tomat сказал:

Для начала чем проще, тем лучше. 

 

Как выбрать аккумулятор и контроллер заряда?

Если цель действительно на простоту - то проще взять powerbank. Выйдет дешевле и проще.

 

16 минут назад, eu_tomat сказал:

Как подключаются сервомашинки к контроллеру? Нужны ли им дополнительные модули драйверов?

В принципе, сервопривод можно подключить напрямую к плате - но у них потребление слишком большое и фонить будет сильно(wi-fi сигналу мешать будет), так же - есть шанс спалить плату. Поэтому сервоприводам нужно отдельное питание от микроконтроллера.

 

16 минут назад, eu_tomat сказал:

Какая периферия требуется для воспроизведения звуков с флешки?

Вообще, писать всё это на Lua слишком сложно. Если очень хочется - можно заказать отдельный модуль, который воспроизводит музыку отдельно. А флеш-накопитель к "слабым" esp-шкам подключить нельзя, разве что к ESP32 можно. Но там уже и камеру приделать можно =)
 

Скрытый текст

 

 

UPD: По поводу драйверов для двигателей - в том модуле, что я сбросил - есть ШИМ, то есть плавное управление возможно. В некоторых модулях же ШИМ нет. 

Изменено пользователем BrightYC

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@BrightYC Спасибо за разъяснения. Это поможет мне быстрее вникнуть в предмет. Я погуглил тему датчиков, и там всё оказалось сложно.

 

Дешёвые датчики имеют малую дальность. То есть, роботу будет нельзя сильно разгонятся.

 

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

 

Правильно ли я понимаю, что сервоприводы для Ардуино могут лишь воспринимать управляющий сигнал без возможности передать контроллеру фактический угол поворота? И если сервоприводу дать команду развернуться в крайней положение из противоположного, то время завершения операции можно определить лишь примерно? Оно, насколько я понимаю, зависит от питающего напряжения? И является ли скорость поворота сервопривода более-менее постоянной, или сервопривод замедляется ближе к целевой точке? И есть ли у сервопривода крайние положения? Может ли он непрерывно вращаться на 360 градусов?

 

Зная ответы на эти вопросы, можно было бы вращать головой на полной скорости сервопривода, считывая расстояния до всех предметов на горизонте.

 

Ещё есть идея вскрыть сервопривод, и если позволит схема, подключиться непосредственно к потенциометру сервопривода. Это позволит точно определять угол даже не остановившегося сервопривода.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
25 минут назад, eu_tomat сказал:

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

Надеюсь, ты не против, если я кину сразу видео?
https://youtu.be/wOBoQ2WoAQw
Можно заменить ультразвуковой датчик на дальномер, думаю принцип не будет сильно отличаться. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
28 минут назад, eu_tomat сказал:

Правильно ли я понимаю, что сервоприводы для Ардуино могут лишь воспринимать управляющий сигнал без возможности передать контроллеру фактический угол поворота? И если сервоприводу дать команду развернуться в крайней положение из противоположного, то время завершения операции можно определить лишь примерно? Оно, насколько я понимаю, зависит от питающего напряжения? И является ли скорость поворота сервопривода более-менее постоянной, или сервопривод замедляется ближе к целевой точке? И есть ли у сервопривода крайние положения? Может ли он непрерывно вращаться на 360 градусов?

Так же, огорчу - сервоприводы действительно на это неспособны. Можно узнать лишь приблизительно, где находится сервопривод. Здесь уже помогут моторчики как в жёстких дисках или 3д принтерах. Они называются "шаговые двигатели". Их положение можно определить со 100% точностью, поэтому для этого они идеально подходят. Но это не совсем обычные двигатели - им нужен специальный драйвер. Что опять же усложнит конструкцию и порог входа. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
17 минут назад, BrightYC сказал:

Надеюсь, ты не против, если я кину сразу видео?
https://youtu.be/wOBoQ2WoAQw
Можно заменить ультразвуковой датчик на дальномер, думаю принцип не будет сильно отличаться. 

В видео я не услышал главного: почему после поворота на один градус нужно ждать именно 30 миллисекунд. Почему не больше? Почему не меньше? Изменится ли эта задержка при повышении или понижении напряжения питания сервопривода?

14 минуты назад, BrightYC сказал:

Здесь уже помогут моторчики как в жёстких дисках или 3д принтерах. Они называются "шаговые двигатели". Их положение можно определить со 100% точностью, поэтому для этого они идеально подходят. Но это не совсем обычные двигатели - им нужен специальный драйвер. Что опять же усложнит конструкцию и порог входа.

Насколько я знаю, положение шагового двигателя со 100% точностью мы можем определить лишь в одном случае: если знаем его начальное положение. Ну, и если не было пропуска шага при работе двигателя с перегрузкой. Перегрузки у нас не будет. Но как определить начальный угол вала шагового двигателя при включении робота?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
14 минуты назад, eu_tomat сказал:

Но как определить начальный угол вала шагового двигателя при включении робота?

Никак. Принудительно при включении робота устанавливать угол например на 90%

15 минут назад, eu_tomat сказал:

В видео я не услышал главного: почему после поворота на один градус нужно ждать именно 30 миллисекунд. Почему не больше? Почему не меньше? Изменится ли эта задержка при повышении или понижении напряжения питания сервопривода?

Скорее всего, эти данные получены экспериментальным путём. Так же, есть задержка между получением данных у ультразвукового сенсора. Ты то можешь выставить любую задержку, не обязательно ведь ставить 30 мс

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
34 минуты назад, BrightYC сказал:

Скорее всего, эти данные получены экспериментальным путём. Так же, есть задержка между получением данных у ультразвукового сенсора. Ты то можешь выставить любую задержку, не обязательно ведь ставить 30 мс

Понятно, что любую. Вопрос в том, как определить, что задержка достаточна и не избыточна? Не изменится ли оптимум при изменении напряжения питающей батареи?

34 минуты назад, BrightYC сказал:

Никак. Принудительно при включении робота устанавливать угол например на 90%

Ну, а как принудительно установить на нужный угол? Шаговый двигатель не имеет такой возможности. Можно лишь сместить на нужный угол относительно исходного. И снова встаёт вопрос, как определить угол? Исходный или конечный, без разницы.

 

Я тут, кстати, нагуглил, что есть сервоприводы, способные вращаться на 360 градусов. Но у них та же проблема, что и у шаговых двигателей: есть возможность задать скорость вращения, но абсолютный угол определить или задать невозможно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 минуты назад, eu_tomat сказал:

Понятно, что любую. Вопрос в том, как определить, что задержка достаточна и не избыточна? Не изменится ли оптимум при изменении напряжения питающей батареи?

Погрешность то в любом случае будет. Просто мне кажется, что ставить оптический датчик и шаговый двигатель на радиоуправлямую машинку - из пушки по воробьям. Лучше уж камеру поставить с сервоприводом, повеселее будет, как мне кажется :)

8 минут назад, eu_tomat сказал:

Ну, а как принудительно установить на нужный угол? Шаговый двигатель не имеет такой возможности. Можно лишь сместить на нужный угол относительно исходного. И снова встаёт вопрос, как определить угол? Исходный или конечный, без разницы.

 

Я тут, кстати, нагуглил, что есть сервоприводы, способные вращаться на 360 градусов. Но у них та же проблема, что и у шаговых двигателей: есть возможность задать скорость вращения, но абсолютный угол определить или задать невозможно.

По сути, можно использовать недостаток сервоприводов которые не могут вращаться на 360 градусов - крутануть например на 260 градусов вправо, и рано или поздно сервопривод установится в нужное положение. А там уже можно прыгать от исходного положения. 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
18 минут назад, BrightYC сказал:

Погрешность то в любом случае будет. Просто мне кажется, что ставить оптический датчик и шаговый двигатель на радиоуправлямую машинку - из пушки по воробьям. Лучше уж камеру поставить с сервоприводом, повеселее будет, как мне кажется :)

Погрешность будет, это понятно. Мне не понятно, может ли сместиться оптимум при работе в других условиях: просело напряжение на батарее, износился сервопривод и т.д. Машинка, кстати, не радиоуправляемая. Вайфай мне нужен в основном для отладки.

 

Кстати, об отладке. Платформа NodeMCU поддерживает выполнение произвольного Lua-кода? Требуются функции load и pcall.

 

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

 

18 минут назад, BrightYC сказал:

По сути, можно использовать недостаток сервоприводов которые не могут вращаться на 360 градусов - крутануть например на 260 градусов вправо, и рано или поздно сервопривод установится в нужное положение. А там уже можно прыгать от исходного положения. 

У них вроде бы и так есть два крайних положения: ноль и один, управляется скважностью через PWM. Тут проблем в том, что скорость работы этих сервоприводов неизвестна. Почти как неопределённость Гейзенберга: либо в режиме реального времени известен относительный угол, либо известен абсолютный, но с некоторой задержкой. Поэтому я не знаю, как применить эту идею.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 минуты назад, eu_tomat сказал:

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

А зачем распознавать преграды микроконтроллером?=)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
9 минут назад, eu_tomat сказал:

Кстати, об отладке. Платформа NodeMCU поддерживает выполнение произвольного Lua-кода? Требуются функции load и pcall.

Подожди, пожалуйста, пару минут. Нужно уточнить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

load не принимает строку в качестве аргумента. Требует функцию. Но есть dofile, у NodeMCU файловая система, похожая на OpenComputers'овскую. 

Насколько я понял, можно сделать что-то вроде pclal(loadfile("test.lua"))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 минуты назад, BrightYC сказал:

А зачем распознавать преграды микроконтроллером?=)

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

Да, цель в создании именно автономного робота, способного видеть и обходить препятствия без участия человека. Я неточно сформулировал цель. Робот должен объезжать препятствия без помощи человека. Никакого читерства в виде миллионов лет эволюции. Объезжать препятствия за счёт человеческого интеллекта как раз и будет "из пушки по воробьям".

 

Цели пугать кота я не ставил. Пугать как раз можно было бы ультразвуковым датчиком. А этого я хочу избежать. Кота я планирую троллить: в автоматическом режиме надо найти кота, подползти, выполнить замысловатый танец и попытаться сбежать. Но это дело будущего. Сначала нужно научить робота обходить преграды, это задача-минимум.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
24 минуты назад, eu_tomat сказал:

Да, цель в создании именно автономного робота, способного видеть и обходить препятствия без участия человека. Я неточно сформулировал цель. 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Лучше взять нормальный микроконтроллер, а это годится разве только для мигания светодиодом.

 

Можно прикрутить одну камеру, но скорость работы вообще никакая.

Видел конструкции, где делались два снимка, вычислялась карта глубины и робот прокладывал маршрут. Довольно костыльно, но работает.

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

 

Можно взять какой-нибудь нормальный проц на ARM, вроде STM32. Такая мощь не снилась оберткам для всяких луа, жаваскриптов и прочих пистонов. К тому-же цена в разы меньше.

Памяти все-равно ни на что серьезное не хватит, поэтому, через вафлю можно подключиться к серверу с нормальным железом и использовать тушку робота только в качестве аватара.

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

Шаговые двигатели дают точность, но не мощность. При том, что точность тоже немного плавает, где они используются. Плюс нужен датчик и обвязка для нормальной работы.

 

Вот пример нормальной начинки для робота https://www.youtube.com/watch?v=8LSrYU5G61M

Единственное, что не купить и не выдрать из каких-нибудь потрохов - сканирующий дальномер.

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, Doob сказал:

Лучше взять нормальный микроконтроллер, а это годится разве только для мигания светодиодом.

Лучше для какой задачи?

 

3 часа назад, Doob сказал:

Единственное, что не купить и не выдрать из каких-нибудь потрохов - сканирующий дальномер.

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

Немного изучив тему, я тоже склонился к лидарам. Потребление энергии лидаром на фоне приводов меня не беспокоит.

 

Но с лидарами мне пока не всё понятно. Есть, например GY-530 VL53L0X с получением данных по шине I2C, там в характеристиках указано время <30ms. Что это значит? В течение некоторого времени сенсор должен оставаться неподвижным? А есть, например GY-53-L1X VL53L1X, там про время ничего не сказано, а ещё у него есть выход ШИМ. Даёт ли ШИМ возможность непрерывного сканирования без необходимости останавливать движение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
11 час назад, BrightYC сказал:

load не принимает строку в качестве аргумента. Требует функцию. Но есть dofile, у NodeMCU файловая система, похожая на OpenComputers'овскую. 

Насколько я понял, можно сделать что-то вроде pclal(loadfile("test.lua"))

А loadstring принимает строку lua-кода?

 

У меня вот ещё какой вопрос. Как у NodeMCU дела с математическими функциями? Синусы с косинусами придётся самому вычислять? Как там вообще осуществляются вычисления с плавающей точкой? Какова максимальная разрядность при работе с целыми числами?

 

Я тут подумал, что в принципе приводу поворота головы не обязательно знать начальный угол. Привод можно откалибровать при старте программы за два сканирования. Между сканированиями надо выполнить одно движение вперёд или назад. Причём, движение не обязательно откалиброванное. Главное, чтобы во время калибровки на пути робота ничего не стояло. Ещё думаю, алгоритм может запутаться при сканировании решетчатых структур, но тут должно помочь сглаживание. Правда, тригонометрия нужна в любом случае. Без синусов я пока не смог придумать калибровку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, eu_tomat сказал:

У меня вот ещё какой вопрос. Как у NodeMCU дела с математическими функциями? Синусы с косинусами придётся самому вычислять? Как там вообще осуществляются вычисления с плавающей точкой? 

Я думаю математические функции не тронуты, было бы глупо. Но нужно проверить

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
6 часов назад, BrightYC сказал:

Я думаю математические функции не тронуты, было бы глупо. Но нужно проверить

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

 

Я тут узнал, что для NodeMCU есть альтернативная прошивка, поддерживающая лишь целочисленную арифметику. По умолчанию вроде бы используется арифметика с плавающей точкой. Это, конечно сказывается на быстродействии, но зато снижает порог вхождения в программирование этих микроконтроллеров.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...