Русский
Русский
English
Статистика
Реклама

Diy или сделай сам

Беспроводная мини погодная станция с e-paper экраном на батарейках

25.02.2021 12:15:55 | Автор: admin
Приветствую всех читателей Habr! В своей сегодняшней статье хочу поделиться с вами своим новым устройством датчиком температуры, влажности и давления с функцией предсказания погоды. Датчик работает на микроконтроллерах nRF52. Данный проект это логическое продолжение этого проекта. В новом датчике используется дисплей на электронных чернилах размером 2.9 дюймов. В датчике установлен сенсор BME280, так же есть место под установку датчиков SI7021, HTU21D. Работает от батареек CR2450. Может передавать данные в системы Умного Дома, так же может работать в режиме без сети.




Для этого проекта был выбрана модель дисплея на электронных чернилах GDEH029A1 размером экрана 2.9 дюймов. Примерно через 3 месяца тестирования на смену этому дисплею производители выпустили на рынок новую модель GDEM029T94(V2 по версии Waveshare).
Старую модель стало трудно купить, поэтому пришлось добавлять поддержку нового дисплея в проект.



Характеристики дисплеев:
Разрешение: 296х128
Диапазон рабочих температур: 0 50 C
Потребление в рабочем режиме: 3мА
Потребление в режиме глубокого сна: 1мкА
Минимальное время обновления экрана: 0.3 сек.

Разрабатывал сразу несколько вариантов плат под несколько вариантов радио модулей nRF52 от разных производителей. Остановился на модулях MINEW MS50SFA2 (nRF52832) и EBYTE E73 2G4M08S1C (nRF52840), E73 2G4M08S1E (nRF52833).



Модуль MINEW MS50SFA2 имеет небольшие размеры, но не очень большое количество выведенных ножек. В моем проекте были задействованы все доступные ножки MS50SFA2. У модулей E73 ножек на много больше, поэтому впоследствии была разработана расширенная версия датчика. В раcширеной версии добавлен активный биззер, датчик освещенности MAX44009, заменены батарейки с CR2450 на ААА.

Схема датчика



Корпус датчика печатается на FDM 3D принтере, что бы добиться более или менее приличного вида, корпус после печати необходимо отшлифовать наждачной бумагой и отполировать. Так как у датчика есть светодиод, а в расширенной версии датчик освещенности, то в корпусе необходимо было сделать два сквозных отверстия, после сверления отверстий, они были залиты полимерной смолой для SLA 3D принтера и засвечены УФ лампой, после этого отполированы.





ПО датчика было сделано для работы в сети MySENSORS, это открытый проект домашней автоматизации. К слову, датчик будет нормально работать и без сети. На данный момент в проекте поддерживается работа с двумя моделями дисплеев GDEH029A1, GDEM029T94. Возможно позднее будет добавлена поддержка трехцветных дисплеев.

Опишу немного функционал устройства. Устройство при подаче питания осуществляет попытку поиска сети, если сеть не найдена, то устройство переходит в основной режим работы без работы в сети (не шлет данные), но периодически делает короткие запросы на поиск сети(~раз в час). Интервал опроса сенсора один раз в минуту, обновление экрана и отправка данных(если сеть доступна) происходит при изменении данных температуры на 0.5C, влажности на 1%, давления на 1 единицу, уровня освещенности на 1 люкс, изменения прогноза по погоде. Интервал опроса батарейки задается пользователем в интервале от 1 часа до 24 часов, по умолчанию опрос один раз в 6 часов.

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

Описание алгоритма расчета прогноза погоды (NXP Application Note 3914 | John B. Young)

При работе в радиосети датчик передает данные:
  • Температура,
  • Влажность,
  • Атмосферное давление,
  • Уровень освещенности,
  • Прогноз погоды,
  • Уровень сигнала,
  • Уровень заряда батарейки,
  • Причина перезагрузки






Для компиляции нужной версии ПО необходимо сконфигурировать файл MyConfig.h.
В файле задаются:
  • Язык вывода информации (RU,ENG)
  • Режим оптимизации питания при передаче данных
  • Подключение датчика освещенности
  • Подключение активного биззера
  • Скорость передачи данных
  • Версия подключенного дисплея


//#define EINK_V1#define DCPOWER#define LIGHTSENS#define BIZZER#define LANG_EN//#define MY_DEBUG//#define MY_PASSIVE_NODE//#define MY_NODE_ID 101#define MY_RADIO_NRF5_ESB#define MY_NRF5_ESB_MODE (NRF5_1MBPS)//#define MY_NRF5_ESB_MODE (NRF5_250KBPS)#define MY_RESET_REASON_TEXT#define SN "EFEKTA WeatherStation 290"#define SV "0.45"


Потребление датчика в режиме сна составляет в среднем 3мкА (на nRF52840 больше), в режиме считывания сенсора и обновления экрана 5мА(среднее), в режиме передачи данных 8мА(среднее), время передачи одного сообщения 10мc (идеальные условия).

Проект датчика в варианте с модулем MINEW MS50SFA2 может быть легко повторен. Из сложных моментов можно выделить пайку разъема под шлейф экрана. Как это сделать проще рекомендую посмотреть мое короткое видео по пайке разъема. Так же датчик можно приобрести готовым, тем самым поддержав мои открытые разработки.

Видео пайки разъема



Фото датчика

















Видео с демонстрацией работы датчика



GitHub проекта github.com/smartboxchannel/

В файле readme находится инструкция по установке и настройке среды для редактирования и компиляции ПО для датчика.

В завершении сделаю небольшой фото анонс проектов с которыми в скором времени поделюсь и о которых раскажу.

Новые проекты на стадии тестирования
Датчик качества воздуха на батарейках с e-paper экраном(аналогов не нашел)









Мини датчик влажности почвы с e-paper дисплеем(аналогов не нашел)










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

Всем, кто хочет делать устройства, начать строить автоматизацию своего дома, я предлагаю познакомиться с простым в освоении протоколом Mysensors телеграм-чат MySensors

А тем кто ищет достаточно взрослые решения для домашней автоматизации приглашаю в телеграм-чат Open Thread. (что такое Thread?)

Спасибо за внимание, всем добра!

Подробнее..

Запускаем DOOM на калькуляторе HP Prime G2

26.02.2021 16:11:32 | Автор: admin

Установить DOOM на какое либо устройство, это как водрузить знамя победителя на павшей крепости. Мне задали вопрос ну что, doom запустил? не менее 35 раз, когда узнали что я вожусь с данным калькулятором. Решил не разочаровывать публику и добиться запуска DOOM. Попутно, это стало неплохим тестом работоспособности оборудования, а также выявления неприятных багов. В общем, поехали!

Новости по проекту


Тем, кому интересно как же я запустил DOOM, могут пропустить эту главу и перейти сразу к следующей. Тут просто представлен текущий статус проекта.
Как вы помните в прошлых частях (часть 1 и часть 2), я занимался тем что ставил Linux на калькулятор, пересобирал u-boot, kernel, rootfs. С тех пор достаточно плотно занимался калькулятором и даже основательно разобрался с тем, что же было сделано в u-boot, kernel и device tree. Надо понимать, что это моё хобби, в свободное от основной работы и семьи время, поэтому не всё идёт быстро, и порой несколько алогично, просто потому что сегодня есть настроение делать так, а не иначе.
Главная новость состоялась, благодаря пользователю Alx2000y, который пригласил меня в чатик в телеге, где на аналогичном процессоре народ пилит свою прошивку для Xiaomi Gateway. Даже есть статья на хабре по теме. Народ уже сильно продвинулся в данной теме, невероятно расширив функционал устройства. И мне очень сильно помогли победить проблему nand. Как вы помните, в самом начале я свой образ nand затёр по глупости. В результате, у меня получилось достаточно большое количество виртуальных битых секторов, самое неприятное что битые сектора находились в самом начале и не давали записать туда u-boot. Ниже привожу список битых секторов, большинство из них виртуальные.

=> nand badDevice 0 bad blocks:  00000000  00020000  00040000  00060000  012c0000  04e20000  05280000  094c0000  17b20000  1ff80000  1ffa0000  1ffc0000  1ffe0000=> 

Ленар, из вышеупомянутого чатика, очень сильно мне помог, проблема решилась буквально двумя командами в u-boot:

nand erase.chipnand scrub.chipReally scrub this NAND flash? <y/N>y

После чего, проверяем количество битых секторов, и, о чудо, их стало значительно меньше!

=> nand badDevice 0 bad blocks:  1ff80000  1ffa0000  1ffc0000  1ffe0000

В результате, я теперь могу загрузить u-boot в нулевой сектор и произвести загрузку. На данный момент, калькулятор может быть загружен просто подав питание и будет полностью загружен linux, с работающим дисплеем и возможностью запуска программ по UART. Там даже корректно работает DOOM. Но, есть нюанс (С). Видимо драйвер клавиатуры как-то пересекается с драйвером ubifs, и в результате, если нажать любую клавишу на клавиатуре, то происходит мгновенное зависание калькулятора. Мне разок даже прилетел kernel panic, но я не сообразил его сохранить, чтобы хотя бы найти место этого пересечения. Так что на данный момент, всё однозначно работает в initramfs. Видео с демонстрацией работы загрузки nand, запуска DOOM и зависания постил в своём телеграмм канале.

Из других хороших новостей, попробовал поставить ubuntu на nand, тоже корректно работает. Пакеты, конечно, ставить нельзя, но в целом можно работать и использовать её, что тоже удобно. Но без работающий клавиатуры, эти игры пока лишены практического смысла.
В последней части я жаловался, что u-boot имеет разное поведение, при работе на nand и из ОЗУ. Я потратил два дня, ковыряния в исходных кодах u-boot, чтобы понять в чём же дело. А всё оказалось банально (даже стыдно). Утилита uuu, при запуске u-boot из памяти, передаёт туда свои переменные окружения. А точнее вызывает mfgtool_args и в результате строка переменной окружения загрузки выглядит таким образом:

bootargs=rdinit=/linuxrc g_mass_storage.stall=0 g_mass_storage.removable=1 g_mass_storage.file=/fat g_mass_storage.ro=1 g_mass_storage.idVendor=0x066F g_mass_storage.idProduct=0x37FF g_mass_storage.iSerialNumber= mtdparts=gpmi-nand:4m(boot),8m(kernel),1m(dtb),1m(misc),-(rootfs) clk_ignore_unused

Разумеется, если загрузиться с nand, то с такими параметрами ubifs в четвёртом разделе виден не будет. Поэтому после загрузки u-boot в ОЗУ, я принудительно задаю ему следующие переменные окружения:

setenv bootargs  console=ttymxc0,115200 ubi.mtd=4 root=ubi0:rootfs rootfstype=ubifs mtdparts=gpmi-nand:4m(boot),8m(kernel),1m(dtb),1m(misc),-(rootfs)

И всё отлично работает.
Поясню, зачем это нужно: если прошить загрузчик в нулевой сектор, пропадает возможность работы через mfgtool (утилита uuu). А на данном этапе, состоящем из разработки и отладки это основной инструмент. Поэтому проще оставить возможность работы утилиты uuu, и загружать каждый раз u-boot вручную.

Запуск DOOM


Переходим к самой интересной части к запуску DOOM на калькуляторе. Как вы понимаете, я не зря вначале расписал обо всех проблемах. Можно запустить DOOM при загрузке на NAND-флеш, там можно поставить карты всех видов, все возможные версии DOOM и вообще всего что душа пожелает. Но при запуске в ОЗУ, мы ограничены размером образа rootfs примерно в 15 МБ (практика показала, что 16 ещё прокатывает). В связи с этим, пришлось подбирать версию DOOM и делать правильную сборку, а также научиться с ней работать.
Оказалось, что всё хорошее давно придумано за нас, и DOOM можно собрать прямо в buildroot не вставая с дивана. Это я узнал, когда гуглил все возможные варианты DOOM для встраиваемых систем и пытался их собрать. Как оказалось, достаточно запустить:

make menuconfig

И выбрать DOOM. Это делается в "Target packages ---> Games --->"


В нашем распоряжении две версии DOOM: chocolate-doom и prboom. После нескольких экспериментов, я понял что chocolate-doom ну никак не хочет влезать в initramfs. Разве, если вообще убрать wad-файлы. Пытался найти обрезанные wad-файлы, которые бы влезали вместе с шоколадным думом. Но она с ними на отрез отказалась работать. В результате, я попробовал шоколадную версию установить на nand (вместе с prboom), и пробовал там. Подбирал параметры и т.д. Результатом экспериментом стала следующий способ запуска:

export SDL_NOMOUSE=1 chocolate-doom -geometry 320x240 -bpp 24 -nomouse

Итог меня сильно разочаровал: эта версия doom некорректно (или может наоборот корректно) растягивает экран, оставляя широкие полосы по краям экрана, что мне очень не понравилось.


Шоколадная версия DOOM. Видна чёрная полоса снизу.

При запуске, мне шоколадный дум говорит о том, что делает изменение размера окна:

I_InitGraphics: 320x240 mode not supported on this machine.I_InitGraphics: Auto-adjusted to 320x200x32bpp.

Поэтому, я остановился на prboom. Сделал образ вместе с шароварными WAD-файлами и самим prboom, всё лишнее убрал. Но, всё равно очень долго не мог заставить его работать. Читал всевозможные мануалы, искал как сконфигурировать, чтобы всё корректно работало. Изображение выводит, на кнопки реагирует, но экран коряво растягивает и выводит кривые цвета. Пока на каком-то форуме не нашёл идеальные параметры запуска.
В общем, для нашего калькулятора запуск prboom такой: отключаем мышку, и далее запускаем prboom со следующими параметрами:

export SDL_NOMOUSE=1 /usr/games/prboom -width 320 -height 240 -nosound -vidmode 32bit

Ключевой параметр здесь: "-vidmode 32bit".


Долго искал подходящие параметры, и только с этим всё завелось. Для удобства всё записал в скрипт d.sh. Наконец всё работает, можно даже играть!


Специально для вас, я подготовил обновлённую сборку flash_utility с DOOM, который вы можете запустить на своём калькуляторе даже без перепрошивки, и показать друзьям, мол вот, DOOM у меня в калькуляторе работает. Достаточно разобрать калькулятор, замкнуть контакты, описанные в первой части и запустить

sudo uuu doom.uu

В конце всех действий, вы получите калькулятор, с linux и DOOM. Чтобы запустить DOOM, надо будет залогиниться и на калькуляторе выполнить:

./d.sh

Резюмируя


DOOM работает! Можно ли в него играть? Ну локально, загружая с компьютера можно. Это выглядит круто и красиво, но на деле, не совсем то что хочется получить. В действительности будет круто, когда ты едешь в метро, взять и достать из широких штанин калькулятор, включить его (на данный момент режим энергосбережения не работает), и запустить DOOM. Вот это реально круто, играть в метро на калькуляторе в DOOM, Duke Nukem 3D, Quake I, II, III и т.д. Но факт остаётся фактом DOOM на этой железке запущен. Но ещё очень много работы.
В целом, не хватает хотя бы небольшого сообщества вокруг этого калькулятора (хотя бы больше меня одного), чтобы были тестировщики проблем, было с кем поговорить и поделиться, услышать совет. Первоначальный автор явно остыл к данному проекту, хотя и проделал титаническую работу. Я его хорошо понимаю, и никак не могу укорять за то, что он не хочет помогать даже советом по данному проекту. Ну так, небольшие рекомендации давал, но ему явно уже не до него. Поэтому если у вас есть идеи, калькулятор, желание помочь, хотя бы советом, пишите тут или в телегу, буду рад!

P.S. Зачем я этим занимаюсь?


Очень часто спрашивают меня нафига? Умом понимаю, что на данный вопрос отвечать глупо, но тем не менее отвечу.
Зачем художник рисует картину или автор пишет книгу? Будем честны, 90% книг, картин да и других произведений могут вообще не увидеть свет, а из тех кто увидят, доли процента станут известными и обретут широкий круг читателей. Проще говоря, большинство творцов делают бесполезный труд. Более того, множество произведений даже никогда не находят своего читателя, но что же им этого не делать? Что движет этими людьми? Всё достаточно банально. Ими движет простое чувство:


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

Файлы для скачивания




Подробнее..

Перевод Модернизация токарного станка под работу с ЧПУ

28.02.2021 12:13:00 | Автор: admin


В нашей домашней мастерской есть токарный станок по металлу Jet GBH-1340A с устройством цифровой индикации (УЦИ). Мы давненько обсуждали возможность добавить к нему ЧПУ, потому что без компьютерного контроля некоторые виды деталей чрезвычайно сложно изготавливать с высокой точностью. Статья повествует о полученном в этом процессе опыте, включая допущенные ошибки и рекомендации по их избежанию, а также детально раскрывает весь процесс от начальной комплектации до получения готового результата.

Подготовка


Тем не менее к проекту мы подошли с некоторой долей прокрастинации. С самого начала мы выбрали контроллер частотно-регулируемого электропривода для шпинделя, шаговые моторы NEMA 34 и драйверы для осей станка на основе того, что обнаружили в нашем фрезерном станке Tormach 770. Мы также нашли в интернете интерфейсную плату с параллельным портом для управления ЧПУ. Одним из основных критериев выбора всех запчастей была их дешевизна, хотя в конечном счете пришлось переплачивать. Как говорится, скупой платит дважды.

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

Общая сводка по проекту


Затраченное время: множество выходных
Сложность: продвинутая
Стоимость: $2,500$2,800

Материалы


  • Станок металлообрабатывающий с устройством цифровой индикацией (УЦИ);
  • 3-фазный асинхронный двигатель Marathon #145THFR5329 / $500, встал на замену сгоревшего двигателя шпинделя;
  • Контроллер двигателя частотно-регулируемого электропривода Emerson Commander SK / $450;
  • Плата управления ЧПУ для LPT-порта, а именно многофункциональная плата ЧПУ C11G с сайта CNC4PC.com / $68;
  • Шаговый двигатель NEMA 34 (2 шт.) для X- и Z-осей, Model 34HS38-3008S / $110 каждый;
  • Плата драйвера шагового двигателя (2 шт.) GeckoDrive G213V / $150 каждая;
  • Компьютер с ПО Linux для ЧПУ (доступно на linuxcnc.org). Мы использовали древний Pentium 4;
  • Фильтр (электромагнитной совместимости) ЭМС Roxburgh для подавления сетевых помех;
  • Шарико-винтовая пара 40 с шариковой гайкой / $225;
  • Упорные подшипники (4 шт.);
  • Опора двигателя (2 шт.), изготовленная из нержавеющей стали и алюминия на Tormach 770 с ЧПУ;
  • Соединительная втулка (2 шт.), она же гибкая муфта вала, на Amazon от $5 до $50 в зависимости от размера;
  • Корпус блока управления, сталь, размер 241610;
  • Выключатели для питания, защитного отключения и т.д.;
  • Провода: 12ga, 14ga и 22ga;
  • Реле, выключатели и т.д. из разобранных частей станка;

Инструменты


  • Фрезерный станок ЧПУ, концевые фрезы, расточные оправки, токарные инструменты для обработки креплений двигателя.
  • Дрель, отвертки, гаечные ключи, инструменты для зачистки проводов, обжимные устройства и т.д.
  • Паяльник и олово.

Весь процесс реконструкции был поделен на три этапа:

  1. Модификация самого механизма.
  2. Сборка блока управления.
  3. Установка и настройка управляющего ПК.



Плата управления для LPT-порта/интерфейсная плата

Модификация станка. Часть 1



Наш 40 станок по металлу до апгрейда

Этот станок имеет следующие характеристики: расстояние между центрами 40 дюймов и максимально возможный диаметр заготовки 13 дюймов. По умолчанию скорость шпинделя контролируется через редуктор, расположенный за шпинделем и приводимый в действие однофазным двигателем 230В. Редуктор изменять не потребовалось; мы просто выбрали оптимальные настройки передачи, и далее при использовании ЧПУ управление скоростью уже будет осуществляться контроллером частотного преобразователя. Выход из строя оригинального однофазного двигателя, фактически, только сыграл нам на руку, так как его замена трехфазным аналогом давала большую степень контроля и позволяла удвоить максимально возможную скорость вращения, которая для умершего мотора составляла 1 750 Об/мин. Самое же удачное, что частотный преобразователь был способен преобразовать 220В из одной в три фазы. Оригинальный блок управления был снят с задней части станка, и некоторые из его контрольных реле вместе с другими деталями мигрировали в новый.


Фрезеровка первой опоры двигателя оси Z

Каретка, удерживающая режущие инструменты, предполагала два варианта управления своим движением по оси Z. (На токарном станке ось Z идет слева направо, а ось X является осью поперечной подачи). Есть основной ходовой винт для общего резания и второй ходовой винт, который вращается синхронно со шпинделем для нарезания резьбы. Оба винта приводятся в движение одним редуктором и задействуются для перемещения каретки с помощью рычагов управления на самой каретке. Мы решили убрать винт нарезания резьбы и стержень, управляющий первичным ходовым винтом. Это позволило нам приводить в движение основной ходовой винт с помощью шагового двигателя (ШД), размещенного на противоположном конце и закрепленного ремнем и шкивами. Основному винту требовалось всего чуть более 50 вращений для перемещения каретки на 1, и мы рассчитывали, что это даст некоторую степень контроля точности.


Первый вариант привода двигателя оси Z

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


Замена вертикального суппорта: основная рукоятка оси X

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


Мотор с вертикальным суппортом в сборе: новый шаговый двигатель оси X

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

Сборка блока управления


Оригинальный блок был слишком мал и просто не вместил бы все компоненты, необходимые для управления станком. Поэтому мы заказали корпус размером 241610, в который бы точно все поместилось. Глубина 10 была, возможно, излишней, но зато обеспечила достаточно пространства для крепления вентиляторов охлаждения и переключателей на боковой стенке. В то же время корпус оказался достаточно жестким, чтобы, будучи установленным на задней стенке станка, удерживать на себе монитор и при этом не падать.


Расположение элементов управления

Мы закрепили все компоненты на листе алюминия толщиной 1/8, который можно было вынимать из корпуса для удобства доступа. При этом он также выступал в качестве отводчика тепла. Для элементов ручного управления шпинделем мы вырезали в листе и корпусе соответствующие отверстия.


Прокладка проводов

Во избежание спутывания проводов мы добавили кабельные каналы с открытыми пазами.


Тщательно промаркированное соединение

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


Собранный блок управления (с головой Стэна внутри)


Блок управления в сборе. Первое тестирование

Весь процесс сборки блока управления занял около 60 часов.

Настройка управляющего ПК


Хоть во многих проектах ЧПУ для управления устройством и используют параллельный порт, в них зачастую не используется новейшее наиболее производительное аппаратное обеспечение. Во-первых, многие современные ПК не оборудованы параллельными портами, к тому же многие из современных процессоров оптимизированы таким образом, что хорошо работают с ПО, но малоэффективны в прямой реализации портов ввода/вывода по технологии bit-banging для чувствительного ко времени управления аппаратной частью. Это не проблема для ПК, управляющего принтером, потому что USB снижает степень нагрузки, но в нашем случае с фрезером на ЧПУ неверная конфигурация оборудования/ПО может привести к тому, что рез будет сделан в десятках тысячных долей от места, куда указывал G-code. (Например из-за пропуска шагов, прим. переводчика).

К счастью, для основных возможностей программного обеспечения ЧПУ есть списки протестированных компьютеров, так что подбирать было уже куда легче. Мы выбрали старый Dell Optiplex с процессором Pentium 4 и ОС LinuxCNC. Два таких ПК (один на запчасти) мы удачно приобрели в местном магазине подержанных компьютеров по $30 за каждый.

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

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

Скупой платит дважды


Все-таки нечестно говорить, что не работало ничего. Были намеки на практически правильное функционирование некоторых компонентов. Один из ШД реагировал на команду повернуться единственным глухим звуком. На драйвере этого двигателя даже светился светодиод зелёным вплоть до этого момента, после чего переключался на красный. Драйвер другого ШД демонстративно горел красным сразу при подаче питания и продолжал пялиться на нас, словно глаз Саурона.

Мы просмотрели всю проводку. Мы сравнили свой вариант ее прокладки с вариантом в Tormach. Здесь не было проблем. И только позже проверив с помощью позаимствованного осциллографа выход платы управления ЧПУ мы нашли первую неполадку: напряжение выходного сигнала поднималось только до половины от необходимого драйверам ШД уровня. Купленная нами за $20 плата оказалась просто мусором. Мы решили на этот раз не скупиться и нашли на другом сайте еще одну плату стоимостью уже в $99. По ее прибытии выяснилось, что маркирована она другим сайтом: CNC4PC.com. При этом она также на 6 ревизий отставала от последней предлагаемой версии. Напряжение эта плата обеспечила достаточное, и мы рассчитывали, что двигатели заработают лучше. Но они молчали

Я уже упоминал, что многое из купленного нами для собственного блока управления было выбрано по образцам из имеющегося фрезерного станка. Эти драйверы ШД были той же модели MA860H, что и в нем. Так что, рисуя в воображении счета на ремонт этого фрезера, мы начали заменять подозреваемые детали, устанавливая их в него. Шаговые двигатели были первыми, и к нашему облегчению оба заработали отлично. Следующими на проверку отправились их драйверы, и вот из них уже ни один не функционировал. Глаз Саурона продолжал насмехаться над нами. Заподозрив, что это был наш косяк, мы заказали еще пару драйверов той же модели. Оба оказались недееспособны сразу по прибытии. Один вообще отказался работать во фрезерном станке, а второй обеспечивал вращение, но только в одном направлении. Очевидно, что эти драйверы не являлись надежным решением.


Франкенштейн-драйвер двигателя: новые GeckoDrives, установленные в каркас нерабочего драйвера

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


Детали управления в сборе, но пока без корпуса

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

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

Сборка всего воедино


Все было на своих местах. Мы могли управлять ШД при помощи кнопок UI или инструкций G-code, а с помощью элементарного крепления двигателей к ходовым винтам можно было перемещать каретку вдоль обеих осей.

Мы не знали точного отношения скорости вращения ходовых винтов к боковому смещению, так что правильные установки для программы StepConf искали методом проб и ошибок. Эта программа запрашивает несколько значений: количество шагов двигателя на оборот, микрошаг драйверов, соотношение зубьев шкивов и шаг ходового винта. Если вы не уверены в этих значениях, имейте ввиду, что они перемножаются в одно значение, которое означает шаги на дюйм. Если все эти значения кроме одного (не важно какого) установить на 1, то в итоге оставшееся значение будет большим числом, которое можно подстроить с отличной точностью.

Для этого мы следовали такому алгоритму:

  • Двигаясь слева направо, переместить каретку на приблизительную известную позицию. В UI ЧПУ сбросить смещения, установив значение позиции как 0.
  • Измерить расположение каретки.
  • С помощью G-code передвинуть каретку на 1 дальше вправо, то есть к Z1.
  • Измерить новое положение каретки и посчитать разницу в дюймах.
  • Разделить значение шаги на дюйм на пройденное кареткой расстояние, получив новое значение шагов на дюйм. Например, если количество шагов на дюйм равно 20 000, и вы производите смещение на 1.015, то новое значение будет 20 000/1.015 или 19 704 шагов на дюйм.
  • Повторять процесс, пока команда выполнить смещение на 1 не будет давать конкретно смещение на 1.

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

Цифровой индикатор по-прежнему был прикреплен к токарному станку, что сильно упрощало процесс сравнения вводимых на ПК инструкций с фактическим перемещением каретки. Следуя разработанному нами алгоритму, мы должны были получить значение шагов на дюйм, которое бы давало согласованные результаты независимо от оси, на которой проводились измерения. Этот подход отлично работал для оси X, но при измерении оси Z результаты варьировались в диапазоне до 0.012, что зависело от места проведения измерений. В чем-то крылась серьезная ошибка.

Модификация станка. Часть 2


Ходовые винты могут быть неточными, но винт должен быть совсем плох, чтобы отклонение то возрастало, то опять уменьшалось вдоль всех 40. Проблема была в том, что помимо ходового винта в движении по оси Z были задействованы и другие шестерни, а также червячные передачи. Нам нужно было учесть неточность во всем этом связанном механизме. Люфт оси Z был таким же ужасным. В LinuxCNC есть способы компенсировать это, но для этого потребовалось бы вычислить ошибку в каждой точки вдоль всех 40 оси. Достичь желаемой точности было практически невозможно. Передаточный механизм нужно было менять.


Замеры места для расположения двигателя оси Z

Прецизионная шарико-винтовая пара (ШВП) может практически полностью устранить люфт, вопрос лишь в цене. В одной компании ШВП предлагалась аж за $3 500. В конечном итоге мы приобрели ШВП и гайку за $225 в Roton Products, расположенной в Миссури. Дополнительно потребовалась ее подгонка под купленные ранее подшипники, что в местной шлифовальной мастерской обошлось еще в $336. У данной ШВП люфт составлял уже всего 0.007, но он хотя бы не изменялся по ходу длины винта, что позволило легко это компенсировать в LinuxCNC.


Вторая опора двигателя оси Z: середина вырезана фрезой, обработана и смонтирована вместе с ШВП

Мы также решили убрать ремень со шкивом и сделать новое крепление для ШВП, чтобы можно было реализовать прямой привод от ШД.


Крепление бабки ШВП оси Z

Каждый край вала удерживается парой упорных подшипников, закрепленных один к одному для блокировки подвижности с одновременным сохранением вращения. Сам вал закреплен между этими двумя опорами подшипников под некоторым давлением.


Модифицированный токарный станок с новыми опорами, подготовленными для ШД

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


Монтирование конечного выключателя

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

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

Последние штрихи



Токарный станок с ЧПУ в действии. Тестовый запуск

Теперь у нас был полностью функционирующий токарный станок с ЧПУ. LinuxCNC работала отлично, хоть ее UI и напоминал приложение для старой Windows 98.


Скриншот LinuxCNC (Ни одна программа не загружалась, пока я не выяснил, как заставить ее игнорировать то, что она не подключена к станку)

К счастью, немного пошерстив форумы мы нашли два альтернативных UI, которые выглядели и работали на порядок лучше.

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


Приспособление для заточки ножей. Рукоятки изготавливаются на токарном станке ЧПУ!


Готовое приспособление для заточки

В дальнейшем мы планируем кое-какие доработки:
  • В результате этого проекта станок лишился возможности нарезать резьбу. Тем не менее LinuxCNC поддерживает эту возможность, если удастся реализовать обратную связь от оптического датчика скорости шпинделя.
  • Будет очень кстати добавить жидкостное охлаждение СОЖ (смазочно-охлаждающей жидкостью), пусть даже для открытого станка, работающего на низких оборотах.
  • Можно ограничить люфт, заказав новые шариковые гайки, у которых каждый четвертый или пятый шарик имеет другой размер, что позволяет уменьшить погрешность между шарико-винтовой парой и гайкой.
  • ШВП необходимо защитить. Для этого нужно изготовить подходящие чехлы или хотя бы кисти для ее очистки.


Подробнее..

Серебряная пуля для кремлевского демона

27.02.2021 08:11:18 | Автор: admin

image
Вот, наконец, в теме помех навигации мы и добрались до самого крутого и интересного. Причем, это интересное оказалось не таким уж сложным технически.


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


Хотя в любительской радиотехнике все еще мало примеров использования пространственной обработки, она начинает завоевывать свое место. Этому способствует снижение цен на платы SDR с 2x2 MIMO, такие как LimeSDR или XTRX. Существуют даже относительно недорогие решения и для Massive MIMO.


В практике спутниковой радионавигации антенные решетки встречаются еще реже. Наверное, это происходит из-за узости области знаний, но не только. Немаловажным фактором остается сложность схем обработки. Сигналы спутников GPS, ГЛОНАСС и других имеют на поверхности Земли столь малую мощность, что даже неискушенный нарушитель легко создает помеху, в миллионы раз превышающую эту мощность. Что уж говорить про государственных нарушителей, за которыми мне пришлось гоняться несколько лет назад. Вся Москва не даст соврать. Кремлевские демоны!


Проблема общенародная, поэтому срочно переходим к практике. Берем четырехканальную антенную решетку диапазона L1. Берем четырехканальную SDR-плату для спутниковой навигации. Соединяем.


image


Делаем синхронную запись сигнала с четырех антенн с подоконника. При этом с выхода LimeSDR излучаем гармоническую помеху на центральной частоте GPS L1 1575.42МГц. Спектр сигнала получается такой:


image


Для построения спектра мы используем программу на Matlab, полученную от prof. Dennis Akos и слегка модифицированную для работы с 16-битным комплексным сигналом. Здесь лежит архив с исходниками.


Кроме спектра, программа выводит более подробные параметры сигнала: гистограмма и график во времени.


image
image


Анализ графиков показывает, что входной сигнал заполняет практически весь доступный динамический диапазон цифрового тракта. От максимума сигнала до шума примерно 60 дБ, что, даже с учетом усиления от обработки БПФ, довольно много. Проверим, что этого достаточно, чтобы сигналы спутников не находились коррелятором.


image


Как видно, "спектр" сигналов GPS L1 C/A-code равномерный, без всплесков. Это значит, что сигналы спутников не обнаружены. Проверяем так четыре файла (с каждой антенны) ничего.


Теперь ударим легкой математикой по радио-электронной преступности. Возьмем такой простой код на Matlab:


% clean upclear;close all;clc;% read data from 4 filesfileNames = ['c:\work\aj\habr1\dump2\Dump_15_channel_0.int16';...             'c:\work\aj\habr1\dump2\Dump_15_channel_1.int16';...             'c:\work\aj\habr1\dump2\Dump_15_channel_2.int16';...             'c:\work\aj\habr1\dump2\Dump_15_channel_3.int16'];countFiles = size(fileNames,1);countInSamples = 5000000;dataArr = zeros(countFiles, countInSamples);fID = 0;for i = 1:countFiles    fID = fopen(fileNames(i,:));    if (fID == -1)        fprintf('This file does not exist: %s\n', fileNames(i,:));        return;    else        data = fread(fID, countInSamples, 'int16');        dataArr(i,:) = data;        fclose(fID);    endendcountInSamples% create I/Q arraydataArrIQ = zeros(countFiles, countInSamples/2);for i = 1:countFiles    k = 1;    for j = 1:2:countInSamples        dataArrIQ(i, k) = complex(dataArr(i, j), dataArr(i, j + 1));        k = k + 1;    endend20*log10(mean(abs(dataArrIQ),2))res = (diag(diag(inv(corrcoef(dataArrIQ'))).^(-1)) / corrcoef(dataArrIQ')) * dataArrIQ;20*log10(mean(abs(res),2))% write the result into 4 filesfor i = 1:countFiles    out = zeros(1, countInSamples);    for j = 1:(countInSamples/2)        out(2*j-1) = real(res(i,j));        out(2*j) = imag(res(i,j));    end    fID = fopen(strcat('out',num2str(i),'.int16'),'w');    fwrite(fID, out, 'int16');    fclose(fID);end

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


image


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


image


Статистика отсчетов на выходе компенсатора похожа на статистику шума. График спектра получен с помощью преобразования Фурье, которое "обнажает" гармонические составляющие смеси помехи и шума. А в широкой полосе маленькие остатки помех "тонут" в шуме. Ниже шума подавить помеху у нас не получилось. Физика. Хотя во временной области гармоника остается видимой.


image


Итак, помеха уменьшилась на 30 дБ. Что же теперь покажет нам коррелятор? Сможет ли он найти сигнал?


image


Вуаля! Сигнал найден! Приемник обнаружил спутник в номером 1. Уровень корреляции не очень, но давайте дадим приемнику немного поработать и посмотрим на результаты.


image


На верхних графиках мы можем довольно четко видеть сигнальное созвездие и результат демодуляции. Результаты работы коррелятора, петли по фазе и по задержке выглядят не очень. Они со временем загибаются. Это можно объяснить недостатками представленного алгоритма компенсатора, о которых мы поговорим позже. Но это не меняет главного: помеха удалена силой математики!


Благодаря Матлабу вся математика заключена в одной строчке кода:


res = (diag(diag(inv(corrcoef(dataArrIQ'))).^(-1)) / corrcoef(dataArrIQ')) * dataArrIQ;

В более читаемом виде код будет таким:


cm = corrcoef(dataArrIQ');cc = diag(diag(inv(cm)).^(-1));res = (cc / cm) * dataArrIQ;

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


$\left(\begin{array}{c} y_1 \\ \vdots \\ \vdots \\ y_N \end{array}\right) = \left(\begin{array}{cccc} R_{11}^{-1} &0 &\ldots &0 \\ 0 &R_{22}^{-1} &\ldots &0 \\ \vdots &\vdots &\ddots &\vdots \\ 0 &0 &\ldots &R_{NN}^{-1} \end{array}\right) R \left(\begin{array}{c} x_1 \\ \vdots \\ \vdots \\ x_N \end{array}\right)$


Вот такой простой математикой можно вытащить GPS-приемник из пасти демона и получить вполне хороший SNR.


image


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


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


Все рассказанное выше вы можете проделать сами. Код компенсатора берите из статьи. Код приемника от профессора Акоса здесь. Файлы с записями берите здесь. Не забудьте, они все вместе весят больше гигабайта.


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


Большое спасибо за участие в подготовке этой статьи и кода в ней нашему математику-программисту vtsarik!

Подробнее..

Подавление спутниковой навигации на Кремлевской набережной незаконно

28.02.2021 20:13:53 | Автор: admin
Чтобы не пытаться вместить этот довольно длинный текст в комментарий, я создал отдельную статью. Заранее прошу прощения у юристов, я сам технарь, но легкомысленные комментарии к моей статье Серебряная пуля для кремлевского демона вынудили меня заняться не своим делом и полезть в законы. Я прошу провести экспертизу моих юридических изысканий.

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

Я нашел Федеральный закон от 14 февраля 2009 г. N 22-ФЗ О навигационной деятельности. Вы все без труда найдете ссылку на его текст. Приведу здесь некоторый выдержки.

Статья 1. Сфера действия настоящего Федерального закона

1. Настоящий Федеральный закон устанавливает правовые основы осуществления навигационной деятельности и направлен на создание условий для удовлетворения потребностей в средствах навигации и услугах в сфере навигационной деятельности.

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

Осмысление первой статьи показывает, что сферой ее является, в том числе, навигация на моем смартфоне или автомобильном навигаторе.

Определения пропускаем, сами откроете и прочитаете. Но чего мы там не знаем? Все понятно, далее.

Статья 3. Субъекты правовых отношений в сфере навигационной деятельности

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

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

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

Статьи восемь и девять для нас самые главные.

Статья 8. Участие физических и юридических лиц в навигационной деятельности

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

Статья 9. Условия предоставления навигационных сигналов с открытым доступом

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

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

Указанный выше перечень утвержден Постановлением Правительства РФ от 5 июля 2001 г. N 508 Об утверждении перечня закрытых административно-территориальных образований и расположенных на их территориях населенных пунктов. С изменениями и дополнениями от:
16 апреля 2007 г., 16 июля 2009 г., 16 апреля 2015 г., 18 августа, 23 декабря 2016 г., 14 февраля, 19 апреля 2017 г., 18 апреля, 29 августа 2019 г., 16 февраля 2021 г. указанный перечень содержит:

image
image
image

Москвы в перечне нет. Прошу специалистов указать мне на ошибки в этой моей юридической инсинуации.

Весь материал я подготовил сам, ни один юрист не пострадал. Заранее спасибо!
Подробнее..

Победа над nRF24L01 на три шага ближе

25.02.2021 00:07:45 | Автор: admin

Многие испытывают трудности при соединении по эфиру радиомодулей nRF24L01. Об этом свидетельствует тема на форуме Амперки, открытая в конце 2014г. За пять с небольшим лет в теме накопилось более 120(!) страниц. Это при том, что автор темы не просто обозначил проблему, а поделился своим трехнедельным опытом победного для него боя. Кроме того, он тут же в первом сообщении создал навигатор по страницам темы, где приводит ссылки на решения проблемы другими. Этот своеобразный путеводитель постоянно обновляется.



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



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



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



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



Итак ...





Шаг 1



Загрузить в контроллер платы Ардуино скетч сканера эфира, который можно найти среди примеров Arduino IDE: Файл -> Примеры -> RF24 -> scanner. Ниже под спойлером есть этот скетч с несущественным изменением. В нем изменено время между стартом и остановкой сканирования одного канала с 128 мксек на 512 мксек. Увеличение времени позволило за один цикл выявлять бОльше источников помех и сигналов. Это равнозначно замене результата измерений в канале на сумму результатов в этом канале за четыре цикла сканирования эфира до изменения времени задержки. При этом, время прохода всего прослушиваемого диапазона сканером увеличилось несущественно: примерно с 8-ми до 10-ти сек.



В разных скетчах адрес канала в командах приводится в разных форматах: в одних ...(0x6f), в других ...(112). Перевод с одного формата в другой станет понятным с примера перевода. Например, для (0x1а) это: (1+1)*16 + а = (1+1)*16 + 10 = 42. Отсчет каналов начинается с частоты 2,4 ГГц, далее идет увеличение частоты на 1 МГц с увеличением номера канала на 1.



скетч сканера эфира
/*Победа над nRF24L01: на три шага ближе, сканер эфираhttp://personeltest.ru/aways/habr.com/ru/post/476716/*//*  Copyright (C) 2011 J. Coliz <maniacbug@ymail.com>  This program is free software; you can redistribute it and/or  modify it under the terms of the GNU General Public License  version 2 as published by the Free Software Foundation.*//**   Channel scanner   Example to detect interference on the various channels available.   This is a good diagnostic tool to check whether you're picking a   good channel for your application.   Inspired by cpixip.   See http://arduino.cc/forum/index.php/topic,54795.0.html*/#include <SPI.h>#include "nRF24L01.h"#include "RF24.h"#include "printf.h"//// Hardware configuration//// Set up nRF24L01 radio on SPI bus plus pins 9 & 10RF24 radio(9, 10); //Arduino UNO//// Channel info//const uint8_t num_channels = 128;uint8_t values[num_channels];//// Setup//void setup(void){  //  // Print preamble  //  Serial.begin(57600);  Serial.println("Scanner Air On");  printf_begin();  //  // Setup and configure rf radio  //  radio.begin();  radio.setAutoAck(false);  // Get into standby mode  radio.startListening();  radio.stopListening();  // Print out header, high then low digit  int i = 0;  while ( i < num_channels )  {    printf("%x", i >> 4);    ++i;  }  printf("\n\r");  i = 0;  while ( i < num_channels )  {    printf("%x", i & 0xf);    ++i;  }  printf("\n\r");}//// Loop//const int num_reps = 100;void loop(void){  // Clear measurement values  memset(values, 0, sizeof(values));  // Scan all channels num_reps times  int rep_counter = num_reps;  while (rep_counter--)  {    int i = num_channels;    while (i--)    {      // Select this channel      radio.setChannel(i);      // Listen for a little      radio.startListening();      delayMicroseconds(512);      radio.stopListening();      // Did we get a carrier?      if ( radio.testCarrier() )        ++values[i];    }  }  // Print out channel measurements, clamped to a single hex digit  int i = 0;  while ( i < num_channels )  {    printf("%x", min(0xf, values[i] & 0xf));    ++i;  }  printf("\n\r");}// vim:ai:cin:sts=2 sw=2 ft=cpp



Далее подключаем модуль nRF24L01 к плате Ардуино или любому прототипу, собранному, допустим, на контроллере ATMEGA328P. Я собрал два образца на платах для прототипирования на контроллере ATMEGA328P по схеме контроллер + резонатор. Один образец подключаю к компу через плату Arduino UNO, а второй через конвертор USB/TTL.

Мощность стабилизатора платы Arduino UNO вполне приемлема для подключения дополнительной импульсной нагрузки такой, как nRF24L01+ c адаптером 5В/3,3В для этого модуля или без адаптера.





На мониторе последовательного порта Arduino IDE увидите нечто похожее:





Если вы увидели похожую картинку тест на работоспособность (исправность) радиомодуля и правильность его подключения пройден успешно. Замените радиомодуль другим, с которым планируете работать дальше.



Обратите внимание на чистый диапазон, начиная с канала 4а. У меня он остается чистым даже, если на расстоянии нескольких метров работает старая СВЧ-печь мощный источник помех в этом диапазоне. А в общем-то, в Интернете рекомендуют выбирать каналы для своих проектов выше 60.



Если на каналах шум, но радиомодуль определяется (смотрим преамбулу на мониторе Arduino IDE, подробно тут) это однозначно копия (подделка). Не отчаивайтесь ее тоже можно запустить.



Шаг 2



По схеме, аналогичной первой собираем второй радиоузел. Это будет передатчик. В его контроллер загружаем скетч передатчика (под спойлером).



скетч приемника
/*Победа над nRF24L01: на три шага ближе, приемникhttp://personeltest.ru/aways/habr.com/ru/post/476716/*/#include <SPI.h>#include <RF24.h>RF24 radio(9, 10); // порты D9, D10: CSN CEconst uint32_t pipe = 111156789; // адрес рабочей трубы;byte data;void setup() {  Serial.begin(115200);  Serial.println("TransmitterTester ON");  radio.begin();                // инициализация  delay(2000);  radio.setDataRate(RF24_1MBPS); // скорость обмена данными RF24_1MBPS или RF24_2MBPS  radio.setCRCLength(RF24_CRC_8); // размер контрольной суммы 8 bit или 16 bit  radio.setPALevel(RF24_PA_MAX); // уровень питания усилителя RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH and RF24_PA_MAX  radio.setChannel(0x6f);         // установка канала  radio.setAutoAck(false);       // автоответ  radio.setRetries(0, 15);  //время между попыткой достучаться, число попыток  radio.powerUp();               // включение или пониженное потребление powerDown - powerUp  radio.stopListening();  //радиоэфир не слушаем, только передача  radio.openWritingPipe(pipe);   // открыть трубу на отправку}void loop() {  data = 109;  radio.write(&data, 1);  Serial.println("data= " + String(data));}



Передатчик без пауз в работе передает сигнал на канале 6f (112).



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





Увидев сигнал от передатчика делаем следующий шаг.



Шаг 3



Загружаем вместо сканера скетч приемника (под спойлером).



скетч приемника
/*Победа над nRF24L01: на три шага ближе, передатчикhttp://personeltest.ru/aways/habr.com/ru/post/476716/*/#include <SPI.h>#include "nRF24L01.h"#include "RF24.h"RF24 radio(9, 10); // порты D9, D10: CSN CEconst uint32_t pipe = 111156789; // адрес рабочей трубы;byte data[1];int scn;  //счетчик циклов прослушивания эфираint sg;  //счетчик числа принятых пакетов с передатчикаvoid setup() {  Serial.begin(9600);  Serial.println("ReceiverTester ON");  radio.begin();  // инициализация  delay(2000);  radio.setDataRate(RF24_1MBPS); // скорость обмена данными RF24_1MBPS или RF24_2MBPS  radio.setCRCLength(RF24_CRC_8); // размер контрольной суммы 8 bit или 16 bit  radio.setChannel(0x6f);         // установка канала  radio.setAutoAck(false);       // автоответ  radio.openReadingPipe(1, pipe); // открыть трубу на приём  radio.startListening();        // приём}void loop() {  if (scn < 1000)  { // прослушивание эфира    if (radio.available())    {      radio.read(data, 1);      if (data[0] == 109) {        sg++;      }    }  } else {//всего принято    {      Serial.println("Принято: " + String(sg) + " пакетов");      sg = 0;    }    scn = 0;  }  scn++;  delay(20);  if (scn >= 1000) scn = 1000; //защита от переполнения счетчика}



Логика работы приемника такая же, как и у сканера эфира, но он в отличие от сканера принимает сигналы только на частоте передатчика 6f и, как и сканер, не посылает автоответ. Скорость обмена информацией и размер контрольной суммы у приемника такие же, как у передатчика. После каждых 1000-и циклов прослушивания в скетче обнуляется счетчик числа циклов и выводится инфа о количестве принятых пакетов с передатчика в монитор порта Arduino IDE.



Включаем передатчик и приемник. Если приемник принимает хотя бы каждый третий пакет это уже успех. У меня не получилось. Приемник по непонятным причинам принимал максимум 40 пакетов.



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



Юзерам, которые захотят сделать все грамотно, придется поработать. Дополнительная антенна в данном случае это отрезок коаксиального кабеля с волновым сопротивлением 50 Ом и длиной 115 мм. Антенна подключается к выводу 13 (АNT2) микросхемы nRF24L01+. Схему подключения и номиналы нескольких недостающих smd компонентов, которые надо поставить на плату радиомодуля, можно найти на принципиальной электрической схеме nRF24L01+ тут. Впрочем, есть альтернатива в магазин за NRF24L01+PA+LNA





Теперь обязательно припаиваем между пинами GND и VCC обеих радиомодулей по два конденсатора. Керамический конденсатор, выполняющий роль ВЧ-фильтра, емкостью не менее 0,15 мкФ (чем больше, тем лучше) и электролит емкостью около 10 мкФ (можно и больше, но бесполезно) это НЧ-фильтр. ВЧ-фильтр шунтирует высокочастотные помехи по цепи питания радиомодуля, а НЧ-фильтр сглаживает пульсации питания. Для надежности, цепи питания радиомодулей лучше непосредственно подпаять к пинам контроллеров.



Все. Надеюсь, у вас в дальнейшем поубавится проблем с nRF24L01 в своих проектах. Успехов!



Безусловно эти простые шаги не могут гарантировать решение всех проблем с nRF24L01 мне их и не перечесть, но теперь вы, как и я, будете уверены:


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


Ссылки по теме



  1. Обзор радио модуля NRF24L01+
  2. nRF24L01+: побеждаем модуль.
  3. nRF24L01 и Ардуино: побеждаем модуль (видео)
  4. SE8R01. Подделка под NRF24L01 (видео)
  5. Обзор радио модуля NRF24L01+PA+LNA
Подробнее..

Резьба по дереву против 3D-принтера одно другому не мешает

25.02.2021 14:18:30 | Автор: admin

Резьба по дереву древнейшее искусство с многовековой историей. И кто бы мог подумать, что через такой вид творчества я приду к сборке 3D-принтеров. Взаимосвязь, конечно же, косвенная. Но все началось со знакомства с учителем по технологии в школе, о котором я упоминал в предыдущей моей статье по сборке 3D-принтера из фанеры и запчастей от списанной техники. Это он мне выделил одного из своих учеников, с которым мы собирали принтер для школьного кабинета труда. Сегодня я хочу познакомить вас с деятельностью нашего трудовика и работами его подопечных, которые ни раз занимали призовые места на всероссийских олимпиадах по технологии. На самом деле, таких трудовиков сейчас днем с огнем не сыщешь, а работы просто завораживают, особенно если учесть, что это делали ученики 5-11 классов. Я и сам пробовал вырезать. Очень занимательное творчество. У нас даже есть мастер-класс по геометрической резьбе, им поделюсь ниже в статье.

Шкатулка и карандашница. Работы ученика 9 класса. Липа, морилка, лак.Шкатулка и карандашница. Работы ученика 9 класса. Липа, морилка, лак.

Сравнить несравнимое

Конечно же, сравнивать ручную резьбу и печать на 3D-принтере не совсем целесообразно. Но определенная схожесть есть. Если для принтера изделия мы моделируем в компьютерной программе, то при вырезании из дерева модель нужно держать в голове. Но это не всегда удобно, поэтому наш трудовик (зовут его, кстати, Ринат Зуфарович) как раз и заинтересовался 3д-моделированием. И увлек этим школьников. И именно с одним из них мы собрали 3D-принтер из фанеры и старых запчастей.

Плюсы и минусы везде свои. На самом деле, чтобы вырезать красоту из дерева, особых талантов иметь не нужно. Здесь рулят терпение и творческий подход. А материалом служат всего лишь кусок доски или бревна, резак и финишное покрытие. Однако внешний вид изделий и трудозатраты не сравнить с теми, которые напечатаны на 3D-принтере. Но каждому свое. Например, если даже посмотреть на шкатулки, вырезанные вручную и напечатанные на принтере, можно заметить большую разницу.

Шкатулка из дерева. Работа учителя по технологииШкатулка из дерева. Работа учителя по технологии

С объемными фигурами еще интереснее. Своя прелесть есть и там, и там.

Герб города Стерлитамак. Работа ученика 11 класса.Герб города Стерлитамак. Работа ученика 11 класса.Персонаж из сериала МандалорецПерсонаж из сериала МандалорецМастер ЙодаМастер Йода

Как фанат вселенной звездных воинов, я собираю себе коллекцию. И печать на 3D-принтере очень выручает. Не представляю, сколько бы я вырезал такую фигуру из дерева, хотя это вполне реально.

Моя работа

Резьба по дереву завораживает любого, кто видит результат. А если посмотреть мастер-класс, и вовсе можно залипнуть технически это настолько просто, что хочется прямо сейчас все бросить и начать заниматься резьбой. Со мной было именно так. Ближе с изделиями я познакомился, когда начал делать сайт для школьной мастерской и составлял каталог поделок (ох, немалую работу тогда мы проделали). Я попросил выделить мне материал и инструменты, изучил некоторую информацию в интернете и взялся за работу. Это было несколько лет назад, и даже фотография готового изделия не сохранилась (однажды все фотографии с телефоном вместе канули в небытие), а потом я его кому-то подарил.

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

По памяти опишу коротко процесс:

  1. Получил от Зуфарыча кусок дерева.

  2. Нашел в интернете рисунок розы.

  3. Перевел его на зачищенную поверхность.

  4. Удалил резаком лишнее вокруг контура.

  5. Придал форму цветку и обработал мелкие детали.

  6. Дочка 5 лет раскрасила цветок гуашью (она у меня художница, рисует с малых лет).

  7. Покрыл поверхность лаком.

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

У учеников обычно уходит от 1-2 недель до месяца, если узор мелкий и сложный.

Страна должна знать своих героев

Учитель технологии Ринат Зуфарович с победителем всероссийской олимпиады.Учитель технологии Ринат Зуфарович с победителем всероссийской олимпиады.

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

Победитель всероссийской олимпиады по технологии в номинации Народные промыслы и ремесла" России.

Набор для кумыса. Липа, вощение. Работа ученика 8 класса. Набор для кумыса. Липа, вощение. Работа ученика 8 класса.

Следующая работа заняла 1-е место на республиканском конкурсе мастерства

Шкатулка. Липа, морилка, лак. Работа ученика 9 класса.Шкатулка. Липа, морилка, лак. Работа ученика 9 класса.Морской конёк и ваза. Липа, морилка, лак. Работы ученика 8 класса.Морской конёк и ваза. Липа, морилка, лак. Работы ученика 8 класса.Ваза Весна. Липа, морилка, лак. Работа ученика 9 класса.Ваза Весна. Липа, морилка, лак. Работа ученика 9 класса.

Пятиклассники чаще работают с фанерой.

Герб России. Фанера, морилка, лак. Работа ученика 5 класса.Герб России. Фанера, морилка, лак. Работа ученика 5 класса.Панно Виноград. Липа, морилка, вощение. Работа ученика 10 класса.Панно Виноград. Липа, морилка, вощение. Работа ученика 10 класса.Шкатулка Бабочка. Липа, морилка, лак. Работа ученика 7 класса.Шкатулка Бабочка. Липа, морилка, лак. Работа ученика 7 класса.

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

Работ очень и очень много. Только для школьного сайта было сфотографировано около 100 изделий. И количество их с годами растет.

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

Чеканка из меди. Чеканка из меди.

Виды резьбы по дереву

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

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

Шкатулка. Работа ученика 11 класса. Липа, морилка, лак.Шкатулка. Работа ученика 11 класса. Липа, морилка, лак.

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

Герб республики Башкортостан. Работа ученика 10 класса.Герб республики Башкортостан. Работа ученика 10 класса.

3. Рельефная резьба. Здесь практически нет плоских поверхностей. Выделяют барельефную, горельефную и резьбу татьянка. Первые два более сложны в техническом плане. А "татьянка" подразумевает полное заполнение поверхности рисунком в виде плетеного кружева. Обычно для нее выбирают растительный орнамент, где элементы плавно перетекают друг в друга.

Ларец. Работа ученика 9 класса. Липа, морилка, лак.Ларец. Работа ученика 9 класса. Липа, морилка, лак.

4.Скульптурная резьба. Название говорит само за себя. Берется кусок дерева и вырезается объемная фигура, при этом фон полностью убирается.

Оленёнок. Работа ученика 9 класса. Липа, лак.Оленёнок. Работа ученика 9 класса. Липа, лак.

5. Прорезная резьба. Часто используется при изготовлении мебели или других элементов интерьера. Фон частично вырезается, при этом формируется цельный узор.

Картина Старецв смешанной технике. Работа ученика 9 класса. Липа, морилка, лак.Картина Старецв смешанной технике. Работа ученика 9 класса. Липа, морилка, лак.

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

К сожалению, финансирование на это дело выделяется очень скудное или вообще не выделяется. Основы шкатулок Ринат Зуфарович изготавливает сам. Из фанеры корпуса могут делать и ученики. Материалы трудовик находит также самостоятельно через свои связи. Единственное, в школе есть оборудование - станки разных видов, на которых изготавливаются заготовки, а затем склеиваются. Но и они уже отрабатывают постепенно свой срок, списываются, а новые не поставляются, что, конечно, очень печально.

А вот и обещанный мастер класс.

В заключение

В моей статье про 3D-принтер из фанеры я достаточно опрометчиво отметил, что Один хороший трудовик в школе обучал детей работе с деревом. В основном, это были разделочные доски и шкатулки. Как видите, не только разделочные доски и шкатулки. И там были некоторые споры и мнения про нынешних спитых и странных трудовиков. Почему-то захотелось написать о Ринате Зуфаровиче немного больше. Это человек с большой буквы и мировой мужик с золотыми руками так я его могу описать. И он делает действительно великое дело приобщает детей к труду и творчеству, что в современном мире гаджетов и компьютеров не так-то просто.

Подробнее..

Одноплатник Pimoroni Tiny 2040 улучшенный аналог Raspberry Pi Pico, размером всего в треть малинки

25.02.2021 18:11:56 | Автор: admin

В январе мы публиковали обзор одноплатника Raspberry Pi Pico. В целом, соотношение цена/качество на высоте. Но многим пользователям платы не хватает дополнительных функций.

И вот сейчас появилась альтернатива, причем на основе SoC Raspberry RP2040, но с большим набором возможностей (забегая наперед это не модуль беспроводной связи). Плюс ко всему, размер новинки всего третья часть от Raspberry Pi Pico. Называется это чудо технической мысли Pimoroni Tiny 2040.

Что там с железом?



RP2040 SoC ARM Cortex M0+ running at up to 133Mhz
SRAM 264kB
Flash Storage 8MB of QSPI
GPIO 16 GPIO pins. 7 x Digital I/O, 4 x Analog 12-bit ADC, 2 x I2C, SPI, UART, Debug
USB Port USB C
Dimensions 0.74 x 0.7 inches (19 x 18mm)
Поскольку плата меньше, чем оригинал, то и пинов у нее не 40, а всего 16. Тем не менее, оставлены самые важные, чтобы эта малютка не потеряла необходимые для разработчиков функции. Единственный недостаток подключить к ней Explorer Board или что-то подобное не получится.

Если это и не требовалось, можно приступать к обзору новых возможностей платы. Во-первых, у нее есть кнопка Reset, что очень удобно во многих случаях. У Pico ее нет, так что если что-то идет не так, приходится отключать плату от питания, а потом подключать его снова. Кнопка в новой плате замыкает линию RUN на землю, что приводит к перезапуску SoC.

Более значительное улучшение четыре ADC-пина вместо трех. Это дает возможность подключить, например, два аналоговых джойстика вместо одного, поскольку каждому из них нужно по два ADC-пина.

Третья возможность добавление светодиода, отражающего статус платы. Функции диода можно программировать при помощи MicroPython и C/C++.

Ну и четвертое улучшение целых 8 МБ файлового пространства во внутреннем флеш-хранилище. У базовой модели Pico всего 2 МБ. А это дает возможность загрузить больше кода и библиотек.

Кстати, стоит напомнить характеристики самой Pimoroni. Основа платы двухъядерный чип ARM Cortex M0+, с частотой ядра в 133 МГц. У платы 264 КБ ОЗУ и 2 МБ флеш-памяти. Кроме того, есть разъем USB 1.1 и I/O каналы, из которых пользователю доступны 26. Есть возможность задействовать интерфейсы 2 x UART, 2 x I2C, 2 x SPI (всего до 16 Мбайт QSPI Flash с XIP), а также 16 PWM-каналов. Также в наличии температурный датчик и 3 ADC-канала.

Структура Pimoroni Tiny 2040



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

Да, важный нюанс у новой платы USB-C разъем, что гораздо удобнее microUSB-коннектора для многих проектов. Приятная мелочь распиновка порта присутствует на обратной стороне платы. Сразу становится понятно, где какой вывод и что с чем соединять. Чтобы было еще понятнее, можно воспользоваться официальной документацией.

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

В целом, плата очень хорошо подходит для использования в любых системах хоть больших, хоть миниатюрных.

Работа с Pimoroni Tiny 2040



2040, фактически крошечная версия Pico, поэтому все мануалы, код и все прочее, что писалось для малинки, подойдет и для этой платы.

MicroPython от Adafruit работает без проблем. Работает все, сразу после установки можно кодить и управлять платой.

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

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

Pimoroni Tiny 2040 идеально подходит для небольших роботов, USB-клавиатур, научных проектов, обучения и т.п. Кроме того, благодаря ADC-пинам плату можно использовать вместе с любым контроллером или блоком управления, где требуются четыре потенциометра или два аналоговых джойстика.

В сухом остатке



Raspberry Pi Pico небольшой, но мощный инструмент. Tiny 2040 еще меньше, хоть и чуть дороже. Но за миниатюризацию всегда приходится доплачивать. Кроме того, здесь есть дополнительные возможности.

Если вы работаете над проектом, где требуется миниатюрность, но функциональность Pico, то Tiny 2040 отличный выбор.

Подробнее..

Переделка CNC 3018 Pro на рельсы. Личный опыт. Часть 2

26.02.2021 02:16:46 | Автор: admin

Здравствуйте, продолжаю описание доработки оси Y.

Первая часть тут.

Один из посылов этой части: учитесь читать чертежи/искизы/картинки, и обращать внимание на мелочи.

Вполне допускаю, что некоторые термины, с точки зрения профессиональных токарей/фрезеровщиков/слесарей и т.д. не совсем верны, но повторюсь, я описываю свой личный опыт без какой-либо "проверки" в инете (всё из моих мозгов, так сказать тест :) ) Да и сам то я "любитель" в этом плане.

В первой части я сделал:

- обрезку профилей (и по X оси тоже) и их торцевание (кстати, лишнее я пилил ручной ножовкой, и затем на станке доводил);

- нарезка резьбы в профилях;

- сверление отверстий в передней/задней планках;

- сборка (и не забудьте в "серединные" профили вложить Т гайки (по 12шт.) для рельс, и по боковым профилям гайки для крепления штатной оси X);

По сборке вроде вопросов быть не должно.

Всё же опишу один нюанс, который покажется смешным, но мне реально звонили двое коллег из разных контор где я работал, и они спрашивали: "я собираю диван/тумбу и тут две шайбы, одна какая-то кривая и она не цельная, а другая нормальная, и я не знаю, что ставить вначале на болт". Грустно, но в своих областях они "шарят" очень хорошо. Речь конечно о гровер шайбах и обычных.

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

Пластина, на которую крепятся две каретки (чертеж из исходной статьи).

Разберу чертеж поподробнее:

На данной картинке забыл обозначить размеры самой каретки, они 45.4x27.

У автора чертежа, размер между краями кареток, равен 121.4мм. - в итоге, ход столика за счет ширины "тандема" кареток составляет 300-121.4= 178.6мм., т.е. ход столика меньше на 1.4мм. (стол 180мм.) Мне лично это не понравилось, и я сдвинул каретки на 1мм., но тут возникает проблема - две пары винтов, крепящие каретки по краям, сдвигаются в пазы стола (они впотай, так что ничего страшного), но они будут в воздухе (а может и нет, как пластина "ляжет" к столику), могут отвернуться винты-тут я ступил.

Но в итоге я сверлил по своим размерам:

Получилось чуть меньше 120мм. между каретками, и полный ход столика.

Небольшое примечание по поводу ширины планки, а именно, почему она такая ?.

Гайки крепления к столику, это имбусы (в принципе можно и другие шляпки использовать, просто, допустим шестигранник не очень удобен, хотя, если есть торцевая головка, то пофигу), диаметр головки всё равно будет примерно 10мм. Получаем: ширина каретки 27мм. + два винта по 10мм. = 47мм.

Но это ещё не всё, шайбы нам картину портят.

Диаметр гровер шайбы под болт М6 = 11.5мм. Диаметр обычной шайбы = или 12мм. или 13мм. Вот и считаем: 27+13+13 = 53мм. Автор чуть увеличил на всякий, и получается 55мм.

Я это к чему.

В своём городе, в "обычных" магазинах, я не нашел алюминиевых пластин, размерами больше 50мм. и толщиной 3 и более мм. (заказать то конечно можно под размер). Или, как безысходный вариант, найти алюминиевые уголки 50х50х3 (а они продаются в Леруа, Максидом, Мегастрой и т.д.) и отрезать одну сторону уголка, но максимум мы "выжмем" 47мм. (уголки по внешним размерам указываются). Т.е., по расчетам выше, мы "впритык". Можно и так, но придется отказаться от обычных шайб (гровер сместится при закручивании). Так же нельзя будет использовать обычные шестигранные головки, т.к. размер у них по углам = 11мм. (ну если только разнести отверстия чуть ближе к краям).

Итого.

Нужно искать пластины размерами 126х55х3. Длина и ширина пластин пофигу, в плане увеличения, т.е. можно 130х60 к примеру (такие я "попросил" у знакомых на заводе). Толщина ну смотрите, в эту толщину будут вставляться винты, диаметром 3мм. с потайной головкой. Высота головки 1.65мм. для винта М3 длиной 6мм.

Глубину зенковки найдете в инете.

Тут оговорка у меня есть винты M3 с потайной головкой длиной 20мм., и эти винты не встают в раззенкованное отверстие глубиной 1.65мм. - нужно зенковать больше - поясните плиз, почему. Я в плане стандартов спрашиваю, понятно, что могу померить, но все же.

В итоге, толщина у пластины для винта впотай, "скрашивается" до, грубо говоря, 1мм. - это нормально в том плане, что после зенковки, диаметр "остатка" отверстия не увеличивается. Но, как и пишет автор статьи: "не используйте в качестве зенкера сверло" (у сверла другой угол заточки, не 90град, как у зенкера) . В итоге принимаем толщину 3мм. (мне с завода дали 2.9мм.) Можно толще, но при этом учтите, что пластина должна быть прямой. При толщине пластины 3мм. и зажав её 6ю болтами М6, она сама станет прямой ИМХО.

На заметку.

При заказе винтов с потайной головкой, имейте в виду, что высота самой головки входит в длину винта.

Почему я оперирую длиной рельс 300мм., если у меня длина профилей 290мм. ?

Отвечаю.

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

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

Если нет станка, то это очень легко сделать надфилем (руками я такие операции делал), планки легко растачиваются. С планками закончили.

Сверловка пластин. Что на станке, что "ручками" - одно и тоже ("ручками" - есть нюансы).

Станок.

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

На станке по осям X/Y конечно есть люфт, и вот из-за этого люфта я не стал отмерять всe отверстия по лимбам станка, т.к. ошибешься, и всё по новой.

Сверловку я делал по наклейке, которую распечатал на струйнике (использовал самоклейку). И опять таки сверил две пластины вместе (если пластины не одинаковые по ширине, то их нужно отторцевать, чтобы в тиски зажались обе). Или же, сверлить их по отдельности и на каждой - наклейка.

Совет.

Между губками тисков и заготовкой (а в нашем случае двух заготовок друг на друге), подложите полоски обычной газеты - толщины газетной полоски хватит, чтобы хорошо зажать заготовку (газетка действует как... ну пусть будет "демпфер" между губкой тисков и заготовкой). Газетку можно чуток смочить маслом, чтобы она прилипла к губкам.

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

Теперь самый гемор:

- нужно совместить центр каждого отверстия с центровочным сверлом;

- сделать предварительную сверловку;

- просверлить "обычным" сверлом;

И такая последовательность для каждого отверстия :(

Почему вначале центровочное сверло:

"Обычное" сверло относительно длинное, и оно может "уехать" от точки сверления - биение сверла, жесткость. А после центровочного сверла, "обычное" войдет в отверстие сделанное центровочным, по любому. Даже, если сместить центр на станке (ну тогда или сверлу облом или отверстию).

Для позиционирования сверла, нужен центроискатель. У меня такой:

К этому видео, ремарка.

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

Продолжу по центроискателю.

Он хорош, но вылет у него уж очень большой вместе с его патроном, и в плане "поднимать/опускать стол станка" (конструктив у моего станка такой), не очень удобно. В итоге плюнул и стал использовать твердосплавное сверло для ПП 0.3мм. (оно короче). Нахождение центра :

И дальше, для каждого отверстия, подводим сверло (а-ля "центр") на минимальной высоте и совмещаем с "крестом" центра на бумажке (очки, лупа и т.д., от зрения зависит). И сверлим по шагам (центровка, смена сверла), как описал выше.

Сверловка руками.

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

По бумажке лучше таким образом разметить все отверстия, и затем бумажку удалить.

Затем, очень нежно (без нажима, только вес самого инструмента), шуруповертом/дрелью со сверлом порядка 1-1.5мм. делаем лунку в разметке. Очень желательно делать это под 90град., т.к. любой наклон сверла уведет размеченную лунку в сторону (проходил это). Т.е. процесс ручного сверления алюминия очень тонкий, даже, когда сверлим по кондуктору - имейте это в виду. Вначале лучше просверлить отверстия как можно малого диаметра - порядка 1-1.5мм., и затем нужным диаметром. Тут затык в том плане, что нужно просверлить две пластины (писал выше). Пластины между собой "скрепляем" двухсторонним скотчем (не "уедут" они относительно друг друга, даже, если они изогнуты), и затем кладем их допустим на ЛДСП, и потом крепим струбцинами к столу, примерно так (ЛДСП забыл подложить, но фото один фиг постановочное):

Далее.

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

Или сразу сверлим все отверстия без промежуточного крепежа.

Затем рассверливаем все отверстия,уже по кондуктору, вначале сверлом 3мм., а отверстия, где нужен диаметр 6мм., я бы рассверливал вначале "промежуточным" сверлом 4.5мм., затем 6мм. (и отверстия 3мм. я бы тоже вначале рассверлил промежуточным сверлом).

После сверления, у отверстий остаются кромки. Чтобы их убрать, я их "зенкую": отверстия 3мм. сверлом 6.5мм., отверстия 6мм. сверлом 10мм.(это мои подборки диаметров сверл для "зенковки"), ручками - это легко.

Пластины просверлены, нужно сделать зенковку под потайные винты крепежа кареток.

На станке.

Что на станке, что руками, я сделаю это при помощи зенкера, который у меня был в наличии, вот такого:

Он по дереву, но пишут, что может работать по цветмету (очень плохо он работает по алюмишке, т.к. режущих кромок много). Для алюминия, думаю, достаточно двух режущих кромок (поправьте, если не так).

Почему плохо работает? Стружка забивается между режущих кромок и приходилось вычищать стружку кистью.

Ну что есть, то есть.

Станок.

Чтобы сделать зенковку, вначале зенкер нужно отцентровать по каждому отверстию. По хорошему это делается при помощи того же индикатора ИРЦ (диаметр шарика у него примерно 2мм.) а отверстия под зенковку у нас 3мм., или при помощи более "взрослых" приспособлений, например такое (видео взял первое попавшееся, см. с 8:37):

Просто при помощи ИРЦ не очень удобно находить центр, т.к. сам индикатор крутится - о вращении при помощи движка станка можно забыть и вращать шпиндель только руками. Короче голова кругом пойдет :)

Я поступил "дедовским" методом.

Зажимаю пластину в тиски.

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

Промахнулись (утрирую конечно):

Попали:

И затем поднимаю стол, и, если сверло не уходит вверх, а "вставляется" в отверстие, считаем что центр найден.

Зенковка.

Станок.

Вот честно, не знаю, как найти по простому поверхность, относительно которой нужно зенковать (будут советы, типа: "считай и т.д." - неохота :) ) Но это в данном случае. Я делал так: включил станок, подвожу зенкер к заготовке, и как услышу писк, то считаю, что от этого уровня нужно углубляться на... 1.65мм.Если есть другие варианты в данном случае, то попрошу описать, заранее спасибо!

Таким образом зенкуем 8 отверстий в каждой пластине (у нас их две). Гемор ещё тот.

Руками.

Зенкер в шуруповерт/дрель и вручную, потихоньку проходимся по каждому отверстию (именно по алюмишке не пробовал, но по ЛДСП - без проблем).

Получилось так:

Осталось изготовить центральную пластину для крепления гайки.

Вот тут, опять таки извиняюсь, кто живет в "глубинке". В Казани я нашел пластину 40х3 длиной 1м. И по чертежу (да да, не по ГОСТу чертеж) изготовил такую пластину:

Распечатал наклейку, и наклеил её на заготовку. И далее просверлил отверстия (что станок, что ручками - всё выше описано). Опять таки, центровка наклейки нам не важна, нам нужны относительные размеры. Если нужно, скину чертеж в pdf.

С одного края пластины нужно сделать проточки, т.к. пластина будет упираться в винты крепления шаговика.

Далее, нужно сделать опоры между пластиной и столиком.

Я их делал из обрезков профиля, которые остались после отрезки профилей для оси X (отверстия как раз для крепления профиля 2040). Вот не скажу я вам нужную высоту профилей, делал по месту. Получилось так:

Видите проставки между пластиной и профилем... Это я с размером ступил. Пришлось вот так поступить. Хотя есть варианты, навскидку:

- есть алюминиевые квадратные прутки 16мм. + нужно порядка 2мм. и более на проставку;

- тупо болты с гайками;

Реальную высоту я не пишу, т.к. тут по месту нужно подбирать.

И с одного края пластины вырезы для винтов, которые крепят шаговик (да, надфилем, и получилось колхозно):

В итоге получилось так:

Позволю себе выложить два видео, где видно/слышно как люфтит гайка в крайних положениях. А это значит, что высота центральной пластины отъюстирована, и это отлично!

Осталось отъюстировать сам столик, а это уже отдельная статья (кучеряво юстировать....). И про гайку нужно подумать.

Всем спасибо!

Подробнее..
Категории: Diy или сделай сам , Чпу , Cnc , Cnc3018

Tru3bic0n корпус в кубической орбитальной пространственной раме

26.02.2021 12:14:08 | Автор: admin

" Вы вообще очень странные существа, наконец сказал визирь. Вы даже устроены удивительно у вас мягкие ткани тела торчат наружу, а кость находится глубоко внутри.
А что тут такого? опешил я.
Нет логики, сказал кубарь. Логично, когда организм защищает панцирем свои мягкие ткани от внешней среды. Но какой смысл держать кости внутри организма, окружив их мягкой ранимой тканью? Словно вас раздирает что-то изнутри, словно вы опасаетесь агрессии изнутри больше, чем от окружающей среды." -- Леонид Каганов (рассказ 'Там где нет ветра')

Примерка для инкапсуляции. Слева направо - двойной RaspberryPi 4B, nVidia Jetson Nano B01, Intel NUC gen11.Примерка для инкапсуляции. Слева направо - двойной RaspberryPi 4B, nVidia Jetson Nano B01, Intel NUC gen11.

История tru3bicon

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

Суть tru3bic0n

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

Описание tru3bic0n

Итак, рассматриваемый корпус представляет собой объект класса Евклид своеобразный "кубик в кубе" - внутренний куб имеет сэндвичную структуру, будучи разделен на 2 подошвы теплообмена и картридж с инкапсулированной электроникой и вмонтирован диагональными ребрами во внешнюю орбитальную кубическую раму. Форма куба концептуально являет собой базовый не бионический элемент, который многим близок с детства - от наборов разноцветных кубиков, через кубические игральные кости, до культового кубика Рубика. Наиболее рациональными материалами для формирования данного корпуса сейчас видятся сплавы алюминия, магния, меди.

Применение tru3bic0n

Наболее целесообразными кейсами наполнения нового корпуса представляются одноплатники - туда с легкостью размещаются всевозможные Pi-образные платы с обилием обвязки и коннекторов. Также корпус представляется интересным для инкапсуляции системных плат микроПК, микроворкстейшнов, микросерверов. Не исключены и кейсы удобной инкапсуляции высокопроизводительной периферии - внешних видеокарт, сопроцессоров нейрокомпьютинга, asic-майнеров.

Контекст tru3bic0n

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

Технологии tru3bic0n

На ранних итерациях для небольших партий - наиболее продуктивным способом изготовления представляется вытачивание рамы из монолитных заготовок посредством ЧПУ-фрезерования. В мелкосерийном производстве для оптимизации потерь времени/материала/оснастки целесообразными выглядят технологии литья в заполняемую форму по SLA 3D-печатным испаряемым моделям и металлическая 3D-печать по SLM-процессу. Относительно картриджей для электроники - пока вполне здравим смотрится планомерный путь от полимерной SLA/DLP/LCD 3D-печати, через двухкомпонентное литье в силиконовые формы, к штамповке пластиком в пресс-формах под давлением.

Ценность tru3bic0n

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

Планы tru3bic0n

Сейчас концепция корпуса еще довольна сыра и поверхностна, но если вектор фидбека окажется в позитивном ключе - планирую интенсивную проработку/дополнение/исправление. Относительно реализации, на данный момент есть только FDM-напечатанные габаритные модели - запланированные посредством ЧПУ-фрезерования прототипы из Д16Т отложены на март/апрель/май по причине тотального отстуствия в ДефолтСити вменяемых розничных поставщиков крупных алюминиевых заготовок, прототипы посредством литья через выгораемые модели пока малореальны по факту отсутствия у потенциальных изготовителей SLA-3D-принтеров с достаточно крупной рабочей камерой, прототипы посредством SLM-3D-печати теплопроводящими сплавами еще нецелесообразны по факторам чрезмерных затрат времени и ресурсов, которые требуются для этой сыроватой технологии. Буду рад любой конструктивной критике концепта, любым рацпредложениям по конструктиву, любой полезной информации для совершенствования корпусировки.

Сопоставление габаритов Raspberry PiСопоставление габаритов Raspberry PiСопоставление габаритов Jetson NanoСопоставление габаритов Jetson NanoСопоставление габаритов Intel NucСопоставление габаритов Intel Nuc

"- Куб значит частица куб значит воксель куб значит пиксель куб значит цель куб значит выбор куб значит свобода куб значит жизнь куб значит всё...
- Куб начинается и куб заканчивается я живу ради куба - у жизни нет другого смысла и у жизни есть смысл - смысл значит куб.
- Жизнь бессмысленна без цели, а у меня есть цель - у меня есть куб!" -- я (небольшая графоманская импровизация на тему философии кубарей в scp-стиле)

Подробнее..

Как немного облегчить себе жизнь при проектировании электроники?

27.02.2021 00:16:25 | Автор: admin
GALILEO by Intel. Честно взято тут (http://personeltest.ru/aways/www.ema-eda.com/sites/ema/files/Constraint%20Management.zip)GALILEO by Intel. Честно взято тут (http://personeltest.ru/aways/www.ema-eda.com/sites/ema/files/Constraint%20Management.zip)

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

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

Всё нижеизложенное - ни в коем случае не истина в последней инстанции, а всего лишь частное профессиональное мнение автора.

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

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

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

Посадочные места и трёхмерные модели

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

А что является таковой для печатных плат?

Правильно. Посадочные места ЭРИ!

Прежде всего, забудьте про такую вещь, как чужие посадочные места из непонятной (или понятной) библиотеки из интернета. Только своё, только хардкор! Да, это сложно, особенно, когда проектирование электроники - не ваша основная область деятельности. Но если вы хотите делать действительно качественную электронику - начните делать футпринты самостоятельно. Так в них будут ваши и только ваши ошибки, а не чьи-то чужие. Это не так сложно, особенно если пользоваться адекватными генераторами. Например, с недостатками бесплатной версии PCB Library Expert вполне можно мириться. Зато вы получаете посадочные по IPC из коробки. Вместе с адекватными трёхмерками. При этом, создавая свою библиотеку ЭРИ, вам лучше заранее договориться, как будут называться файлы. Логично, если вы рисуете посадочные по IPC, и называть их так же по методологии IPC. Вы ведь в курсе (да?), что те же конденсаторы, одинаковые по размерам в плоскости, могут иметь совершенно разную высоту, и иногда это может иметь решающее значение.

RESC100X50X40L25NRESC100X50X40L25N

Почему это так важно? Следование рекомендациям IPC позволяет в большинстве случаев получить гарантированно адекватную пайку (для многих стандартных корпусов). Потому что люди старались, вкладывали свой опыт и знания в информацию, которая содержится в IPC-7351B и прочих документах этой замечательной организации (долой почти два с половиной часа времени и мои уши слегка подвяли от акцента Роберта, но оно того стоит, рекомендую!). Сколько моих плат было спаяно что вручную, что на конвейере в печи оплавления - практически не было проблем. При этом посадочные по IPC вполне годятся и для ручной пайки. Может при помощи ЭПСН вы их и не спаяете (на самом деле, сильно зависит от жала), но каким-нибудь клоном серии T12 - запросто!

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

Типичный пример нестандартного трындеца от TIТипичный пример нестандартного трындеца от TI

Для совсем ленивых есть такие сервисы, как SnapEDA, Ultra Librarian и прочие, которые предоставляют вам услуги генерации посадочных мест, УГО и трёхмерок интересующих вас ЭРИ. Поскольку эти сервисы ориентированы на массовость экспорта, как правило, они не учитывают некоторых особенностей конкретных электрических САПР. Например, в SnapEDA невозможно выдать посадочные с площадками с закруглёнными углами. А переделывать сгенерированные из таких сервисов посадочные - то ещё удовольствие. Если берёте оттуда трёхмерки, обязательно проверяйте размеры. То же самое касается и 3D ContentCentral и GrabCAD. Сколько ни пытался оттуда что-то использовать в неизменном виде, всегда были расхождения по размерам.

Паяльная маска (слева) и импортированные из pdf контуры (справа)Паяльная маска (слева) и импортированные из pdf контуры (справа)

Если производитель ЭРИ даёт в документации нормальный векторный чертёж своего изделия (вы же умеете на глаз отличать векторную картинку в pdf от растровой?), бывает чрезвычайно полезно перевести его в, например, dxf, который уже потом, как правило, можно импортировать в вашу любимую САПР, чтобы убедиться, что всё то, что вы понарисовали, соответствует действительности. Это альтернативный безбумажный (а не как советует замечательный Роберт) метод проверки адекватности вашего посадочного места. В комментариях к видео еще предлагают печатать для проверки не на бумаге, а на прозрачной плёнке, но это тоже такое себе. Что делать со статикой? Как быть, если компоненты ещё только в закупке и приедут недель через десять? В общем, спорно. Кстати, импортируя dxf, всегда хорошо проверять, а соответствуют ли расставленные размеры реальным (и дело не только в чудесных словах not to scale на чертеже из документации). Я так и не разобрался, откуда возникают ошибки в импортированных из pdf размерах, но это бывает. Поэтому проверяйте, проверяйте и еще раз проверяйте! На фото ниже дорогущий компас почему-то не работал. Интересно, почему?

Реальный косяк разработчика (выбран неправильный шаг площадок) с размерами из моей практики. И ведь было припаяно. Александр, если вы узнали свой дизайн, не обижайтесь, пожалуйста! И на старуху, как говоритсяРеальный косяк разработчика (выбран неправильный шаг площадок) с размерами из моей практики. И ведь было припаяно. Александр, если вы узнали свой дизайн, не обижайтесь, пожалуйста! И на старуху, как говорится

Зачем вообще заморачиваться с трёхмерками в библиотеке? Всё очень просто: чтобы облегчить себе и коллегам проектирование корпуса и вообще любой сопутствующей механики. Намного проще при создании компонента сразу привязывать к нему модель, чем после трассировки всей платы натужно сопоставлять примененные посадочные места с имеющимися моделями. И опять же, не ленитесь использовать конкретные трёхмерные модели, а не единый условный конденсатор "0603" на всю пассивку 0603. К тому же, многие производители предоставляют трёхмерки своих изделий, по которым в том числе можно проконтролировать адекватность создания посадочного места.

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

Шёлк

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

Догадаетесь, где у этого источника питания резисторы обратной связи?

Не идеальная плата, но работаетНе идеальная плата, но работает

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

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

Вот смотрите:

Шёлковые треугольникиШёлковые треугольники

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

opt3001opt3001

Что делать, когда шёлк нет смысла заказывать, а показать первый вывод хочется? А всё просто. Переносите треугольник в слой меди (или вскрытия маски). Разумеется, если окружающее пространство позволяет. Ещё один удобный приём, когда вы планируете заказывать шелкографию: рисуйте на многоногих разъемах не только первый вывод, но и с определённым шагом номера других выводов. При отладке устройства это очень облегчает тыканье осциллографом, поскольку вам не приходится вручную отсчитывать какой-нибудь семьдесят третий вывод от начала или считать, какой он там будет по порядку с конца, если в разъеме у вас 120 контактов.

Как было спроектировано и как получилось. Напаянное всё уже в работе, но смысл понятенКак было спроектировано и как получилось. Напаянное всё уже в работе, но смысл понятенЭто разъем для UART. Сами разберётесь, почему земля в центре, а не сбоку?Это разъем для UART. Сами разберётесь, почему земля в центре, а не сбоку?

Т.е. вам, практически, не требуется монтажная схема. Достаточно будет только электрической принципиальной с подписанными номерами контактов. Что делать со сквозными разъемами? Меня очень расстраивают печатные платы, на которых первый контакт в разъемах никак не обозначен отличающейся по форме медью. Ведь сразу очевидно, где тут первый контакт. Это бывает очень полезно при отладке в полях, когда плата установлена в корпусе, вы в форме буквы зю изогнулись со щупом осциллографа и еле подлезаете к разъему, а шёлк-то остался с другой стороны и вы, подсвечивая себе зиппой, думаете - а где же тут первый вывод в разъеме? С таким никогда не запутаетесь. Кстати, буду очень признателен, если кто-нибудь в комментариях объяснит мне смысл овально-вытянутых eagle-style площадок для выводных разъемов. Я вот как-то до сих пор этого не понимаю.

Порядок слоёв

Как было и как сделалиКак было и как сделали

Вполне понятно, что если вы делаете двухслойку, то скорее всего герберы (я очень надеюсь, что в производство вы отдаёте герберы, а не проекты) имеют имена для меди вида TOP\BOT или Верх\Низ и тому подобное. А как убедиться, что вашу заметку о том, в каком порядке идёт медь, технолог прочитал? Или что банально слои не перепутали местами? У меня было несколько раз такое. Благодаря описанному ниже способу, завод без особых проблем и проволочек признавал брак и переделывал всё за свой счёт. Приём прост и эффективен. Добавляйте номера слоёв прямо в медь. Вот очередной пример слева. Вверху показано то, как это спроектировано, а далее вид сверху и снизу. Не забывайте делать вскрытие маски в месте размещения такой маркировки. При необходимости для просвечивания пользуйтесь фонариком. Да, разумеется, всё зависит от толщины слоёв диэлектрика, но, как правило, всё достаточно хорошо видно на четырёхслойках. На шестислойках просто с цифрами всё уже гораздо хуже. Что делать в таком случае? Лесенку. Типа вот такой:

Лесенка из меди (http://personeltest.ru/aways/dornerworks.com/blog/pcb-stacking-stripes-could-change-the-way-you-look-at-hardware)Лесенка из меди (http://personeltest.ru/aways/dornerworks.com/blog/pcb-stacking-stripes-could-change-the-way-you-look-at-hardware)

И вот как это выглядит на реальной плате:

Вид торца печатной платы (http://personeltest.ru/aways/resources.altium.com/p/pcb-design-test-test-structures-and-types-tests-part-1)Вид торца печатной платы (http://personeltest.ru/aways/resources.altium.com/p/pcb-design-test-test-structures-and-types-tests-part-1)

Очень рекомендую прочитать статью в блоге Altium и посмотреть видео из другой статьи. Сам пока что такие лесенки не делал, поскольку в основном всё, что делаю, - двухслойки и четырехслойки. Очевидный минус таких лесенок заключается в том, что многие производители крайне не любят фрезеровать медь той фрезой (тупится, видать, и задиры остаются), которой выгрызают контур печатной платы. И отдельно пишут о том, что между фрезеруемым контуром и ближайшей медью должно быть определённое минимальное расстояние. Но, полагаю, если обратить внимание технолога на то, что в проекте так специально заложено, никто особо возражать не будет.

Инженеры из Gigabyte (http://personeltest.ru/away/www.xtremesystems.org/forums/showthread.php?267340-Sandybridge-for-overclocking-two-solutions-review) одобряют. Такую же маркировку я наблюдал и на некоторых материнках AsusИнженеры из Gigabyte (http://personeltest.ru/away/www.xtremesystems.org/forums/showthread.php?267340-Sandybridge-for-overclocking-two-solutions-review) одобряют. Такую же маркировку я наблюдал и на некоторых материнках Asus

Выравнивание

Хотя сам монтаж - это совсем отдельная тема, стоит упомянуть про вещь, которая может его немного облегчить.

В идеальном мире есть схемотехник, тополог, SI, PI и многие другие инженеры, которые по-хорошему должны работать над проектом. Но, жизнь часто вносит свои коррективы, и иногда паять, трассировать, моделировать и многое другое делать приходится самому (да-да, колхоз как он есть!). А когда в проекте есть ЭРИ, которые из-за размеров, веса или технологии пайки не смогут нормально гарантированно самоцентрироваться из-за поверхностного натяжения припоя, хочется изначально установить их максимально точно. Хорошо, когда есть специальный манипулятор для установки компонентов. А что делать, когда есть только пинцет, да и тот вовсе не вакуумный?

А есть вот такой приём:

Вскрытие маски по углам под корпусом (слева), оно же с периметром корпуса (центр), как это выглядит в ортографической проекции в 3D (справа)Вскрытие маски по углам под корпусом (слева), оно же с периметром корпуса (центр), как это выглядит в ортографической проекции в 3D (справа)

Идея очень проста: в углах компонента делаем вскрытие паяльной маски (если позволяет окружающая топология, очевидно). Ширины линии вскрытия в 0,15мм вполне достаточно. Поскольку точность совмещения при производстве печатной платы слоёв маски с медью существенно лучше точности совмещения меди и шёлка, то можно надеяться, что вскрытые уголки будут на своём месте. С шёлком такое иногда не прокатывает, особенно на многорядных BGA корпусах, когда сместил всё на 0.5мм и уже промахнулся на целый ряд. Очевидно, что надо понимать, для какого т.н. material condition вы делаете свои модели и посадочные места, для nominal или maximum (я всё делаю для nominal) и, соответственно, можно ожидать, что уголки будут работать не всегда идеально.

В жизни это выглядит примерно так. Мой микроскоп не делает ортографическую проекцию (странно, да?), поэтому показан только один уголВ жизни это выглядит примерно так. Мой микроскоп не делает ортографическую проекцию (странно, да?), поэтому показан только один угол

Как с этим работать в реальности? А очень просто. Вы нанесли пасту через трафарет (не экономьте на трафарете, кстати!) и начинаете расставлять комплектующие. Вместо того, чтобы с одного захода сразу опускать и придавливать компонент на пасту, аккуратно опускайте его на поверхность пасты и, обсматривая с углов, добивайтесь максимальной симметричности расположения. И только после этого прижимайте компонент к пасте, тоже не усердствуя, чтобы не сдвинуть. Как правило, если паста третьего типа, не просрочена и не бодяжилась самодельным флюсом, суспензия будет совсем слегка пачкать площадки компонента. При необходимости до прижима можно даже снять компонент и не перенаносить пасту и не чистить площадки компонента.

И последнее, но далеко не последнее

А то будет как тут https://www.eevblog.com/forum/projects/silk-screen-on-exposed-pcb-padsА то будет как тут https://www.eevblog.com/forum/projects/silk-screen-on-exposed-pcb-pads

Проверяйте герберы, которые отправляете на завод, не ленитесь! Я не буду советовать конкретный софт здесь, поскольку есть много разных просмотрщиков с разной сложностью использования и задачами, которые они могут решать. Лучше, если вы смотрите герберы не в той же программе, которая их генерирует. Ну так, на всякий случай. Наверное, очень здорово, если в таком просмотрщике можно что-то измерить (те же минимальные зазоры и толщины, например, чтобы убедиться, что ваша плата соответствует определенному классу точности). Сверка герберов даже чисто визуально помогает избежать глупых ошибок. Вы инженер, который проектирует печатную плату. Технолог на заводе в общем случае не обязан за вас думать. Его задача - изготовить вам плату максимально близко к тому, что вы прислали. А уж что вы там напроектировали, это не его забота. Может вам так надо.

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

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

Stay tuned, как говорится!

Подробнее..

Повышение надежности контроллера умного дома на Majordomo (MQTT)

27.02.2021 02:05:07 | Автор: admin

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

Более того, умные устройства стоят теперь как на даче, так и дома, в городе. Причем из-за особенностей совместимости экосистем с Яндексом часть устройств дома (RGB ленты) управляются через сервер на Majordomo (дача).

И вот тут возникает ряд логичных вопросов:

где должен стоять сервер дома или на даче?

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

Как не грузить GSM канал до дачи передачей графиков в HTML верстке сайта?

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

1. Серверы должны быть и там и там

2. Серверы должны уметь управлять всеми устройствами

3. Серверы должны иметь полный набор данных

Так как датчики общаются с сервером в основном через протокол MQTT, MQTT брокер так же становится точкой отказа.

Резервирование сервера

Начнем с MQTT брокера. Если не считать таких сообщений, как LWT (последняя воля устройства) и Retain (хранимых на сервере), большинство сообщений передаются одномоментно и только тем, кто в данный момент подключен к брокеру. То есть "отправил - забыл".

К счастью, в последних версиях mosquitto сервера есть режим бриджа вы просто задаете адрес второго брокера и топики, которые нужно дублировать, направления дублирования. В моем случае вполне пригодился вариант копировать все в обе стороны. Вот как это делается в raspbian/armbian добавляем в /etc/mosquito/mosquito.conf:

#connection bridge-01connection bridge-01address mqtt.mydomain.ru:1883topic # out 0topic # in 0

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

Дальше, сами серверы Majordomo. Я сделал второй сервер на базе Orange pi one plus (1Gb RAM) стоит в 2 раза дешевле Raspberry Pi4, для вспомогательного сервера - то, что надо. Но серверы должны уметь делать одно и то же, но не делать этого одновременно (в большинстве случаев это не страшно, ну поступит 2 команды на включение зарядника не страшно, но некоторые вещи лучше дважды не делать, например, не поворачивать солнечные панели по часам).

Так как для корректной работы с датчиками и исполнительными устройствами я использую MQTT, логично отслеживать работоспособность удаленного сервера через тот же MQTT. Для этого я создал отдельный класс, в котором есть 2 статуса (для отображения) и 2 времени для локального сервера и для удаленного, а также адрес активного брокера и собственный адрес сервера. Раз в 10 секунд выполняется проверка системного цикла MQTT время последнего запуска (ThisComputer.cycle_mqttRun). Это время сравнивается с текущим (time()). Если прошло больше 10 секунд паникуем, то есть понимаем, что локальный сервер не дружит с MQTT брокером и показываем это в интерфейсе. Так же сравниваем время последнего запуска MQTT цикла на удаленном сервере (приходит через MQTT). Если прошло больше 20 секунд, а локальный цикл в порядке понимаем, что удаленный сервер больше не управляет устройствами. Проверяем еще один параметр, передаваемый через MQTT имя активного брокера. Если это не локальный, то надо переключать на себя:

$val=getGlobal("ThisComputer.cycle_mqttRun");$locval=time()-$val;$this->setProperty("LocValue",$val);$this->setProperty("LocDeltaT",$locval);if($locval>10)$locstate=1;else$locstate=0;$tmp=$this->getProperty("Status");if(is_null($tmp))$tmp=10;if($tmp!=$locstate)$this->setProperty("Status",$locstate);$remval=time()-$this->getProperty("RemValue");$newstate=($remval<20)?0:1;$this->setProperty("RemStatus",$newstate);$ot = $this->object_title;$currBroker=$this->getProperty("MQTT_broker");$sA=$this->getProperty("selfAddress");if($sA!=$currBroker)$this->setProperty("isController",0);setTimeOut($ot . "_checkCycle",'callMethod("'.$ot.'.checkCycle");',10);if((!$locstate&&($newstate||($this->getProperty("LinkedRoom")=="Energoblok")))&&($sA!=$currBroker))// remote failed local good or local is good and is not local server{debMes('Switch to '.$this->getProperty("selfAddress"),0);$cnt=0;for($i=40;$i<90;$i++){if(ping('192.168.3.'.number_format($i,0)))    {getURL('http://192.168.3.'.number_format($i,0).'/cm?cmnd=MqttHost%20'.$this->getProperty("selfAddress"));debMEs('http://192.168.3.'.number_format($i,0).' is online',0);$cnt++;$this->setProperty("LocValue",time());}}if($cnt>10){$this->setProperty("MQTT_broker",$this->getProperty("selfAddress"));$this->setProperty("isController",1);}}
Вот такой виджет, пока корявенько, зато информативноВот такой виджет, пока корявенько, зато информативно

У меня Tasmota устройства (IP в диапазоне c 192.168.3.40 по 192.168.3.90), им можно передать обычным URL запросом новый адрес MQTT сервера. Вот только запросы надо посылать синхронные, а главное не забывать между ними обновлять MQTT свойство для удаленного сервера. Иначе получится замкнутый цикл начали переключаться, больше 10 секунд не сообщаем удаленному серверу, что мы живы. Тот начинает переключение на себя и тоже замирает. Не делайте так :)

Повышаем надежность самого сервера

Операционная система и БД хранятся на карте памяти. Есть карты класса А1 и даже А2, но через год постоянной нагрузки такая карта с большой вероятностью загнется. Кроме того, штатный код пишет в базу кучу ненужного, а каждое чтение/запись свойства любого объекта это обращение к БД. У меня было порядка 1200 обращений к БД в секунду.

Карту можно спасти, если базу держать в оперативной памяти. К счастью, разработчики Majordomo сделали прошивку для Raspberry сразу с опцией БД в памяти, а для прочих платформ есть скрипт для переноса БД в память (но памяти должно быть не менее 1Гб, на orange pi zero c 512Мб у меня не взлетело - база весит порядка 300Мб и столько же надо дополнительно для дампов бэкапов). Да, теперь в любой момент просто так перезагружать систему нельзя, нужно выполнить скриптик, иначе данные за последние полчаса потеряются (но база всегда бэкапится в рабочем состоянии!). Зато скорость работы БД и долговечность карты памяти просто великолепны.

Остался последний штрих снизить нагрузку на БД, убрав лишние запросы. Решение простое:

  • Обновиться до последней версии (буквально пару недель назад обновили интерфейс, убрав лишние обращения к БД и переписав на java скрипты)

  • Обращаться к локальным или глобальным свойствам только один раз и использовать переменные в памяти (смотрите на пример кода цикла проверки getProperty\setProperty там использованы только по одному разу).

Еще пример оптимизации скриптов чтобы и обращений лишних не было, и чтобы срабатывала автоматическая зависимость от переменной, например:

if((($temp2Floor=getGlobal("sTemp2Floor.value"))<'21')&&gg("remote_mqtt_updated.isController")) // if remote failed{if ($temp2Floor < '21' && !getGlobal("rConserveSW.status") && timeBetween('2:00', '8:00')) { if (!getGlobal("rDieselHome.status")) { callMethod("rDieselHome.turnOn"); }} else if ($temp2Floor > '23') { if (getGlobal("rDieselHome.status")) { callMethod("rDieselHome.turnOff"); }}}

Обратите внимание, что в первом условии есть ветка проверки, этот ли сервер управляет устройствами в настоящий момент (gg("remote_mqtt_updated.isController")). remote_mqtt_updated это объект контроля работы серверов.

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

Итог

Вот так, добавив сервер за 2500 рублей, получил полное резервирование брокера сообщений, сервера управления устройствами (логики) и можно получать графики с актуальными данными с домашнего сервера, не нагружая сервер, работающий через GSM модем.

Подробнее..

Хакаем CAN шину авто. Мобильное приложения вместо панели приборов

28.02.2021 04:04:14 | Автор: admin
Мобильное приложение VAG Virtual CockpitМобильное приложение VAG Virtual Cockpit

Я продолжаю изучать CAN шину авто. В предыдущих статьях я голосом открывал окна в машине и собирал виртуальную панель приборов на RPi. Теперь я разрабатываю мобильное приложение VAG Virtual Cockpit, которое должно полностью заменить приборную панель любой модели VW/Audi/Skoda/Seat. Работает оно так: телефон подключается к ELM327 адаптеру по Wi-Fi или Bluetooth и отправляет диагностические запросы в CAN шину, в ответ получает информацию о датчиках.

По ходу разработки мобильного приложения пришлось узнать, что разные электронные блоки управления (двигателя, трансмиссии, приборной панели и др.) подключенные к CAN шине могут использовать разные протоколы для диагностики, а именно UDS и KWP2000 в обертке из VW Transport Protocol 2.0.

Программный сниффер VCDS

Программный сниффер VCDS: CAN-SnifferПрограммный сниффер VCDS: CAN-Sniffer

Чтобы узнать по какому протоколу общаются электронные блоки я использовал специальную версию VCDS с программным сниффером в комплекте. В этот раз никаких железных снифферов на Arduino или RPi не пришлось изобретать. С помощью CAN-Sniffer можно подсмотреть общение между VCDS и автомобилем, чтобы затем телефон мог прикинуться диагностической утилитой и отправлять те же самые запросы.

Я собрал некоторую статистику по использованию диагностических протоколов на разных моделях автомобилей:

  • VW/Skoda/Seat (2006-2012) - приборная панель UDS. Двигатель и трансмиссия VW TP 2.0

  • Audi (2006-2012) - приборная панель VW TP 2.0. Двигатель UDS. Трансмиссия VW TP 2.0

  • VW/Skoda/Seat/Audi (2012-2021) - везде UDS

Протокол UDS

Unified Diagnostic Services (UDS) - это диагностический протокол, используемый в электронных блоках управления (ЭБУ) автомобильной электроники. Протокол описан в стандарте ISO 14229-1 и является производным от стандарта ISO 14230-3 (KWP2000) и ныне устаревшего стандарта ISO 15765-3 (Diagnostic Communication over Controller Area Network (DoCAN)). Более подробно в википедии.

Диагностические данные от двигателя по протоколу UDS (Skoda Octavia A7)Диагностические данные от двигателя по протоколу UDS (Skoda Octavia A7)

В моей машине (Skoda Octavia A5) приборка использует UDS протокол, это дало мне легкий старт разработки, т.к. данные были в простом формате Single Frame SF(фрейм, вся информация которого умещается в один CAN пакет) и большинство значений легко поддавались расшифровке. Volkswagen не дает документацию на формат значений, поэтому формулу расшифровки для каждого датчика приходилось подбирать методом логического мышления. Про UDS протокол очень хорошо и с подробным разбором фреймов написано на canhacker.ru.

Разбор UDS пакета в формате Single FrameРазбор UDS пакета в формате Single Frame

Пример запроса и ответа температуры моторного масла:

7E0 0x03 0x22 0x11 0xBD 0x55 0x55 0x55 0x557E8 0x05 0x62 0x11 0xBD 0x0B 0x74 0x55 0x55

Запрос температуры моторного масла:

  • 7E0 - Адрес назначения (ЭБУ двигателя)

  • Байт 0 (0x03) - Размер данных (3 байта)

  • Байт 1 (0x22) - SID идентификатор сервиса (запрос текущих параметров)

  • Байт 2, 3 (0x11 0xBD) - PID идентификатор параметра (температура моторного масла)

  • Байт 4, 5, 6, 7 (0x55) - Заполнитель до 8 байт

Ответ температуры моторного масла:

  • 7E8 - Адрес источника (Диагностический прибор)

  • Байт 0 (0x05) - Размер данных (5 байт)

  • Байт 1 (0x62) - Положительный ответ, такой SID существует. 0x22 + 0x40 = 0x62. (0x7F) - отрицательный ответ

  • Байт 2, 3 (0x11 0xBD) - PID идентификатор параметра (температура моторного масла)

  • Байт 4, 5 (0x0B 0x74) - значение температуры моторного масла (20.1 C формулу пока что не смог подобрать)

  • Байт 6, 7 (0x55) - Заполнитель до 8 байт

Первая версия мобильного приложения VAG Virtual Cockpit умела подключаться только к приборной панели по UDS.

VAG Virtual Cockpit - экран с данными от приборной панели по протоколу UDSVAG Virtual Cockpit - экран с данными от приборной панели по протоколу UDS

VW Transport Protocol 2.0

Volkswagen Transport Protocol 2.0 используется в качестве транспортного уровня, а данные передаются в формате KWP2000. Keyword Protocol 2000 - это протокол для бортовой диагностики автомобиля стандартизированный как ISO 14230. Прикладной уровень описан в стандарте ISO 14230-3. Более подробно в википедии.

Т.к. KWP2000 использует сообщения переменной длины, а CAN шина позволяет передавать сообщения не больше 8 байт, то VW TP 2.0 разбивает длинное сообщение KWP2000 на части при отправке по CAN шине и собирает заново при получении.

Диагностические данные от двигателя по протоколу KWP2000 (Skoda Octavia A5)Диагностические данные от двигателя по протоколу KWP2000 (Skoda Octavia A5)

ЭБУ двигателя моей машины использует протокол VW TP 2.0, поэтому мне пришлось изучить его. Видимо Volkswagen разрабатывала транспортный протокол не только для работы по надежной CAN шине, но и для менее надежных линий связи, иначе нет объяснения для чего требуется такая избыточная проверка целостности данных. Главным источником информации по VW TP 2.0 является сайт https://jazdw.net/tp20.

Разбор протокола VW TP 2.0 на примере подключения к первой группе двигателя:

200 01 C0 00 10 00 03 01

Настраиваем канал с двигателем. Байт 0: 0x01 - двигатель, 0x02 - трансмиссия. Байт 5,4: 0x300 - адрес источника

201 00 D0 00 03 40 07 01

Получили положительный ответ. Байт 5,4: 0x740 - к двигателю обращаемся по этому адресу

740 A0 0F 8A FF 32 FF

Настраиваем ЭБУ на отправку сразу 16 пакетов и выставляем временные параметры

300 A1 0F 8A FF 4A FF

Получили положительный ответ

740 10 00 02 10 89

Отправляем команду KWP2000 startDiagnosticSession. Байт 0: 0x10 = 0b0001 - последняя строка данных + 0x0 счетчик отправляемых пакетов 0 (0x0 - 0xF)

300 B1

Получили первый ACK

300 10 00 02 50 89

Получили положительный ответ. Байт 0: 0x10 - cчетчик принимаемых пакетов 0

740 B1

Мы отправили первый ACK, что получили ответ

740 11 00 02 21 01

Делаем запрос. Байт 0: 0x11 - счетчик отправляемых пакетов 1. Байт 3: 0x21 - запрос параметров. Байт 4: 0x01 - из группы 1

300 B2

Получили второй ACK

300 22 00 1A 61 01 01 C8 13

Байт 0: 0x22 - 0b0010 (не последняя строка данных) + 0x02 (cчетчик принимаемых пакетов 2). Байт 1,2: 0x00 0x1A длина 26 байт. Байт 3,4: 0x61 0x01 - положительный ответ на команду запроса параметров 0x21+0x40=0x61 из 0x1 группы. Байт 5: 0х01 - Запрос RPM (соответсвует протоколу KW1281). Байт 6,7: (0xC8 * 0x13)/5 = 760 RPM (формула соответствует протоколу KW1281)

300 23 05 0A 99 14 32 86 10

Байт 1: 0x05 - запрос ОЖ. Байт 2,3: (0x0A * 0x99)/26 = 57.0 C. Байт 4: 0x14 = запрос лямбда контроль %. Байт 5,6: 0x32*0x86; Байт 7: 0х10 - двоичная настройка

300 24 FF BE 25 00 00 25 00

0x25 0x00 x00 - Заполнитель, до 8 параметров

300 15 00 25 00 00 25 00 00

Байт 0: 0x15 - 0b0001 (последняя строка данных) + 0x5 (счетчик принимаемых пакетов 5)

740 B5

Отправляем ACK. Прибывляем к нашему предыдущему ACK количество полученных пакетов 0xB1 + 0x4 = 0xB5

300 A3

Запрос KeepAlive, что мы еще на связи

740 A1 0F 8A FF 4A FF

Ответ KeepAlive

740 A8

Мы разрываем связь

300 A8

ЭБУ в ответ тоже разрывает связь

Во второй версии мобильного приложения VAG Virtual Cockpit появилась возможность диагностировать двигатель и трансмиссию по протоколу VW TP 2.0.

VAG Virtual Cockpit - экран с данными от двигателя по протоколу VW TP 2.0VAG Virtual Cockpit - экран с данными от двигателя по протоколу VW TP 2.0

Диагностический адаптер ELM327

Для меня некоторое время было вопросом, как получить данные из CAN шины и передать на телефон. Можно было бы разработать собственный шлюз с Wi-Fi или Bluetooth, как это делают производители сигнализаций, например Starline. Но изучив документацию на популярный автомобильный сканер ELM327 понял, что его можно настроить с помощью AT команд на доступ к CAN шине.

Копия диагностического сканера ELM327Копия диагностического сканера ELM327Не все ELM327 одинаково полезны

Оригинальный ELM327 от компании elmelectronics стоит порядка 50$, в России я таких не встречал в продаже. У нас продаются только китайские копии/подделки, разного качества и цены 10-30$. Бывают полноценные копии, которые поддерживают все протоколы, а бывают и те которые умеют отвечать только на несколько команд, остальные игнорируют, такие адаптеры не имеют доступ к CAN шине. Я например пользуюсь копией Viecar BLE 4.0, который поддерживает 100% всех функций оригинала.

Для работы с протоколом UDS через ELM327 нужно указать адреса назначения, источника и разрешить длинные 8 байтные сообщения, по умолчанию пропускается максимум 7 байт.

Последовательность ELM327 AT команд для работы с UDS по CAN шине:

ATZ // сброс настроекAT E0 // отключаем эхоAT L0 // отключаем перенос строкиAT SP 6 // Задаем протокол ISO 15765-4 CAN (11 bit ID, 500 kbaud)AT ST 10 // Таймаут 10 * 4 мс, иначе EBU шлет повторные ответы каждые 100 мс, а мы не отвечаем, потому что ожидаем конца, а нам нужен только первый ответAT CA F0AT AL // Allow Long (>7 byte) messagesAT SH 7E0 // задаем ID, к кому обращаемся (двигатель)AT CRA 7E8 // CAN Receive Address. Можно задать несколько 7XeAT FC SH 7E0AT FC SD 30 00 00AT FC SM 1 // Режим Flow Control 1 должен быть определен после FC SH и FC SD, иначе в ответ придет "?"03 22 F4 0С 55 55 55 55 // UDS запрос оборотов двигателя

Для работы с протоколом KWP2000 через ELM327 нужно только указать адреса назначения и источника.

Последовательность ELM327 AT команд для работы с VW TP 2.0 по CAN шине:

ATZ // сброс настроекAT E0 // отключаем эхоAT L0 // отключаем перенос строкиAT SP 6 // Задаем протокол ISO 15765-4 CAN (11 bit ID, 500 kbaud)AT PB C0 01AT SP B // Задаем протокол USER1 CAN (11* bit ID, 125* kbaud)AT ST 10 // Таймаут 10 * 4 мс, иначе EBU шлет повторные ответы каждые 100 мс, а мы не отвечаем, потому что ожидаем конца, а нам нужен только первый ответAT SH 200 // Обращаемся к 200 IDAT CRA 201 // Ждем ответа от 201 Блок управления двигателем, 202 - Transmission, 203 - ABS, 207 -  Приборная панель01 C0 00 10 00 03 01 // Initiate channel setup with ECU module - 01, request it use CAN ID 0x300; Transmission 02; ABS 03AT SH 740 // адрес блока 740 получен в ответе на предыдущую командуAT CRA 300 // Ждем ответа от 300 IDA0 0F 8A FF 32 FF // Tell ECU module to send 16 packets at a time, and set timing parameters10 00 02 10 89 // Send KWP2000 startDiagnosticSession request 0x10 with 0x89 as a parameter.B1 // ACK11 00 02 1A 9B // Запрос названия блока KWP2000

Мобильное приложение VAG Virtual Cockpit

Для разработки мобильного приложения подключаемого к автомобилю требовалось:

  • Сниффером собрать трафик от диагностической утилиты VCDS

  • Изучить работу протоколов UDS, VW TP 2.0, KWP2000

  • Настроить диагностический сканер ELM327 на работу с UDS и VW TP 2.0

  • Изучить новый для меня язык программирования Swift

Мобильное приложение VAG Virtual Cockpit для iOSМобильное приложение VAG Virtual Cockpit для iOS

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

Пару слов про точность данных. Штатная панель приборов не точно показывает скорость - завышает показания на 5-10 км/ч, стрелка охлаждающей жидкости всегда на 90 C, хотя реальная температура может быть 80 - 110 C, стрелка уровня топлива до середины идет медленно, хотя топлива уже меньше половины и при нуле на самом деле топливо еще есть в баке. Производитель это делает для удобства и безопасности водителя.

На данный момент приложение показывает следующие параметры:

Приборная панель

Двигатель

Трансмиссия (температура)

1) Какая дверь открыта
2) Скорость
3) Обороты
4) Температура масла
5) Температура ОЖ
6) Топливо в баке в л.
7) Запас хода в км.
8) Средний расход
9) Время в машине
10) Пробег
11) Температура за бортом

1) Обороты
2) Массовый расход воздуха
3) Температура забора воздуха
4) Температура выхлопа (рассчитанная)
5) Критический уровень масла
6) Уровень масла
7) Наддув турбины (реальный)
8) Наддув турбины (ожидаемый)
9) Пропуски зажигания в цилиндрах
10) Углы откатов зажигания в цилиндрах

1) ATF AISIN (G93)
2) DSG6 (G93)
3) Блок управления DSG6 (G510)
4) Масло диска сцепления DSG6 (G509)
5) Мехатроник DSG7 (G510)
6) Процессор DSG7
7) Диск сцепления DSG7

Я стремлюсь чтобы приложение поддерживало как можно больше моделей автомобилей. Пока что поддерживаются производители: Volkswagen, Skoda, Seat, Audi. На разных комплектациях могут отображаться не все параметры, но это поправимо.

Сейчас я провожу тестирование версии 3.0. Приложение доступно только на iOS, после релиза 3.0 перейду к разработке версии для Android.

Если интересно потестировать и есть желание принять участие в проекте, то установить приложение можно по ссылке https://testflight.apple.com/join/Yx9vcPxQ. Также я веду бортжурнал на drive2.ru, где делюсь полезной информацией и новостями о VAG Virtual Cockpit.

Подробнее..

Что нужно помнить при переводе сотрудников на удаленку?

28.02.2021 14:11:42 | Автор: admin

Кейс

Компания, которая 99% работы проводит в офисе. Для коммуникации используют живое общение и электронную почту. С учетом последних событий и тенденций планируют перевести своих сотрудников на удаленку. Что делать, о чем подумать и как не проиграть?

Важно сразу понимать: любой интеллектуальный труд можно перевести на удаленку без потери эффективности (а можно даже и выиграть).

Итак, 4 блока перевода из офиса на дом:

1. IT

  • Установить на компьютеры сотрудников софт для удаленного подключения

Что рекомендую использовать: Teamviewer.

Зачем? Для того, чтобы в любое время можно было подсоединиться к компьютеру сотрудника и помочь ему с установкой софта или с другими вопросами.

  • Установите VPN или аналог. (VPN)

Зачем? Для защиты от утечки персональных данных, слежки, DPI, перехвата трафика и других киберугроз.

Оборудование

  • Купите/предоставьте/компенсируйте сотрудникам качественные и недорогие гарнитуры (наушники+микрофон) и проверьте их работоспособность.

Что рекомендую использовать: Plantronics BlackWire C3220-C

Зачем? У сотрудника должен быть качественный звук на всех встречах.

  • Купите/предоставьте/компенсируйте веб-камеру (если нет в ноутбуке).

Что рекомендую использовать: Любая недорогая камера

Зачем? У сотрудника должно быть видео на всех встречах и это обязательно.

Интернет

  • Выпустите приказ о необходимости выходить в интернет со стационарной домашней линии (в том числе через домашний Wi-Fi) и контролируйте это.

Что рекомендую использовать: Подключать интернет через кабель

Зачем? Мобильная связь или интернет на даче или в кафе не позволят проводить встречи качественно. Ничто так не раздражает, как обрыв связи во время встречи.

Чат для всей компании

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

Что рекомендую использовать: Slack, Microsoft Teams, для небольших команд подходит Discord

Зачем? Обычные мессенджеры (например, Telegram) не предназначены для рабочих целей и плохо подходят для средних и больших команд. Во-первых это небезопасно: права на созданную группу принадлежат отдельному сотруднику, который может покинуть организацию. Во-вторых, идет смешение рабочих чатов с личными. В корпоративных чатах даже есть возможность интеграции с Active Directory.

Видеозвонки

  • Предоставьте сотрудникам минимум 23 варианта софта для видеозвонков. Можно использовать бесплатные версии. Что рекомендую использовать: Zoom, Microsoft Teams,

Важно: Во время звонков видео обязательно.

  • Учите сотрудников демонстрировать экран.

  • Договоренности о звонках делают через чат и заносят в календарь.

  • Важные звонки ставьте на запись.

Зачем? Любой софт может работать со сбоями, а клиенты используют разные инструменты для видеозвонков. Не ставьте сотрудников в позицию заложника одного сервиса.

Календарь

  • Приучайте сотрудников пользоваться календарем и создавайте регламент. Все встречи следует высылать заранее для подтверждения всеми участникам. Если встречи нет в календаре - значит встречи не существует.

Что рекомендую использовать: Google Suite, Office 365

Зачем? Если нет встречи в календаре, то шанс ее пропустить крайне велик. На удаленке не получится подойти к сотруднику и напомнить про встречу.

Облако с документами

  • Приучайте сотрудников пользоваться облаком. Никаких папок на личных устройствах!

Что рекомендую использовать: Google Диск, Яндекс Диск, Dropbox

Зачем? Для порядка в документах и быстрого доступа к ним у всей команды.

  • Таск-трекер и сервисы совместной работы

Что рекомендую использовать: Битрикс24, Asana, Trello

Зачем? Все сотрудники знают о своих задачах и дедлайнах, а вы можете ими управлять

Кадровый ЭДО

  • Подумайте сразу, как подписывать с сотрудниками кадровые документы и получать от них заявления. Курьеров отправлять или копить кипу бумаг - неудобно!

Что рекомендую использовать: HR-Link

Зачем? С каждым сотрудником в год подписывают около 30 кадровых документов. Делать это по старинке: вызывать в отдел кадров или отдавать руководителю документ - не вариант!

2. Организационные моменты

  • Составьте список тех, кого хотите перевести на удаленку.

Зачем? Это основа, вы должны понимать кого отправляете, а кого нет. .

  • Разбейте на группы и составьте график перевода.

Зачем? Делать все сразу рискованно, так как можно запутаться и упустить важные моменты.

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

Зачем? Если сотрудник не знает, что нужно делать, то он не будет выполнять свою работу. Убедитесь, что все ознакомились со своей должностной инструкцией и обязанностями. Все директивы сотрудники воспринимают в штыки Делайте акценты на плюсах для них. Обучите сотрудников работе с софтом на удаленке.

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

Зачем? Сотрудникам не придется самостоятельно разбираться в новых технологиях, что сэкономит время и повысит эффективность.

3. Юридические особенности

  • Подготовьте или внесите изменения и ознакомьте всех сотрудников с ЛНА, который:

  • Регулирует порядок дистанционной (удаленной) работы;

  • Позволяет переводить работников по инициативе работодателя на дистанционную работу;

  • Легализует и регламентирует обмен электронными документами с использованием электронной подписи.

  • Определяет режим работы дистанционщика;

  • Регламентирует режим рабочего времени;

  • Упорядочивает продолжительность и периодичность дистанционки, если она временная;

  • Регламентирует Порядок предоставления отпусков;

  • Уточняют порядок вызова в офис для временных дистанционщиков;

  • Определяет порядок выхода в офис по своему желанию;

  • Уточняют порядок и размер возмещения расходов

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

А если не зафиксировать время работы сотрудника, то может возникнуть следующая ситуация: руководитель звонит работнику в 15:00, а тот не берет трубку и потом говорит, что работал до 14:59. В этом случае ваши претензии к нему будут безосновательны.

  • Включите в ПВТР основные положения, регулирующие дистанционную (удаленную) работу.

Зачем? Наличие основных положений в ПВТР позволит не допустить рисков манипуляций и избежать снижения качества труда.

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

Зачем? Это позволит снизить риск при проверке ГИТ и при обращениях работников в суд.

  • Заключите с сотрудниками соглашения об ЭДО.

Зачем? Бумажный документооборот на дистанционке крайне сложный

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

Зачем? Для использования системы кадрового электронного документооборота

ВАЖНО:

Документы компании - это взаимосвязанная система, так что нужно проверить, как минимум, следующие ЛНА на актуальность и противоречия:

Правила внутреннего трудового распорядка - виды дистанционки, правила приема/увольнения и режим работы

Положение об оплате труда работников, Положение о премировании и материальном стимулировании работников - размер и сроки компенсации за использование своего компьютера или другого оборудования для работы

Положение об аттестации - как проводить аттестацию и оценку дистанционщиков

Положение об обработке персональных данных работников - как работники будут передавать документы с персональными данными и где кадровый сотрудник будет их хранить

Регламенты работы отделов - как дистанционные работники будут взаимодействовать, выполнять задания и отчитываться

4. Психологические факторы

Для правильного выполнения функций планирования, организации, мотивации, контроля и координации принимайте и дополняйте следующие принципы:

  1. Установите часы присутствия на работе (онлайн).

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

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

  2. Установите регламент ответа в чатах и не требуйте мгновенного ответа (это главный враг продуктивности!)

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

  4. Попросите сотрудников использовать в чате только реальные имена и фото (как бы это ни было банально). Чат может и должен стать заменой публичного справочника сотрудников.

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

  6. Проводите регулярные общие видеозвонки с командой и встречи 1-1 с ключевыми сотрудниками. Не реже раза в неделю!

  7. Введите тихие часы. Для максимальной продуктивности у сотрудников должен быть баланс между работой и личной жизнью.

  8. Подумайте над программой wellbeing. Постоянное сидение на одном месте может вызвать проблемы со здоровьем.

  9. Создайте курс Как организовать удаленную работу дома, где подробно расскажете о тайм-менеджменте и прочих правилах и принципах. Дома рамки между отдыхом и рабочим временем размываются. В результате, накапливается усталость, которая может привести к психологическому выгоранию.

Принципы организации рабочего места сотрудника:

  1. Отдельная комната с хорошим интернетом.

  2. Десктоп, ноутбук, гарнитура, камера.

ВАЖНО!

  1. Никаких личных дел во время работы.

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

Учтите, что на первых порах у сотрудников будет много вопросов, поэтому заведите канал помощи в чате.

Если вы будете следовать предложенным правилам и принципам, то сложностей с переводом сотрудников на удаленку не возникнет.

А если у вас появились вопросы, возражения или пожелания, то буду рад вашим обращениям:

Махлин Дмитрий. +79110001778 Телеграм: @MakhlinD

Facebook: facebook.com/MakhlinD, https://www.instagram.com/makhlin.d/

Подробнее..

Перфорационные очки на 3D-принтере для улучшения зрения опыт моделирования и полученный эффект

28.02.2021 22:22:33 | Автор: admin

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

Перфорационные очки, распечатанные на 3d-принтереПерфорационные очки, распечатанные на 3d-принтере

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

Зачем мне перфорационные очки?

Недавно я писала, что начала изучать 3D-моделирование в Компас 3Д. Статью о моих салфетницах можно посмотреть ТУТ. Этот проект завершен. Результат меня очень порадовал и вдохновил к следующим действиям. Встал вопрос, что же эдакое смастерить. Безделушки печатать на 3D-принтере не особо хочется, поэтому решила создать что-то полезное. На момент написания данного поста я ношу свои очки-тренажеры уже 5 дней и эффект ощущаю явный. Но обо всем по порядку.

Итак, почему именно перфорационные очки:

  1. Моделировать гайки и болты, а также простейшие конструкции надоело. Было решено взяться за что-то более сложное. Это был мой второй проект. На деле моделирование очков оказалось до безобразия простым, но к итоговому результату я пришла через слёзы и боль))) Ниже расскажу, почему.

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

  3. Я терпеть не могу делать гимнастику для глаз. Ну, не моё это. Всякий раз, как начинала, меня хватало на 1,5 занятия. Может тренажёры как раз и помогут? Решила проверить свою теорию об эффективности перфорационных очков, о которой не перестают спорить знатоки и обыватели с момента появления продукта на рынке. Если не изменяет память, бум был в годах 90-х.

Принцип работы перфорационных очков

Устройство этих тренажёров для глаз очень простое. Представляют они собой темные пластины с дырочками диаметром 12 мм, расположенными в определенном шахматном порядке. На самом деле, есть мнение, что отклонения в диаметре дырочек и порядке их расположения особого значения не имеют, так как принцип работы единый. Заключается он в том, что через мелкие отверстия на сетчатку глаза пучки видимого света поступают точечно, а не рассеянно, как обычно. Сжатые компактные световые лучи быстрее обрабатываются головным мозгом, который перерабатывает их в более четкую картинку. Именно поэтому в этих очках возникает ощущение, что видишь мир вокруг более четко.

Если говорить о механизме действия, то все завязано на аккомодационном аппарате органа зрения. А конкретнее, на цилиарной мышце глаз.

Как работает цилиарная мышцаКак работает цилиарная мышца

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

PS: я не профессор, у меня всего лишь среднее медицинское образование (фельдшер). А строение органа зрения очень и очень сложное. Поэтому объяснила, как смогла.

Как я моделировала свои перфорационные очки

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

Процесс моделирования:

1. Нарисовала схему очков на бумаге и обозначила нужные размеры. Будет как подсказка.

2. Создала в Компасе деталь. Нарисовала прямоугольник размерами 140х46 мм. Выдавила на 12 мм, так как форма пластины должна быть вогнутой и будем вырезать нужную толщину из имеющейся массы. Дело в том, что моя попытка выдавить пластину из дуги изначально вогнутой формы провалилась не удалось корректно вырезать даже дырочки.

Основа пластиныОснова пластины

3. Вырезала по нужным размерам область переносицы. Для этого сначала установила вспомогательные линии, так как на определенной длине отрезка нужно было высокое скругление. Прорисовала контур основной линией и вырезала выдавливанием. Высота проёма = 2,5 см, длина основания = 3 см.

Чертёж переносицыЧертёж переносицыРезультат после вырезанияРезультат после вырезания

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

Чертеж контуров для вырезанияЧертеж контуров для вырезанияРезультат после вырезанияРезультат после вырезания

5. Дальше прорисовала пазы по бокам, куда будут вставляться дужки очков. От верха располагаются на расстоянии 7 мм, от бокового края 2 мм (лучше сделать 3). Высота отверстия = 10,3 см, толщина = 2,3 мм (чтобы шип высотой 10 мм и толщиной 2 мм вставился свободно).

6. Прорисовала дырочки. Изначально хотела диаметром 1 мм, но решила, что лучше 1,5 мм для более корректной печати на 3d-принтере. Расстояние между перфорациями = 1 мм (но, когда моделировала, идеальное совмещение Компас мне показал на значении 7 так и не поняла, почему, но ориентировалась по схеме визуально). Чтобы быстро размножить отверстия, сначала прорисовала одну начальную и вторую в шахматном порядке во втором ряду. Выделив две окружности, скопировала по сетке, определила количество элементов и расстояние между ними. Затем удалила лишние отверстия, которые располагаются слишком близко к краям или выходят за них. Отзеркалила сетку для другой пластины. Чтобы убедиться в правильности размеров и расстояний между дырочками, открыла фото перфорационных очков, схожих по форме с моими, и посчитала вручную, сколько их там. Все оказалось в порядке.

В левом углу видна абра-кадабра из вспомогательных линий. Это так я рассчитывала точные расстоянияВ левом углу видна абра-кадабра из вспомогательных линий. Это так я рассчитывала точные расстоянияТакой результат получилсяТакой результат получился

7. Дальше дело оставалось за малым из толщи вырезать вогнутую платину. И вот тут я дошла до слёз и чуть не бросила это занятие) Причем, по своей же глупости. Этот вариант у меня уже был последним, я подкорректировала размеры и учла ошибки предыдущих 5 попыток. Но две дуги и отрезки, соединяющие их, никак не хотели совмещаться и замыкаться в контур. Как так-то? Я ж до этого делала, проблем не возникалоПросидела 1,5 часа, пытаясь совместить точки начала дуги и отрезков. Проступили слезы))) Решила, что не нужны мне эти очки и не буду я заниматься моделированием. Через 15 минут отошла. Убедила себя, что я сильная, что я справлюсь и дойду до конца. Обозначила начало и конец каждой точки вручную, долго и аккуратно. Вуаля получилось! Контур замкнулся. А дальше, на каком-то этапе, когда я прорисовывала дужки, поняла, что у меня тупо были отключены привязки((( Но результат есть, дело пошло дальше.

Не забываем прорисовать замкнутый контур вокруг детали, чтобы корректно вырезать выдавливаниемНе забываем прорисовать замкнутый контур вокруг детали, чтобы корректно вырезать выдавливаниемВырезаем выдавливанием по высоте очков на 45-47 мм. Получается такой результат.Вырезаем выдавливанием по высоте очков на 45-47 мм. Получается такой результат.

8. Прорисовать форму дужек очков после такого стресса было уже проще некуда))) Выдавила на 3 мм. Кстати, создала их не в сборке, а как отдельную деталь.

Контур дужек очковКонтур дужек очковПолучившаяся детальПолучившаяся деталь

9.Скруглила "на глазок" углы. Ребра трогать не стала.

Так уже смотрится симпатичнееТак уже смотрится симпатичнее

10. Вспомнила, что у пластин я не скруглила ничего, доработала. Добавила фаску по верхним углам (для более удобной печати). Скруглила ребра, чтобы не царапали, когда буду носить.

Вид сразу преобразилсяВид сразу преобразился

11. Теперь осталось сделать шипы на дужках, которые будут вставляться в пазы на пластине. НО! Пластина изогнутая, а дужка очков должна вдеваться к ней перпендикулярно. На данном этапе я тоже долго промучилась, но была готова, поэтому боли было меньше))) Я этот нюанс заметила заранее, но не стала скашивать паз, а решила сделать шип под уклоном для большей прочности крепления. Процесс такой: создала сборку, совместила по осям две детали. Пока дужку поставила под прямым углом. Далее на дужке в эскизе рисуем прямоугольник и выдавливаем его до внешнего края объекта (пластин). На этом этапе я еще научилась ловчить с инструментом ориентация.

Готовый шип для пазаГотовый шип для паза

12.Еще пришлось редактировать дужку прилегающий край ровный, под прямым углом, а пластина скошена, соответственно остается небольшое пространство. Отредактировала деталь, изменив выдавливание до ближней поверхности объекта (пластины) в сборке.

13.На завершающем этапе обнаружила, что дужка у очков тоже не прямо-горизонтальная, а изогнута примерно под углом 30 градусов. Здесь уже было проще действовала как с пластиной. Отредактировала эскиз дужек, выдавливание поставила на 10 мм, а не 3. Нарисовала нужные формы и вырезала лишнее.

Готовая дужка для очковГотовая дужка для очков

Вторую дужку рисовать не надо, так как ее можно отзеркалить в слайсере при настройке печати.

Вот и все. Печатаем три детали и собираем перфорационные очки.

На фото неудачный засвет - правая дужка тоже прямая)На фото неудачный засвет - правая дужка тоже прямая)

На печать пластины ушло 3,5 ч, дужек 1 ч 20 мин. Сопло поставили 1,4. Пластик - АБС. Печатали вертикально, причем пластину верх ногами.

Рада, что решила смоделировать очки самостоятельно с нуля

На весь процесс моделирования с попытками 1-6 у меня ушло в общей сложности около 10 часов в несколько подходов. Сейчас я их могу нарисовать меньше чем за час в лёгкую) Но за это время наработала навыки в Компас 3Д, научилась ловчить с разными инструментами, изучила лучше интерфейс и возможности. Улучшилась и пространственная ориентация. Именно так приходит опыт и совершенствуются навыки, которые не потеряются со временем. Многие вещи, которые я смотрела в видеоуроках, забывались сразу после того, как вставала из-за компа) А как моделировала свои первые очки, я не забуду никогда)

Немного об эффективности перфорационных очков

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

Но эффект эти очки в определенных ситуациях могут дать:

  1. Снижение остроты зрения вследствие перенапряжения глаз. Не стоит путать с общим ухудшением зрения. Разницу можно понять так: долго сидели за компом, читали книгу, играли в телефон перед глазами образуется некая пелена, кажется, что стали видеть плохо. Но после отдыха все возвращается в норму. Однако, если это происходит изо дня в день, то постепенно острота зрения становится все хуже и хуже. В данном случае перфорационные очки помогут предотвратить ухудшение.

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

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

У меня была миопия -4 и -4,5. Делала в 2014 году лазерную операцию на глаза. Но за последние полгода напряженной работы заметила, что зрение стало по-тихоньку падать. И в этих очках я вижу мир намного четче и ярче. Надеваю их, когда смотрю телевизор или фильмы на компе (играть в них, делать домашние дела, читать не рекомендуется, да и неудобно). И глаза реально отдыхают. Сейчас уже через 5 дней заметила, что меньше устают. Совпадение? Самовнушение? Или реальный эффект? Я склоняюсь к последнему варианту. Как бы там ни было, ношу их и результатом довольна. В итоге получился полезный опыт в моделировании и нужная для меня вещица)

В заключение

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

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

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

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

  4. После печати каждую дырочку нужно тщательно проработать тонким острым предметом. Я это сделала маникюрными ножницами.

  5. Когда надеваешь первый раз такие очки-тренажёры, непривычно. Но потом быстро привыкаешь и чувствуешь, что реально все стало не только четче, но и ярче.

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

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

Подробнее..

Перевод Как за 60 создать систему распознавания лиц с помощью Python и Nvidia Jetson Nano 2GB

02.03.2021 16:05:07 | Автор: admin
Теперь с помощью алгоритмов распознавания лиц и Python вы сможете с лёгкостью отслеживать всех людей, которые приближаются к вашей двери.Теперь с помощью алгоритмов распознавания лиц и Python вы сможете с лёгкостью отслеживать всех людей, которые приближаются к вашей двери.

Новый набор инструментов для разработчиков Nvidia Jetson Nano 2GB представляет собой одноплатный компьютер с графическим ускорителем стоимостью 59$, работающий под управлением программного обеспечения с искусственным интеллектом.

Производительность, которую вы можете получить от одноплатного компьютера за 59$ в 2020 году, просто потрясающая. Давайте попробуем использовать этот продукт, чтобы собрать простой вариант домофона, который будет отслеживать всех людей, подходящих ко входной двери вашего дома. С помощью алгоритма распознавания лиц система мгновенно узнает, приближался ли когда-нибудь в прошлом к вашей двери этот человек, даже если в прошлый визит он был одет по-другому.


Что такое Nvidia Jetson Nano 2GB?

Jetson Nano 2GB это одноплатный компьютер с четырёхъядерным ARM-процессором 1,4 ГГц и встроенным графическим процессором Nvidia Maxwell. Это самая дешёвая модель Nvidia Jetson практически того же класса, что и одноплатный компьютер Raspberry Pi.

Компьютер Nvidia Jetson Nano 2GB имеет много общего с Raspberry Pi оба представляют собой одноплатные компьютеры на ОС Linux. Отличие состоит в том, что с целью ускорения работы моделей глубокого обучения модуль Nvidia Jetson оснащён 128-ядерным графическим процессором Nvidia и поддерживает программно-аппаратную архитектуру параллельных вычислений (CUDA).Компьютер Nvidia Jetson Nano 2GB имеет много общего с Raspberry Pi оба представляют собой одноплатные компьютеры на ОС Linux. Отличие состоит в том, что с целью ускорения работы моделей глубокого обучения модуль Nvidia Jetson оснащён 128-ядерным графическим процессором Nvidia и поддерживает программно-аппаратную архитектуру параллельных вычислений (CUDA).

Если вы уже знакомы с линейкой продуктов Raspberry Pi, то вам всё должно быть понятно. Единственным различием двух одноплатных компьютеров является то, что в Jetson Nano установлен графический процессор Nvidia. Компьютер может запускать приложения с ускорением вычислений на графических процессорах (например, модели глубокого обучения) намного быстрее, чем одноплатный Raspberry Pi, у которого нет графического процессора, способного работать с большинством технологий глубокого обучения.

Наборов инструментов для разработчиков с ИИ и модулями ускорителя существует множество, однако у продукта Nvidia есть перед ними одно важное преимущество он непосредственно совместим с библиотеками ИИ для настольных систем и не требует преобразования моделей глубокого обучения ни в какие специальные форматы для их запуска. Для ускорения вычислений на графическом процессоре в продукте Nvidia используются те же самые библиотеки CUDA, что и практически во всех базирующихся на Python системах глубокого обучения. Другими словами, вы можете взять существующую программу глубокого изучения на Python и запустить её на Jetson Nano 2GB (лишь немного её изменив) и в результате получить довольно сносную производительность (при условии, что ваше приложение сможет работать на 2 Гб оперативной памяти). Возможность взять код в Python, который был написан для мощнейшего сервера, и практически без изменений перенести его на автономное устройство стоимостью 59 долларов это ли не заманчиво?

В новом наборе инструментов Jetson Nano 2GB реализованы некоторые новые функции, которых не было в предыдущих версиях оборудования Nvidia. В первой модели Jetson Nano по непонятной причине не была реализована поддержка WiFi, данная же модель поставляется с подключаемым модулем WiFi, поэтому вам не придётся возиться с ethernet-кабелями. В новом модуле также был заменён вход по питанию установлен более современный порт USB-C, а также усовершенствованы некоторые возможности программного обеспечения. Теперь вам не нужно беспокоиться, например, о включении файла подкачки, модуль сделает это за вас.

Приобретение простого в использовании аппаратного устройства с настоящим графическим процессором обойдется вам менее чем в 60$ этот шаг со стороны Nvidia следует признать достаточно агрессивным. По всей видимости, этим они желают показать, что хотят составить прямую конкуренцию Raspberry Pi и пытаются захватить рынок образования / продуктов для программистов-любителей. Будет весьма интересно наблюдать, как на это отреагирует рынок.

Что ж, давайте приступим к сборке нашей системы

Как и при сборке любых аппаратных устройств, вначале нужно подобрать все необходимые детали:

1. Одноплатный компьютер Nvidia Jetson Nano 2GB (59$).

Продукт доступен для предварительного заказа (по состоянию на 5 октября 2020 г.). Сам продукт, как ожидается, будет выпущен в конце октября. Я не знаю, какую цену установит Nvidia на продукт после его релиза, но следует иметь в виду, что предыдущая модель Jetson Nano в течение нескольких месяцев после релиза была в дефиците.

Полная открытость: модуль Jetson Nano 2GB мне достался бесплатно за рецензию на продукты Nvidia, однако с Nvidia у меня нет ни финансовых, ни редакционных отношений. Вот как получилось, что мне удалось составить данную инструкцию до выхода продукта.

2. Адаптер питания с разъёмом USB-C (возможно, такой у вас уже есть?).

В новом компьютере Jetson Nano 2GB для питания используется разъём USB-C. Адаптер питания в комплект не входит, но у вас наверняка завалялся где-то лишний.

3. Камера: либо веб-камера с USB-выходом (возможно, у вас такая уже имеется?), либо камера Raspberry Pi Camera Module v2.x (прибл. 30$).

Если вы захотите поместить небольшую камеру в чехол, отличным выбором станет модуль Raspberry Pi Camera v2.x (примечание: модуль v1.x работать не будет). Приобрести их можно на Amazon или у множества реселлеров.

Некоторые веб-камеры с USB-выходом, например Logitech C270 или C920, прекрасно работают с Jetson Nano 2GB, так что, если у вас уже есть такая камера, можно, не задумываясь, использовать её. Ниже приводится неполный перечень USB-камер, которые должны работать.

Прежде чем торопиться покупать что-то новое, сначала проверьте: а может быть, вполне подойдут уже имеющиеся у вас USB-устройства? Не на всех из них может быть реализована поддержка драйверов Linux, но, возможно, вам удастся найти устройство с соответствующей поддержкой. Я подключил обычный адаптер HDMI-на-USB за 20$ (заказывал на Amazon), и он подошёл идеально. В качестве источника видеосигнала по HDMI мне удалось задействовать свою высококлассную цифровую камеру, причём без каких бы то ни было дополнительных настроек. Красота!

Вам понадобятся ещё несколько других компонентов, но, я полагаю, все они у вас уже есть в наличии:

  • Карта памяти microSD, на ней должно быть не менее 32 ГБ свободного пространства. На неё мы установим Linux. Если у вас имеется любая карта microSD, можете использовать её.

  • Устройство чтения карт microSD, с помощью которого мы установим на компьютер программное обеспечение Jetson.

  • Проводная USB-клавиатура и проводная USB-мышь. Эти устройства будут использоваться для управления Jetson Nano.

  • Любой монитор или телевизионный экран, на которые можно напрямую подавать сигнал HDMI (не через переходник HDMI-на-DVI). Монитор будет использоваться для визуального контроля ваших действий. Монитор вам потребуется для первоначальной настройки Jetson Nano (даже если потом Jetson Nano будет запускаться без монитора).

Загрузка программного обеспечения Jetson Nano 2GB

Перед подключением компонентов к Jetson Nano необходимо вначале загрузить образ программного обеспечения для Jetson Nano. Стандартный образ программного обеспечения Nvidia включает в себя Ubuntu Linux 18.04 с предустановленными Python 3.6 и OpenCV.

Ниже приводится инструкция по загрузке программного обеспечения Jetson Nano на SD-карту:

  1. Скачайте Jetson Nano Developer Kit SD Card Image на сайте Nvidia.

  2. Скачайте Etcher программу, которая запишет образ программного обеспечения Jetson на SD-карту.

  3. Запустите программу Etcher и используйте её для записи загруженного образа Jetson Nano Developer Kit SD Card Image на SD-карту. Это займёт приблизительно 20 минут.

Пора распаковывать остальное оборудование!

Подключаем всё что можно

Прежде всего выньте модуль Jetson Nano 2GB из коробки:

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

Затем к одному из USB-портов необходимо подключить входящий в комплект WiFi-адаптер с разъёмом USB:

После этого подключается камера.

Если используется модуль камеры Raspberry Pi v2.x, его необходимо подсоединить с помощью ленточного соединительного кабеля. Найдите разъём для ленточного соединительного кабеля на Jetson, поднимите крышку разъёма, вставьте в разъём кабель и закройте крышку разъёма. Убедитесь, что металлические контакты на ленточном соединительном кабеле смотрят внутрь радиатора:

Если используется веб-камера с разъёмом USB, просто подключите её к одному из USB-портов, порт ленточного кабеля для этого не нужен.

Теперь подключаем всё остальное:

  • подключите мышь и клавиатуру к USB-портам;

  • подключите монитор с помощью HDMI-кабеля;

  • подключите кабель питания USB-C, чтобы система могла загрузиться.

Если используется модуль камеры Raspberry Pi, в результате у вас получится примерно такая конструкция:

Если используется источник видео с USB, конструкция получится примерно такая:

При подключении кабеля питания начнётся автоматическая загрузка Jetson Nano. Через несколько секунд на мониторе появится экран инициализации Linux. Следуйте инструкциям на экране для создания учётной записи и подключения к WiFi. Все действия будут элементарные.

Установка необходимых библиотек Linux и Python для распознавания лиц

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

На рабочем столе Jetson Nano откройте окно LXTerminal и выполните следующие команды. Если система запросит пароль, нужно будет ввести тот же пароль, который был указан при создании пользовательской учётной записи:

sudo apt-get updatesudo apt-get install python3-pip cmake libopenblas-dev liblapack-dev libjpeg-dev

Вначале обновляем apt стандартный инструмент для установки программного обеспечения Linux, его мы будем использовать для установки других необходимых нам системных библиотек. Затем устанавливаем несколько Linux-библиотек, без которых наша программа не будет работать (эти библиотеки не предустановлены).

В последнюю очередь устанавливаем библиотеку Python face_recrecognition и её зависимости, в том числе библиотеку машинного обучения dlib. Это можно сделать автоматически, запустив единственную команду:

sudo pip3 -v install Cython face_recognition

Поскольку на платформе Jetson отсутствуют предварительно скомпилированные копии dlib и numpy, данная команда скомпилирует эти библиотеки из исходного кода. Вся операция займёт почти час, поэтому у вас будет время, чтобы пообедать.

Когда процесс завершится, ваш компьютер Jetson Nano 2GB с графическим ускорителем и программно-аппаратной архитектурой параллельных вычислений (CUDA) будет готов к распознаванию лиц. Теперь переходим к самому интересному!

Запуск демонстрационной версии приложения распознавания лиц для домофона

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

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

Сначала скачайте код. Полный код с комментариями я разместил здесь, однако вы можете поступить ещё проще загрузить код на Jetson Nano из командной строки:

wget -O doorcam.py tiny.cc/doorcam2gb

В верхней части программы необходимо отредактировать строку кода, чтобы указать, используете ли вы USB-камеру или модуль камеры Raspberry Pi. Файл можно изменить таким образом:

Вставка с кодомСледуйте инструкциям, затем сохраните код, выйдите из GEdit и запустите код:

gedit doorcam.py

На рабочем столе появится окно с видео. Каждый раз, когда новый человек будет подходить к камере, система будет регистрировать его лицо и рассчитает продолжительность нахождения такого человека перед дверью. Если один и тот же человек уйдет и вернётся через 5 минут или позже, система зарегистрирует новый визит и заново рассчитает продолжительность. Чтобы в любое время выйти из программы, нужно нажать на клавиатуре клавишу 'q'.

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

Превращаем систему в автономное аппаратное устройство

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

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

7-дюймовый сенсорный HDMI-экран, способный запитываться от USB-порта:

И обычный зарядный батарейный блок (power bank) с выходом USB-C для подачи питания:

Давайте запитаем систему от блока аккумуляторных батарей и посмотрим, как она будет работать в автономном режиме. Подключите USB-аккумулятор вместо обычного сетевого зарядного устройства и подключите HDMI-экран к порту HDMI (для работы в качестве экрана) и к USB-порту (для работы в качестве входа мыши).

Всё работает идеально. Сенсорный экран работает как обычная USB-мышь без дополнительных настроек. Есть единственный недостаток: если Jetson Nano 2GB станет потреблять больше энергии, чем может выдавать USB-аккумулятор, быстродействие графического процессора может снизиться. Но и в том, и в другом случае результаты получаются вполне удовлетворительные.

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

Обзор кода Python для домофона

Хотите понять, как работает код? Давайте разберёмся.

Сначала в код необходимо импортировать библиотеки, которые мы собираемся использовать. Самые важные из них OpenCV (в Python она называется cv2), которую мы будем использовать для считывания изображений с камеры, и face_recognition, которую мы будем использовать для обнаружения и сравнения лиц.

import face_recognitionimport cv2from datetime import datetime, timedeltaimport numpy as npimport platformimport pickle

После этого нам нужно указать, как будет осуществляться доступ к камере, так как процесс получения изображения с модуля камеры Raspberry Pi работает иначе, чем процесс получения изображения с USB-камеры. Для этого нужно просто изменить эту переменную на True или False, в зависимости от оборудования:

# Set this depending on your camera type:# - True = Raspberry Pi 2.x camera module# - False = USB webcam or other USB video input (like an HDMI capture device)USING_RPI_CAMERA_MODULE = False

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

known_face_encodings = []known_face_metadata = []

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

У нас имеется функция, сохраняющая и загружающая данные об известных лицах. Это функция сохранения (save):

def save_known_faces():    with open("known_faces.dat", "wb") as face_data_file:        face_data = [known_face_encodings, known_face_metadata]        pickle.dump(face_data, face_data_file)        print("Known faces backed up to disk.")

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

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

def register_new_face(face_encoding, face_image):    known_face_encodings.append(face_encoding)known_face_metadata.append({        "first_seen": datetime.now(),        "first_seen_this_interaction": datetime.now(),        "last_seen": datetime.now(),        "seen_count": 1,        "seen_frames": 1,        "face_image": face_image,    })

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

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

def lookup_known_face(face_encoding):    metadata = None    if len(known_face_encodings) == 0:        return metadata    face_distances = face_recognition.face_distance(        known_face_encodings,         face_encoding    )    best_match_index = np.argmin(face_distances)    if face_distances[best_match_index] < 0.65:        metadata = known_face_metadata[best_match_index]        metadata["last_seen"] = datetime.now()        metadata["seen_frames"] += 1        if datetime.now() - metadata["first_seen_this_interaction"]                  > timedelta(minutes=5):            metadata["first_seen_this_interaction"] = datetime.now()            metadata["seen_count"] += 1    return metadata

В этой части кода мы делаем несколько важных вещей:

  1. Используя библиотеку face_recogntion, мы проверяем, в какой степени черты неизвестного лица совпадают с чертами лиц всех прошлых посетителей. Функция face_distance()выдаёт численное значение степени сходства между неизвестным лицом и всеми известными лицами чем меньше число, тем больше похожих лиц.

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

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

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

def main_loop():    if USING_RPI_CAMERA_MODULE:        video_capture =             cv2.VideoCapture(                get_jetson_gstreamer_source(),                 cv2.CAP_GSTREAMER            )    else:        video_capture = cv2.VideoCapture(0)

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

Итак, начинаем захватывать кадры с видео:

while True:    # Grab a single frame of video    ret, frame = video_capture.read()    # Resize frame of video to 1/4 size    small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)    # Convert the image from BGR color    rgb_small_frame = small_frame[:, :, ::-1]

Каждый раз при захвате кадра видео мы сжимаем его до 1/4 размера. Этот приём позволяет ускорить процесс распознавания лиц, но это происходит за счёт обнаружения на изображении только лиц большого размера. Но, поскольку мы собираем домофон, распознающий лица только тех людей, которые подошли близко к камере, это не должно нас беспокоить.

Нам также придётся столкнуться с тем, что библиотека алгоритмов OpenCV получает изображения с камеры, в которых каждый пиксель представлен в формате "синий-зеленый-красный", а не в стандартном формате "красный-зеленый-синий". Поэтому перед запуском программы распознавания лиц на изображении необходимо преобразовать формат изображения.

Теперь мы можем обнаружить все лица на изображении и преобразовать каждое лицо в кодированное изображение. Это делается всего двумя строками кода:

face_locations = face_recognition.face_locations(rgb_small_frame)face_encodings = face_recognition.face_encodings(                     rgb_small_frame,                      face_locations                  )

Далее необходимо просмотреть каждое обнаруженное лицо и решить, принадлежит ли это лицо человеку, который был здесь в прошлом, или это был совершенно новый посетитель:

for face_location, face_encoding in zip(                       face_locations,                        face_encodings):metadata = lookup_known_face(face_encoding)    if metadata is not None:        time_at_door = datetime.now() -             metadata['first_seen_this_interaction']        face_label = f"At door {int(time_at_door.total_seconds())}s"    else:        face_label = "New visitor!"        # Grab the image of the face        top, right, bottom, left = face_location        face_image = small_frame[top:bottom, left:right]        face_image = cv2.resize(face_image, (150, 150))        # Add the new face to our known face data        register_new_face(face_encoding, face_image)

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

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

for (top, right, bottom, left), face_label in                   zip(face_locations, face_labels):    # Scale back up face location    # since the frame we detected in was 1/4 size    top *= 4    right *= 4    bottom *= 4    left *= 4    # Draw a box around the face    cv2.rectangle(        frame, (left, top), (right, bottom), (0, 0, 255), 2    )    # Draw a label with a description below the face    cv2.rectangle(        frame, (left, bottom - 35), (right, bottom),         (0, 0, 255), cv2.FILLED    )    cv2.putText(        frame, face_label,         (left + 6, bottom - 6),         cv2.FONT_HERSHEY_DUPLEX, 0.8,         (255, 255, 255), 1    )

Я также хотел вывести в верхней части экрана пополняемый список последних посетителей с указанием количества посещений вашего дома:

Графические значки, представляющие каждого человека, находящегося в данный момент у двери.

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

number_of_recent_visitors = 0for metadata in known_face_metadata:    # If we have seen this person in the last minute    if datetime.now() - metadata["last_seen"]                          < timedelta(seconds=10):# Draw the known face image        x_position = number_of_recent_visitors * 150frame[30:180, x_position:x_position + 150] =              metadata["face_image"]number_of_recent_visitors += 1        # Label the image with how many times they have visited        visits = metadata['seen_count']        visit_label = f"{visits} visits"if visits == 1:            visit_label = "First visit"cv2.putText(            frame, visit_label,             (x_position + 10, 170),             cv2.FONT_HERSHEY_DUPLEX, 0.6,             (255, 255, 255), 1        )

Наконец, мы можем вынести текущий кадр видео на экран и поверх этого кадра вывести все наши пояснения:

cv2.imshow('Video', frame)

Чтобы не утратить данные в случае программного сбоя, через каждые 100 кадров будем сохранять на диск список известных лиц:

if len(face_locations) > 0 and number_of_frames_since_save > 100:    save_known_faces()    number_of_faces_since_save = 0else:    number_of_faces_since_save += 1

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

Код запуска программы находится в самом низу:

if __name__ == "__main__":    load_known_faces()    main_loop()

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

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

Интересный факт: похожие системы отслеживания лиц установлены вблизи многих рекламных стендов с объявлениями на улицах и автовокзалах. Система определяет, кого из прохожих интересует данное объявление и как долго люди его изучают. Возможно, полчаса назад это прозвучало бы для вас дико, но вы ты только создали точно такую же систему всего за 60$!

Расширение возможностей программы

Данная программа пример того, как с небольшим количеством кода Python 3, запущенного на дешёвом одноплатном компьютере Jetson Nano 2GB, можно создать мощную систему.

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

Также можно попробовать превратить эту программу во что-то совершенно другое. Схема, при которой осуществляется чтение кадра видео, затем выполняется поиск чего-то конкретного на изображении, затем выполняется соответствующее действие, это основа основ всех видов систем машинного зрения. Попробуйте изменить код и подумайте, где ещё его можно применить! Как вам, например, такая идея каждый раз, когда вы приходите домой и открываете входную дверь, вас будет встречать любимая музыка? Ознакомьтесь с некоторыми другими примерами использования библиотеки Python face_recognition и узнайте, как можно реализовать нечто подобное.

Узнайте больше о платформе Nvidia Jetson

Узнайте больше о том, как создавать устройства с помощью аппаратной платформы Nvidia Jetson, запишитесь на новый бесплатный учебный курс Nvidia по Jetson. Более подробная информация приведена на сайте Nvidia. Вы также также можете посетить отличные общественные ресурсы, например сайт JetsonHacks.

Узнайте подробности, как получить Level Up по навыкам и зарплате или востребованную профессию с нуля, пройдя онлайн-курсы SkillFactory со скидкой 40% и промокодомHABR, который даст еще +10% скидки на обучение.

Другие профессии и курсы
Подробнее..

Делаем гибкую печатную плату

02.03.2021 22:15:14 | Автор: admin

Материал по мотивам методики создания магнитопланарных излучателей для наушников и колонок. Подход имеет широкий спектр применения, не только для создания электроакустических систем. Например, для гибких шлейфов взамен порванных, антенн и прочего, на что хватит воображения и терпения. Один из вариантов использования фоторезистивного метода вместо популярного ЛУТ.

Введение

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

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

Однако, данное занятие требует весьма значительных вложений сил, денег и времени, так что насчет оптимальности ещё есть о чем поговорить. Мой подход совместим для работы с весьма и весьма тонкими пленками и слоем металла, к тому же имеет весьма большую точность. Правда эта точность по факту ограничивается огромной кучей факторов, с которыми, тем не менее, можно бороться. Теоретически неустранимое ограничение разрешение фоторезиста, обычные листы которого имеют показатель что-то порядка 50 мкм. Конечно, в гаражных условиях это недостижимая утопия, для показателя хотя бы в 100 мкм нужны условия, приближающиеся к т.н. чистой комнате. По итогу обычно можно получать платы с шириной дорожек порядка 0.3-0.2 мм в условиях достаточно подготовленного места, относительно чистого (никаких котов!) и при наличии всех инструментов.

А в данной методике используется большой набор инструментов. Понадобится.

  • ЧПУ станок с лазером 405 нм. Я использовал 450 нм, это неверно, но тоже работает (об этом позже). Обязательно использование защитных очков! Мощность 50 мВт. Важно наличие качественной оптики.

  • Пленочный фоторезист. Аэрозольный не подходит. Не наткнитесь на просрочку, фоторезист хранится относительно не долго.

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

  • Гидроксид натрия. Щелочь для смывания фоторезиста. Лучше брать чистый, а не в смеси а.к.а. крот. Едкая субстанция, работайте в перчатках.

  • Фен.

  • Утюг.

  • Ровная, чистая, термостойкая поверхность для работы.

Техпроцесс

Фоторезист

Для начала нужно составить топологию и создать программу для ЧПУ. Это весьма важный этап и не стоит его недооценивать. Дело все в том, как лазер индуцирует фоторезист.

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

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

Паразитную засветку я уменьшил так. Вместо нанесения фоторезиста непосредственно на печатную плату, я взял нужный кусок фоторезиста, под него подложил материал, поглощающий световое излучение (лист бумаги с тремя слоями тонера на нем) и, придавив сверху стеклом, отправил под лазер. Темный материал удаляет большую часть энергии, не позволяя отраженному свету засветить то, что не нужно. Чем лучше этот поглощающий материал, тем точнее и тоньше получается дорожка. Мой вариант с листом бумаги и тонером не идеален, под лазером углерод начинает сам излучать свет, хоть и не в том диапазоне, в котором активируется фоторезист, но частично все-таки пересвечивает. Что же касательно длины волны, как вообще 450 нм могут засветить фоторезист? На самом деле в моем случае активация происходила тепловой, а не световой энергией. Здесь свои особенности и так лучше не делать, а брать лазер точно под фоторезист. Иначе снижается качество границы дорожки и сложнее сделать тонкие промежутки между ними.

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

Подготовка основы

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

В моем случае наносился слой фольги на пленку. Я нашел весьма хороший вариант для себя УФ клей для модулей смартфонов. Также может подойти клей марки БФ-6.

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

Нанесение фоторезиста

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

Промывание

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

Берём фен (можно обычный бытовой) и тщательно просушиваем фоторезист. Просушили, теперь снова тщательно пройдитесь утюгом через ту же бумагу. Здесь уже можно прижимать утюг более тщательно. Это обеспечит хорошее прилипание даже отошедшего фоторезиста. На крайний случай можно заделать пропуски маркером. Обязательно проконтролируйте качество смывания не активированного фоторезиста. После просушки можно повторить смывание.

Травление

Травление производится в соответствии с металлом, нанесенным на подложку. В моем случае травился алюминий с помощью раствора медного купороса. Происходит реакция восстановления меди из раствора с замещением его в сульфате алюминием. Так как алюминий очень хороший восстановитель, травится он очень быстро с выделением большого количества медного порошка, который я рекомендую счищать мягкой щеткой с мелкой щетиной. Температура раствора максимальная, в которой сможете комфортно держать пальцы, порядка 40 градусов. Концентрация раствора медного купороса подбирается по правилу: чем больше, тем лучше, лишь бы полностью растворился. Я размешивал в пропорциях 15 грамм купороса на 150 грамм воды, но можно разводить в пропорциях до 30 грамм на 100 грамм воды, чтобы при остывании раствор не становился перенасыщенным.

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

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

Собственно, после промывки растворителем получается готовая гибкая печатная плата. При желании можно паять (но очень аккуратно и быстро, чтобы не расплавить подложку). Как вариант, не лучший, но всё же можно использовать сплав Розе. Или паять обычным припоем, но очень быстро и точечно.

Послесловие

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

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

Подробнее..

Снова о автономной Arduino-метеостанции на батарейках

03.03.2021 00:13:52 | Автор: admin

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


Это было донедавна. Несколько дней назад меня поразил очередной проект @Berkseo, как поражают все его проекты: "Беспроводная мини погодная станция с e-paper экраном на батарейках". Тут все на уровне промышленного продукта. Удивляет единственное в устройстве нет внешнего датчика.


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



Что сделано:


Датчики DHT22 и DS18B20, которые использовались в предыдущем проекте, заменены энергосберегающим модулем это датчик температуры и влажности HTU21D. Период измерений, отправки/приема данных уменьшен с 15-ти мин до 53,5 сек. Сделан переход на устойчивую частоту работы контроллера (8 МГц) при напряжении питания ниже 3В. Для уменьшения объемов занимаемой памяти в скетчах использованы некоторые функции С/С++. И главное, принципиально изменен алгоритм передачи пакетов с выносного датчика и алгоритм приема этих пакетов базой метеостанции. Теперь для обеспечения надежного приема пакетов с выносного датчика в нем формируется и отправляется с интервалом около 0,3 сек не один, а три пакета с данными о параметрах воздуха на улице и состоянии батареек. Только после отправки третьего пакета контроллер в. датчика вместе с периферией уходит в сон. База метеостанции уходит спать после приема одного из 6-ти пакетов с выносного датчика и просыпается за полсекунды до поступления очередной серии пакетов с выносного датчика.


Метеостанция состоит из двух автономных узлов с питанием от двух батареек AA: базы и выносного датчика. Назовем их для простоты анализатором (по-другому база) и беспроводным в.датчиком (выносным датчиком).


Анализатор, построен на контроллере ATMEGA328P, измеряет температуру и влажность (датчик температуры и влажности HTU21D) в помещении, а также измеряет и анализирует величину напряжения питания узла, которое обеспечивают две батарейки АА 1,5 В. На контроллер также поступает сигнал с приемника LoRa, который по эфиру принимает информацию с выносного датчика. Вся инфа с контроллера выводится на ЖК-дисплей NOKIA 5110.


В в.датчике, тоже собранном на контроллере ATMEGA328P, измеряется температура и влажность воздуха на улице (модуль HTU21D), а также напряжение питания выносного узла, организованного на двух батарейках АА 1,5 В. Передатчик LoRa этого узла передает инфу о температуре, влажности и состоянии батарейки на анализатор. С в.датчика выполняется отправка 3-х пакетов с интервалом около 0,3 сек, затем контроллер ATMEGA328P, передатчик LoRa и модуль HTU21D для экономного расходования заряда батареек переводятся в режим сна. Измерения и отправка данных с в.датчика выполняется с циклом несколько меньше 1-ой минуты.


Работа анализатора построена по следующему алгоритму:


Вначале, при включении обеих узлов метеостанции, контроллер анализатора подает команды на измерение температуры и влажности внутри помещения и выводит эти параметры на дисплей, затем устанавливает приемник LoRa в режим прослушивания эфира. После приема сигнала с в.датчика и успешной дешифрации принятых данных контролер подает команду на повторное измерение температуры, влажности и выводит инфу в полном объеме на экран. Затем анализатор уходит в сон, просыпаясь примерно за полсекунды до планируемого поступления сигнала с в.датчика. Приняв и дешифровав один из трех пакетов с в.датчика, повторно выполняет свои измерения, выводит информацию на экран и снова уходит спать. Если по каким-то причинам сигнал с в.датчика отсутствует около одной минуты (например, сели батарейки), что по времени соответствует отправке 6-ти пакетов с в.датчика, анализатор проводит измерения только в помещении, изредка сканируя эфир: а вдруг в.датчик появился в эфире?! Это сделано для того, чтобы постоянно работающий на прием модуль LoRa не посадил за короткое время батарейки анализатора.


Для сборки устройства понадобятся радиодетали:


  1. Контроллер ATMEGA328P-PU 2 шт.
  2. Датчик влажности и температуры HTU21D/SHT21/Si7021 2 шт.
  3. ЖК-дисплей NOKIA 5110 1 шт.
  4. Приемник-передатчик LoRa Rа-01 2 шт.
  5. Макетная плата (стеклотекстолит), монтажные провода, батарейки АА, кварцевые резонаторы 8 МГц, резисторы, конденсаторы, другие мелочи.

Ориентировочная стоимость компонентов по ценам AliExpress примерно $25.


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


На этот раз мы не будем устанавливать новые фьюзы программой SinaProg, а воспользуемся, на мой взгляд, более универсальным способом созданием новых конфигураций плат в платформе Arduino IDE.


В новые контроллеры надо установить загрузчик Arduino as ISP и надо учитывать то, что контроллеры ATMEGA328P поступают в продажу с заводской настройкой фьюз для мониторинга (контроля) напряжения питания не ниже 2,7 В. Мы же будем работать от батареек, напряжение на которых при разряде может быть ниже установленного заводского порога 2,7 В, и с кварцем 8 МГц. Установим загрузчик и изменим фьюзы под наши условия, используя в качестве программатора плату Arduino UNO, в такой последовательности:


  1. Найти по адресу c:\Program Files\Arduino\hardware\arduino\avr\ файл boards.txt и открыть его текстовом редакторе с форматированием, например, AkelPad.
  2. Дополнить файл блоком, который приведен под спойлером, и сохранить файл.

    блок установок 1
    ##############################################################

    amega.name=Mega Low (8 MHz, >1.8V)

    amega.upload.tool=avrdude
    amega.upload.protocol=arduino
    amega.upload.maximum_size=32256
    amega.upload.maximum_data_size=2048
    amega.upload.speed=57600

    amega.bootloader.tool=avrdude
    amega.bootloader.low_fuses=0xFF
    amega.bootloader.high_fuses=0xDA
    amega.bootloader.extended_fuses=0xFE
    amega.bootloader.unlock_bits=0x3F
    amega.bootloader.lock_bits=0x0F
    amega.bootloader.file=optiboot/optiboot_atmega328.hex

    amega.build.mcu=atmega328p
    amega.build.f_cpu=8000000L
    amega.build.board=AVR_UNO
    amega.build.core=arduino
    amega.build.variant=standard

  3. В плату Arduino UNO загрузить скетч ArduinoISP.ino из примеров платформы Arduino IDE (Файл > Примеры > ArduinoISP).
  4. Собрать схему (плата Arduino UNO, контроллер ATMEGA328P, кварц 16 МГц) для установки в контроллер загрузчика ArduinoISP (инструкции тут), подключить ее компьютеру и записать в контроллер бутлоадер Arduino as ISP.
  5. Заменить кварц в схеме 16 МГц на 8 Мгц. В меню ИНСТРУМЕНТ выбрать из списка плату Mega Low (8 MHz, >1.8V), которая появилась в меню после дополнения файла boards.txt новым блоком, выбрать тут же Программатор: Arduino as ISP и, нажав Записать загрузчик изменить фьюзы и другие установки в контроллере.
  6. Далее загружаем в контроллер необходимый скетч, используя ту же схему, что и для установки загрузчика (п.4), через Скетч > Загрузить через программатор.

Выносной датчик


В.датчик построен на контроллере ATMEGA328P. В нем осуществляется прием данных с HTU21D по протоколу I2C, измерение и анализ величины напряжения питания узла и управление передатчиком LoRa.


скетч в.датчика
/*   Снова о автономной Arduino-метеостанции на батарейках, выносной датчик   http://personeltest.ru/aways/habr.com/ru/post/544936/*/#include <avr/io.h>#include <util/delay.h>#include <SPI.h>#include <LoRa.h>#include <LowPower.h>#include <Wire.h>#include <avr/power.h>#include "HTU21D.h"#define VccHTU 8  //питание и подтяжка HTU21D (pin 14 AtMega328P, D8)HTU21D myHTU21D;float Tout; // температураint Hout;  // влажностьunsigned int sleepCounter, sleepCounter0; // счетчик, задающий время снаint pct;  //счетчик числа пакетов перед уходом в сонString messageOut; // LoRa-сообщениеfloat BatOut; // напряжение батареекconst int batteryPin = A0; // pin 23 (Atmega328P), к которому подключена батарея для измерения напряженияconst float typVbg = 1.132; //калибровачная константа, 1.0 - 1.2int counter = 0;// измерение опорного напряженияfloat readVcc() {  byte i;  float result = 0.0;  float tmp = 0.0;  for (i = 0; i < 1; i++) {    // Read 1.1V reference against AVcc    // set the reference to Vcc and the measurement to the internal 1.1V reference#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)    ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);#elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)    ADMUX = _BV(MUX5) | _BV(MUX0);#elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)    ADMUX = _BV(MUX3) | _BV(MUX2);#else    // works on an Arduino 168 or 328    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);#endif    _delay_ms(3); // Wait for Vref to settle    ADCSRA |= _BV(ADSC); // Start conversion    while (bit_is_set(ADCSRA, ADSC)); // measuring    uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH    uint8_t high = ADCH; // unlocks both    tmp = (high << 8) | low;    tmp = (typVbg * 1023.0) / tmp;    result = result + tmp;    _delay_ms(5);  }  return result;}void Measurement () {  // измерение температуры и влажности  Hout = myHTU21D.readHumidity();  Hout = 62;  //delete!  float Tout_p = myHTU21D.readTemperature();  Tout = 0.1 * int(Tout_p * 10 + 0.5);  //округление до десятых  // измерение напряжения батареек  BatOut = 0.1 * int(readVcc() * 10 + 0.5);  if (BatOut < 2.2) {    BatOut = 0.0;  } else {    BatOut = 2.2;  }}void SendMessage () {  // отправка данных (температура, влажность, состояние батареек)  if (BatOut > 2.1) {    messageOut = String(Tout) + "#" + String(Hout) + "$" + String("BGood");  }  else {    messageOut = String(Tout) + "#" + String(Hout) + "$" + String("BLow");  }  LoRa.beginPacket();  LoRa.print(messageOut);  LoRa.endPacket();}void setup() {  Serial.begin(9600);  Serial.println("Power ON");  analogReference(DEFAULT);  pinMode(VccHTU, OUTPUT);  digitalWrite(VccHTU, 1);  _delay_ms(200);  myHTU21D.begin();  int counter = 0;  while (!LoRa.begin(433E6) && counter < 10) {    Serial.println("Не удалось найти LoRa-передатчик!");    counter++;    _delay_ms(500);  }  LoRa.setTxPower(4); //мощность передатчика, 2...20 дБ  LoRa.setSyncWord(0xF3);}void loop() {  digitalWrite(VccHTU, 1);  if (pct < 3)  { // измерения, отправка пакетов    Serial.println(messageOut);    Measurement ();    SendMessage ();  } else {// измерения, отправка пакета и длительный сон    Serial.println(messageOut);    Serial.println("sleep ...");    Measurement ();    SendMessage ();    for (sleepCounter = 6; sleepCounter > 0; sleepCounter--)    {      digitalWrite(VccHTU, 0);      digitalWrite(VccHTU, 1);      LoRa.sleep ();      LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);    }    pct = 0;  }  pct++;  if (pct >= 3) pct = 3; //защита от переполнения счетчика}int main() {  init();  setup();  for (;;) {    loop();  }}

Электрическая схема в.датчика:



Питание и подтяжка выводов модуля HTU21D осуществляется с пина 14 контроллера ATMEGA328P. Это сделано для того, чтобы программно обнулить питание HTU21D и перевести этот датчик в режим низкого энергопотребления во время сна.


Изначально в схеме в.датчика планировалось использовать барометр-термометр BMP280, но мне не удалось программно перевести BMP280 в режим низкого потребления во сне. Хотя по даташиту BMP280 для перехода в режим низкого потребление требуется, как и для HTU21D, кратковременное обнуление питания. Разрыв питания BMP280 во время сна снижает потребляемый ток в схеме ATMEGA328P + BMP280 с 130 мкА до 5 мкА, но, повторюсь, смоделировать этот разрыв питания программно у меня пока не получилось.


В в.датчике формируется и отправляется с интервалом около 0,3 сек три пакета с данными о температуре и влажности на улице и состоянии батареек. Если напряжение на батарейках выше установленного порога (2,2 В), то в коде пакета присутствует BGood, а ниже BLow. После отправки третьего пакета контроллер в.датчика вместе с периферией уходят в сон. Цикл отправки серий пакетов 53,5 сек.


Анализатор


Мозг анализатора контроллер ATMEGA328P. Он принимает сигналы с датчика HTU21D по протоколу I2С и по SPI взаимодействует с приемником LoRa и дисплеем NOKIA 5110.


скетч в.датчика
/*   Снова о автономной Arduino-метеостанции на батарейках, анализатор   http://personeltest.ru/aways/habr.com/ru/post/544936/*/#include <avr/io.h>#include <util/delay.h>#include <SPI.h>#include <LoRa.h>#include <LowPower.h>#include "HTU21D.h"#include <LCD5110_Graph.h>#define VccHTU 8  //питание и подтяжка HTU21D(pin 14 AtMega328P, D8)HTU21D myHTU21D;float Tin; // температура в помещенииint Hin;  // влажность в помещенииLCD5110 myNokia(3, 4, 5, 6, 7);extern uint8_t SmallFont[];extern uint8_t MediumNumbers[];float BatIn = 0; // напряжение батареиconst int batteryPin = A0; // pin 23(Atmega328P), к которому подключена батарея для измерения напряженияconst float typVbg = 1.132; //калибровачная константа, 1.0 - 1.2unsigned int sleepCounter;  //счетчик, задающий время снаint r; //счетчик циклов прослушивания эфираint mlc;  //счетчик циклов работы без в.датчикаString LoRaData, Tout_str, Hout_str, BatIn_str, BatOut_str;// измерение напряжения батареекfloat readVcc() {  byte i;  float result = 0.0;  float tmp = 0.0;  for (i = 0; i < 1; i++) {    // Read 1.1V reference against AVcc    // set the reference to Vcc and the measurement to the internal 1.1V reference#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)    ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);#elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)    ADMUX = _BV(MUX5) | _BV(MUX0);#elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)    ADMUX = _BV(MUX3) | _BV(MUX2);#else    // works on an Arduino 168 or 328    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);#endif    _delay_ms(3); // Wait for Vref to settle    ADCSRA |= _BV(ADSC); // Start conversion    while (bit_is_set(ADCSRA, ADSC)); // measuring    uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH    uint8_t high = ADCH; // unlocks both    tmp = (high << 8) | low;    tmp = (typVbg * 1023.0) / tmp;    result = result + tmp;    _delay_ms(5);  }  return result;}void Measurement() {  float Tin0;  // измерение напряжения батареи:  BatIn = readVcc();  // измерение температуры  и влажности в помещении  Hin = myHTU21D.readHumidity();  // Hin = 58; // delete!  float Tin_p = myHTU21D.readTemperature();  Tin = 0.1 * int(Tin_p * 10 + 0.5);  //округление до десятых  //  Tin = 21.4; // delete!}void draw() {  myNokia.enableSleep();  myNokia.clrScr();  //Tin  char chr_Tin [5];  String Tin_str = String(Tin);  myNokia.setFont(SmallFont);  myNokia.print("            C", LEFT, 0);  myNokia.print("In", LEFT, 8);  myNokia.setFont(MediumNumbers);  Tin_str.toCharArray(chr_Tin, 5); //количество знаков+1  myNokia.print(String(chr_Tin), CENTER, 0);  //Tout  char chr_Tout [5];  myNokia.setFont(SmallFont);  myNokia.print("            C", LEFT, 16);  myNokia.print("Out", LEFT, 24);  myNokia.setFont(MediumNumbers);  Tout_str.toCharArray(chr_Tout, 5);  myNokia.print(String(chr_Tout), CENTER, 16);  // Hin, Hout  char chr_Hout [5];  Hout_str.toCharArray(chr_Hout, 4);  myNokia.setFont(MediumNumbers);  myNokia.print(String(Hout_str), RIGHT, 32);  myNokia.setFont(SmallFont);  myNokia.print("    In Out", LEFT, 40);  myNokia.print("      %", LEFT, 32);  myNokia.setFont(MediumNumbers);  myNokia.print(String(Hin), LEFT, 32);  myNokia.setFont(SmallFont);  // Battery Level  if (BatIn < 2.2) {    myNokia.setFont(SmallFont);    myNokia.print("Bat", LEFT, 0);  }  if (BatOut_str == "BLow") {    myNokia.setFont(SmallFont);    myNokia.print("Bat", LEFT, 16);  }  myNokia.disableSleep();  _delay_ms(5);}void drawStart() {  myNokia.enableSleep();  myNokia.clrScr();  //Tin  char chr_Tin [5];  String Tin_str = String(Tin);  myNokia.setFont(SmallFont);  myNokia.print("            C", LEFT, 0);  myNokia.print("In", LEFT, 8);  myNokia.setFont(MediumNumbers);  Tin_str.toCharArray(chr_Tin, 5); //количество знаков+1  myNokia.print(String(chr_Tin), CENTER, 0);  // Battery Level  if (BatIn < 2.2)  {    myNokia.setFont(SmallFont);    myNokia.print("Bat!", RIGHT, 28);  }  //Hin  myNokia.setFont(SmallFont);  myNokia.print("         %", LEFT, 18);  myNokia.print("In", LEFT, 28);  myNokia.setFont(MediumNumbers);  myNokia.print(String(Hin), CENTER, 18);  //No signal!  myNokia.setFont(SmallFont);  myNokia.print("Out - - -", CENTER, 40);  myNokia.update();  myNokia.disableSleep();  _delay_ms(5);}void setup() {  Serial.begin(9600);  pinMode(VccHTU, OUTPUT);  digitalWrite(VccHTU, 1);  Serial.println("Power ON!");  analogReference(DEFAULT);  // инициализация дисплея  myNokia.InitLCD();  myNokia.setFont(SmallFont);  myNokia.clrScr();  myNokia.print(">>>>>", CENTER, 20);  myNokia.update();  _delay_ms(1000);  myNokia.setFont(SmallFont);  myNokia.clrScr();  myNokia.print("))-->", CENTER, 20);  myNokia.update();  if (!LoRa.begin(433E6)) {    Serial.println("Ошибка загрузки LoRa-приемника!");    while (1);    myNokia.setFont(SmallFont);    myNokia.clrScr();    myNokia.print(" ->  ->", CENTER, 20);    myNokia.update();  }  // Диапазон для синхрослова  между "0-0xFF".  LoRa.setSyncWord(0xF3);  Serial.println("Прослушивание эфира. Ожидание пакета с в.датчика ...");  myHTU21D.begin();  Measurement();  drawStart();  digitalWrite(VccHTU, 0);  _delay_ms(1000);  myNokia.clrScr();  myNokia.print("Waiting", CENTER, 10);  myNokia.print("Message from", CENTER, 22);  myNokia.print("OUTSIDE", CENTER, 34);  myNokia.update();}void loop() {  r++;  digitalWrite(VccHTU, 1);  if (r < 600)  // 8 MHz;  {    mlc = 0;    // Прослушивание эфира, прием, дешифрация, если сигнал с в.датчика принят,    // то измерения в помещении, вывод инфы на экран и - в спячку.    {      int packetSize = LoRa.parsePacket();      if (packetSize) {        while (LoRa.available()) {          LoRaData = LoRa.readString();        }        int pos1 = LoRaData.indexOf('#');        int pos2 = LoRaData.indexOf('$');        Tout_str = LoRaData.substring(0, pos1);        Hout_str = LoRaData.substring(pos1 + 1, pos2);        BatOut_str = LoRaData.substring(pos2 + 1, LoRaData.length());        if ((LoRaData).substring(pos1, pos1 + 1) == "#") {          Serial.println("Принято, декодировано! r = " +  String(r));          r = 0;          Measurement();          draw();          digitalWrite(VccHTU, 0);          // sleepCounter = 49; 16 MHz          // sleepCounter = 48; 8 MHz          for (sleepCounter = 48; sleepCounter > 0; sleepCounter--)          {            digitalWrite(VccHTU, 1);            LoRa.sleep ();            LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF);          }        }      }    }  } else {    r = 600;    if (mlc < 250) //4 часа, время работы без датчика    {      Serial.println("Работа без в.датчика.");      LoRa.sleep ();      Measurement();      drawStart();      digitalWrite(VccHTU, 0);      for (sleepCounter = 6; sleepCounter > 0; sleepCounter--)      {        digitalWrite(VccHTU, 1);        LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);      }      mlc++;    } else {      r = 0;      mlc = 0;    }  }  _delay_ms(110); }int main() {  init();  setup();  for (;;) {    loop();  }}

Работа анализатора начинается в setup'e с инициализации модулей, измерения параметров воздуха, анализа напряжения на батарейках и вывода этой инфы на дисплей. Далее уже в loop'e прослушивается эфир приемником LoRa. После приема и дешифрации сигнала с в.датчика повторно проводятся измерения, анализа напряжения на батарейках и вывод измеренной и принятой инфы на дисплей. Выполнив эту работу все элементы схемы уходят поспать примерно на полсекунды меньше, чем период отправки пакетов с в.датчика. В следующем цикле контроллер просыпается и включает приемник приблизительно за 0,5 сек до ожидаемого прихода сигнала с в.датчика. Таким образом, контроллер и периферия анализатора работают около полсекунды с периодом (циклом) меньше минуты (53,5 сек). Если радиосигнал с в.датчика не поступает на приемник анализатора на протяжении приблизительно одной минуты (время, достаточное для приема одного из 6-ти пакетов), то анализатор переходит в режим работы без в.датчика на 4 часа, измеряя параметры воздуха и оценивая состояние батареек только в помещении с индикацией на дисплее этих данных. Период обновления данных в режиме работы без в. датчика 56,7 сек. В конце четырехчасового цикла работы анализатора без в.датчика он прослушивает эфир: а вдруг в.датчик снова в эфире?




Для перевода модуля HTU21D в режим низкого энергопотребления во время сна его питание также, как и в в.датчике, организовано с контроллера ATMEGA328P (пин 14).


В целом, на дисплее анализатора видна такая картинка:



Дисплей из-за низкого разрешения и малого размера экрана плотно забит символами. Эта картинка смотрелась бы намного лучше на современном дисплее с электронными чернилами. В будущем в своих проектах буду использовать e-paper дисплей.


Ресурс батареек и другое


Для расчета срока работы батареек понадобится время и потребляемый ток во время выполнения работы (операционное время) и сна. Операционное время и рабочий ток измерялись с использованием тестовых скетчей, идея которых взята отсюда.


Рабочий ток измерялся с использованием тех же тестовых скетчей. Для исключения разрывов цепи питания или значительного увеличения величины выходного сопротивления батареек можно использовать шунт 3,9...5,6 Ом и параллельно подключенный к нему цифровой мультиметр с механическим переключением в режиме вольтметра на диапазоне 2000 мкВ. Это критично при измерении потребления тока сна анализатора, поскольку разрыв питания или значительное ограничение тока приводят к цикличесому ресету анализатора. Да и выносной датчик может переходить в постоянный рестарт. По мере возможности необходимо проверять ток потребления разными способами на разных диапазонах шкал прибора и с батарейками, которые планируется использовать, притом, обязательно без вывода результатов на монитор порта Ардуино. Невыполнение этих правил сказались на результатах измерений тока в предыдущем моем посте на тему метеостанции в одних случаях они занижены, в других завышены.


Результаты измерений сведены в таблицу:


в.датчик анализатор
Операционное время функции измерений параметров воздуха, состояния батареек 0,25 сек 0,39 сек
Операционный ток функции измерений параметров воздуха, состояния батареек 3,4 мА 3,5 мА
Операционное время функции передачи/приема сигнала 42 мсек 83 мсек
Операционный ток функции передачи/приема сигнала 30,0 мА

(4 дБ)


11,5 мА
Ток сна 10 мкА 190 мкА

Что бросается в глаза, глядя на эту таблицу. Операционный ток передачи сигнала 30,0 мА при мощности передатчика LoRa 4 дБ. Для сравнения, ток передачи для модуля nRF24L01 13,5 мА. Вывод очевиден: надо переходить на nRF24L01, но не все так просто.


В режиме приемника в nRF24L01 используется так называемыйLNA (малошумящий усилитель). Разработчик библиотеки предполагает, что нет никакого программного обеспечения, которое могло бы повлиять на режим LNA.В режиме приема модуль постоянно демодулирует сигнал для поиска входящего пакета. Именно по этой причине Berkseo не поставил внешний датчик. У меня задача, вроде, попроще организовать режим сна с библиотекой LowPower.h. Сомневаюсь, что задача имеет решение. Буду благодарен за ваши мнения на этот счет.


Средний ток потребления по данным таблицы в. датчика 0,13 мА. Емкости батареек типа АА GP Litium для выносного датчика должно хватить на 2,5 года.


Средний ток потребления анализатора 0,27 мА. Ресурс батареек АА GP Litium в анализаторе 1,2 года. Для беспроводного комнатного термостата Computherm Q7RF, например, срок действия батареек: около 1 года.


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


Составил код на С в Atmel Studio и эмулировал его в Proteus'е для для барометра-термометра.



На картинке ниже показаны результаты сравнения кода для одного и того же устройства на языке С и в среде разработки Arduino IDE.



Объем флеш-памяти, занимаемой в коде в Ардуино 12968 байт, на С 5954 байта и оценочно на Ассемблере не больше 200 байт.


Из этих чисел сделал несколько выводов, в которых убедился на собственном опыте:
Код на Ассемблере уменьшает размер памяти на порядки. Соответственно пиковое потребление падает в сотни раз. С десятков миллиампер при прошивках контроллеров устройств на Ардуино или С, С++ до десятых миллиампера на Ассембере.
Поиск компромисса. Так благодаря использованию компилируемых в Arduino IDE библиотек и функций на С/С++ в некоторых скетчах этого поста удалось уйти от предупреждения: Недостаточно памяти, программа может работать нестабильно. Притом, чем проще код, тем выше соотношение: размер памяти в Arduino IDE к памяти на С/С++. Для простейшего кода мигания светодиодом в несколько строк это соотношение составит 6 раз, а проигрыш в производительности 28 раз.


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


И, наконец, искренне благодарю AlexanderS, который донес до меня идею виртуальной шкалы времени или синхронизации, а также других участников обсуждения статьи Автономная метеостанция на контроллере ATMEGA328P и питанием от батареек с беспроводным выносным датчиком (ittakir, Javian, smart_alex, Polaris99, gerasimenkoao, igrushkin, enjoyneering) за предложения, конструктивную критику и замечания.


Спасибо, кто дочитал. Всем отличного иммунитета во времена коронавируса и не только.


Ссылки по теме


Узел беспроводного датчика с низким энергопотреблением


Беспроводная мини погодная станция с e-paper экраном на батарейках


Превращаем Arduino в полноценный AVRISP программатор


LoRa и сон


Узнайте о битах конфигурации ATmega328P и о том, как использовать их с внешним кварцевым резонатором


Калькулятор фьюзов AVR


Почему многие не любят Arduino

Подробнее..

Немного непортативного домашнего мониторинга, или из чего ещё можно собрать троллейбус

03.03.2021 12:06:10 | Автор: admin
КДПВ Borya_Spec (facebook.com/strangedrawings)КДПВ Borya_Spec (facebook.com/strangedrawings)

Мысль внедрить очередную свистелку в Home Assistant посетила меня, внезапно, в туалете. Бывает, сидишь, залипаешь в любимый информационный ресурс, и вдруг в глазах резко темнеет, и весь твой кругозор сужается до светящегося экранчика телефона. Снова УЗО не выдержал кухонных экспериментов, или, как говорили наши далёкие предки, "пробки выбило". И вот считаешь про себя секунды, в течение которых всё твоё драгоценное оборудование, весь твой любимый зоопарк одноплатников и показометров, противостоит беспросветной тьме силами бездушного куска свинца, именуемого "Источник бесперебойного питания". И, казалось бы, нагрузка невелика, и вроде как статью дочитать успеваешь, и до электрощита добежать, чтобы "автомат" передёрнуть, но всё равно как-то волнительно, вот бы знать, сколько минут еще в запасе осталось?

TL;DR

Далее я покажу и расскажу, как сделать беспроводной портативный роутер Kingston Mobilelite Wireless MLWG2 проводным и непортативным, с возможностью быстро вернуться к базовому состоянию (не стоит зацикливаться на рарности данной модели, руководство универсальное), а также накрутить на него OpenWrt, воткнуть кабель от APC UPS и отправлять данные в Home Assistant.

Дисклеймер: автор не несёт ответственности за сожжённое и закирпиченное вами оборудование, если решились что-то повторить - думайте своей головой. Мне обычно везёт, а повезёт ли вам?

Intro

Итак, задача поставлена: старенький бесперебойник, допустим, "APC Back-UPS ES 700", без особых финансовых затрат желает быть помониторенным и интегрированным в Home Assistant, с последующей привязкой на смену статуса каких-либо событий автоматизации. Задача осложняется достаточно коротким проприетарным шнурком, допустим, "USB-RJ45", который особо далеко не протянешь (неудобство компенсируется практически нулевой стоимостью ИБП, ввиду появления огромного количества оных на вторичном рынке). Нужна маленькая тихая железяка, способная спрятаться под столом, принимать данные по USB, и слать воздухом - под эти цели был выделен портативный роутер, он же "портативная флешка", он же Kingston MobileLite Wireless G2. Немного об MLWG2: не вдаваясь в технические подробности по поводу его внутренностей, устройство представляет собой точку доступа, способную принимать подключения по WiFi, раздавая интернет через другую точку доступа (одним радиомодулем), либо через мобильный "свисток", либо через витую пару. Оснащено крайне ограниченной функционально прошивкой, умеет шарить подключенные флешки через родное мобильное приложение. Приобреталось для временного расширения памяти нерасширяемых устройств Apple, в связи с пандемией актуальность временно утратило.

Железо

Большинство портативных роутеров, оснащенных съёмной батареей, без этой самой батареи включаться и работать отказываются, даже будучи подключенными к источнику постоянного питания. Без понятия, с чем это связано, но держать 24/7 устройство, запитанное от аккумулятора, я посчитал нецелесообразным и местами даже опасным, так как батареи имеют свойство деградировать, вздуваться и воспламеняться.

Kingston MLWG2 без верхней крышки (фото с сайта openwrt.org)Kingston MLWG2 без верхней крышки (фото с сайта openwrt.org)

Самый распространённый (в интернете) способ сделать портативное устройство непортативным - воткнуть или впаять вместо батареи опытным путём подобранный конденсатор, спаяв его с пачкой резисторов, и тем самым обманывая контроллер заряда/разряда, встроенный в роутер. Выглядит крайне ненадёжно, устройство я еще планирую использовать по назначению, а значит обманывать контроллер буду наиболее очевидным способом: подавая в него постоянное напряжение, равное напряжению полностью заряженного аккумулятора. Из устройства была изъята батарея, и путём многократных замеров штангенциркулем, гугления, чтения даташитов, и даже не с первого раза, был идентифицирован и приобретён на Алиэкспресс правильный коннектор с маркировкой JST ZH 5-pin.

Сверху вниз: JST GH 1.25 мм, JST ZH 1.50 мм, оригинальный коннектор и батареяСверху вниз: JST GH 1.25 мм, JST ZH 1.50 мм, оригинальный коннектор и батареяТермистор заменен на резистор 10 кОмТермистор заменен на резистор 10 кОм

Вооружившись мультиметром, удалось определить распиновку коннектора: два красных провода - плюс, два чёрных провода - минус. Средний жёлтый провод показывал сопротивление порядка 10 кОм и был идентифицирован, как термистор. У китайского JST-коннектора были аккуратно срезаны направляющие "рельсы", термистор заменен обычным 10 кОм-резистором, всё аккуратненько спаяно и закрыто в термоусадку.

Готовая связка коннектор - преобразовательГотовая связка коннектор - преобразователь

Полностью заряженный аккумулятор роутера давал напряжение чуть более 4 вольт, значит нужен понижающий преобразователь с 5 вольт. Как нельзя лучше подошёл миниатюрный модуль, известный как DSN-MINI-360 (360 вероятно из-за вращающегося на 360 подстроечника). Пришлось помучиться с капризным подстроечником, дабы понизить напряжение телефонной зарядки до нужных 4 вольт (делать это лучше с тем блоком питания, от которого планируете питать устройство в будущем, учитывая так же, что под нагрузкой напряжение слегка просядет). В итоге роутер благополучно обманулся, показал 100% заряд аккумулятора и без проблем загрузился. Непрерывная работа связки в течение нескольких суток так же не выявила каких-либо проблем. Родное приложение показывает полностью заряженный аккумулятор (при его отсутствии). Конструкция с легкостью возвращается к исходному состоянию.

С 4 вольт без нагрузки просел до 3.86 под нагрузкойС 4 вольт без нагрузки просел до 3.86 под нагрузкой

Прошивка

Kingston MLWG2 имеет официально поддерживаемую сообществом сборку OpenWrt последней (на текущий момент) версии, 19.07.7. Однако способ прошивки здесь слегка нестандартный. Вряд ли кто-то будет это повторять, но интереса ради можно и глянуть, я получил от процесса "колоссальное" удовольствие. Для начала нужно активировать в железяке telnet. К сожалению, я забыл вытащить init-скрипты оригинальной прошивки, но костыль там прописан знатный. Итак, форматируем флешку в FAT32, помещаем в корень сборку OpenWrt (я использовал openwrt-19.07.7-ramips-mt7620-mlwg2-squashfs-sysupgrade.bin из официального репозитория), и пустой текстовый файл с названием "mlwG2_v;telnetd; .x.x.bin" (именно так, без кавычек).

После втыкания флешки в устройство и последующей его перезагрузки, подключившись к создаваемой устройством WiFi-сети, можно подсоединиться telnet-клиентом (логин admin, без пароля, ip устройства захардкожен в прошивке):

telnet 192.168.201.254

Получаем BusyBox:

  (none) login: admin    BusyBox v1.12.1 (2014-09-18 09:46:08 CST) built-in shell (ash)  Enter 'help' for a list of built-in commands.    #

Прошиваем...

mtd_write write /media/USB1/openwrt-19.07.7-ramips-mt7620-mlwg2-squashfs-sysupgrade.bin KernelAmtd_write -r write /media/USB1/openwrt-19.07.7-ramips-mt7620-mlwg2-squashfs-sysupgrade.bin KernelB

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

Вскрываем корпус устройства и на верхней плате справа видим четыре неподписанных пятнышка припоя - это и есть спасительный UART. Запаиваем на него USB-to-TTL конвертер, запускаем эмулятор терминала (под винду я использую PuTTY), подключаемся (COMx:57600,8,n,1).

Белый - TX (R конвертера), зелёный - RX (T конвертера), черный - GND, паял дрожащими рукамиБелый - TX (R конвертера), зелёный - RX (T конвертера), черный - GND, паял дрожащими руками

Видим, что устройство живо, но неправильно сконфигурированы сетевые интерфейсы. Вместо eth0 откуда-то вылез eth0.1, а WiFi вообще отключен. Исправляем несправедливость, отправляем устройство в reboot, и наслаждаемся полностью работоспособной OpenWrt (UART я отпаивать пока не рекомендую, только через него можно сделать failsafe в случае нарушения работоспособности прошивки).

root@OpenWrt:/etc/config# cat network config interface 'loopback'        option ifname 'lo'        option proto 'static'        option ipaddr '127.0.0.1'        option netmask '255.0.0.0'config globals 'globals'        option ula_prefix 'fdf0:a4ca:5192::/48'config interface 'lan'        option type 'bridge'        option ifname 'eth0.1' <--- заменяем на eth0        option proto 'static'        option ipaddr '192.168.1.1'        option netmask '255.255.255.0'        option ip6assign '60'config device 'lan_eth0_1_dev'        option name 'eth0.1'  <-- заменяем на eth0        option macaddr '00:26:b7:09:e9:32'        root@OpenWrt:/etc/config# cat wireless config wifi-device 'radio0'      option type 'mac80211'      option channel '11'      option hwmode '11g'      option path 'platform/10180000.wmac'      option htmode 'HT20'      option disabled '1' <-- убираемconfig wifi-iface 'default_radio0'      option device 'radio0'      option network 'lan'      option mode 'ap'      option ssid 'OpenWrt'      option encryption 'none'

Как подключить OpenWrt в режиме клиента к существующей точке доступа, думаю, писать не стоит, есть подробнейшая официальная документация. Вкратце, через LuCI: Network -> Wireless -> Scan -> Join Network -> Assign firewall-zone = lan. После чего, в целях безопасности, лучше деактивировать интерфейс точки доступа (Mode: Master), продолжая работу с устройством по IP изнутри основной сети (всё-таки написал).

Софт

Для мониторинга ИБП APC используется демон apcupsd, про его интеграцию с Home Assistant уже много где написано, для этого даже плагины не нужны, у меня всё заработало просто через configuration.yml.

Ставим поддержку USB и демона из репозитория:

opkg updateopkg install kmod-usb-hidopkg install apcupsd

Подключаем кабель ИБП в роутер, проверяем, что устройство видно:

root@OpenWrt:/# ls -la /dev/usbdrwxr-xr-x    2 root     root            60 Mar  2 21:10 .drwxr-xr-x    5 root     root          1380 Mar  2 21:10 ..crw-------    1 root     root      180,  96 Mar  2 21:10 hiddev0

Заходим в /etc/apcupsd, бэкапим конфиг apcupsd.conf, заменяя на свой. В минимуме нам достаточно вот этого (говорим, что используем USB-кабель, и будем отдавать данные по сети):

## apcupsd.conf v1.1 ##UPSCABLE usbUPSTYPE usbNETSERVER onNISIP 0.0.0.0NISPORT 3551

Cтартуем демона

/etc/init.d/apcupsd start

Выполняем команду apcaccess и в идеале видим в консоли информацию об ИБП, любуемся полем STATUS: ONLINE. Теперь по адресу роутера (при правильно сконфигурированном файрволе) можно получать инфу от бесперебойника.
С софтом закончено.

root@OpenWrt:/etc/apcupsd# apcaccessAPC      : 001,035,0824DATE     : 2021-03-03 00:23:17 +0300HOSTNAME : OpenWrtVERSION  : 3.14.14 (31 May 2016) unknownUPSNAME  : OpenWrtCABLE    : USB CableDRIVER   : USB UPS DriverUPSMODE  :STARTTIME: 2021-03-03 00:23:15 +0300SHARE    :MODEL    : Back-UPS ES 700STATUS   : ONLINELINEV    : 232.0 VoltsLOADPCT  : 42.0 PercentBCHARGE  : 100.0 PercentTIMELEFT : 31.4 MinutesMBATTCHG : 10 PercentMINTIMEL : 5 MinutesMAXTIME  : 0 SecondsSENSE    : MediumLOTRANS  : 180.0 VoltsHITRANS  : 266.0 VoltsALARMDEL : 30 SecondsBATTV    : 13.5 VoltsLASTXFER : Low line voltageNUMXFERS : 0TONBATT  : 0 SecondsCUMONBATT: 0 Seconds...

Настройка Home Assistant

Тут даже и настраивать ничего не надо, прописываем в configuration.yml, рестартуем:

apcupsd:  host: <IP устройства с apcupsd>  port: 3551sensor:  - platform: apcupsd    resources:     - bcharge     - loadpct     - status     - timeleft     - model     - linev

Получаем готовый набор entities: модель ИБП, состояния (ONLINE, ONBATT, ...), % заряда батареи, % нагрузки, примерное оставшееся время работы от батареи, напряжение в сети (перечень параметров гораздо больше, я взял основные для себя). По результатам тестов, Home Assistant получает состояние бесперебойника где-то в течение 10-40 секунд, обновление показателей идёт где-то раз в 2-3 минуты. В целом, оно того стоило.

Далеко не полный набор сущностей, которые можно вытянуть из демонаДалеко не полный набор сущностей, которые можно вытянуть из демона

Итак, кто дочитал до конца, узнал, что с помощью старого портативного роутера, спрятанного под столом, можно мониторить напряжение в сети и заряд старенького бесперебойника с Авито, а ещё стоит иметь про запас USB-to-TTL конвертер, мало ли, захочется что-нибудь перепрошить. Я же получил некоторое удовольствие от того, что заставил работать валявшуюся без дела железяку, а также без особых усилий получил очередную карточку в Lovelace своего полоумного дома. Спасибо за внимание.

Данные несколько искажены вследствие тестированияДанные несколько искажены вследствие тестирования

Ссылки.

Подробнее..

Перевод Как сделать волоконно-оптическую светодиодную лампу

03.03.2021 18:08:18 | Автор: admin

Ранее я уже делал подобные проекты, но в этот раз я хотел сделать что-то попроще, то, что будет легким в изготовлении, и то, что смогли бы сделать многие из вас. "Механические" части лампы печатаются на 3D-принтере, электронная часть довольно проста, а пластиковое оптическое волокно притягивает взгляд. Сейчас я расскажу, как легко и просто изготовить такую светодиодную лампу.


Шаг 1. Детали, необходимые материалы

Много картинок компонентов

И ещё немного по мелочи: провода, термоусаживаемые муфты для соединений и клей для горячего склеивания.

Если у вас нет опыта работы в tinkercad, прилагаю файлы stl:

Шаг 2. Электронная схема

Как видно из рисунка, cхема устройства чрезвычайно проста.

Шаг 3. Сборка

Много картинок сборки

Я начал с 3D-печати компонентов. Сам процесс занимает довольно много времени, поэтому во время печати компонентов я занимался тем, что соединял друг с другом части светодиодной ленты. Перед установкой паяных деталей желательно проверить правильность работы светодиодов в соответствии с инструкциями, приведёнными на шаге 3 проекта "Волоконная оптика и светодиодные лампы Украшение стен" (единственное, что я изменил, это значение DATA PIN на 5 и NUM_LEDS на 32).

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

После этой процедуры я вставил в боковые отверстия несколько кусков пластикового оптоволокна. Я вырезал куски как можно более перпендикулярно, используя тот же шаблон, что и в проекте "Волоконная оптика и светодиодные лампы - Украшение стен". Получилось 8 отрезков волокна, всего 16 отрезков разной длины соединяют пары отверстий, находящихся на одинаковом расстоянии от боковых сторон рамы лампы (см. фотографии выше).

Остальные соединения я сделал в соответствии с электронной схемой, затем установил опору лампы и зафиксировал её большим количеством клея для горячего склеивания, нажимную кнопку я прикрепил также с помощью клея для горячего склеивания (это надо делать после установки нажимного штифта), после чего в соответствующем месте опоры закрепил модуль Arduino Pro Mini. Вот и всё!

Шаг 4. Программное обеспечение

Последний шаг в изготовлении лампы загрузка программы на микроконтроллер Arduino. Как видно из фотографий выше, я использовал адаптер с USB-порта на последовательный порт с подключённым чипом FT232RL. Естественно, загрузить код можно с помощью других адаптеров с USB-порта на последовательный порт. О технике программирования модуля Arduino Pro Mini есть много статей в Интернете.

Исходный код программы можно загрузить отсюда: github.

Несколько слов о программе

Лампа работает в трёх основных режимах, которые можно выбирать двойным нажатием на кнопку: режим сплошного цвета (с эффектом "дыхания"), режим палитры и режим эффектов. Однократным нажатием на кнопку в режиме сплошного цвета выбираются различные цвета (9 цветов) также с эффектом "дыхания", в режиме палитры выбираются несколько цветовых палитр, которые можно взять здесь: PaletteKnife для FastLED, а в режиме эффектов выбираются да, вы правы, эффекты:)

Программа представляет собой адаптированные коды из FastLED Breath для создания эффекта "дыхания", коды из palettes with button control для создания различных цветовых палитр и коды из DemoReel100 with button для создания эффектов. Для того чтобы перевести модуль Arduino Pro Mini в спящий режим двойным нажатием на кнопку, я воспользовался инструкциями из следующей статьи. При таком двойном нажатии также сохраняются текущий режим работы и настройки каждого режима работы.

Я воспользовался следующими внешними библиотеками (библиотеки sleep.h и EEPROM.h уже встроены в модуль Arduino): FastLED и ArduinoMultiButton.

Шаг 5. Пользование лампой

Как пользоваться лампой, показано на видео ниже.

Шаг 6. Некоторые выводы

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

Лампы сделанные по этому проектуЛампы сделанные по этому проекту

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

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

Спасибо что прочитали и удачного крафта!

Узнайте подробности, как получить Level Up по навыкам и зарплате или востребованную профессию с нуля, пройдя онлайн-курсы SkillFactory со скидкой 40% и промокодомHABR, который даст еще +10% скидки на обучение.

Другие профессии и курсы
Подробнее..

Категории

Последние комментарии

© 2006-2021, personeltest.ru