Светодиодная ёлка с подарками, управляемая по Wi-Fi.

Введение

Мой сын Алексей предложил сделать ёлку из светодиодов, для украшения прихожей. Естественно, чтобы она мигала. Ну, папа подумал, подумал… Сделали на ESP8266 (в варианте ESP-201), разноцветных светодиодов, мощных транзисторов (добытых из балластов люминесцентных ламп), сопротивлений, пары разъёмов от флоповодов.
Алексей помогал припаивать светодиоды, Николаю поручили написать программу в среде Arduino, с простенькой веб страничкой для загрузки новых “мелодий”.

Железо

Сначала прикинули с ребёнком рисунок ёлочки и подарков на листе бумаги. Набросали черновой вариант разводки шин питания. Из-за выбранной схемы подключения (см. ниже), общей шиной является +5В (а не земля).

Внимание! Разные светодиоды имеют разное падение напряжение и рассчитаны на разный максимальный ток. Для ограничения тока через светодиод проще всего использовать сопротивление. Поскольку у нас напряжение питания для светодиодов было порядка 5.4 Вольт, можно было некоторые светодиоды (на которых падает < 2.5 Вольт) ставить в пары последовательно. Это увеличивает эффективность схемы (меньше энергии рассеивается на сопротивлении).
Для расчёта сопротивлений можно использовать онлайн калькуляторы.

Для основы вырезали картонку из коробки для пиццы.

Для припаивания ножек светодиодов к железной проволоке использовали флюс, без него припаять трудно. Рассчитанные сопротивления подпаяли сразу к светодиодным блокам. Вышло немного аляповато, зато быстро и наглядно. Чтобы сделать конструкцию модульной, т.е. чтобы “дисплей” можно было отсоединять от платы, отдельные элементы припаял к разъёмам от флоппи дисководов, срезанных с шлейфа проводов компьютерного блока питания.

Для управления используется ESP8266, купленный в варианте ESP-201. (Для тех, кто не знает что это такое ESP8266, можно посмотреть здесь. Грубо говоря, это Arduino с встроенным Wi-Fi. Модули ESP-201 можно приобрести на Aliexpress за ~150р).
Разумеется ESP8266 не может напрямую питать такие мощные нагрузки, поэтому я использовал NPN транзисторы подключенные по схеме с общим эмиттером. Ниже приведена принципиальная схема (на три группы светодиодов). Резисторы R1-R3 нужны для работы самого контроллера, R4-R6 для ограничения тока на выходах контроллера через базы транзисторов, R7-R9 для ограничения тока на светодиодах. Номиналы последних не указаны, поскольку зависят от количества, характеристик и схемы подключения светодиодов (см. онлайн калькулятор выше). В принципе, R1-R6 можно выбирать в широком диапазоне (1к – 20к). При слишком маленьких значениях можно спалить контроллер, при слишком больших не откроется транзистор. Транзисторы выпаял из балластов для люминесцентных ламп (имеющихся в наличии в связи с плановой заменой освещения) и старого компьютерного блока питания.

Схему я сначала собирался спаять на макетной плате для пайки, но с первого раза не получилось. И поскольку время поджимало, использовал макетную плату с гнёздами. К транзисторам припаял трёх штыревые разъёмы.
Внимание! Транзисторы не должны соприкасаться корпусами.
Для преобразования 5 Вольт в 3.3 Вольта, необходимые для контроллера, я использовал готовый миниатюрный преобразователь. Он поддерживает ток до 800мА, что достаточно для контроллера.
Основной блок питания – зарядка от какого-то почившего гаджета, выдающая 5.4 Вольта на 1.850 Ампера. Разъём питания я использовал аналогичные используемым во многих игрушках для зарядки аккумуляторов. Для включения/выключения – микро переключатель.
Вот картинки от использованных компонентов:

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

Софт

Для программирования использовалась среда Arduino настроенная для ESP8266. Более подробно на гитхабе. Программа основана на примере стандартного веб сервера. Разбирает POST от формы и на основе значения аргумента, в цикле, настаивает цифровые выходы контроллера. Контроллер подключен в домашнюю Wi-Fi сеть и настроить системы можно с любого компьютера или смартфона.

Коля придумал длинную “мелодию”, которую пока и оставили. Видео есть на Facebook.

Учебный проект: записываем анимацию на карточки метро

Этот проект мы сделали совместно с моим сыном Николаем. Я помог на начальной стадии со сборкой устройства, программированием на Python занимался Николай.

Железо

Проект сделан на Raspberry Pi B+, NFC датчике от ELECHOUSE на базе чипа PN532, LED матрице 8*8 на базе MAX7219.

RaspberryPiBplus
PN532-7 matrix

Матрица подключена по интерфейсу SPI, для работы использовались библиотеки из этого проекта. NFC датчик также был подключен по SPI, только уже эмулированному на цифровых пинах. Для работы с ним использовались библиотеки от аналогичного модуля от Adafruit.

MiFare Ultralight

Как известно, Московский метрополитен использует бесконтактные карточки Mifare для прохода на станции. Разумеется, тема чтения/записи таких билетов широко известна в узких кругах. Мы тоже начали со считывания и вывода в консоль количества оставшихся поездок. Но поскольку метро мы часто не пользуемся, дублировать метрошный девайс для отображения аналогичной информации было как-то не интересно.
Изучив теорию в популярной форме, мы заинтересовались возможностью записи на карточки и использования их просто как носителей информации. Вообще на карточках Ultralight есть 12 блоков по 4 байта, доступных для записи. На наших билетах нам удалось перезаписывать нижние 8 блоков по 4 байта, т.е. всего 32 байта.

Софт

В качестве полезного упражнения я подал идею записывать на карточки простенький мультфильм для LED матрицы. Таким образом поднося разные карточки к считывателю, можно проигрывать разные анимации. Первоначальная идея была записывать 4 полных кадра. Николай усовершенствовал систему заменив последний кадр на управляющую последовательность, описывающую, как показывать оставшиеся три кадра (повторения, паузы и т.д.).

1Программа на Python’e разрабатывалась под Windows, с использованием IDE JetBrains PyCharm.  На Raspberry была установлен стандартный Raspbian (Jessy), из специальных настроек – был разрешён SPI. Доступ к Raspberry был только по SSH (SuperPutty), SFTP (Filezilla). Так что заодно оттачивалось мастерство работы в shell 🙂

Выводы

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

С течение времени у нас появлялись и другие идеи использования карточек в играх, например:

  • В играх типа монополии можно сделать “настоящие” кредитки.
  • В играх с карточками, где у героев есть разные способности, можно автоматически рассчитывать результат сражения.
  • Чипы из карточек можно прикреплять к внешне одинаковым предметам для идентификации.
  • Уникальные неперезаписываемые идентификаторы карточек можно использовать для доступа в помещения, открытия ящиков с вещами и т.п.

Возможно что-то из этого мы и сами сделаем, на то они и каникулы 🙂

Робот из пылесоса

Проект придумывался для совместной работы с моими детьми: Николаем (12 лет) и Алексеем (8 лет). В попытке заинтересовать детей чем-то развивающим, купил для экспериментов платы Стрела (Arduino Leonardo) и RaspberryPi B+.

После некоторых мучений Стрелу удалось подружить с детской средой разработки Scratch. (Мучения заключались в модификации протокола связи в Scratch 1.4 (сделан на Squeak Smalltalk). На стороне Arduino просто С, так что всё намного проще.)

Мы сделали пару интересных проектов, например, радар из сервопривода и ультразвукового датчика расстояния. С младшим мы написали программу на Скретче для вращения сенсора в секторе 180 градусов, со старшим получали по сети на его компьютере данные о расстоянии до препятствия и текущий угол. Затем рисовали на круговой диаграмме. Делали на PascalABC.NET, они его в школе используют.

Scratch

Но, конечно, всё это стало не интересно когда дети увидели в Интернете многочисленных подвижных роботов на базе Arduino.

Пока я придумывал как-бы к этому подступиться без особых капитальных затрат, у нас сгорел пылесос 🙂 Ну, я его разобрал, там внутри какая-то ерунда (с). Накрылся двигатель, из которого он вообщем-то и состоит. После демонтажа двигателя остался отличный, переживший годы жестокой эксплуатации корпус, с двумя колёсами сзади и одним поворотным роликом впереди. Так мы получили платформу для нашего прототипа. И вот что вышло:

Robot

Управление

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

Raspberry отвечает за функции “высокого уровня”. Подключение по Wi-Fi в домашнюю сеть, сервер “Remote Sensors Protocol” для интеграции со Scratch по TCP/IP, небольшой WWW сервер для альтернативного канала управления, видео сервер. Между собой платы общаются по последовательному порту USB, с помощью простенького самодельного текстового протокола. Для Raspberry всё написано на Python’е, ну кроме видео сервера, он готовый.

Платформа

Все печатные платы прикручены к общей панели. Под ней расположена свинцовая аккумуляторная батарея на 12В от ИБП, и два серво мотора постоянного вращения.

_DSC0004 (Small)

Моторы закреплены с помощью изогнутых деталей от детского конструктора (вот где пригодился бы 3D принтер!). Вращение на колёса передаётся через пластиковые “звёздочки”, которые шли в комплекте с мотором. Для них в колёсах пылесоса были сделаны пропилы. Серво двигатели были выбраны из-за большого крутящего момента, тогда как большая скорость не нужна, диаметра колёс достаточно большой.

_DSC0005 (Small)

Питание

Напряжение от 12В батареи подаётся параллельно на три устройства. На плату Стрела, которая имеет собственный стабилизатор напряжения. На DC-DC конвертер для преобразования в 5В для питания Raspberry. И на DC-DC конвертер в 7В для подачи на двигатели. В принципе, двигатели и Raspberry можно было запитать от одного конвертера, но я опасался просадки напряжения при старте или из-за блокировки двигателей и, как следствие, перезагрузки Raspberry. Получилась схема, устойчивая к падению напряжения на батарее до 7В.

Кнопка включения питания взята от самого пылесоса. Замечательная вещь, проработала много лет, коммутируя килловатную нагрузку, и хоть бы что.

_DSC0003 (Small)

Дополнительные сенсоры

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

_DSC0002 (Small)

RaspberryPi B+ имеет четыре порта USB. Кроме Стрелы и Wi-Fi адаптера, я подключил веб камеру и мышку.

Камеру использует стандартный пакет motion, благодаря нему изображение с камеры можно посмотреть в обыкновенном броузере с любого компьютера в квартире. К сожалению, присутствует приличная задержка и Raspberry этот сервис грузит примерно на 25%. Но всё равно дистанционно управлять роботом получая с него картинку реально круто 🙂

Мышка стала попыткой создать датчик движения. Оказалось что в Python’е достаточно просто считывать координаты с USB мышки, вращение колёсика и нажатия кнопок. План был составлять карту передвижений робота и рисовать её на удалённом компьютере.

_DSC0006 (Small)

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

В принципе идея работает, но обнаружились две проблемы:

  • для корректной работы сенсора мыши нужно, чтобы он был близко к поверхности. Перефокусировать сенсор на большее расстояние не вышло. Под рукой у меня нашлась всего пара линз, и они не подошли. В качестве временного решения я собрал узел для подвижного крепления мыши. Он позволяет мыши скользить по полу и подниматься вверх. Так что робот может наезжать на небольшие препятствия типа ковра или порожка.
  • для полного определения положения робота на плоскости нужно знать две точки (=мышки). С помощью одной, даже расположенной впереди, не получается точно построить траекторию. При повороте колёса пробуксовывают, и нельзя точно определить точку вокруг которой поворачивает корпус даже на ровном месте. Ну и геометрия тут уже получается сложновата для 6-го класса.