Подарок любимой на 14 февраля от электронщика

в 23:47, , рубрики: arduino, diy или сделай сам, stm32, WS2812, гаджеты, Лайфхаки для гиков, подарок гика, подарок девушке, Программирование, программирование микроконтроллеров, метки:

Приветствую тебя читатель GT.
Для меня как человека технического и не сильно романтичного выбор подарка на любое торжество — невероятная боль. Все было бы просто если моей любимой можно было подарить оперативку в ноут или горку процессоров, но она ни разу не технарь.
Ну а поскольку: Не так дорог подарок, как дорого внимание (с) — попробуем вложиться временем.
Представляю вашему вниманию «Сердце v1.0»

Подарок любимой на 14 февраля от электронщика - 1


Основная идея устройства была придумана коллективно с моей командой еще для «Елки v1.0». Кратко набор функций:
— гравированное поздравление на сердце
— питание от ЗУ телефона (разъем microUSB)
— RGB подсветка с возможностью записи профилей мигания, переключаемых по кнопке
— режим ночника
— встроенная память для записи поздравления. При подключении к ПК определяется как флешка.

Подискутировав/порадовавшись заложенному функционалу мы решили делать — никто тогда не подозревал каких временнЫх затрат потребует сердце…

Железо.

Как оказалось — самая простая часть сердца. Первым делом была составлена структурная схема устройства
Подарок любимой на 14 февраля от электронщика - 2
Детали брались из тех, что были у нас на складе, а также уже не раз использованы в устройствах. По схеме можно сказать: самый дешевый МК с USB на борту STM32F042F6P6, простой LDO — XC6206P332MR, 32Мбит SPI память W25Q32FVSSIG (на плату заложили 2 шт, но в итоге паяли одну), управляемый RGB светодиод WS2812.
Принципиальная схема:
Подарок любимой на 14 февраля от электронщика - 3
Минимум деталей и самый главный просчет — надежда на то, что WS2812 будет нормально работать от уровня 3,3В (Славик! Да я сто раз так делал… говорили многие)
Плата была сделана минимальной ширины, с целью максимально спрятать ее под гранью сердца. Цвет белый. Полученный результат на рисунке.
Подарок любимой на 14 февраля от электронщика - 4

Фейл.

Помните я упоминал про робкую надежду на то, что WS2812 будет работать от уровня 3,3В? Так вот не будет!!! Точнее все вроде как работало до начала обмена по USB. При этом начинал сбоить канал Blue. Долго искали проблему в ПО, думая, что не хватает ресурсов процессора, но потом подтянули ногу PB1 к 5В через резистор 1кОм и все заработало четко. При этом уровень лог.1 стал примерно 4,3В. Понимаю, что так делать не хорошо, но выбора не было. На плате получился довольно элегантный «колхоз»:
Подарок любимой на 14 февраля от электронщика - 5

Софт МК.

Для облегчения программирования МК было решено использовать STM HAL Library, поскольку уже почти все есть, надо только добавить логику и соединить все ее модули между собой. В этом нам, от части, помог STM32CubeMX — генерацию большей части кода можно возложить на него. Впрочем тут каждый решает для себя — сгенерированный код все равно придется существенно править, и платить придется размером прошивки — библиотека HAL не из компактных.
Тем не менее, в нашем микроконтроллере доступно 32кб, прошивка займет чуть больше половины, поэтому логично в оставшейся памяти хранить последовательности из трех байт (R-G-B), которые и передавать по очереди на вход светодиода. Нажатие кнопки будет по кругу переключать последовательности, которые записаны во флеш МК.
Здесь мы сталкиваемся с первой проблемой: светодиод WS2812 очень требователен к периоду и длительности импульсов, при том что время импульсов (0.4-0.8мкс) достаточно мало для процессора работающего на 48МГц. Кроме того, надо учесть, что кроме управления светодиодом, наш мк должен будет еще обслуживать общение с ПК по usb и чтение/запись флеш памяти.
К счастью, этот диод довольно популярен и в интернете описано несколько способов реализации его протокола, в том числе и на микроконтроллерах STM. Мы выбрали, пожалуй, один из самых сложных с точки зрения реализации, но и одновременно самый эффективный с точки зрения процессорного времени — DMA + таймер. DMA пишет непосредственно в GPIO порт, таймер управляет каналами DMA. Поскольку DMA пишет во весь порт разом, то использовать другие выводы порта как выход не получится. Именно поэтому для управления светодиодом был выбран вывод PB1. Идеологически все просто, но с реализацией пришлось бы изрядно повозиться, если бы не замечательная библиотека, которую написал Martin Hubáček и выложил на github. После небольшого допиливания под наш МК и выбранный способ хранения RGB последовательностей, мы получаем работающий светодиод.

Флеш память.

Представьте, подарили Вам сердечко с персональным поздравлением. Приходите Вы, радостный, домой, подключаете его к компьютеру, а оно, вместо «Люблю!», выдает Вам «Не найден необходимый драйвер устройства» или еще что-нибудь в этом роде. Нехорошо.
Поэтому сердце должно распознаваться как флеш накопитель в любой из распространенных операционных систем, не требуя установки драйверов. Поэтому будем использовать класс usb под названием «Mass storage device», благо STM32 USB Device Library предоставляет нам готовое решение. Стоп! Готовое???? Сейчас посмотрим.
Создаем проект в STM32CubeMX, соединяем методы read/write для spi флэш памяти с соответствующими вызовами в модуле usb mass storage и обнаруживаем сразу две проблемы: флешка не хочет безопасно извлекаться и «захлебывается» при попытке записать на нее что-нибудь больше чем текст «Hello World» в файле README.txt.
Первую проблему решить легко — нужно реализовать отсутствующую обработку SCSI команды StartStopUnit. Вторую решить сложнее. Размер блока файловой системы (естественно, располагая лишь 8мб места, мы будем использовать Fat16) 512 байт. Память умеет стирать только блоками по 4кб. Придется резервировать один из блоков под временное хранилище (занять 4кб оперативной памяти при имеющихся 6кб мы себе позволить не можем). То есть чтобы записать 512 байт, придется скопировать 4кб, стереть 4кб, и скопировать их обратно. Мало того, если файл достаточно большой, операционная система хочет записывать на накопитель по 64кБ за раз, и наш контроллер не способен обслужить такой большой для него объем данных за нужное время, учитывая что используемый флеш накопитель тоже не самый быстрый. В общем, пока контроллер неспешно пишет данные по 256 байт за раз (размер страницы памяти), операционная система (по крайней мере Fedora, на которой все это тестировалось) уже успевает решить, что накопитель пал смертью храбрых.
Знатоки наверняка укажут более элегантное решение проблемы, но «мы пойдем другим путем». Чтение флеш памяти будет по интерфейсу mass storage device и в этом режиме он будет позиционировать себя как Read-Only (заодно сердце можно будет спокойно «вырвать» из компа без всяких «безопасных извлечений», но боясь попортить файловую систему), а записывать его будем через виртуальный com-порт (aka Communication Device Class). Через этот же интерфейс будем записывать в конец памяти МК наши RGB последовательности.
Режим загрузки (mass storage или cdc) будем выбирать при загрузке по нажатой (или нет) кнопке.
Сказано — сделано (как всегда, на эти два слова было потрачено основное количество времени и кофе). Возвращаем read-write в MSC интерфейс, поскольку обнаруживается что в режиме read-only macOs отказывается распознавать флешку, — не беда, тут мы обманем операционную систему и будем возвращать «success» на любой запрос записи, ничего при этом не делая (опять же, решение из разряда «пусть не элегантно, зато дешево и сердито»). Дело за малым — софт для ПК.

Софт ПК.

Поскольку настройку и прошивку решено было производить по интерфейсу cdc, просто перетащить файлы мышкой уже нельзя и нужно специальное приложение, которое будет уметь это делать. Его основная задача: предоставить пользователю возможность создать образ диска, накидать туда пользовательские файлы и записать этот образ в флэш память. Также приложение должно предоставлять интерфейс для создания/чтения/записи RGB последовательностей.
Приложение должно быть кросс-платформенное, и тут нам на помощь приходят библиотека Qt для создания графического интерфейса и FatFS от ChaN для создания и управления образом диска. Обмен данными с устройством через com-порт доступен в Qt последних версий «из коробки» (модуль QSerialPort), для операций с образом диска используем QTreeView с item model, наследованной от QabstractItemModel, в которой дополнительно реализованы операции Drag&Drop (что ни говори, «перетащить мышкой» удобно и привычно, если речь идет о файлах/папках). Для создания RGB последовательностей пригодится QListWidget (для отображения последовательности цветов), библиотека QtColorWidgets (автор Mattia Basaglia) для выбора цвета и встроенный в Qt класс QEasingCurve для плавных (или наоборот скачкообразных) переходов между цветами и создания эффекта радуги.
Результат: приложение имеет две вкладки
1) «Storage» для файлов

Подарок любимой на 14 февраля от электронщика - 6

2) «LED» для управления RGB последовательностями

Подарок любимой на 14 февраля от электронщика - 7

Диалог создания RGB последовательности:

Подарок любимой на 14 февраля от электронщика - 8

Диалог работает в трех режимах:
а) RGB — позволяет задавать переходы между двумя цветами заданными в нотации RGB.
б) HSV — то же самое, но в нотации HSV — перелив получается более привычный для человеческого глаза, в частности режим «HSV» + «Iterate->HUE» позволяет создавать радуги.
в) Custom — этот режим дает возможность задать каждый цвет последовательности вручную. Большие последовательности так не составить, в вот погасить сердце на какое-то время (задав цвет «черный») в этом режиме как раз очень удобно.

Ну и, наконец, определение нашего устройства как флешки в Windows/macOs/Linux(Gnome):

Подарок любимой на 14 февраля от электронщика - 9

Подарок любимой на 14 февраля от электронщика - 10

Подарок любимой на 14 февраля от электронщика - 11

Заключение.

И вот после всей проделанной работы и написанного текста я обнаружил, что не сделал ни одной нормальной фото самого сердца. Поэтому прилагаю вариант «как получилось»:

Подарок любимой на 14 февраля от электронщика - 12

Подарок любимой на 14 февраля от электронщика - 13

В реальности смотрится прекрасно (особенно при наличие гравировки). Любите своих близких!!!

Автор: vladimir_open-dev

Источник

Поделиться

* - обязательные к заполнению поля