Привет, Хабр! Пришло моё время начать писать статьи сюда. И первая моя статья будет посвящена новогодней игрушке. Прошу не судить строго.

В 2019-м году Я приобрел 50 микроконтроллеров CH32V003F4P6 по 11 рублей за штуку. В этом году решил пустить их в дело. И первое, что пришло в голову, это сделать игрушку к новому году. Кроме того, появилась возможность лично попробовать WS2812B.

Схема и печатная плата устройства были разработаны в свободной САПР KiCad 9.0. Прошивка написана в среде MounRiver Studio Ⅱ, от производителя микроконтроллера Nanjing Qinheng Microelectronics.

Схема устройства получилась достаточно простой, даже примитивной. В её основе RISC-V микроконтроллер CH32V003F4P6 и адресные светодиоды WS2812B. Так же в схеме есть разъём питания, разъём программирования и куча конденсаторов по питанию. Питание платы внешнее, номиналом 5 В.

Рис. 1. Схема новогодней игрушки.
Рис. 1. Схема новогодней игрушки.

Светодиоды WS2812B Я подключил на линию MOSI модуля SPI микроконтроллера. Такое решение мне показалось самым простым. Светодиоды WS2812B управляются по однопроводной линии с NRZ протоколом Длительность одного бита должна быть примерно равна 1.25 ± 0.6 мкс, а ширина импульса задаёт значение бита. При передачи 0, длительность высокого уровня должна быть равна 0.4 ± 0.15 мкс. При передачи 1, длительность высокого уровня должна быть равна 0.85 ± 0.15 мкс. Для сброса светодиода передаётся сигнал низкого уровня длительностью более 50 мкс.

Рис. 2. Протокол светодиода WS2812B.
Рис. 2. Протокол светодиода WS2812B.

Выглядит не очень удобно, но как оказалось этот протокол можно легко реализовать используя модуль SPI, работающий на частоте 6 МГц (или кратно выше). При частоте 6 МГц длительность байта равна 1.3(3) мкс. Длительность 3 бит равна 0.5 мкс, а длительность 5 бит равна 0,83(3) мкс. Эти значения идеально подходят для управления светодиодом. Для передачи 0 нужно отправить через SPI значение 0xE0, для передачи 1 значение 0xF8. Модуль SPI настроен так, что бы первым отправлять старший бит (SPI_FirstBit_MSB). Для сброса светодиодов нужно отправить пачку нулей, не менее 38, но лучше больше, так как у генератора микроконтроллера есть погрешность частоты.

Рис. 3. Реализация протокола WS2812B с использованием SPI.
Рис. 3. Реализация протокола WS2812B с использованием SPI.

Дальше в том же KiCad Я выполнил трассировку печатной платы. Плату сделал в форме треугольника. Плата имеет двухстороннюю металлизацию и один слой шелкографии.

Рис. 4. Плата в САПР KiCad 9.0.
Рис. 4. Плата в САПР KiCad 9.0.

Платы заказал в Китае с оплатой и доставкой через один популярный сайт. Но перед этим через Online Gerber View сформировал изображение платы. Делаю так в целях проверки правильности формирования Gerber файлов. Раньше случались ошибки.

Рис. 5. Изображение платы выполненное на основе файлов Gerber.
Рис. 5. Изображение платы выполненное на основе файлов Gerber.

Заказал платы 17 ноября, а уже 22 ноября менеджер прислал мне фотографию плат перед отправкой. 30-го ноября платы пришли в почтовое отделение и уже 1 декабря они были спаяны. Видно, что разъём питание припаян с обратной стороны платы, так оказалось удобнее.

Рис. 6. Упакованные печатные платы.
Рис. 6. Упакованные печатные платы.
Рис. 7. Готовая печатная плата.
Рис. 7. Готовая печатная плата.

Для питания плат изготовил простой переходник. Он состоит из готового кабеля с разъёмом XHP-2 и разъёма USB-A. На фотографии кабель короткий, часть из них Я удлинил на метр.

Рис. 8. Новогодняя игрушка с кабелем.
Рис. 8. Новогодняя игрушка с кабелем.

Следующим этапом было написание прошивки микроконтроллера в MounRiver Studio Ⅱ. Не сложно для тех у кого есть опыт программирования микроконтроллеров STM32. Очень похоже. Платы прошивал через программатор WCH-LinkE-R0-1v3. Сделал множество режимов индикации, но самым красивым считают бегущие RGB огни.

Рис. 9. Один из режимов работы игрушки.
Рис. 9. Один из режимов работы игрушки.

Ссылка на проект в GitHub

На этом всё. Всем спасибо. Поздравляю с наступающим Новым Годом!