Заливаем шары к празднику

lilik
Offline
Зарегистрирован: 19.10.2017

Забыл, вот второй файл - скетч из 2 частей.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

lilik пишет:

Интересное явление, явно неземного происхождения мне приходиться наблюдать.

Так намедни ж полнолуние было, а в такое время и не то случается.

MaksVV
Offline
Зарегистрирован: 06.08.2015

ЕвгенийП пишет:

lilik пишет:

Интересное явление, явно неземного происхождения мне приходиться наблюдать.

Так намедни ж полнолуние было, а в такое время и не то случается.


Особенно при том, что шары все залиты)

lilik
Offline
Зарегистрирован: 19.10.2017

Явление осталось необъяснимым. Заменил на УНО, всё работает как надо, значит в платке дело.

 

lilik
Offline
Зарегистрирован: 19.10.2017

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

sadman41
Offline
Зарегистрирован: 19.10.2016

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

Можно запытать фастлед в SPI mode.

lilik
Offline
Зарегистрирован: 19.10.2017

sadman41 пишет:
А так да - битстрим блокирует прерывания.

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

http://arduino.ru/forum/programmirovanie/upravlenie-pikselnoi-svetodiodn...

Пробовал под неопиксель - не работает. Тогда сделал грубо, добавил между УНО и ИК приёмником "шибанутую про мини 168". Такой вариант работает, то есть вместо блютуз модуля подключаем по ТХ, RX ещё один МК и в него простенький скетч.

01/////////////////////////// тест с дистанционным управлением через ИК пульт на про мини 168
02#include "IRremote.h"
03int RECV_PIN = 2;        //Пин подключения выходного сигнала с ИК-приёмника
04//Создаём экземпляр класса IRrecv, в качестве параметра передаём пин подключения сигнала ИК-приёмника
05IRrecv irrecv(RECV_PIN); 
06decode_results results;   //Переменная для сохранения полученного кода нажатой кнопки
07void setup()
08{
09 Serial.begin(115200);
10 irrecv.enableIRIn(); //Включение ИК-приёмника в работу
11///////////////////////////////////
12}
13void loop()
14{
15if (irrecv.decode(&results)) //Если произошло событие/кнопка была нажата
16  {
17    switch ( results.value )
18    {
19    case 0x830CF://кнопка 0
20      Serial.print("0\n");
21        break;
22    case 0x8C03F://кнопка 1
23      Serial.print("1\n");
24        break;
25    case 0x820DF://кнопка 2
26      Serial.print("2\n");
27        break;
28    case 0x8A05F://кнопка 3
29      Serial.print("3\n");
30        break;
31    case 0x8609F://кнопка 4
32     Serial.print("4\n");
33        break;
34    case 0x8E01F://кнопка 5
35      Serial.print("5\n");
36        break;
37    case 0x810EF://кнопка 6
38     Serial.print("6\n");
39        break;
40    case 0x8906F://кнопка 7
41      Serial.print("7\n");
42        break;
43   case 0x850AF://кнопка 8
44      Serial.print("8\n");
45        break;
46   case 0x8D02F://кнопка 9
47     Serial.print("9\n");
48        break;
49   case 0x8C837://кнопка OK
50     Serial.print("10\n");
51        break;             
52    }
53    irrecv.resume();//Считываем следующую значение/кнопку
54   }  
55}

 

lilik
Offline
Зарегистрирован: 19.10.2017

Фишка в том, что на УНО скетч под блютуз менять совсем не надо - можно выбирать хочешь блютуз модуль, хочешь ИК модуль на про мини, хочешь сразу оба подключаешь. Правда надо 2 развязывающих диода и резистор тогда. Но тогда гирлянда управляется с телефона, ПК, самодельного пульта, ИК пульта от чего нибудь и перепрошивается по воздуху.

sadman41
Offline
Зарегистрирован: 19.10.2016

У меня несколько лет был самопальный ящик на 328м МК с фастледом и ИК. Все заработало сразу, но реактивность сохраняется только до определённого FPS. Потом уже пропуски кнопок идут и пр.

resume() нужно сразу делать, не громоздить в свичах println. Выставил по кнопке номер эффекта в переменную, зарезюмировал и пошёл фонарики в неблокирующем стиле крутить.

lilik
Offline
Зарегистрирован: 19.10.2017

https://github.com/Arduino-IRremote/Arduino-IRremote

Это страничка библиотеки. Нашёл на ней вопрос конкретный и ответ конкретный. Нифига не работает (решил ещё раз проверить). Может конечно я не понял ответ.

1IR не работает правильно, когда я использую Neopixels (также известный как WS2811 / WS2812 / WS2812B) или другие библиотеки, блокирующие прерывания на более длительное время (> 50 мкс).
2Независимо от того, используете ли вы Adafruit Neopixel lib или FastLED, прерывания отключаются на многих младших процессорах, таких как базовый Arduinos, на время более 50 мкс. В свою очередь, это останавливает выполнение обработчика прерывания IR, когда это необходимо.
3Вы можете попытаться подождать, пока ИК-приемник будет бездействовать, прежде чем отправлять данные Neopixel с помощью if (IrReceiver.isIdle()) { strip.show();}. Это предотвращает, по крайней мере, прерывание работающей ИК-передачи и, в зависимости от частоты обновления Neopixel, может работать достаточно хорошо.

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

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Опять println() до resume().

Где-то у меня набор ресивера-пульт валялся, найду попробую.

lilik
Offline
Зарегистрирован: 19.10.2017

Целый день глумления над платами и итог.

 

lilik
Offline
Зарегистрирован: 19.10.2017

Секрет открылся при прочтении темы:

https://mysku.ru/blog/aliexpress/68990.html

Среди описаний бесчисленных победных модернизаций изделия от Гайвера проскочила строка, что авторы библиотеки "ирремото" взяли и испортили её, исключив корректную работу с умными светодиодами. Благо у автора осталась старая версия.

Про мини 168 так и не заработала корректно (два эффекта не хочет воспроизводить), видимо ресурс ограничен (95 процентов использует скетч для неё и 62 по ОЗУ). Поэтому 328.

Чёт авторы библиотеки мудрят.

lilik
Offline
Зарегистрирован: 19.10.2017

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

MaksVV
Offline
Зарегистрирован: 06.08.2015

А питание все равно по проводам? Имхо таже гирлянда

lilik
Offline
Зарегистрирован: 19.10.2017

MaksVV пишет:

А питание все равно по проводам? 

Нет, внутри шара аккумулятор б/у на 800 мА. Схема потребляет (по микроамперметру, в разрыв плюса) - шар не светит 14 мА, ярко вспыхивает (в одном эффекте) 55 мА. Теоретически, на ёлке "должон мигаться"  сутки без подзарядки :-)  

lilik
Offline
Зарегистрирован: 19.10.2017

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

lilik
Offline
Зарегистрирован: 19.10.2017

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

 

01#include <IRremote.h>
02int RECV_PIN = 11;                // Pin, an den der Empf�nger angeschlossen ist
03IRrecv irrecv(RECV_PIN);         // Instanz der Receiver-Klasse
04decode_results results;          // Zur Aufnahme des ermittelsten Codes
05 
06void setup() {
07   Serial.begin(9600);
08   irrecv.enableIRIn(); // Startet den Receiver
09   
10}
11 
12// Gibt die Code-Sequenz auf der seriellen Schnittstelle aus
13void printCode(decode_results *results) {
14   int codeLen = results->rawlen - 1; // The length of the code
15  for (int i = 1; i <= codeLen; i++) {
16      unsigned int rawCode;
17      if (i % 2) {
18        // Mark
19         rawCode = results->rawbuf[i] * USECPERTICK - MARK_EXCESS;
20 
21      }
22      else {
23        // Space
24         rawCode = results->rawbuf[i] * USECPERTICK + MARK_EXCESS;
25 
26      }
27      if (i > 1)
28         Serial.print(",");
29   Serial.print(rawCode, DEC);
30   }
31   Serial.println("");
32}
33 
34 
35void loop() {
36   if (irrecv.decode(&results)) {
37       printCode(&results);// вывод кода кнопки в "сигнатуре"
38      Serial.println(results.value, HEX);//код кнопки в привычном нам виде
39      irrecv.resume(); // resume receiver
40      
41   }
42}

У меня для пульта получилось так:

013250,650,1000,750,1000,750,1000,1350,500,1350,500,1400,500,750,1000,750,1000,750,1000,1350,450
029F4FDCF9
033250,1300,450,800,1000,750,1000,750,1000,1350,450,1400,500,750,1000,800,900,850,900,1400,500
049E614B1D
053250,700,950,1350,500,750,1000,1400,450,1350,500,1400,450,800,1000,1350,500,750,1000,1350,450
069E1C511
073250,1300,450,800,1000,750,1000,750,1000,1400,400,1400,500,750,1000,800,950,800,950,1350,500
089E614B1D
093250,1300,500,750,1000,1400,400,850,950,1400,450,1400,450,800,950,1400,450,800,950,1400,450
109472DE25
113250,1300,450,800,1000,750,1000,750,1000,1350,450,1400,500,750,950,850,900,850,900,1400,500
129E614B1D
133250,650,1050,1350,500,1350,550,700,1050,1350,500,1350,550,750,950,1400,500,750,1000,1350,500
146567AC1
153250,1350,400,850,950,800,950,800,950,1400,450,1400,450,800,950,850,900,850,900,1400,500
169E614B1D

В длинных строчках записаны 0 и 1 (как я понял из визуального анализа), их  10 штук с каждой кнопки (10 бит данных). В коротких строчках код кнопки. Есть ли связь между этими данными?, и какая? Просто на других пультах длинные строчки не менялись, а коды кнопок (для каждой) могли быть разные (связь неустойчивая видимо - данные терялись :-). Только вот какие и почему?

sadman41
Offline
Зарегистрирован: 19.10.2016

Конечно есть связь. См. например: https://techdocs.altium.com/display/FPGA/NEC+Infrared+Transmission+Protocol