SCratORS

SCratORS

пикабушник
пол: мужской
поставил 130 плюсов и 290 минусов
сообщества:
496 рейтинг 427 комментариев 23 поста 3 в "горячем"
-1

Сон

Белая черёмуха, яблони в цвету,
С белыми ромашками я к тебе иду.
Ты навстречу в платьице в беленький горох,
Прежняя девчонка из далёких снов.
Мы любовь когда-то не смогли сберечь.
Угасали чувства, как огарки свеч.
Думал я, что счастье лучше где-то есть,
Но найти другое, как пуд соли съесть.
Жизнь судьбой вертела, и неслись года.
Только в моём сердце ты была всегда.
Одиноким волком рыскал я, не жил.
О тебе мечтая, не любя, грешил.
В чудеса поверю, в магию примет:
К нам весна вернулась через столько лет!
Две судьбы- тропинки снова нас свели.
И белей ромашки в поле зацвели.
Под ветвями яблони, в аромате грёз
Глажу с прежним трепетом прядь твоих волос.
Боже, как же сильно я тебя люблю!
Щемит сердце болью: я ведь просто сплю!

от автора:
Что б душа не ныла по утрам от снов,
Берегите чувства, счастье и любовь!

Елена К.

С наступающим праздником, влюблённые!!!

P.S. Стих написала моя мама.
Вообще мама пишет в последнее время много стихов, и готовится 2 книги в продакшн.

41

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

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

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

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


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

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


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


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

Замена analogWrite на Arduino Nano. Массивы функций. Arduino Nano V3, Программирование, Шим, Массив функций, Длиннопост

Взять код можно на 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
25

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

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

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


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

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

Итак, котэ работает на 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(); после - каждый решает сам, от требований поставленной задачи.


Вот и всё.

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

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

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

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

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


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

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

Программный ШИМ на arduino NANO Arduino Nano V3, Шим, Программирование

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

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

Программный ШИМ на arduino NANO Arduino Nano V3, Шим, Программирование

Котэ работает на прерывании по таймеру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 значения). Вот и всё.

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

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

Светомузыка с Arduino. Сезон 2 Часть 3

Часть 1 https://pikabu.ru/story/svetomuzyika_s_arduino_sezon_2_chast...

Часть 2 https://pikabu.ru/story/svetomuzyika_s_arduino_sezon_2_chast...


Продолжаем ковырять прерывания и таймеры.

Поговорим о делителях частоты и зачем они нужны. Делители - тупо уменьшают системную частоту, зачем - да фиг его знает, но зачем то нужны. В прошлом посте я пришёл к тому, что цикл прерывания работает, и не мешают работе ШИМ, но вот чот не так быстро как хотелось бы. Напомню, что время между тактами составляло порядка 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 миллисекунды - слишком медленно,... будем выключать делители. Посмотрим как это делать: (картинка с видео)

Светомузыка с Arduino. Сезон 2 Часть 3 Arduino, Таймеры, Прерывания, Новичкам, Длиннопост

Как видим, какие-то мутные регистры, но ничего сложного:

Все настройки делаются в блоке 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 мкс.

Посмотрим как это делать:

Светомузыка с Arduino. Сезон 2 Часть 3 Arduino, Таймеры, Прерывания, Новичкам, Длиннопост

Видим, что надо задавать регистры 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 мкс на круг. Всё, можно писать прошивку для Светомузыки с  микросхемой анализатора.


Продолжение следует.... со скоростью китайско-русской почты. Жду посылку с микрухой.

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

Светомузыка с Arduino. Сезон 2 Часть 2

Часть 1 https://pikabu.ru/story/svetomuzyika_s_arduino_sezon_2_chast...

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

Как работает ШИМ на ардуино? А очень просто:

Что бы это понять расскажу о таймерах и как оно устроено:

Таймер - это такая штука, которая тикает с определенным временным промежутком, который задается генератором частоты (или резонатором, хер его знает как это правильно назвать - нам это не важно), у Ардуины нано он составляет 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

Светомузыка с Arduino. Сезон 2 Часть 2 Arduino, Таймеры, Прерывания, Новичкам, Длиннопост, ШИМ

Допустим записываем в 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, сравнение с каналом В, Есть другие, читаем гугл.

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

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

Светомузыка с Arduino. Сезон 2 Часть 2 Arduino, Таймеры, Прерывания, Новичкам, Длиннопост, ШИМ

Да, оно работает, - прерывание вызывается, ШИМ работает. То есть имеем что то типа 2 потоков, один работает самостоятельно в цикле LOOP, второй на выбранном прерывании. правда есть две небольших особенности:

1. В цикле по прерыванию, НЕЛЬЗЯ просто так использовать задержки и вообще нагружать цикл чем-то тяжелым, Но например помигать светодиодом, или дернуть микруху стробом или считать значение - можно.

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


Итого, 1 особенность - мне не мешает, да и при умении, она легко обходится.

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


Почему я использую таймер 2, а не другие:

Во первых, он 8 разрядный, т.е. считает до 255, - т.е. прерывание будет вызываться чаще чем таймер 1, который считает до 1023.

Во вторых, Таймер 0 - он хоть и тоже 8 разрядный, но на нём работают помимо ШИМ еще функции delay, micros и тому подобные, а функция micros мне нужна. То есть, если я буду поднимать чатоту ШИМ на таймере 0, то функция micros и другие тоже начнут работать не корректно.


Итак имеем. Понятие как работает ШИМ, что такое Таймеры, счетчики и прерывания, Запустили дополнительный цикл параллельно основному, но пока медленный.

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


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

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

Светомузыка с Arduino. Сезон 2 Часть 1

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

Светомузыка с Arduino. Сезон 2 Часть 1 Светомузыка, Arduino, Msgeq7, Своими руками, Длиннопост

Эта часть будет больше техническая и немного о программировании и решении вопросов в работе.

Итак, моё устройство должно уметь принимать входной сигнал и раскладывать его на частоты. Почитав гугл находим массу статей и прочего про библиотечку БПФ (Быстрое преобразование Фурье) и что с ней всё должно работать, НО тут же находим такую штуку как:

1. Это все довольно медлительно;

2. Не всегда корректно;

3. Написано на костылях;

4. Диапазон частот заканчивается на 5кГц.

Вывод - не вариант. Все должно быть идеально. Вариант второй,- используем анализатор спектра в виде микросхемы MSGEQ7, - она умеет раскладывать на 7 частот включая 16кГц, - этого мне выше крыши.

Вот как это выглядет

Светомузыка с Arduino. Сезон 2 Часть 1 Светомузыка, Arduino, Msgeq7, Своими руками, Длиннопост

Таким образом, буду собирать с использованием микросхемы.

Значит чего я хочу: Аудио сигнал поступает на вход анализатора, и на вход Ардуины. С выхода анализатора результат поступает на вход Ардуины. Ардуино это дело обрабатывает и выдает по ШИМ на УОРПИ.

С анализатора снимаем 7 частот, из них выделяются Низкие, Средние, Высокие, Среднее значение всех частот. - Получаем каналы НЧ, СЧ, ВЧ, ППЧ.

Со входа ардуины снимаем громкость сигнала, получаем канал ППГ. И вычтя это значение из максимально возможного получаем канал ОПГ. Таким образом будет все 6 каналов СДУ.

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

Светомузыка с Arduino. Сезон 2 Часть 1 Светомузыка, Arduino, Msgeq7, Своими руками, Длиннопост

То есть всё это работает на пресловутых Delay? Далее сюда втюхиваем еще работу ППГ и ОПГ, и получаем кашу на delay'ях, то есть будем тормозить работу ардуины только для того что бы соблюсти тайминги микрухи? Да ну нахер...

Я хочу что бы циклы поучения результата, манипуляции с ними и вывод сигналов ШИМ работали как-то сами по себе, а тайминги микрухи и получение значений с них работали отдельно. Значит мне надо как минимум 2 потока. А вот ардуино это не умеет. Значит надо сделать так, что бы основной цикл работал сам по себе, а когда надо прочитать значение с анализатора и дернуть его стробом, то основной цикл прервался, - выполнилась работа с микрухой, и продолжил работать основной цикл. А это называется прерывание, а поскольку внешних каких-то событий не будет происходит, значит надо сделать прерывание по таймеру. В ардуине имеется аж 3 таймера!. Что же это за таймеры? Почитаем:

http://arduino.ru/Tutorial/Arduino_Interrupts_part2

Таймер 0 - Отвечает за Delay, micros ... и ШИМ 5 и 6 пин.

Таймер 1 - ... ШИМ 9 и 10 пин.

Таймер 2 - ... ШИМ 3 и 11 пин.

Да что за нахер мне надо все 6 ШИМ каналов. Все таймеры заняты! а значит, либо я циклю все в loop'е и имею говнокод но с ШИМ, или я имею раздельное выполнение циклов, но БЕЗ ШИМ на одном пине.

Светомузыка с Arduino. Сезон 2 Часть 1 Светомузыка, Arduino, Msgeq7, Своими руками, Длиннопост

Пост становится длинноват, поэтому продолжение следует...

Спойлер: вопрос я таки решил.

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

Светомузыка через LPT порт. Часть 3.

Часть 1. https://pikabu.ru/story/svetomuzyika_cherez_lpt_port_chast_1...

Часть 2. https://pikabu.ru/story/svetomuzyika_cherez_lpt_port_chast_2...


После того, как была сделана, спаяна и проверена на работоспособность печатная плата были заказаны 2 разъема 4pin 250v, 1 разъем питания 250v (обычная 8-ка), и алюминиевый корпус.


Сразу отвечу на свой вопрос из 2 части - резисторы не находятся под нагрузкой, поэтому даже в SMD 1206 им вполне комфортно даже если лампы на 100ВТ поставить, и в целом ничего не греется.


Шло все это долго. Но в конце концов, устройство управления было собрано полностью:

Светомузыка через LPT порт. Часть 3. Светомузыка, LPT, Своими руками, Сделано в СССР, Цапонлак, Длиннопост
Светомузыка через LPT порт. Часть 3. Светомузыка, LPT, Своими руками, Сделано в СССР, Цапонлак, Длиннопост

И дальше начинаем искать или думать как сделать прожектора. Поиск результатов не дал от слова совсем. Ок, сделаем сами.

Итак, нам понадобится:

1. Светильник-прищепка 6 штук. Я взял ENERGY EN-DL24, из магазина на букву Аксон (пофиг вообще).

2. Старый убитый светильник типа цапля.

3. Провод 4*0,75 10 метров.

4. Лампы рефлекторные, желательно цветные. 6 штук.

5. Металлический уголок для крепления полок на стену. 4 штуки.

6. Металлическая решетка-гриль (от компа или блоков питания). 6 штук (не обязательно, но прикольно смотрится).


Начинаем собирать. Разбираем Светильники.

От прищепок нам нужно Плафон, патрон, крепление патрона к плафону.

От цапли - 4 металлические стойки.

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

В стойках от цапли, есть по отверстию с каждого края, дополняем еще отверстиями по центру.

В плафонах сверху над патроном в корпусе имеется 2 отверстия для крепления патрона, и 1 отверстие для выхода провода. Просовываем провод от патрона в центральное отверстие (выход провода) а через крайние отверстия крепим весь плафон на 2 металлические стойки от цапли. И таким образом крепим по 3 плафона на стойки. и на крайние прикручиваем уголок. Провода подключаем любым удобным способом.

Получается примерно так:

Светомузыка через LPT порт. Часть 3. Светомузыка, LPT, Своими руками, Сделано в СССР, Цапонлак, Длиннопост
Светомузыка через LPT порт. Часть 3. Светомузыка, LPT, Своими руками, Сделано в СССР, Цапонлак, Длиннопост

Делаем таким образом 2 прожектора.

Следующий этап - лампы. Найти цветные мне не удалось, решил красить. Чем красить? Цапонлаком, чо тут выдумывать. Идём в первый попавшийся магазин радиодеталей и покупаем лак. стоит он где-то 50 руб на 30 мл.

Я купил 4 цвета: Красный, Желтый, Зелёный, Синий.

Какая же это дрянь, скажу я вам. Что хочется отметить:

1. Производят его несколько контор. Почти все - барахло.

2. Смотрите на срок годности обязательно! Если вышел или на гране - Барахло.

3. Проверяйте цвет.


Фото (стырены из интернета) с описанием.

Светомузыка через LPT порт. Часть 3. Светомузыка, LPT, Своими руками, Сделано в СССР, Цапонлак, Длиннопост

Красная этикетка, с черным текстом (такое ощущение, что печатали лазерным принтером на цветной бумаге).

Отличный лак. Насыщенный цвет, глянцевый, блестящий.

Купил синий и красный. - Соответственно красный как на фото, а синий, точно также но напечатано на синей бумаге (не путать с похожим принтом синей краской на белой бумаге).

Синий - без претензий.

Красный... Ну да, он глянцевый, насыщенный, блестит при высыхании, НО он, цука, ПУРПУРНЫЙ, или MAGENTA как в струйных принтерах. Ну ладно, нам такой тоже нужен.

Пошёл искать красный...

Светомузыка через LPT порт. Часть 3. Светомузыка, LPT, Своими руками, Сделано в СССР, Цапонлак, Длиннопост

Жидкий, срок годности закончился 3 месяца как. и он ... ПРОЗРАЧНЫЙ,... нет, не так, он ВООБЩЕ КАК ВОДА прозрачный. - Вернули деньги.

Ладно, пофиг, идем дальше.

Зелёный:

Светомузыка через LPT порт. Часть 3. Светомузыка, LPT, Своими руками, Сделано в СССР, Цапонлак, Длиннопост

Полная хрень. Жидкий, пока не высох - вроде даже сочный, блестящий.

При высыхании, становится очень светлый, матовый, с какими-то вкраплениями и сам цвет - как бледная трава.

Нанеся 2 слой - появляются как какие-то сопли в матовом не равномерном покрытии. С 3 слоя - вообще все в кашу превращается.

Сохнет довольно быстро.

Ладно. Желтый.

Светомузыка через LPT порт. Часть 3. Светомузыка, LPT, Своими руками, Сделано в СССР, Цапонлак, Длиннопост

Очень бледный. После высыхания становится матовым и не сочным. Нанеся 7 слоёв - ну около дела, но матовый и не красивый.


Далее. Смешав Пурпурный с Желтым - Получился вполне красивый красный. И поскольку Пурпурный лак - вполне качественный, то и на выходе не испортился, Красный получился глянцевый, блестящий. Но наносить пришлось в 5 слоёв.


Далее. Смешав Зелёный и Синий - Получился вполне красивый голубой (морской волны). Аналогично красному. Синий лак просто отличный - на выходе получилось отлично. настолько насыщенно, что хватило 1 слоя.


Итого, результат:

Светомузыка через LPT порт. Часть 3. Светомузыка, LPT, Своими руками, Сделано в СССР, Цапонлак, Длиннопост
Светомузыка через LPT порт. Часть 3. Светомузыка, LPT, Своими руками, Сделано в СССР, Цапонлак, Длиннопост

Красный - 5 слоев, Отличный глянцевый.

Зеленый - 2 слоя, Матовый, грустный цвет с "соплями" в виде вкраплений.

Синий - 1 слой, Отличный глянцевый.

Голубой - 1 слой, Отличный глянцевый.

Желтый - 7 слоёв, Бледный, матовый.

Пурпурный - 3 слоя, Отличный глянцевый.


Решётки - загибаем ушки, и надеваем для красоты. Или на них можно закрепить светофильтры в будущем.


Видео работы, возможно будет, но не скоро. Работы еще ведутся.


Далее планируется:

Поскольку многие Материнки без распаянного LPT порта, - это вызывает проблемы, а имеено: Если на материнке есть гребенка под LPT - далеко не факт, что она будет работать! У меня не заработало. Поэтому, я заказал PCIe - LPT плату, посмотрим на неё, будет ли работать.


И из вкусного:

Разработка печатной платы устройства на Ардуино нано + микросхема MSGEQ7 для вывода ШИМ сигналов на разъём DB25 для подключения у данной СДУ.

З.Ы. Прошивку для ардуино нано я уже написал, и печатка уже разведена. Ждем Ардуину и микросхему для отлаживания с последующим заказом платы на производство.

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