Сообщество - Arduino & Pi

Arduino & Pi

1 493 поста 20 825 подписчиков

Популярные теги в сообществе:

Ищу "сосерверовцев"

Привет Пикабу. Мой первый пост поэтому прошу не пинать. Ищу людей кто хочет нанять в складчину сервер(Amazon, Azure etc) для своих проэктов. Я начинающий программист .Net, Java. Работаю embeeded разработчиком в Польше на процках очень малознакомой на наших просторах фирмы Renesas тыц(кому будет интересно о даных микроконтроллерах - пишите, работаю первый год  - но есть некоторые наработки) Также интересуюсь тематикой  Arduino, STM32, Raspberry. Хочу соарендовать сервер для своих проэктов - к примеру есть опыт отправки даных с ESP8266 в MS SQL Server 2016. Но хочется чтобы сервер крутился в облаке а не на домашнем пк..

67

OSMC (Kodi) IPTV Simple Client — настройка EDEM.TV

Вот ещё одно маленькая заметка по теме Проигрывателя на базе Raspberry Pi 3 модель B (ссылка последнюю часть:  часть 5).


Сегодня о настройке OSMC (Kodi) IPTV Simple Client для просмотра  телепередач EDEM.TV


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

/home/osmc/IPTV


Готовый файл настроек

/home/osmc/.kodi/userdata/addon_data/pvr.iptvsimple/settings.xml

<settings>

<setting id="epgCache" value="true" />

<setting id="epgPath" value="" />

<setting id="epgPathType" value="1" />

<setting id="epgTSOverride" value="true" />

<setting id="epgTimeShift" value="0.000000" />

<setting id="epgUrl" value="http://epg.it999.ru/edem.xml.gz" />

<setting id="logoBaseUrl" value="http://teleguide.info/download/new3/xmltv.xml.gz" />

<setting id="logoFromEpg" value="2" />

<setting id="logoPath" value="/home/osmc/IPTV/logo/" />

<setting id="logoPathType" value="0" />

<setting id="m3uCache" value="true" />

<setting id="m3uPath" value="/home/osmc/IPTV/edem_playlist.m3u8" />

<setting id="m3uPathType" value="0" />

<setting id="m3uUrl" value="" />

<setting id="sep1" value="" />

<setting id="sep2" value="" />

<setting id="sep3" value="" />

<setting id="startNum" value="1" />

</settings>


Исправление групп каналов

Источник.

В исходном файле формата m3u8 Playlist формат описания группы каналов не пригоден для использования в Kodi. Этот скрипт, написанный на Python решает эту проблему.


Действия по настройке:

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

edem_playlist.py

link = "https://####### PLAYLIST URL #######"


2. Для периодического обновления удобно создать задание для Cron:

0 */8 * * * (cd /home/osmc/IPTV; python edem_playlist.py)


Логотипы каналов

Источник.

Я только переупаковал логотипы в архивы формата tar.gz для удобства работы с ними в Linux (имена файлов должны быть в Unicode).


Подробное описание решения здесь.

Показать полностью
21

Использование часов реального времени на DS3231 в Raspberry Pi 3 под управлением OSMC в Debian 9 (Stretch)

Настройка часов реального времени на DS3231 в Raspberry Pi 3 под управлением OSMC в Debian 9 (Stretch), для проигрывателя на базе Raspberry Pi 3 модель B (часть 1, часть 2, часть 3, часть 4, часть 5).

Использование часов реального времени на DS3231 в Raspberry Pi 3 под управлением OSMC в Debian 9 (Stretch)

1. Добавить в файл /boot/config.txt строки:

dtparam=i2c_arm=on

dtoverlay=i2c-rtc,ds3231


2. Отключить fake-hwclock

systemctl disable fake-hwclock


3. Настроить синхронизацию часов системы с часами реального временем (RTC) при загрузке

добавить в конец файла /etc/rc.local строки:

echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

sleep 3

hwclock -s


Основная статья здесь.

Показать полностью
39

Замена analogWrite на Arduino Nano. Массивы функций.

Доброго времени суток!

Да, может уже надоело по ШИМ, но я хочу закончить этот ШИМ для себя и оставить немного полезностей.

В первой части программного ШИМа, уважаемый @Begemot911 подкинул одну занимательную статейку (если интересно - ссылку найдете там же), а именно про то, что analogWrite довольно медленный в силу своей универсальности, и для того что бы его ускорить, нужно просто ручками вписать в нужный таймер в нужный регистр сравнения значение скважности (в таймер, или подключить вывод нужного таймера, - не знаю как это правильно сказать). Да, это действительно ускоряет результат, но нужно знать какой таймер, какой регистр, какой бит порта, и пока analogWrite все это определит и получается задержка.


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

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


Спустя полчаса-час мучений и баданий с Arduino IDE, его компилятор сказал, что он понял чего я хочу, и скомпилировал код.


Что получилось на практике - Если записать сначала скважность хотя бы 1, то потом, записав 0 - на выходе все-равно есть сигнал.  Вообщем перед записью значений 0 и 255 надо бы еще и ШИМ выключить (в статейке про это сказано, что типа нефиг писать 0 и 255) - да, логично, но я чот подумал что если в порт на этот пин записать 0 или 1, то ШИМ сам отключится - *индейская народная изба*. Ладно, берем все необходимое, и пишем код:

Замена analogWrite на Arduino Nano. Массивы функций.

Взять код можно на github.com


Как работает котэ:

Дефайны - просто определяют cbi и sbi, ничего интересно, все это знают.

Есть 6 функций, каждая и которых отвечает за свой пин (3, 5, 6, 9, 10, 11), по порядку. Алгоритм функции таков: сначала порт переводится в режим OUTPUT, затем, если задаваемое значение скважности 0 или 255, то отключается режим ШИМ, и в порт пина записывается 0 или 1, иначе, включается ШИМ на нужное значение скважности. В общем и целом, вся логика сделана такая же как и у analogWrite, только без всех проверок и прочих определений, все только по факту.

Далее определяем массив из указателей на эти функции. Делается это так:


void ( * название_массива_функции[])(типы_условных_параметров) = {&название_функции_1, &название_функции_2 ... и т.д.}


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


Конечно же, если у вас не Nano, а что-то более жирное, то можно добавить свои функции


И получаем вот  такую удобную конструкцию.

Например надо на все пины ШИМ, подать какие-либо значения скважности


Определяем значения скважности в массив

byte valueMass[]={v1 ,v2, v3, v4, v5, v6};


и банальным FORэм передаем все значения в функции

for(byte i=0;i<6;i++) analogFastWrite[i](valueMass[i]);


Вот и всё!


Я думаю что существует способ обойтись без FOR и передать значения как-то напрямик, но я пока не нашёл как. Если кто знает, напишите в комментариях, очень требуется.

Наверняка кому-нибудь пригодится, если не вариация замены analogWrite, то пример как сделать массив из указателей на функции в Arduino IDE.

Показать полностью 1
172

Эпопея про NAS или как я к своему файловому хранилищу шел

Долгая история о том как я собственное файловое хранилище долго хотел и как к нему докатился

Для тех кому неохота/неинтересно/лень читать весь квест - сразу спойлерну ссылкой на описание устройства, которое и стало результатом моих изысканий.

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

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

С появлением неттопов руки зачесали вновь. Был куплен таковой, на атоме, для родителей, в качестве замены десктопа, безнадежно устаревающего своей начинкой миди-тауэра. Однако освободившееся железо повергало в уныние своими размерами и отсутствием SATA вкупе с горячим Бартоном. Хотя со сменой работы идея покупки готового NAS выглядела уже не совсем финансово неразумной. А помешала (или выручила) командировка на много месяцев. И идея опять утонула в других заботах. Зато потом был куплен приличный роутер c USB, на котором и Samba и miniDLNA и Transmission успешно работали с внешним хардом.

Только не радовала 100%-ная загрузка процессора роутера при закачке (ниже приложено окошко жуя для Transmission, чтоб для наглядности было видно загрузку сетевого интерфейса):

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

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

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

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

И опять идея осталась без воплощения…

Хотя нет – роутер то продолжал трудится на все 100.

А тут и NanoPi NEO выкатили с красивым домиком для жесткого диска:

Красивая коробочка, хочу такую же!

Но сначала - почитать, проверить характеристики, а то на офсайте просто и скромно: USB хост.
Зато на линукс-санкси нашлось что хост этот у Нео – 2.0! А в красивой коробочке - мост SATA–USB3.0. Ну как так то?!

Ёптель! Шёл, шёл…
И Neo2 туда же. Хорошо хоть сетка не так как на малине организована…

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

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

И в поле зрения появляется еще одна заманчивая картинка:

Пусть плата голенькая, зато то что надо!

Ищем что тут у нас и кто… Orange Pi Plus2… AllWinner H3… Уже где-то встречали. Ага у Нио такой же.

Стоп, а откуда ж тогда сата тут? На офсайте ничего, зато на других картинках удается рассмотреть GL830 USB2.0 to SATA мостик. Как жалуются довольно хилый, например  кажется тут народ пишет что ну нефонтан совсем. На NEO/NEO2 мостик то получше будет.
Какое-то прям надувательство от производителей.

Кто же тогда спасет сердце моего роутера от каторжного труда?

Неужели и некому, кроме товарища Интела с его Нюком или господина QNAP и иже с ними…

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

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

Кстати в том же топике, да и на форуме в целом, довольно много нареканий на стабильность работы связки "одноплатник - юсб разъём – юсб кабель – микроюсб разъём – юсб/сата мост – жесткий диск". Суть их в том, что «электромеханическое» качество разъёмов и кабелей является основным источником перебоев в работе системы. Поэтому решения типа такого как в обзоре - предпочтительный вариант для файлового хранилища в случае отсутствия нативного SATA, потому как кабель с сопутствующими разъёмами просто исключены (а зато еще и минимальная длина проводников опять-таки).

Но вернемся к нашим баранам, а именно к плате Odroid HC1:

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

• SoC Exynos5422, ARM Cortex-A15 @ 2GHz, ARM Cortex-A7 @ 1.4GHz

• GPU Mali-T628 MP6

• 2GB RAM LPDDR3

• Gigabit Ethernet

• Разъем microSD (до 128GB)

• SATA интерфейс через JMicron JMS578

• USB 2.0 Host x1

• Разъем для подключения батареи резервного питания для RTC

• Последовательный порт для отладки

• Светодиодная индикация активности

• Питание: 5V4A (через разъем 5.5 х 2.1mm).

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

Опять таки это для ССД. Но система на Интеле будет кушать наверняка больше, да и спецНАС тоже.

А еще изобретатели этого одноплатника утверждают что винт и сеть подключаются через USB3.0. А это же намного лучше чем 2.0 у одноклассников (фулл дуплекс, все дела…):

В общем и в целом меня всё устраивает, надо брать.

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

Комментировать не стану, у каждого своё видение бюджетности.

Для сравнения - комплект NAS Kit&NanoPi Neo2 с блоком питания будет стоить в районе 45 баксов в зависимости от опций и без доставки.

Пока посылка в пути изучаю что и как можно установить на этот Одроид (ибо моя работа уже давно в совсем другой сфере и актуальность познаний в плане софта осталась на прошлой работе) и оказывается что есть готовое решение - OpenMediaVault. Надстройка на Дебиан, точнее готовый образ для этой платы на Armbian, хотя можно и «from scratch» при желании. Ну значит будет apt-get.

Будущий NAS приехал, сборка не представляет сложности, только вот пластиковая крышка, состоящая из двух половинок, выглядит довольно дешевенько:

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

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

На цифру 5 на фото внимание не обращать, фото из нитернетов, а я не додумался еще и шайбочку заснять.

Про вторую доработочку будет позже.

Винчестер был позаимствован от внешнего ЮСБ-кармана, купленного лет 7 назад и у которого развалился корпус, не выдержав тягот дальних командировок.

Установка оси, и её конфигурирование тоже сложностей не вызывает, благо есть ODROID Wiki, на которой на доступном английском все пошагово расписано. Да и на русском языке найти подробный гайд, думаю возможно. Хотя несколько мелких нюансов при настройке все-таки выплыло. Нубских нюансов, чего уж там. Во-первых, на вкладке общих настроек в вэб-морде нужно сразу отключить автовыход, по умолчанию он всего через 5 минут, хотя если следовать инструкции на вики, то там есть это, но надо ж дочитать еще. А во-вторых для доступа рута через SSH нужно его сначала включить в вэб-интерфейсе на соответствующей вкладке. И в-третьих при попытке обновить систему с помощью вэб-морды или разными командами через консоль выпадают ошибки с сообщенями о многократно повторяющихся параметрах в конфигах. От танцев и гугла спасла кнопочка сброса на панели управления настройками обновления. В общем систему обновил, диск сконфигурировал, настроил нужные сервисы, права прописал. И новый обитатель квартиры отправился на место работы, а именно был водружен на “крышу” шкафа в прихожей, поближе к роутеру, к которому и подключается гигабитным заводским патчкордом, который таки дождался этого своего звездного часа.

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

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

Стало намного лучше, можно спать спокойно.

Однако спать не хотелось, да и рано еще, поэтому были проведены нехитрые тесты производительности Самбы програмулиной “как у них” и другой, более популярной у нас.

Напрямую соединив патчкордом с ноутом:

Через роутер между НАС-ом и ноутом, который подключен к роутеру вторым давно-самодельным кабелем:

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

На результаты тестирования Helios LanTest ощутимое влияние оказывает выбор конфигурации сети в настройках, поэтому настройки выбрал как в обзоре. Разбираться с КристалДиском не стал, поскольку эти тесты интересны были для сравнения с “эталоном” на сайте разработчиков Одроида. Значит и ориентироваться буду на результаты Хелиоса. Они конечно не дотягивают до рекламных показателей , но можно считать их удовлетворительными, помня что рекламные скорости были получены на ССД-диске, а мой то уже и староват.

Ну и график который порадовал – нагрузка на процессор роутера при работе торрента на Одроиде:

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

Собственно цель поражена.

Торренты качаются, фильмы стримятся, доступ к файлам по Самбе имеется.

Вот тут нашлось сравнительное тестирование третьей малины и первого Нио в сравнении с Синелоджи:

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

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

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

А еще для меня неприятным открытием стало откровенное лукавство производителей одноплатников в описании характеристик своих устройств.

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

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

Показать полностью 16
26

Программный ШИМ на arduino NANO часть 2. Самоубийство

Доброго всем времени суток!

В связи с оглушительным успехом первой части аппаратного ШИМа, я решил, что не стоит останавливаться, и хочу поделиться еще одним вариантом реализации данного действа, но чуть более издевательского. А читая комментарии к первой части, я сделал для вывод, что не стоит пытаться реализовать код универсально, кому надо - тот сам все сделает под свои цели. Ну что же, так и поступим.


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

Программный ШИМ на arduino NANO часть 2. Самоубийство

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


Пройдемся по алгоритму:


Допустим, хотим ШИМ на D13, смотрим табличку вначале... D13 - это первая таблица, она относится к PORTB и регистр настроек DDRB, В самой верхней шапке - управляющие биты, ПИНу D13 соответствует байт 32 (если так можно сказать), разложив его в бинарный код, будет 00100000 , это 6 бит,.. но нам надо записать в переменную bit число 32.


Далее, прописываем нужные порты и регистры.. т.е. в блоке setup - DDRB и в прерываниях таймеров прописываем порты PORTB.

Соответственно, если порты и регистры будут не B, а например на аналоговых пинах - это С, то пишем вместо DDRB - DDRC, вместо PORTB - PORTC.

Для более простой настройки, конечно же можно это все переопределить в define.


Для установления значения скважности, нужно значение скважности записать в регистр сравнения, в данном примере используется таймер 2, канал B, значит записываем OCR2B = 0-255. Максимально 255, т.к. таймер 2 - 8 битный. Нужно ли вызывать перед записью значений запрет прерываний cli(); и их разрешение sei(); после - каждый решает сам, от требований поставленной задачи.


Вот и всё.

Показать полностью 1
161

Колесный робот на Arduino

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

Каждое колесо приводится в движение редуктором с мотором.

Для управления колесным роботом используется Ардуино Мега.

Существуют три режима работы робота: радиоуправление, самостоятельное движение и откат по памяти назад.

Используемые датчики: ультразвуковые, инфракрасные.

Для индикации текущего режима работы используется полноцветный LED. В режиме радиоуправления светодиод мигает, при самостоятельном режиме - светится постоянно, синий цвет - откат по памяти.

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

Состав пульта: Ардуино Нано, джойстик, передатчик 433МГц, клавиатура на 5 кнопок.


Видео испытаний инфракрасных датчиков:  https://youtu.be/F4poZUIt5Mc

Видео испытаний ультразвуковых датчиков: https://youtu.be/s-vzDc4BbiA

Видео поворотов: https://youtu.be/dissl3xMw9Y


По части программирования Arduino:


KemaUS - класс для работы с ультразвуковыми датчиками. При расстоянии до препятствия более 30см робот движется вперед, сигнал на LED индикаторе зеленый. При расстоянии 15 - 30 см - он останавливается, LED индикатор желтый. При приближении препятствия менее чем на 15 см - робот едет назад, LED индикатор красный.


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


KemaState - класс для сохранения состояния робота. В него записываются показания датчиков, скорость и поворот, если есть. В скетче для Ардуино Меги используются две переменные этого класса: текущее и предыдущее состояния. Также используется в классе KemaMem.


KemaDrive - класс для управления моторами. Скорость отрицательная - назад, положительная - вперед. Отрицательный поворот - влево, положительный - вправо.


KemaLED - класс для управления полноцветным LED индикатором. Мигание означает режим радиоуправления, постоянный свет - режим робота. При этом могут гореть три цвета:

зеленый - робот едет вперед (нет препятствий);

желтый - робот стоит;

красный - робот едет назад.

Синий индикатор - откат по памяти.


Чертежи, схемы, классы Arduino в моей группе по робототехнике: https://vk.com/myrobotics

Показать полностью 4
95

Программный ШИМ на arduino NANO

Приветствую всех!

Сегодня я хочу затронуть тему реализации программного ШИМ на Ардуино НАНО.

Бывают такие моменты, что надо ШИМ там где его нет, например на Аналоговых пинах.. почему нет?


Что такое ШИМ я затрагивал ТУТ, Напомню в краце: ШИМ - это отношение высокого и низкого сигнала за какой-либо период, который называется частотой ШИМ.

Картинка из интернетов:

И вот понадобилось мне сделать ШИМ там, где его нет в Ардуине.

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

Котэ работает на прерывании по таймеру2, так как на нем висит Аппаратный ШИМ пинов 3 и 11, то никаких критичных "базовых" функций этим не испортим.

Значит в блоке setup просто переводим таймер в режим работы по CLK, т.е. 16 мГц, и разрешаем прерывание по таймеру.

Для включения ШИМ на каком-либо пину делаем так: в массиве пинов пишем пины какие надо, через запятую,.. ну там {13, A0, A7, 5} и тд...

Затем в Массиве значений ШИМ записываем им всем начальное значение, лучше нули, ... т.е. {0, 0, 0, 0} - 4 Пина юзаем, 4 значения записали,.. хотя наверное можно вообще не писать, они и так при инициализации нулями будут..

Ну а дальше в цикле программы, когда нужно записываем в переменную нужное значение, т.е. надо на пин A0 подать 50%, - пишем PWM_pins[1] = 127; обьясняю: в 1 ячейке массива пинов записан A0,.. 127 - это половина от 255 (0-255 значения). Вот и всё.

Надеюсь кому поможет.

Показать полностью 2
Отличная работа, все прочитано!