воскресенье, 10 декабря 2023 г.

W801 стартовый блинк

 На момент написания данной статьи в продаже существует множество разных плат с микроконтроллерами например Arduino, Blue pill, ESP32 и т.д. Наиболее интересными являются те из них которые имеют низкую цену и большие возможности, поэтому перечисленные Arduino, Blue pill, ESP32 являются самыми популярными. Однако, на момент написания данной статьи, есть ещё одна недорогая и имеющая большие возможности плата с микроконтроллером W801. Данный микроконтроллер 32х разрядный и имеет высокую тактовую частоту 240 МГц а также большое количество пинов GPIO и 2 МГб встроенной флеш памяти. Также есть много интересной и сложной периферии которой обычно нет в простых и дешевых микроконтроллерах. Например WIFI, bluetooth, DCMI. Нет USB и CAN шины поэтому если нужна аппаратная поддержка USB или CAN то нужно выбирать другой микроконтроллер например STM32 или ESP32. Также для W801, на момент написания данной статьи, нет нормальной документации и большого количества примеров в интернете как например для Blue Pill. В остальном это весьма неплохой микроконтроллер особенно с учетом его невысокой цены. W801 может быть интересен не только на готовой плате но и ввиде отдельного чипа т.к. встроенной flash памяти а также ОЗУ достаточно для того чтобы не разводить дорожки для отдельной микросхемы. Поскольку память работает на большой частоте то важно делать разводку платы по правилам разводки для высокочастотных схем а также иметь некоторый опыт в данной области т.к. простые рекомендации всё таки не могут охватить весь спектр возможных проблем. По традиции, изучение нового микроконтроллера следует изучать с блинка т.е. светодиодной  мигалки. Проще всего это сделать через среду Arduino IDE. Которую нужно сначала настроить. Для настройки среды Arduino, откроем её, в верхнем меню выберем "файл" -> "настройки"

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

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

Далее нажимаем "ок" потом снова "ок" и в верхнем меню выбираем "инструменты" -> "платы" -> "менеджер плат" 

в поисковой строке окна менеждера плат вписываем "W801"
и после того как менеджер найдет плату нужно нажать на появившуюся кнопку "установить"
После успешной установки, менеджер плат можно закрыть
Далее по вкладке инструменты выбираем установленную плату
Теперь на вкладке "файл"->"примеры"->"BasicExamples" Можно выбрать скетч блинка
После чего загрузить его в плату кнопкой "загрузка"

Если всё прошло успешно то плата замигает зеленым светодиодом.
Поздравляю с первым блинком платы W801


Адрес биткоин кошелька для поддержки канала - bc1qlhrmmkh77x2lzhqe4lt9qwkglswj64tsqt2l5g



суббота, 4 ноября 2023 г.

Правильная настройка таймера на STM32 CMSIS режим импульса

 Таймеры микроконтроллеров STM32 имеют функцию одиночного импульса. Эта функция похожа на обычное использование таймера с циклической выдачей импульсов но только + к этому добавляется автоматическая аппаратная остановка сразу после выдачи первого импульса. Настраивается данная функция очень просто. Для этого просто устанавливается один третий бит регистра CR1 в единицу. Однако при использовании данного режима и обычной настройке (какая была описана в статье -> https://electe.blogspot.com/2021/12/stm32f103c8t6-cmsis_24.html) будет заметна такая проблема как срабатывание прерывания таймера сразу после старта микроконтроллера. Это может быть большой проблемой т.к. некоторые действия будут выполняться в незапланированный промежуток времени. Чтобы этого избежать нужно выполнить определенную последовательность действий при настройке таймера. Рассмотрим код:

Константой DELAY_MS  задается время задержки в миллисекундах. В константу DEL записывается значение для записи в регистр для создания задержки записанной в константе DELAY_MS . Следующий макрос с конструкцией if проверяет константу на не выход за допустимый предел значения. Если предел превышен то компилятор выдаст ошибку и компиляция не произойдет. В этом случае нужно уменьшить задержку. В основной функции производиться настройка пинов. Пин PC13 (со встроенным светодиодом на плате "blue pill") настраивается на выход в режиме push-pull. Пин PB8 настраивается на вход с подтяжкой к плюсу для подключения кнопки между этим пином и землей для запуска таймера по нажатию данной кнопки. При нажатии на кнопку запускается таймер, через некоторое время (заданное константой DELAY_MS ) срабатывает прерывание и светодиод меняет свое состояние вслед за изменением своего состояния пином PC13 микроконтроллера. Правильная последовательность настройки таймера выглядит так:

 1) - записать, что надо, прерывание еще не разрешать,

 2) - установить искусственно флаг UG в регистре EGR - это обновит PSC|ARR новыми значениями.

3) - сбросить установившиеся флаги прерываний

4) - только теперь разрешить прерывания и запустить таймер.

Посмотреть работу платы blue-pill, в таком режиме, можно на видео:



 источник -> https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=120406


пятница, 20 октября 2023 г.

WIFI кораблик

Популярные и недорогие WIFI модули ESP8266 можно использовать для создания, на их основе, системы дистанционного управления например самодельными кораблями. В качестве пульта управления для такого корабля можно использовать например смартфон. Дистанционно управляемый кораблик, также как и дистанционно управляемый танк, может иметь простую в реализации систему поворота путем создания ассиметричной тяги с разных сторон т.е. например если мотор с левой стороны корабля работает быстрее чем мотор с правой то корабль поворачивает на право. Если правый быстрее то налево. Моторы можно расположить по бокам и приделать к ним гребные винты или колеса. Т.к. моторы будут работать по воде а не по суше то их не обязательно дополнять редукторами для усиления и снижения оборотов. Для управления моторами можно использовать драйвер l293d или аналогичный (мотор, при этом, должен соответствовать драйверу по мощности т.е. не потреблять больше тока и напряжения чем может выдать драйвер) чтобы драйвер не сгорел. Проверить потребление тока мотором можно соединив его последовательно с амперметром и источником питания. Для драйвера L293D этот ток должен быть не боле 600мА. Для того чтобы WIFI модуль ESP8266 работал без перебоев (например при возникновении большой нагрузки на моторы) и не сгорел при превышении напряжения питания, питание на него следует подавать со стабилизатора напряжения с конденсатором для сглаживания пиков просадки и скачков напряжения. Электрическая схема кораблика, с данным модулем, будет не сложная:

    Рисунок 1 - Схема WIFI кораблика

Скетчь также не сложный, он был сделан на основе заготовки описанной в статье https://electe.blogspot.com/2023/08/esp8266-esp32.html

  

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

Один ползунок управляет одним мотором, второй ползунок управляет вторым мотором. Если ползунки не трогать то они находятся по середине и моторы не крутятся. Поднятием ползунка можно крутить мотор в одну сторону со скоростью пропорциональной уровню поднятия. Опусканием крутить в другую сторону со скоростью пропорциональной уровню отпускания. Простого способа сделать один джойстик для двух двигателей стандартными средствами HTML найти не получилось по этому пришлось использовать два ползунка. Так HTML код получается коротким, при желании можно модифицировать код и сделать более удобный орган управления. Однако ползунки всё таки поддерживаются многими браузерами а также работают на смартфонах и для их использования не надо писать много кода поэтому были выбраны они. В скетче есть закомментированные строки для случая если например понадобиться (зачем то) управлять корабликом через роутер, есть строка для задания идентификатора точки доступа без задания пароля а также строка для вывода ip адреса в последовательный порт. IP адрес задается в строке 

IPAddress local_IP(192,168,4,22);

После того как скетч загружен в модуль (о том как это сделать (загрузить скетч в модуль (а также настроить среду разработки Arduino IDE)) см. первую статью о модуле ESP8266 https://electe.blogspot.com/2023/06/esp8266-arduino-ide.html) можно подать питание на модуль (3.3В (если это не специальная плата с модулем и специальным стабилизатором для него и выводом для подачи другого напряжения)) и после того как WIFI сервер, на этом модуле, запуститься (что, как правило, происходит быстро) можно будет включить поиск WIFI точек на смартфоне и найти точку с идентификатором который был задан в строке 

 const char* ssid     = "id";

Вместо id можно задать другое название например THE_GREAT_BOT или что в этом роде. Далее чтобы подключиться к точке доступа нужно будет ввести пароль который был указан в строке:

const char *password = "987654321"; // пароль обязательно должен быть длиннее 8ми символов

пароль обязательно должен быть длиннее 8ми символов т.к. иначе программа не заработает. Пароль можно сделать посложнее чтобы потенциальным злоумышленника было сложнее угнать великолепный самодельный игрушечный радиоуправляемый по WIFI кораблик. Далее для доступа к кораблику нужно открыть браузер на смартфоне и ввести в его адресной строке IP адрес кораблика который был указан в строке:

 IPAddress local_IP(192,168,4,22);

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


testtesttesttestvideohere

Тема радиоуправления является весьма интересной и востребованной однако существует множество других интересных и востребованных тем связанных с электроникой, затронутых в данном блоге. Это например: машинное зрение, бесколлекторные моторы и их контроллеры, сварочные аппараты, аппарат наплавления, 3д сканер, 3д принтер и д.р. ЧПУ станки, всевозможные роботы (напр. BEAM роботы или роботы на ардуине, распберри и т.д.), уроки по микроконтроллерам, металлоискатель, гаусган, бесплатная энергия, всевозможные варианты дистанционного управления по средствам звука, света и т.д. и многое другое. Принять участие в выборе приоритетной темы предлагается посредством криптодонатинга. Для этого нужно прислать некоторое количество сатошей по адресу:

bc1qlhrmmkh77x2lzhqe4lt9qwkglswj64tsqt2l5g

После чего прислать название темы + номер транзакции или номер отправителя например в сообщении к данной статье, в комментарии на ютуб канале или на почту: freedms@yandex.ru. Можно также, для этого, воспользоваться группой вконтакте или сообщением. Те темы которые будут набирать больше сатошей будут более приоритетными. Темы естественно д.б. по тематике блога и реально реализуемыми т.е. например космический корабль вряд ли будет реализован, в рамках данного блога, максимум что можно сделать по теме космического корабля - это словесно описать то как его можно было бы реализовать при наличии достаточного количества ресурсов и др. возможностей по его созданию. Проверка самодельного космического корабля на практике естественно не будет осуществлена, если конечно для этого не будет прислано достаточно сатошей в донате. Сатоши могут быть добыты различными способами. Например обменяны на другие валюты или товары, намайнены или добыты с биткоин кранов. Хотя последний вариант наименее прибыльный из всех, всё же он может сработать если желающих делать донаты будет мало или не будет совсем т.к. даже одна сатоша больше чем ноль сатош. При использовании биткоина важно соблюдать меры предосторожности. По возможности использовать холодные кошелки и ни в коем случае не забывать пароль от кошелька (лучше записать его на некотором количестве разных мест) т.к. надежность криптоалгоритмов биткоина очень высока.

среда, 20 сентября 2023 г.

Радиоуправление на транзисторах

 Существует множество способов дистанционного управления различными электронными устройствами. Например это может быть управление светом, звуком, длинным проводом, радиоволнами а также есть другие способы. Использование радиоволн примечательно тем что для их создания и поглощения используются кусочки проволоки определенных форм и размеров которые можно например скрутить руками самостоятельно (чтобы тоже самое сделать для света нужны очень маленькие руки но это отдельная большая и сложная тема). Эти кусочки проволоки называются антеннами. Чтобы антенна могла излучать и принимать радиоволны, и это приносило бы пользу, нужно дополнить её дополнительными деталями т.е. сделать передатчик и приемник. Сделать данные устройства можно на специальных микросхемах или если их нет то можно даже на распространенных высокочастотных транзисторах общего назначения например на КТ315. Граничная частота коэффициента передачи тока, в схеме с общим эмиттером, для данного транзистора составляет 250 МГц. Данная частота может использоваться для радиоуправления но желательно делать некоторый запас в меньшую сторону. На рисунке ниже приведена схема двухканального приемника системы радиоуправления:


Рисунок 1 - Приемник двухканальной системы радиоуправления

Приемник имеет всего два канала, это не очень много но зато такой приемник гораздо проще изготовить без использования микросхем на одних транзисторах чем приемник с большим количеством каналов. Если нужно например 4 канала то можно сделать например два таких приемника настроенными на разные радиочастоты чтобы они друг другу не мешали. Для радиоприема в схеме имеется сверхрегенеративный каскад на транзисторе кт315. Радиочастота каскада с данными деталями не очень высокая. Для эффективного приема нужна длинная антенна. Однако практика показывает что при хорошей настройке контура, приемник может работать и с антенной длинной около 40 См. Энергия от антенны в высокочастотный контур передается через трансформатор с катушками L1 и L2. Катушка L1 располагается внутри катушки L2 и имеет больше витков, в два раза. Так, на практике, получилось добиться большей чувствительности приемника чем в случаях с одинаковым числом витков и большим на вторичной обмотке. Возможно (и скорее всего да) это не оптимальный вариант и можно экспериментальным путем добиться лучших результатов. Каскад настраивается потенциометром R2 по пьезодинамику подключенному на выход усилителя низких частот как показано на рисунке:

Рисунок 2 - Настройка РЧ каскада

Резистор R1 нужен для защиты базы транзистора VT1 на случай установки потенциометра в крайнее положение при котором он мог бы соединить базу с плюсом питания. Данным  потенциометром можно установить режим при котором в пьезодинамике слышен треск и режим при котором его не слышно. Потенциометром нужно установить уровень посередине между этими режимами со слабым треском или так чтобы он возникал при касании потенциометра тогда данная схема будет нормально работать. Если треск будет постоянным и большим то импульсы будут проходить через LC фильтр для сепарации полезных НЧ сигналов и запускать мотор в отсутствии полезного сигнала с приемника. Если приемник будет в глубоком режиме без треска то он будет слабо усиливать. Настраивать радиочастоту приемника можно растяжением и сжатием витков катушки L2 или же можно её оставить как есть и настраивать, таким же образов, контур передатчика на частоту приемника. Делать это можно также по звуку с пьезодинамика. Можно также использовать осциллограф для этого. Можно даже не собирать всю схему целиком для настройки приемника а после его настройки собрать низкочастотную часть после усилителя низких частот на транзисторах VT2, VT3. В усилителе низких частот на транзисторах VT2, VT3 возможно понадобиться подобрать сопротивления резисторов R5, R7 т.к. коэффициенты усиления по току у разных транзистором могут сильно различаться. Желательно добиться на коллекторах данных транзисторов напряжений близких к половине питания для того чтобы усиливаемые сигналы меньше ограничивались. После усилителя низких частот на транзисторах VT2, VT3 находится два низкочастотных LC фильтра. Фильтр на C3 L4 нужен для пропускания полезного высокочастотного сигнала и ослабления полезного низкочастотного сигнала. Фильтр на L5 C10 нужен для пропускания полезного низкочастотного сигнала и ослабления полезного высокочастотного сигнала. LC фильтры выбраны по тому что они проще активных и цифровых фильтров и сепарируют сигналы лучше чем пассивные RC фильтры. Можно сказать что LC фильтры имеют простоту RC фильтров и хорошую сепарацию как у активных фильтров. Недостаток LC фильтров в том что они имеют большой вес и габариты из за катушек которые должны иметь большую индуктивность и большое количество витков. По этой причине данные фильтры трудно изготовить т.к. нужно сделать много витков тонким проводом. Однако практика показала что можно использовать готовые катушки которые например использовались в старых часах или можно использовать например обмотки относительно высоковольтных ( напр. 24В со стороны обмотки) реле т.е. данные обмотки имеют большое количество витков.
 На выходе каждого LC фильтра стоит усилитель-детектор который выпрямляет и усиливает полезный сигнал. Далее стоит накопитель на конденсаторе. А после ещё один усилитель и эмиттерный повторитель для управления двигателем. Транзисторы в эмиттерном повторителе д.б. желательно комплементарные и достаточно мощные для управления двигателем. Поэтому Вместо кт315 и кт361 (у которого ток коллектора всего 50мА) поставлены более мощные комплементарные 2SC815 и 2SC539 (с током коллектора 200мА) которые часто встречаются в старой импортной аппаратуре. Вместо них можно также использовать любые другие подходящие по параметрам транзисторы.
    Схема передатчика приведена на рисунке:

Рисунок 3 - Схема передатчика двухканальной системы радиоуправления

    Передатчик будет эффективнее с двухтактным генератором чем с однотактным за счет большей мощности, для создания полезного сигнала которым будет модулироваться ВЧ сигнал, используется простой релаксационный генератор на двух транзисторах.  При нажатии на кнопку S2 генератор полезного сигнала будет работать с конденсатором C5 на высокой частоте и этой частотой модулирует основной ВЧ генератор. При нажатии на кнопку S1 к конденсатору C5 параллельно подключается конденсатор C4 с большой ёмкостью и генератор полезного сигнала работает на низкой частоте. Т.о. при нажатии на одну кнопку мотор будет крутиться в одну сторону, при нажатии на другую кнопку мотор будет крутиться в другую сторону. Если нажать сразу на две кнопки то генератор полезного сигнала будет работать на низкой частоте и мотор будет крутиться в соответствующую, этой частоте, сторону. Антенна передатчика д.б. таких же размеров как и антенна приемника. Катушки L1 и L2 являются одной катушкой с отводом от середины. Передатчик настраивается на частоту приемника путем растяжения и сжатия витков данной катушки.
Запитать передатчик можно например от 4х никель метал гидридных аккумуляторов. Напряжение от них будет близко к 5В. Слишком высоким напряжением запитывать передатчик не надо т.к. ВЧ генератор легко может сгореть. Приемник можно запитать от двух литий полимерных аккумуляторов с общим напряжением около 7.4В. Для нормальной работы сверхрегенеративного каскада приемника желательно стабильное напряжение питания и аккумулятор можно дополнить стабилизатором но если аккумулятор достаточно мощный а мотор нет то возможно что аккумулятор будет хорошо держать напряжение и стабилизатор не понадобиться. По крайней мере с таким аккумулятором собранный радиоуправляемый автомобиль работал. Тест собранного радиоуправляемого автомобиля можно увидеть на видео:
vvvvvvvvvv
Можно заметить что иногда радиоуправляемый автомобиль дергается при движении в одну сторону. Возможно что это вызвано тем что антенна, при движении, качается а так как радиосигнал поляризованный то сигнал принимается слабее при наклоне антенны. Для лучшего приема с такими антеннами желательно чтобы они обе располагались вертикально относительно поверхности земли. Также было замечено что пъезодинамик приемника начинает звучать на гораздо большем расстоянии от передатчика чем мотор начинает крутиться. Мотор крутиться когда пульт находиться близко к приемнику. Это свидетельствует о том что ВЧ каскад и каскады усиления звуковой частоты работают хорошо но сигналы после частотной сепарации усиливаются недостаточно хорошо. Схему можно пробовать дорабатывать, возможно получиться увеличить усиление путем подбора номиналов или внесения изменений в схему, например добавлением транзисторов. Однако даже без этого получилась неплохая игрушка на транзисторах.
    Тема радиоуправления является весьма интересной и востребованной однако существует множество других интересных и востребованных тем связанных с электроникой, затронутых в данном блоге. Это например: машинное зрение, бесколлекторные моторы и их контроллеры, сварочные аппараты, аппарат наплавления, 3д сканер, 3д принтер и д.р. ЧПУ станки, всевозможные роботы (напр. BEAM роботы или роботы на ардуине, распберри и т.д.), уроки по микроконтроллерам, металлоискатель, гаусган, бесплатная энергия, всевозможные варианты дистанционного управления по средствам звука, света и т.д. и многое другое. Принять участие в выборе приоритетной темы предлагается посредством криптодонатинга. Для этого нужно прислать некоторое количество сатошей по адресу:

bc1qlhrmmkh77x2lzhqe4lt9qwkglswj64tsqt2l5g

После чего прислать название темы + номер транзакции или номер отправителя например в сообщении к данной статье, в комментарии на ютуб канале или на почту: freedms@yandex.ru. Можно также, для этого, воспользоваться группой вконтакте или сообщением. Те темы которые будут набирать больше сатошей будут более приоритетными. Темы естественно д.б. по тематике блога и реально реализуемыми т.е. например космический корабль вряд ли будет реализован, в рамках данного блога, максимум что можно сделать по теме космического корабля - это словесно описать то как его можно было бы реализовать при наличии достаточного количества ресурсов и др. возможностей по его созданию. Проверка самодельного космического корабля на практике естественно не будет осуществлена, если конечно для этого не будет прислано достаточно сатошей в донате. Сатоши могут быть добыты различными способами. Например обменяны на другие валюты или товары, намайнены или добыты с биткоин кранов. Хотя последний вариант наименее прибыльный из всех, всё же он может сработать если желающих делать донаты будет мало или не будет совсем т.к. даже одна сатоша больше чем ноль сатош. При использовании биткоина важно соблюдать меры предосторожности. По возможности использовать холодные кошелки и ни в коем случае не забывать пароль от кошелька (лучше записать его на некотором количестве разных мест) т.к. надежность криптоалгоритмов биткоина очень высока.

воскресенье, 20 августа 2023 г.

Заготовка асинхронный сервер на ESP8266, ESP32

 WIFI модуль ESP8266 может использоваться во множестве различных проектов. При написании кода для загрузки в данный модуль, можно заметить что некоторые его части пишутся повторно а также то что их приходиться вспоминать или искать какой нибудь пример. Поскольку основной и наиболее интересной функцией у данного модуля является WIFI то чаще всего он будет использоваться именно из за наличия этой функции для её использования поэтому наиболее полезным примером программы, для данного модуля, будет программа использующая WIFI. В качестве примера можно реализовать например устройство пропорционального управления двумя светодиодами и получения от модуля двух значений в асинхронном режиме т.е. без перезагрузки страницы с клиентской частью приложения для управления этим устройством. Асинхронный способ будет более быстрый и удобный чем синхронный и поэтому он более предпочтителен а также для его реализации существует специальная библиотека. Светодиоды к модулю можно припаять например к пинам GPIO4 и GPIO5 (которые скорее всего будут указаны на плате) через резисторы с сопротивлением 560 Ом.

Меньше, сопротивление этих резисторов, делать не надо т.к. нагрузочная способность пинов низка и они могут перегореть если, в достаточной мере, не ограничить ток. 
В начале скетча подключаются необходимые заголовочные файлы с конструкцией, для препроцессора, которая выберет файлы в зависимости от того какой модуль программируется ESP8266 или ESP32:
Ниже нужно ввести иденитификатор, пароль и настройки WIFI сети. Если модуль будет работать в режиме точки доступа то можно придумать любой идентификатор (который будет отображаться как название WIFI сети при поиске её на смартфоне) и пароль который должен быть не короче 8ми символов, иначе идентификатор и пароль установяться по умолчанию. После того как сеть была найдена и к ней успешно произведено подключение по паролю, можно зайти в браузер и ввести IP адрес такой же какой установлен в скетче и попасть на страницу управления модулем. IP адрес указан в переменной local_IP. Чтобы помимо IP адреса, не было необходимости вводить ещё и номер порта, можно создать объект AsyncWebServer на порту 80:
В следующей конструкции вводиться html код web страницы:
Данная конструкция является самым удобным способом вставить html код в ардуино скетч. В тэге body есть два поля ввода яркостей светодиодов. Яркости имеют диапазон от 0 до 255 т.е. диапазон ШИМа. Можно сделать ограничение на стороне клиента т.е. в html коде или на стороне сервера. Для простого шаблона это не принципиально важно поэтому тут его просто нет. Также есть кнопка для передачи и приема данных от модуля + два блока для вывода информации полученной от модуля. В тэге script происходит получение доступа к данным элементам интерфейса по их идентификаторам указанным в атрибутах id. На кнопку добавлен обработчик клика в котором создается GET запрос с яркостями светодиодов, полученных из текстовых полей. Данный GET запрос передается в функцию fetch которая также принимает ответ от сервера в формате json. Принятый json ответ является обычным javascript объектом (как и любой другой json ответ) поэтому получать данные из него можно через точку. Данный способ взаимодействия с сервером происходит асинхронно т.е. без перезагрузки web страницы что удобно т.к. происходит быстрее, чем в синхронном режиме, и данные текстовых полей (и любого другого прогресса на странице (если он, конечно же, есть)) не потеряются, в результате перезагрузки.
    В начале функции setup настраиваются: последовательный порт, пины вывода, точка доступа:
Далее имеется обработчик выдающий основную web страницу при первом заходе на неё или её перезагрузке:
После есть обработчик срабатывающий после нажатия на кнопку отправки данных на сервер и получения от него ответа:

Данный обработчик срабатывает в ответ на запрос страницы /update. В нем есть проверка на наличие параметра led1 а также проверка на наличие параметра led2 (т.е. параметров содержащих ШИМы светодиодов) в GET запросе. Есть также получение значений параметров, преобразование их в тип int (приходят они в виде строки) и вывод принятых ШИМов (через функцию analogWrite) на пины к которым подключены светодиоды. После формируется ответ серверу в виде строки содержащей информацию в формате json с двумя параметрами с простыми цифрами которые можно, в последствии, заменить какой либо другой полезной информацией. В конце данная строка передается в фомате json на клиентскую часть, клиентская часть выводит цифры на экран.
 В конце функции setup() запускается сервер. В основном цикле т.е. функции loop() пусто.

Посмотреть тест модуля с данным скетчем + данную статью в видеоформате можно на видео:


среда, 26 июля 2023 г.

Фотоаппарат на ESP32 CAM

 Популярный и недорогой (на момент написания данной статьи) модуль ESP32-CAM (http://alii.pub/69872w) имеет на своей плате разъем для подключения камеры и слот для подключения SD карты а также мощный микроконтроллер и кнопку т.е. имеет всё необходимое для постройки, на его основе, компактного, недорогого малогабаритного фотоаппарата. Также для того чтобы записать прошивку в модуль нужен USB-UART конвертер который нужно соединить с модулем по схеме:

О том как настроить среду Arduino и загрузить скетч в данный модуль можно почитать статью на странице: https://electe.blogspot.com/2022/03/esp32-cam.html. Готовый скетч фотоаппарата также уже существует поэтому не обязательно "изобретать велосипед"  и писать его заново. Можно просто скачать на странице: https://randomnerdtutorials.com/esp32-cam-take-photo-save-microsd-card/ после разобраться как он работает и возможно в последствии переделывать его под свои нужды. Резисторы в схеме выше нужны для ограничения тока на случай перепутывания выводов при подключении. Их можно заменить перемычками если защита от ошибок подключения не нужна. В скетче всю самую сложную работу с камерой и SD картой, на низком уровне, делают библиотеки поэтому скетч получается просто и короткий:
В начале скетча имеются подключения заголовочных файлов библиотек. Константа EEPROM_SIZE должна быть равна единице для того чтобы данный скетч исправно работал. Следующие константы задают пины для камеры. Переменная pictureNumber нужна для того чтобы фотографии имели названия с разными порядковыми номерами. строка
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0);
блокирует датчик понижения напряжения. Serial.begin(115200) -включает последовательный порт для отладки.
Далее заполняется структура config настройки камеры. Далее в строке
esp_err_t err = esp_camera_init(&config);
происходит инициализация камеры, после инициализируется SD карта функцией SD_MMC.begin(). Строкой
fb = esp_camera_fb_get();
делается фотография. Строки:
EEPROM.begin(EEPROM_SIZE);
  pictureNumber = EEPROM.read(0) + 1;
нужны для чтения текущего номера фотографии чтобы название следующей фотографии было иным нежели название текущей. В переменную path записывается путь на SD карте для хранения фотографии. Далее открывается файл, в него записывается фотография и файл закрывается. В строке: esp_camera_fb_return(fb);  освобождается переменная для хранения фотографии. Далее выключается светодиод и осуществляется перевод модуля в режим сна до следующей перезагрузки. 
Посмотреть видеорассказ о том как сделать фотоаппарат на модуле ESP32-CAM можно на видео:


суббота, 10 июня 2023 г.

ESP8266 настройка Arduino IDE и загрузка мигалки

 Недорогой и компактный WIFI модуль ESP8266 можно использовать для управления по WIFI каким либо прибором или получением от него каких либо данных. Данный модуль лучше подойдет для каких нибудь не сложных действий, например включение лампочки по WIFI, чем более современные и сложные ESP32 т.к. имеет более низкую (хотя и не значительно) стоимость а также более компактные (тоже не сильно но всё таки) размеры. Существует некоторое количество вариантов таких модулей. Например ESP-12-F -это один из минималистичных вариантов с антенной, светодиодом, экранирующим корпусом и некоторым количеством выводов. Для того чтобы загрузить в такой модуль скетч можно собрать схему например такую как на фотографии:


На фотографии есть резистор с сопротивлением 100 Ом внизу на перекрученных проводах, он соединяет пин GPIO0 и GND, это сделано для того чтобы перевести модуль в режим программирования. В этот режим модуль перейдет после подачи питания при соединенных GPIO0 и GND. Эти пины можно соединить также обычной перемычкой, однако же резистор создает страховку на случай неправильного соединения. Для того чтобы модуль заработал в обычном рабочем, не загрузочном, режиме, нужно подать питание или перезагрузить модуль при разъединенных пинах GPIO0 и GND. Для того чтобы иметь возможность писать, компилировать и загружать программы, в данный модуль, через Arduino IDE, нужно сначала эту среду настроить. Ниже будут инструкции по настройке, они подходят для Arduino IDE версии 1.8.19 но могут не подходить для других версий. Чтобы настроить Arduino IDE, для работы с модулями ESP8266, нужно её открыть, выбрать пункт "настройки" во вкладке файл:
В открывшемся окне надо найти поле "Дополнительные ссылки для менеджера плат" и если оно пустое то вставить в него ссылку:

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Если в поле уже имеется какой то текст например:

https://dl.espressif.com/dl/package_esp32_index.json

для модуля ESP32 (об этом есть отдельная статья в данном блоге) то нужно нажать на кнопку которая находиться справа от этого поля:

 и в открывшемся окне дописать данную ссылку в дополнении к тем или той которая уже имеется в данном окне:
После нужно нажать "ОК" на данном окне и том которое появилось до него чтобы перейти в основную часть программы где теперь нужно выбрать пункт "Менеджер плат" в пункте показывающем текущую выбранную плату не вкладке "инструменты":

В открывшемся окне найти пакет ESP8266 чему поможет строка поиска сверху. После того как пакет найден его можно установить нажав соответствующую кнопку с надписью "установка":
После установки можно нажать кнопку "закрыть" в текущем окне, чтобы перейти в основное. В основном окне, на вкладке "инструменты" в пункте "плата" выбрать "Generic 8266 Module" чтобы можно было загружать скетч в модуль ESP-12-F (по крайней мере с моим модулем это сработало):
Чтобы проверить что всё работает, можно открыть пример мигалки:
Или выбрать другой пример, после того как он откроется можно замкнуть GPIO0 на GND на модуле, воткнуть его в USB порт, выбрать правильный COM порт в настройках и нажать кнопку вгрузить:
Другие настройки д.б. примерно такими:

Они могут отличаться и если загрузка не удается то можно попробовать их поменять. После успешной загрузки можно вынуть переходник из USB порта. Разомкнуть GPIO0 от земли. Подать питание 3.3в на модуль и увидеть как мигает встроенный на плату светодиод:

понедельник, 8 мая 2023 г.

ESP32-CAM выделение границ на изображении перекресным оператором Робертса

Одной из задач машинного зрения является отделение одних объектов, на изображении, от других. А одним из путей решения данной задачи может быть например выделение границ путем определения переходов цветов на изображении. Одним из ранних алгоритмов для этого является выделение границ перекресным оператором робертса. Существуют более современные алгоритмы (оператор Собеля, оператор Айверсона и т.д.) но оператор Робертса является простым и быстрым по этому используется поныне и подходит для недорогой платы за 5 долларов. Реализовывать алгоритмы машинного зрения можно проще, используя например javascript библиотеку opencv. Но такой подход работает только если есть связь модуля с компьютером т.к. opencv слишком тяжелая и ресурсозатратная библиотека для модуля ESP32-CAM если нужна автономность (которая может быть важна для автоматизации) то алгоритмы машинного зрения нужно реализовывать на стороне сервера. В данном блоге уже есть статья о том как получить массив пикселей с фотографии модуля ESP32 CAM. (см. датчик цвета на ESP32-CAM -> https://electe.blogspot.com/2022/11/esp32-cam.html). Далее, после того как массив пикселей получен, можно подвергать его воздействию всевозможных алгоритмов с целью их исследования. Массив пикселей содержит 3 байта на каждый пиксель. Один байт для яркости синей составляющей, один для зеленой и один для красной. Именно в таком порядке, как было выяснено ранее, компоненты располагаются в получаемом массиве.

Однако для понимания работы алгоритма порядок не важен. Предположим что каждый пиксель имеет всего одну компоненту яркости т.е. изображение не цветное. В таком случае для определения границы какого либо объекта в какой либо точке на изображении из 4х пикселей можно найти корень из суммы квадратов разностей двух пикселей находящихся на разных диагоналях:
или сумму модулей разностей яркостей пикселей на диагоналях. Будут ли использоваться модули или корень - не важно с точки зрения результата абстрактного алгоритма но для работы на реальном процессоре, вариант с модулями более предпочтителен т.к. его быстродействие будет больше. Суть метода заключается в том что с какой бы стороны на какую не менялся цвет, в этом перекрестии, это изменение будет выражено положительным значением результата вычисления данной формулы. Для того чтобы увидеть границы объектов, на изображении, нужно пройтись данной формулой по всем этим точкам из 4 пискелей со смещением на один пиксель на каждой итерации не затрагивая крайние справа и снизу пиксели всего изображения т.к. они сильно не повлияют на результат какой либо реальной фотографии с не очень низким разрешением. Прелесть этого метода (помимо быстродействия) также заключается в том что результат вычисления можно записывать в ту же самую матрицу из которой берутся яркости пикселей изображения, что не требует дополнительного выделения оперативной памяти чем её экономит. Прежде чем применить данный алгоритм к цветному изображению, можно сначала пройтись по всей матрице и усреднить значение трех компонент яркости каждого пикселя или же пройтись оператором Робертса по каждым компонентам в отдельности. Как будет показано в видео, внизу страницы, на практике визуально результат получается практически одинаковым.

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

Данный код является переделкой примера который скачивается вместе с библиотекой для данного модуля для среды Arduino. Код длинный а его полный разбор будет ещё длиннее поэтому лучше сосредоточиться на более интересных вещах. А разбор работы именно с аппаратными возможностями данного модуля, возможно будут выделены в отдельные статьи в данном блоге. Код алгоритма Робертса помещен в функцию capture_handler т.к. она вызывается после того как делается снимок, который можно разобрать на пиксели и обработать данным алгоритмом, после чего отправить результат по WIFI для просмотра на каком либо устройстве типа смартфона. Для того чтобы не было необходимости в роутере для получения результата. Добавлена возможность работы модуля в режиме точки доступа. В переменную ssid нужно записать название WIFI сети которую создаст модуль и к которой нужно будет подключиться для получения результата. В переменную password нужно записать пароль который нужно будет ввести при подключении к WIFI сети которую создаст модуль. IP адрес который нужно будет ввести в адресной строке браузера, после подключения к сети, можно посмотреть в мониторе последовательного порта среды Arduino IDE после запуска которого на модуле нужно будет нажать кнопку "reset" (единственная кнопка которая имеется на данном модуле) чтобы этот адрес появился. Модуль, при этом, должен быть подключен к компьютеру через usb-uart переходник. Схему такого подключения а также то как загрузить скетчь в данный модуль, можно посмотреть на странице  https://electe.blogspot.com/2022/03/esp32-cam.html

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

В функции index_handler нужно найти вызов функции httpd_resp_set_hdr и поменять там строку GZIP на html чтобы можно было делать клиентскую часть на обычном html не конвертируя его в GZIP это удобнее и к томуже GZIP имеет меньший размер чем html только при больших размерах кода, при малых получается обратный эффект. Строка с HTML кодом клиентской части передается вторым параметром в функцию httpd_resp_sendstr. Чтобы текст можно было продолжить на следующей строке, можно ставить разделители обратные слеши. На фронтэнде т.е. клиентской стороне будет картинка с результатом обработки фотографии, кнопка чтобы сделать фотографию и выполнить обработку, кнопка чтобы включить/выключить освещение светодиодом и ссылка для перехода на страницу с результатом обработки фотографии. Также видно что в коде есть конструкция для того чтобы картинка бралась из сервера а не из кэша.

Алгоритм робертса в функции capture_handler будет реализовываться только в случае успешной конвертации фотографии в формат RGB888. Изображение состоит из пикселей, пиксель состоит из 3х составляющих красной, зеленой и синей на каждую состаляющую выделено 8 байт если усреднить составляющие то можно получить черно-белое изображение в данной реализации это делается на каждой итерации цикла для 4х соседних пикселей поэтому циклы проходят по всем пикселям кроме тех что в последней строке и последнем столбце для определения границы из правого нижнего пикселя вычитается левый верхний и из этой разницы берется модуль. Далее тоже самое производиться с оставшимися диагональными пикселями. Если берется модуль то, на самом деле, не важно какой из какого вычитаются главное чтобы это вычитание было перекресным в данной же реализации используется тренарный оператор для большей переносимости кода. После чего эти разницы по модулю складываются и получается результат, чем светлее пиксель тем резче переход цветов. Вот примерно такие получаются результаты обработки фотографий данным модулем с данным скетчем:

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