https://github.com/unityreef/controller/blob/main/UnityReef_v8.0.ino
Комрады. не понимаю как скачать библиотеки для проекта на esp 32, впн не хочу . Если придется то да,но по дефолту не хочу.
Комрады. не понимаю как скачать библиотеки для проекта на esp 32, впн не хочу . Если придется то да,но по дефолту не хочу.
VM5277 — это универсальный инструментарий для embedded-разработки, который предоставляет мост между миром высокоуровневой ООП-разработки (Java-подобный язык J8B) и нативной компиляции под 8-битные микроконтроллеры (AVR, PIC, STM8).
Статус проекта: В общей картине проект находится в стадии активной альфа-разработки, но в фокусе AVR (ATmega328) реализовано ядро и полный цикл разработки:
И так, я выложил новый коммит на GitHub https://github.com/w5277c/vm5277.
Здесь можно почитать что было сделано https://github.com/w5277c/vm5277/blob/main/NEWS.md
Также обновил статус проекта на странице-визитке https://vm5277.ru/
И выложил новый релиз 0.1.2 http://vm5277.ru/releases/vm5277-release-latest.zip
В целом сейчас есть работающие утилиты проверенные под Debian, и часть примеров оттестированные на Atmega168p/ATmega328p (Arduino Uno)
Далее продолжу тестирование и багфиксинг, затем дописывание документации и подготовка к презентациям.
В будущем другие платформы, легкая и эффективная отладка J8B, многопоточность и много всего интересного и вкусного.
Прилагаю скриншот процесса сборки и прошивки ArduinoUno одной командой

Я не копирайтер и никогда не практиковался в написании постов, я практикуюсь в разработке ПО(профессионально и давно) а также в схемотехнике(хобби). Здесь не будет красивого изложения.
К тому же я хочу донести общий смысл, а не заострять много внимания на деталях.
В общем я даже не буду пытаться соответствовать шаблону крутого спеца. Просто прошу обращать внимание не на мою личность, и форму подачи материала, а конкретно на вопросы о которых буду писать.
И да, у меня будут проскакивать различного рода ошибки, прошу прощения, а также прошу проходить мимо, если Вас это напрягает. Я здесь не для того, чтобы показать какой я умный и на сколько хорошо знаю правила русского языка.
А пишу я этот пост, просто потому, что меня(в том числе и как потребителя) очень сильно напрягает положение дел касаемо домашней автоматизации. И я вижу альтернативное решение. Благо я волен сам выбирать как функционал ПО, так и оборудование на котором строю свое решение.
Приступим.
Я всегда стараюсь исходить из задачи. Задача - я хочу автоматизацию в квартире, гараже. А далее на даче, когда она у меня будет. Да и вообще где угодно, автоматизация везде полезна.
Конкретно, для квартиры я хочу следующее:
Вода: счетчики на горячую и холодную воду(т.е. автоматический съем с них показаний и либо передача в центр приема показаний или информирование мне). Проверка на протечку и перекрытие поступления воды от стояков. Съем температуры со стояка горячей воды. Съем показаний с теплосчетчика(если получится его использовать, в моем случае проблемы с нашими законами, а не техническая).
Климат: Датчики температуры, влажности, в каждом помещении(и С02 датчики в жилых помещениях). Управление запорной арматурой батарей отопления(для регулировки темпрературы в помещении). Управление вентиляцией.
Безопасность: Датчики открытия на каждое окно, входную дверь(и на некоторые двери внутри квартиры). Датчики дыма.
Электрика: Диммирование ламп накаливания(я не сторонник светодиодного освещения), управление светом для остальных типов ламп(вкл/выкл). Управление(очень желательно) каждой розеткой в доме. Съем показаний с электросчетчика. Управление электрозамком на входной двери и еще в паре мест в квартире соленоидом.
Ну и прочее: Съем температуры в ларе(морозильник), метеостанция, счетчик Гейгера и прочее, прочее, прочее. А вот еще - универсальный модуль в каждую жилую комнату, который сможет управлять кондишкой, телевизором и прочим по ИК, сможет принимать команды по ИК от пульта, сможет работать ночником и прочее. А еще можно подружить Wi-Fi точку доступа или Bluetooth и клиента с сценариями для управления охранкой и открытием двери, домофоном и прочее.
В общем размах очень большой. При этом я не рассматриваю всякие системы типа умных чайников и прочая лабуда мне оно откровенно не нужно. Также как и всякого рода шпионы типа умных колонок с Алисой.
Главное, я могу написать софт сам, а еще мне интересны микроконтроллеры типа старых ATmega 8(AVR), которые несколько лет назад изучил очень детально(без Ардуино). И которые, во всяком случае были, намного дешевле остального на рынке. Я могу писать и на STM но я не любитель Си, я люблю ассемблер, а ассемблер у кортексов мне не нравится.
Главный вопрос, в какую сумму мне все это встанет? Как мы видим, здесь только одних умных розеток будет несколько десятков. В общей сложности всех устройств будет явно больше сотни.
Разумно ли в этом случае рассматривать беспроводные решения? Я считаю, что это совершенно не разумно. Вот причины:
1) Wi-Fi забит соседями, сам стандарт не рассчитан, чтоб на небольшом простанстве было такое количество устройств - проблемы со связью будут обеспечены.
2) Безопасность, любой радио интерфейс могут заглушить и вероятно прослушать, подменить. Т.е. датчики на окнах и дверях могу быть просто заглушены, и мы никогда не узнаем, что дверь открывали.
3) Питание. Автономное от батарей - значит через некоторый период придется менять ближе к сотни батарей. Не автономное - значит у вас в квартире будет около сотни импульсных блоков питания(чревато возгоранием и влиянием на здоровье)
4) Безопасность. Более того, насколько мне известно в России никому не интересны Российские разработки в данной отрасли, все просто покупают кастомизацию зарубежных решений(типа Tuya), даже китайцы типа Midea. Все эти железки в вашем доме соединяются скорее всего с зарубежными серверами. Технически вас могут слушать, воровать ваши личные данные(те-же пароли введенные через беспроводную клавиатуру). И кто знает как они могут повлиять на ваши исполнительные устройства. Самое простое, что они могут сделать - это окирпичить весь ваш умный дом просто отказав в обслуживании.
5) Ну и такие мелочи как высокая цена, большие размеры устройства, электромагнитное излучение, высокочастотный слышимый шум.
* конечно, где-то что-то реализовано по уму и есть исключения, но общую картину я думаю описал достаточно верно.
И исходя из вышесказанного, плюс из того, что я могу сам создать устройства и софт, я конечно выбрал свой велосипед. А главное, я выбрал его давно, когда тема умных домов была еще не так популярна.
Решение представляет собой сервер, контроллер(оптимально ставить один контроллер на одну локацию, например квартиру), клиент и конечные устройства(датчики, устройства управления, модули, шлюзы и прочее).
Я использую проводное решение. Смотрим RS-485. Устройства вешаются параллельно, шина(как на елочной гирлянде). Достаточно одного кабеля. Т.е. одна шина(лучше две витых пары, подойдет сетевой компьютерный кабель UTP). Желательно поставить шлюз с гальванической развязкой и отдельным питанием на каждое большое помещение. И да, главная сложность провести эту шину до всех устройств. Я, в основном, использовал плинтуса. Буду делать ремонт в квартире - уберу все в стены. Также как и компьютерную сеть, проводной гигабит лучше Wi-Fi, а еще лучше 10 гигабит..
Занимаюсь я этим около 10 лет. Довольно редко, ведь это хобби. Какие-то устройства ставлю, какие-то снимаю. И я подустал, многое снял(снял старые мало функциональные версии, а новые многофункциональные - пока просто не дошли руки). Установка и съем никак не повлияли на стандартную электрику! Сейчас у меня около 10 умных розеток, управляемое освещение во всех комнатах, несколько датчиков дверей, своя охранка, несколько датчиков температуры. Есть очень много различных наработок, что-то даже спаяно и это просто нужно подключить. Например в ближайшее время я буду менять 4 счетчика воды. Уже лежат для замены(с импульсными выходами). Платы модулей для них начерчены, надо заказать печать PCB, паяю пока сам. ПО написать - пара, тройка вечеров, так как много универсального кода уже написано.
И главное, поштучное изготовление устройства(это очень важно, так как массовое значительно снижает цену единицы) для меня выходит где-то 150-500 рублей. Т.е. я могу обвешать всю квартиру датчиками и средняя цена за каждый будет 200 рублей(можно и дешевле, если делать устройство под конкретную задачу). Умная розетка чуть дороже, где-то 300-400 рублей.
При этом, как говорил ранее, я профессиональный системный программист. Функционал в устройствах достаточно широкий. К примеру, что первое в голову пришло: обнаружение устройств на шине, обновление прошивки, история событий, сенсорное, клавишное, кнопочное управление(обычный выключатель), порт расширения, датчики тока и прочее.
А про программную часть(сервер, контроллер клиент) я даже и говорить не буду. Функционал очень богатый и закрыты многие технические вопросы, о которых такие как Ксиаоми скорее всего даже и не задумывались.
Конечно есть области в которые я не добрался, что-то реализовано поверхностно, что-то содержит не критические баги. Клиент вообще без дизайна. Да и вообще, сейчас много мелких недоработок, так как проектом пользуюсь только я, и поэтому многих недочетов, которые легко исправить) не замечаю.
А гараж, в гараже было решение, временно снял. Доработал модули, но не доходят руки дописать и доделать некоторые вещи(например модуль бесперебойного питания и модуль радио интерфейса на базе LoRaWAN). По большей части потому, что там сейчас охранять нечего.
И ведь это не законченное решение, так как по большей части им пользуется только моя семья. И никто больше. Почему? Потому что:
1) Я не копирайтер, я не могу подать материал так, чтобы в нем кого-то заинтересовать в мире заваленном кучей беспроводных устройств с сильной рекламой
2) Я не дизайнер и не могу его отточить для удобоваримого восприятия конечным пользователем.
3) У меня скудная документация и скудная поддержка сторонних устройств (да, мой проект может, поддерживает и будет поддерживать много сторонних устройств)
4) Ну и у меня нет капитала, который я был бы готов вложить в серьезное развитие этого проекта. Достаточно того, что я вложил кучу своего опыта и личного времени.
В итоге, что я мог бы предложить в сравнении с современными решениями:
1) Бесплатное ПО(с минимальными ограничениями) в виде AS-IS(кроме сервера). При этом весь код написан на Java - любой знающий может проверить решение на вредоносный функционал. А клиентская часть реализована на Gluon Mobile, что позволяет практически один и тот-же Java код запускать почти везде.
2) Возможность ввести в систему любое не проприетарное устройство. В том числе и беспроводные шлюзы и устройства.
3) Исполнение контроллера на широком списке различных устройств(почти все где можно запустить Java SE 8
4) Информирование и различные точки управления типа Telegram, Алиса, СМС и прочее
5) Свой набор конечных устройств с проприетарным ПО
6) Рабочую систему даже без сервера и контроллера(но с ограничениями в функционале естественно)
7) В основе открытый основной код конечных устройств - операционная система реального времени для AVR на ассемблере.
8) Полностью Российское решение, за исключением некоторых открытых библиотек и JRE
9) Конечно-же богатый функционал типа сценариев, скриптов и т.п.
10) И важно, не нужно никакого умения и знаний в программировании или в написании конфигураций. Нужно просто понимать, что за устройство у вас в руках, как оно работает и как подключается. Но, никто вам не запрещает создавать свои устройства со своей прошивкой. Также в проект заложена возможность писать сценарии на Java.
Да, получилось сумбурно, знаю, но я даже не представляю как весь свой труд проделанный в течении многих лет описать в один пост. Это просто не возможно.
И главное. Я ни на что не рассчитываю, просто хотел показать как оно, по другому, бывает.
Ну и последний пост на сегодня.
Данный проект не имеет никакого отношения к коммерции.
Я с детских лет любил кодить на асме, тогда доступтыми машинами были ZX Spectum'ы на микропроцессорах Z80. Позже мне пришлось отказаться от Спекки в сторону IBM PC, в универах на Спекки не писали. Да, я писал 'кое-что' на асме для таких как Intel 386, но это не приносило удовольствия в сравнении со Спекки.
Из-за университета мне пришлось годами писать на Си и это было не приятно, потому что в принципе восприятие низкоуровневого программирования сильно отличалось. Достаточно сказать, что в асме нет указателей, повторяю, их нет, есть индексные регистры.
Данный проект родился из-за моей ностальгии по тем временам.
В нем я предлагаю ассемблер наработки(также у меня есть свой ассемблер-сборщик, так как avra не справляется с моими проектами). По сути это операционная система реального времени с ядром и дополнительными утилитами реализованными для Atmel AVR микроконтроллеров на чистом ассемблере.
Я предлагаю посмотреть мои наработки желающим познакомиться с ассемблером для AVR. Эти наработки могут значительно уменьшить порог вхождения в данное направление.
Думаю мой проект позволит вам писать на асме не намного сложнее чем на Си.
Спасибо за внимание.
Я знаю о куче современных сетевых технологиях для IOT.
Bluetooth, Wi-Fi, XBee, Zigbee, 433MHz да и много чего еще(в том числе и CAN). Знаю что-то поверхностно, что то достаточно глубоко чего не знают многие.
Но знаете ли вы, что есть простейшее решение на базе RS-485?
Да, нужны провода, кабель с двумя витыми парами сойдет, чтобы передать на километры данные с битрейтом в 9600.
Ваше DIY устройство может быть собрано на базе очень дешевого микроконтроллера, так как решение не нуждается не в шифровании ни в других задачах радио связи. Поддержка обычного UART достаточно. А еще вы можете снизить цену контроллера где-то в два раза, если не будете писать на популярном Си, а сразу на нативном ассемблере, для которого тоже есть куча наработок, но без логики и мозга там делать нечего(заучивание теории не подойдет). Зато трудозатраты очень серьезно отличаются - и главная правда в том, что не в пользу Си. Просто Си заучить можно, а асм нужно думать головой.
Это проводное решение, где на одну шину подключаются все устройства. Устройства питаются от шины - не нуждаются в персональном ненадежном блоке питания, существенно менее опасны как причина возгарания, так и в рамках влияния на здоровье(радио магнитное излучение). Да еще и размерами существенно меньше. И сосед не сможет положить ваш дом забив Вашу радио часть помехами.
Наш мир загажен популярными решениями, за которыми стоят тупые производители желающие просто на нас заработать.
Даже если беспроводное? Вы слышали про LoRaWan, почему она менее популярна чем Wi-Fi для IOT? Или Zigbee или XBee...?

Программируемый многофункциональный робот от Keyestudio V3.0 для Arduino. Умеет выполнять множество команд. Комплект для сборки отлично подойдет начинающим любителям робототехники и программирования. Ссылка на источник.

Интересный набор для сборки фургона-автодома с множеством различных функций. Ссылка на источник.

Набор для сборки умного робота с 'рукой'. Умеет выполнять различные команды, брать/класть предметы и тд. Ссылка на источник.

Еще одна версия робота с 'клешней' для самостоятельной сборки и программирования. Ссылка на источник

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

Робот с интересными колесами, которые могут двигаться в любом направлении. Робот сборный, программирование на Microbit V2. Ссылка на источник

Электронный комплект «сделай сам» - робот балансир для взрослых и детей. Ссылка на источник

Робот-машинка Pi 4B для сборки и программирования. Имеет камеру и функцию слежения/наблюдения, а также множество других возможностей. Ссылка на источник

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

Забавный робот с ковшом и умеющим рисовать. Ссылка на источник

Геймпад Keyestudio ATMEGA32U4 с OLED-экраном, стартовый набор для Arduino. Ссылка на источник

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

Веселый робот-лягушка с сервоприводами для сборки. Ссылка на источник

Набор для сборки крана-манипулятора для последующего программирования. Поможет обучить и научить начинающих любителей электроники, роботостроения и программирования как это делается=). Ссылка на источник

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

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

Умная собака-робот для сборки и программирования. Ссылка на источник

Роботизированный паук с пультом управления. Ссылка на источник

Робот-вездеход ELEGOO Conqueror с UNO R3. Ссылка на источник

Самый серьезный аппарат в нашей сегодняшней подборке. ROSMASTER X1 - это обучающий робот с приводом на 4 колеса, разработанный на основе операционной системы ROS robot. Он использует плату серии Jetson и Raspberry Pi 4B в качестве основного контроллера и оснащен высокопроизводительной аппаратной конфигурацией, такой как лидар и камера глубины, которые могут осуществлять управление роботом, дистанционную связь, картографирование и навигацию, отслеживание обхода препятствий, автопилот, распознавание особенностей человеческого тела и другие функции. Ссылка на источник.
Взято с сайта Обзоровик
Здравствуйте уважаемые! Возникла необходимость установить некое устройство, которое будет по смс или телеграм или вацап оповещать о том, что на контакте появилось питание. Контакт (-ы) 380V установка вайфай- невозможна, протянуть витую пару- невозможно. Отсюда вопрос: есть ли такие устройства в природе (кроме автомобильных сигнализаций), как они могут называться? Если нет, можно ли такое решение реализовать на ардуино? Если да, то обсудил бы цену со-специалистом, нужно два таких устройства.
Если подробнее, то алгоритм примерно такой: некто включает рубильник, затем идет к щитку и нажимает кнопку пуска, после нажатия кнопки устройство готово к работе, выключение устройства происходит отключением рубильника. Нужно что бы приходило уведомление в момент когда появляется питание (не важно, рубильник или кнопка) и нужно уведомление в момент, когда питание пропадает.
Решил, на базе полученных комментариев, немного дополнить свой пост. Думаю это я проделаю много раз, если будет интерес у публики.
Не менее 90% моего проекта - это комплекс программного обеспечения(как минимум сервер, контроллер и клиент). Остальное - это по сути необязательные допы, типа линейки своих конечных устройств(датчики, устройства управления, модули, шлюзы и прочее).
Вот с программной частью и с дополнительными услугами коммерция вполне возможна.
Расскажу про те самые 10%
Насчет своей линейки устройств - конечно, конкурировать с Китаем никаким образом не выйдет. Максимум, это единичные продажи, от которых заметную прибыль не получишь, но это может быть полезным бонусом для проекта в целом.
Я знаком с CAN, и все же RS-485(без Modbus) подходит лучше. Физика не отличается, отличаются протоколы. Я использую свой проприетарный протокол, который существенно более функциональнее Modbus. И он закрывает все необходимое для домашней автоматизации. Более того, я также разрабатывал в другом проекте аналогичное решение но с более богатым функционалом, например там устройства свободно могут общаться друг с другом без мастера, находясь на одной RS-485 шине. В данном проекте такое мне пока не нужно.
Ну и CAN требует больше финансовых затрат, драйвера дороже, документация закрыта, реализация значительно сложнее и прочие прелести.
STM вероятно сейчас дешевле чем AVR и точно функциональнее и богаче ресурсами. Но лично меня устраивает функционал и цена за МК(ATmega168) в пределах 80-100 рублей. Большего мне в конечных устройствах не нужно.
В моих железках не используется конкретно RTOS, у меня своя realtime OS написана полностью на ассемблере(существенная разница в размере потребления ресурсов). Да, конечно, размер прошивки в небольших программах заметно меньше для кода без ОС, особенно под конкретную задачу. Но если у Вас богатый функционал, то не важно Си это или ассемблер - у вас будут большие трудозатраты. Использование ОС эти трудозатраты существенно снижает. Здесь просто нужно смотреть на поставленную задачу. У меня богатый функционал, и использование ОС заметно более выгодно. Ну и разработка на ассемблере существенно оптимизирует размер прошивки и использование других реусрсов МК.
Теперь по поводу комментария, что у меня проект совсем не похож на умный дом.
Конечно у меня есть сценарии. На базе их контроллер(а не сервер) управляет всеми устройствами. Главное преимущество - большинство сценариев описываются в виде UI формы, там нет ни скриптов, ни конфигов, ни программирования. Хотя если будет действительно сложная задача - можно подключить Java код.
Кроме того для своей линейки у меня наработан почти полный функционал триггеров(пока не ввел в работу), т.е. устройства сами могут выполнять простейшую автоматизацию, в том числе и на базе показаний других устройств. Подобное я уже делал. И все это на ATmega168(в край 328).
Как уже сказал, сценарии выполняет контроллер. Он может быть установлен в квартире, может быть виртуальным в облаке. А может и не быть. Клиентская программ сама может взять на себя функционал контроллера, но в этом случае сценарии работают только тогда, когда работает клиент.
Для автоматизации сервер не нужен, он вообще не выполняет автоматизацию - у него другие задачи, типа агрегации данных, предоставление доступа пользователям, информирование и прочее.
Спасибо за внимание.
Насчет холивара Си и ассемблера я напишу отдельно. Можно будет устроить срачь, шучу.
В моем посте завелись тараканы. Я их не вижу, но они гадят. Постоянно приходят сообщения как только кто-то из них нагадит.
Будьте осторожны, я не вижу этих тараканов и не знаю что оне там постят.
Я заметил, что у нас тут очень мало постов на техническую тематику. Вернее, вообще нету. @Vobmatolog не пора ли замутить сообщества? Уверен, что они есть в планах, просто никак уже не дождусь.
Ладно, это была лирика. Я тут озадачился решением одной проблемы, весьма надуманной. Мне необходимо засверливать перпендикулярные отверстия в деревянных брусках.

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

И подумалось мне - а что если приспособить пузырьковый уровень к шуруповерту? Типа такого.

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

Называется это xDrill, вот проект на Кикстартере: https://www.kickstarter.com/projects/xdrill/xdrill-the-drill-reimagined
Там много чего есть: тачскрин, лазерный глубиномер, уровень и кое-что еще. Меня же интересует только уровень. Ну так почему-бы его и не сделать своими руками?
Для этого всего-лишь нужна Ардуина, какой-то MPU5060 и экранчик. Ну, батарейка, 3D-принтер, чтобы напечатать корпус. Всего делов.
Технические требования такие: ручная установка начального уровня и отслеживание его при сверлении. Таким образом, деталь может располагаться под любым углом - уровень всегда будет ей перпендикулярен.
Вот такой получился у меня прототип:

Следующий этап - проектирование и создание корпуса, который можно было бы закрепить на тыльной части шуруповерта. Ну и допилить прошивку, добавить кнопку для установки уровня, может пищалку, чтобы не пыриться в экран все время.
А теперь, внимание, вопрос. Не смотря на все эти фокусы, все равно осталась проблема начального уровня. То есть, устройство нужно снять с дрели, приложить к поверхности, обнулить уровень, закрепить его опять на дрель и только потом начать сверление.
Как оптимизировать этот процесс? Например, чтобы не снимать уровень с дрели вообще.
Всем привет. Хочу посоветоваться. Я задумал сделать в комнате светодиодное освещение, для этого купил ленту RGBCTT. Это та, которая не адресная, просто 5 отдельных каналов.
Уже подключил к Ардуине и проверил, все работает вот по такой схеме:

Мне хотелось бы ее подключить к Home Assistant, но Ардуино туда не подцепить, единственное, что в голову приходит - связать ее с какой-нибудь ESPшкой и уже ее подключать к HA через ESPHome. Делается это для того, чтобы иметь физическое управление светом и возможность давать команды с сервера HA.
Вопрос, как правильно связать два микроконтроллера и возможно ли управлять ардуиной с ESP? Например, передавать команды типа: "R180 G51 B120 CC255 CW 200".
С кодом я разберусь. Главное, понять принцип, как это делать.

Пытаюсь создать вот такое устройство. Датчик цвета TCS34725 и экранчик SSD1306. Оба подключаются по I2C на одни и те-же ноги А4 и А5 и имеют разные I2C адреса. У экрана - 0x3C, у сенсора 0x29, кажется. Вообще реально их как-то развести и заставить работать вместе? Я уже всю голову сломал. Ковырял U8glib, но она для SPI, I2C там имеет стандартное подключение. Попадался способ с перемычками, меняющими адрес, но они есть только на Adafruitовских девайсах. Чего делать-то?
Продолжаем ковырять прерывания и таймеры.
Поговорим о делителях частоты и зачем они нужны. Делители - тупо уменьшают системную частоту, зачем - да фиг его знает, но зачем то нужны. В прошлом посте я пришёл к тому, что цикл прерывания работает, и не мешают работе ШИМ, но вот чот не так быстро как хотелось бы. Напомню, что время между тактами составляло порядка 2 миллисекунд, а надо микросекунды. Будем отключать делитель.
У адруины нано есть вот такие варианты:
1. таймер/Счетчик выключен;
2. Тактовый генератор;
3. Делитель на 8;
4. Делитель на 64;
5. Делитель на 256;
6. Делитель на 1024.
По умолчанию, в частности на таймере 2, делитель установлен на 64. Посчитаем:
Ардуина работает на 16 МГц, следовательно 16 000 000 / 64 = 250 000, т.е. 250 кГц, т.е. 250 000 раз в секунду.
Далее посмотрим, сколько времени требуется на такт: 1 / 250 000 = 0, 000004 сек, или 4 микросекунды. Счетчик таймеры 2 считает до 255, а значит прерывание срабатывает 1 раз за 256 тактов (0 - 255), значит прерывание срабатывает каждые 4 * 256 = 1024 мкс, или 1,024 миллисекунды,...
Отступление: многие мануалы, которые я прочитал,пытаются заставить работать прерывание со сбросом при совпадении, и настраивают его на работу в 1 миллисекунду, но при выборе режима работы допускают маленькую ошибку, и получают время 1,024 - на практике это особо не заметно, и их светодиоды работают вроде бы как надо, но отличить глазом разницу в 24 мкс - не реально, и типа ок. А когда я стал с этим разбираться, тайминги не совпадали, и ничего не работало как надо.
Ок, вернемся к нашим баранам.
1,024 миллисекунды - слишком медленно,... будем выключать делители. Посмотрим как это делать: (картинка с видео)

Как видим, какие-то мутные регистры, но ничего сложного:
Все настройки делаются в блоке setup!
CS00, CS01, CS02 - Разбираемся: CS - Регистры, просто запоминаем. первая цифра - номер таймера, Нам нужен 2. Вторая цифра - управляющий бит. Итак, нам надо тактовый генератор на канале B таймера 2, а значит надо установить регистры CS20 = 1, CS21 = 0, CS22 = 0 в регистр таймера 2 канал B
В программном виде это выглядит так:
TCCR2B |= 1<<CS20;
TCCR2B &= ~((1<<CS22)|(1<<CS21));
, где
TCCR2B - Регистр таймера 2, канал B (Соответственно может быть TCCR0А, TCCR0B, TCCR1A, TCCR1B, TCCR2A, TCCR2B - Думаю понятно что тут и где).
Первой строчкой через оператор OR устанавливаю 1 на регистр CS20, второй строчкой устанавливаю нули в регистры CS21 и CS22 используя операторы AND и Инвертирование от OR.
Для тех кто не знает:
| - это оператор OR (логиеское или). Принцип работы: имеем биты А и Б, Про себя проговариваем: Если А или Б = 1, то на выходе 1. т.е. если хотя бы один из битов = 1, то на выходе 1. Соответственно, если оба = 0, то на выходе 0.
& - это оператор AND (логическое и). Принцип работы: имеем биты А и Б, Про себя проговариваем: Если А и Б = 1, то на выходе 1. т.е. если хотя бы один из битов = 0, то на выходе 0. Соответственно, если оба = 0, то на выходе тоже 0. Чуишь разницу?
~ - это оператор NOT (логическое не). Принцип работы: Имеем бит А. Про себя проговариваем: Если А = 0, то на выходе не 0, и наоборот. Грубо говоря, просто инвертируем значение.
<< - Операция побитового смещения влево, То есть, было у нас 3 бита = 001, смещаем их влево на 1 знак, получаем 010, Еще разок сместим - 100, еще разок сместим 000. ну и вправо смещать тоже можно аналогично.
Как работает вся эта конструкция в целом - да не особо важно, если будет ты туда залез, и тебе это нужно - разобраться будет не сложно.
Итак. Делители выключили, посчитаем: 1 секунда / 16 000 000 Гц = 0,0625 мкс, * 256 = 16 мкс. Во, уже просто супер! Теперь можно хреначить цикл работы с микрухой анализатора.
Изменение частоты делителя, никак не влияет на работу ШИМ, - так как подняв частоту ШИМ, мы не меняем скважность сигнала (процентное соотношение времени вкл и выкл) - это как частоту на мониторе поднять, просто мерцать меньше будет.
В общем и целом,что можно сделать на ардуине:
7 типа параллельных потоков:
один цикл - Основной LOOP, - очень шустрый, менее 1 мкс на круг.
еще два цикла - на таймере 2 каналы A и B - довольно шустрые по 16 мкс на круг.
еще два цикла - на таймере 1 каналы A и B - помедленнее, так как они до 1024 считаю, т.е. 64 мкс на круг.
и еще два - на таймере 0, но тут частоту менять не надо, то есть 1024 мкс на круг.
Далее, если нам не надо ШИМ или всякие Delay, micros, millis, и прочие (в зависимости от таймеров и каналов), можно поставить в прерывании по таймеру сброс счетчика, и в регистр сравнения записать 1, таким образом, прерывание будет вызываться в каждый такт: т.е. получим скорость как у основного цикла LOOP, = 0,0625 мкс.
Посмотрим как это делать:

Видим, что надо задавать регистры WGM, где первая цифра - это номер таймера, вторая - задающий бит (У таймера 1 немного иначе - имейте ввиду). То есть надо сделать так:
TCCR2B = 1<<WGM21;
По умолчанию установлен режим Нормальный, то есть биты стоят в 0. поэтому дополнительных манипуляций не требуется, просто берем и устанавливаем единицу в нужный регистр.
Обращаю внимание что оператор | (OR) перед знаком равенства не используется! Я фиг знает почему так, - логично что надо бы, но если его поставить, то нифига не работает. Ну и соответственно, эту строчку надо бы размещать перед другими настройками этого бита (TCCR2B в данном случае).
Если надо установить в оба бита, то делаем так: TCCR2B = ((1<<WGM21)|(1<<WGM20));
Итак: в конечном виде это выглядит так:
TCCR2B = 1<<WGM21; Режим Сброс при совпадении
TCCR2B |= 1<<CS20; Режим работы по генератору 16 МГц
TCCR2B &= ~((1<<CS22)|(1<<CS21)); Делители выключаем.
OCR2B = 1; Число для сравнения с счетчиком, пущай каждый такт прерывание фигачит
TIMSK2 |= (1 << OCIE2B); Разрешаем прерывание при совпадении
В коде функции прерывания, напишем немного кода, что бы посчитать время. И на мониторе порта посмотрим результат: 30 мкс... Сабака, так быстро тикает, что пропускает такты, или micros не успевает считать. Ок,.. поставим Счетчик подальше, OCR2B = 127 и... 15 мкс
Вывод: Без делителей, смысла использовать режим Сброса при совпадении - особо нет. Да и ШИМ перестает работать - нахер эту ерунду. Оставляем режим в "нормальном", вырубаем делители, и получаем и ШИМ и 16 мкс на круг. Всё, можно писать прошивку для Светомузыки с микросхемой анализатора.
Продолжение следует.... со скоростью китайско-русской почты. Жду посылку с микрухой.
Закончил на вопросе о том все таймеры прерываний у меня заняты, чтож мы не шиком лыты, будем думать.
Как работает ШИМ на ардуино? А очень просто:
Что бы это понять расскажу о таймерах и как оно устроено:
Таймер - это такая штука, которая тикает с определенным временным промежутком, который задается генератором частоты (или резонатором, хер его знает как это правильно назвать - нам это не важно), у Ардуины нано он составляет 16МГц, т.е. тикает 16 млн. раз в секунду.
Счетчик таймера - это такая своего рода переменная, которую таймер увеличивает на 1 с каждым тактом (тиком). Для каждого таймера свой счетчик, - таким образом имеем 3 счетчика и 3 таймера. Каждый счетчик имеет свою разрядность (то максимальное число, до которого можно досчитать). Счетчик таймера 0 может сосчитать от 0 до 255. Счетчик таймера 1 от 0 до 1023, Счетчик таймера 2 от 0 до 255.
Так же для каждого таймера есть две переменные для сравнения, называется она - а хер его знает как они правильно называются, назову их канал А и Б.
На практике оно обзывается так:
TCNT0, TCNT1, TCNT2 - Счетчики таймеров 0, 1, 2.
OCR0A, OCR0B, OCR1A, OCR1B, OCR2A, OCR2B - каналы А и Б для каждого счетчика таймера.
Когда счетчик досчитывает до максимального своего значения - он обнуляется.
Теперь о ШИМ:
Когда передаешь в функцию analogWtite значение ШИМ, то запускается такой вот механизм:
(Канал таймера выбирается кодом функции analogWtite)
На примере таймера 2

Допустим записываем в D3 значение 93 - analogWrite(3, 93), если посмотреть в код функции, то там можно увидеть что этому пину ШИМ соответствует Счетчик таймера 2, канал B.
Счетчик таймера 2 может считать до 255, что отображено на шкале. С каждым тактом таймера, счетчик TCNT2 увеличивает свое значение на 1, И до тех пор пока счетчик не досчитает до 93, на выходе D3 будет 5 вольт (вкл, высокий уровень). Как только счетчик досчитает до 93, то на выходе D3 будет 0 (выкл, низкий уровень). Досчитав до 255, счетчик обнулится, и все начинается сначала.
Аналогично с пином D11 - это Счетчик таймера 2, канал А.
Таким образом, как можно сделать задуманное не повредив работу ШИМ? Можно использовать прерывание, но никаких манипуляций со Счетчиками или каналами делать нельзя. Хорошо, попробуем:
В блоке setup поставим разрешение на прерывание
TIMSK2 |= (1 << OCIE2B);
, где:
TIMSK2 - Это Выбор Таймера 2, (выбор из : TIMSK0, TIMSK1, TIMSK2 - собсно таймеры)
OCIE2B - Прерывание по счетчику таймера 2 на канал В (Выбор из: OCIE0A,OCIE0B, OCIE1A, OCIE1B, OCIE2A, OCIE2B - Думаю объяснять не надо, что тут к чему относится).
А функция которая будет вызываться - это
ISR (TIMER2_COMPB_vect) {
... тут код
}
, где
ISR - это грубо говоря тип функций для прерываний, а в скобках описывается что за прерывание.
TIMER2 - Ну таймер 2,
COMPB - Сокращение от COMPARE B, сравнение с каналом В, Есть другие, читаем гугл.
Собственно если надо другое - меняем номер таймера или канала.
Теперь это выглядит так:

Да, оно работает, - прерывание вызывается, ШИМ работает. То есть имеем что то типа 2 потоков, один работает самостоятельно в цикле LOOP, второй на выбранном прерывании. правда есть две небольших особенности:
1. В цикле по прерыванию, НЕЛЬЗЯ просто так использовать задержки и вообще нагружать цикл чем-то тяжелым, Но например помигать светодиодом, или дернуть микруху стробом или считать значение - можно.
2. Это прерывание, в рамках таймингов микросхемы вызывается не так часто как хотелось бы, т.е. если померить промежуток времени между прерываниями, то получается что-то порядка 2 миллисекунд.... а тайминги микросхемы идут в микросекундах.
Итого, 1 особенность - мне не мешает, да и при умении, она легко обходится.
2 особенность связана с тем что помимо частоты работы есть еще так называемые делители частоты, которые используются в этих таймерах. - От этого и есть много интересных статей по увеличению частоты ШИМ и прочие радости. А значит решить эту проблемку можно подняв частоту ШИМ.
Почему я использую таймер 2, а не другие:
Во первых, он 8 разрядный, т.е. считает до 255, - т.е. прерывание будет вызываться чаще чем таймер 1, который считает до 1023.
Во вторых, Таймер 0 - он хоть и тоже 8 разрядный, но на нём работают помимо ШИМ еще функции delay, micros и тому подобные, а функция micros мне нужна. То есть, если я буду поднимать чатоту ШИМ на таймере 0, то функция micros и другие тоже начнут работать не корректно.
Итак имеем. Понятие как работает ШИМ, что такое Таймеры, счетчики и прерывания, Запустили дополнительный цикл параллельно основному, но пока медленный.
Можно конечно все рассказать в одном посте - но будет слишком много информации, поэтому разбиваю на несколько частей примерно по темам.
Далее я кратко расскажу что такое делители частоты, как ими пользоваться, и немного о режиме счетчика CLC (сброс при совпадении). Продолжение следует.
В прошлых частях я собрал устройство светомузыки для LPT. По факту это было устройство оптической развязки параллельного интерфейса от силовой нагрузки, назовём его УОРПИ. Да, при помощи его можно устроить светомузыку используя в качестве подачи сигнала LPT порт, а управление сигналом при помощи программы. В этой части я хочу поговорить о применении микроконтроллера для управления, а именно приём входного сигнала, разложение его на частоты и вывод в параллельный интерфейс УОРПИ.

Эта часть будет больше техническая и немного о программировании и решении вопросов в работе.
Итак, моё устройство должно уметь принимать входной сигнал и раскладывать его на частоты. Почитав гугл находим массу статей и прочего про библиотечку БПФ (Быстрое преобразование Фурье) и что с ней всё должно работать, НО тут же находим такую штуку как:
1. Это все довольно медлительно;
2. Не всегда корректно;
3. Написано на костылях;
4. Диапазон частот заканчивается на 5кГц.
Вывод - не вариант. Все должно быть идеально. Вариант второй,- используем анализатор спектра в виде микросхемы MSGEQ7, - она умеет раскладывать на 7 частот включая 16кГц, - этого мне выше крыши.
Вот как это выглядет

Таким образом, буду собирать с использованием микросхемы.
Значит чего я хочу: Аудио сигнал поступает на вход анализатора, и на вход Ардуины. С выхода анализатора результат поступает на вход Ардуины. Ардуино это дело обрабатывает и выдает по ШИМ на УОРПИ.
С анализатора снимаем 7 частот, из них выделяются Низкие, Средние, Высокие, Среднее значение всех частот. - Получаем каналы НЧ, СЧ, ВЧ, ППЧ.
Со входа ардуины снимаем громкость сигнала, получаем канал ППГ. И вычтя это значение из максимально возможного получаем канал ОПГ. Таким образом будет все 6 каналов СДУ.
Проштудировав в интернете мануалы по работе с данной микросхемой анализатора имеем код:

То есть всё это работает на пресловутых Delay? Далее сюда втюхиваем еще работу ППГ и ОПГ, и получаем кашу на delay'ях, то есть будем тормозить работу ардуины только для того что бы соблюсти тайминги микрухи? Да ну нахер...
Я хочу что бы циклы поучения результата, манипуляции с ними и вывод сигналов ШИМ работали как-то сами по себе, а тайминги микрухи и получение значений с них работали отдельно. Значит мне надо как минимум 2 потока. А вот ардуино это не умеет. Значит надо сделать так, что бы основной цикл работал сам по себе, а когда надо прочитать значение с анализатора и дернуть его стробом, то основной цикл прервался, - выполнилась работа с микрухой, и продолжил работать основной цикл. А это называется прерывание, а поскольку внешних каких-то событий не будет происходит, значит надо сделать прерывание по таймеру. В ардуине имеется аж 3 таймера!. Что же это за таймеры? Почитаем:
Таймер 0 - Отвечает за Delay, micros ... и ШИМ 5 и 6 пин.
Таймер 1 - ... ШИМ 9 и 10 пин.
Таймер 2 - ... ШИМ 3 и 11 пин.
Да что за нахер мне надо все 6 ШИМ каналов. Все таймеры заняты! а значит, либо я циклю все в loop'е и имею говнокод но с ШИМ, или я имею раздельное выполнение циклов, но БЕЗ ШИМ на одном пине.

Пост становится длинноват, поэтому продолжение следует...
Спойлер: вопрос я таки решил.
Собрали из кареток от двд-ромов макет для будущего чпу (понять как оно работает, и постараться вычислить максимум минусов в начале) не претендую на оригинальность.
С лёгкостью воспринимаю критику! А ещё лучше воспринимаю конструктивную критику.
В общем, использовано ардуино Уно+ плата расширения cnc v3.0 с драйверами шаговых двигателей (в комплекте 4шт, использовано пока что только 2.

Видно, что самого лазера ещё нет, его рукожопить начнем завтра. Изначально планируем все же попытаться заставить работать лазер от режущего ДВД. Если не получится, то Али наш лучший друг.
На данный момент двигателя работают и вроде бы вполне даже точно. Но уверен что ещё будет много донастройки доналадки.
А так все. Всем спасибо!
Если есть замечания, милости прошу в комментарии!

