Problem z ws2812 oraz IR

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
ODPOWIEDZ
kozalec
Młodszy majsterkowicz
Posty: 5
Rejestracja: 1 gru 2017, 19:02

Problem z ws2812 oraz IR

Post autor: kozalec » 17 gru 2017, 12:25

Witam
Amatorsko bawie się arduino i postanowiłem wykorzystać coś w praktyce bo same montowanie i rozmontowywanie przykładów troszkę mi się znudziło. Postanowiłem zrobić sobie podświetlana szafkę RTV ledami ale żeby było trudniej i ciekawiej zastosowałem diody ws2812 oraz układ msgeq7 do mrugania w rytm muzyki czujnik ruchu do podświetlania w nocy oraz sterowanie za pomocą odbiornika podczerwieni.
O ile wszystko zaczyna ładnie działać to mam problem z działaniem IR oraz WS2818 na raz? Umieszcza okrojony przykład z którym mam problem. chodzi o linijkę kodu na końcu "dol.show(); //błąd" gdy ona jest to działa pasek led nie działa pilot? gdy jej niema pilot działa ale pasek LED nie.
Nie mam pojęcia jak to naprawić czy to wina jakiejś kłótni w bibliotekach ? naprawdę brakuje mi pomysłu
Prosze o pomoc



Kod: Zaznacz cały

#include <IRremote.h>
#include <Adafruit_NeoPixel.h>
#define irPin 7
int LED_D = 12;
IRrecv irrecv(irPin);
decode_results results;
Adafruit_NeoPixel dol = Adafruit_NeoPixel(38, LED_D, NEO_GRB + NEO_KHZ800);
 
void setup() {
   Serial.begin(115200);
   irrecv.enableIRIn();
    dol.begin();
    dol.show();
}

void loop() {

  dol.clear();
   if (irrecv.decode(&results)) {
 
      switch (results.value) {
         case 0xD00E1EC:
            Serial.println("w lewo");
            break;
 
         case 0xD00A1AC:
            Serial.println("w gore");
            break;
 
         case 0xD00111C:
            Serial.println("w prawo");
            break;
 
         case 0xD00616C:
            Serial.println("w dol");
            break;
 
         case 0xD00414C:   // enter
            Serial.println("srodek");
            break;
            
            case 0xD00D9D4:   //top menu
            Serial.println("lewa gora");
            break;

            case 0xD00010C:   //menu
            Serial.println("prawa gora");
            break;

            case 0xD004944:  ////display
            Serial.println("lewy dol");
            break;

            case 0xD00818C:  //return
            Serial.println("prawy dol");
            break;
         }
 
   irrecv.resume();
   }

       for (int a=0 ; a<36 ; a++)
        {
          dol.setPixelColor(a, dol.Color(0, 0, 100));
      
        } 
        
   dol.show(); //błąd
}
pierwszy działający kod na mrugający w rytm muzyki :)
chciałem wkleić link ale nie mogę jeszcze? wrzuciłem załącznik z zdjęciem
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


Awatar użytkownika
ethanak
Złota rączka
Posty: 761
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: Problem z ws2812 oraz IR

Post autor: ethanak » 17 gru 2017, 14:06

Po prostu: metoda show() blokuje przerwania, a odbiornik IR potrzebuje przerwań do prawidłowego działania. Daj w loop() po dol.show()

Kod: Zaznacz cały

   irrecv.enableIRIn();
Może pomoże... jeśli nie to spróbujemy czegoś innego.
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
kozalec
Młodszy majsterkowicz
Posty: 5
Rejestracja: 1 gru 2017, 19:02

Re: Problem z ws2812 oraz IR

Post autor: kozalec » 17 gru 2017, 16:39

niestety dalej nic

Kod: Zaznacz cały

dol.show(); //błąd
   irrecv.enableIRIn();
Awatar użytkownika
ethanak
Złota rączka
Posty: 761
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: Problem z ws2812 oraz IR

Post autor: ethanak » 18 gru 2017, 13:33

Nie wiem czy coś takiego pomoże... w moim programie mam coś takiego (w uproszczeniu oczywiście):

Kod: Zaznacz cały

bool resumeIR=false;
uint32_t last_led_tick;

void loop()
{
  if (irrecv.decode(&ired)) {
      przyjmij_polecenie();
      resumeIR=true;
  }
  if (millis() - last_led_tick >= 15) {
        zmiana_i_wyslanie_led();
        last_led_tick = millis();
   }
   if (resumeIR) {
        irrecv.resume();
        resumeIR=false;
    }
}
Jakoś mi to działa...
Funkcja przyjmij_polecenie po prostu obrabia dane z pilota. Funkcja zmiana_i_wyslanie_led ustawia kolorki i wywołuje show().
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
elvis
Młodszy majsterkowicz
Posty: 3
Rejestracja: 17 gru 2017, 12:30

Re: Problem z ws2812 oraz IR

Post autor: elvis » 18 gru 2017, 16:00

Niestety biblioteka Adafruit_NeoPixel to nic dobrego. Fragment komentarza z jej kodu:

Kod: Zaznacz cały

 // In order to make this code runtime-configurable to work with any pin,
  // SBI/CBI instructions are eschewed in favor of full PORT writes via the
  // OUT or ST instructions.  It relies on two facts: that peripheral
  // functions (such as PWM) take precedence on output pins, so our PORT-
  // wide writes won't interfere, and that interrupts are globally disabled
  // while data is being issued to the LEDs, so no other code will be
  // accessing the PORT.  The code takes an initial 'snapshot' of the PORT
  // state, computes 'pin high' and 'pin low' values, and writes these back
  // to the PORT register as needed.
Blokowanie przerwań to zły pomysł, a już na dłużej i co chwilę to przepis na katastrofę.
Może łatwiej będzie napisać własne sterowanie dla ws2812? To bardzo prosty rejestr przesuwny.
Awatar użytkownika
ethanak
Złota rączka
Posty: 761
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: Problem z ws2812 oraz IR

Post autor: ethanak » 18 gru 2017, 16:15

To nie jest bardzo prosty rejestr przesuwny, bo ledy wymagają bardzo precyzyjnych czasów rzędu mikrosekund, i dlatego przerwania są wyłączane.
Rozwiązaniem może być sterowanie led przez dma (w atmedze nie występuje) lub uart (pewnie dałoby się zrobić).
Osobiście używam esp8266 i dedykowanej biblioteki (dma). Tak że polecałbym przejście choćby na nodemcu (jeśli komuś goły esp nie odpowiada). Programuje się to zacnie w Arduino IDE, a możluwości dużo większe przy tej samej (lub nawet nieco niższej) cenie.
Ewentualnie - jeśli ktoš po za atmegami świata nue widzi - zastosowanie oddzielnego pro mini jako drivera led.
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
elvis
Młodszy majsterkowicz
Posty: 3
Rejestracja: 17 gru 2017, 12:30

Re: Problem z ws2812 oraz IR

Post autor: elvis » 18 gru 2017, 16:22

Też doczytałem i faktycznie, aż tak prosto nie jest :) Nie wiem dlaczego ale byłem przekonany że ws2812 ma komunikację synchroniczną. Jak chodzi o problem z tego wątku - to komunikacja zajmuj coś koło 1ms, a to całkiem sporo jak na wyłączanie przerwań. Natomiast najgorsze w programie jest wysyłanie danych w każdym obiegu pętli. Dlatego nic nie działa - gdyby komunikację z ws2812 robić co jakiś czas byłaby chociaż szansa na obsługę innych modułów. Ale to i tak raczej nie będzie działało idealnie.
Proponuję jak napisał ethanak pomyśleć nad użyciem modułów sprzętowych. Tylko bez DMA to raczej nie ma sensu. Więc chyba najlepiej pomyśleć nad innym mikrokontrolerem.
kozalec
Młodszy majsterkowicz
Posty: 5
Rejestracja: 1 gru 2017, 19:02

Re: Problem z ws2812 oraz IR

Post autor: kozalec » 18 gru 2017, 19:08

czyli jak rozumiem do obsługi IR jedna atmega a do obsługi LED druga atmega
Tez mi to przeleciało przez głowę ale z uwagi na moje doświadczenie myślałem ze to jakaś drobnostka do dopisania w kodzie wiec zapytałem. W załączniku moje wypociny z pod lutownicy :) będzie trzeba coś przerabiać, a i tak kurczy się pamiec na moje zabawy z ledami może zmienię na MEGA. Dodatkowo dodam ze układy MSGEQ7 Chińczycy sprzedają strasznie uwalone.

Dziękuję za pomoc
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Awatar użytkownika
Marhef
Złota rączka
Posty: 1140
Rejestracja: 18 lis 2011, 02:18

Re: Problem z ws2812 oraz IR

Post autor: Marhef » 18 gru 2017, 19:37

Pooglądaj sobie filmiki z linku: http://mirekk36.blogspot.com/2017/05/at ... start.html
Tam jest o użyciu jakiegoś małego procka, jest pokazane, jak zoptymalizować kod
Nie wiem, czy pomoże, ale może jakoś naprowadzi na rozwiązanie...
Awatar użytkownika
ethanak
Złota rączka
Posty: 761
Rejestracja: 21 lis 2015, 14:41
Kontakt:

Re: Problem z ws2812 oraz IR

Post autor: ethanak » 19 gru 2017, 09:09

Ja bym jednak postawił na ESP8266. Tańszy niż Mega, o wiele więcej pamięci, wbudowane WiFi z możliwością zdalnego programowania, a przy sterowaniu ledami nie blokuje żadnych przerwań.
ATTiny owszem, bardzo ładnie steruje ledami (robiłem ostatnio taką zabawkę na ATTiny85) - tyle że moim zdaniem niespecjalnie się nadaje na układ pośredniczącym który jakieś tam dane od głównego procka musi przyjmować (kiedy ma to biedny robić), poza tym ilość pamięci daje bardzo ostre ograniczenia na liczbę diod.
Pisze człowiek ambitnie, a tu przychodzi prostak i wszystko rozumie.
To jest ewidentna bezczelność!
kozalec
Młodszy majsterkowicz
Posty: 5
Rejestracja: 1 gru 2017, 19:02

Re: Problem z ws2812 oraz IR

Post autor: kozalec » 22 gru 2017, 18:49

Nadal draże temat bo nie chce mi sie przerabiać płytki.
w poszukiwaniu w internecie natrafiłem na strone: ****** nie mogę wstawic

Kod: Zaznacz cały

#include <Adafruit_NeoPixel.h>
#include <IRLibAll.h>

IRrecv myReceiver(2);//receiver on pin 2
IRdecode myDecoder;//Decoder object

//One NeoPixel connected to pin 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(1,6,NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  myReceiver.enableIRIn(); // Start the receiver
}

void loop() {
  if (myReceiver.getResults()) {
    myDecoder.decode();
    if (myDecoder.protocolNum == NEC) {
      switch(myDecoder.value) {
        case 0xfd00ff:  //Volume Down
          strip.setPixelColor(0,255,0,0);//Red
          break;
        case 0xfd807f:  //Play/Pause
          strip.setPixelColor(0,0,255,0);//Green
          break;
        case 0xfd40bf:  //Volume Up
          strip.setPixelColor(0,0,0,255);//Blue
          break;
      }
    strip.show();
    myReceiver.enableIRIn(); //Restart the receiver
    }
  }
}
znalazłem bibliotekę
pracuje nad uruchomieniem
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
kozalec
Młodszy majsterkowicz
Posty: 5
Rejestracja: 1 gru 2017, 19:02

Re: Problem z ws2812 oraz IR

Post autor: kozalec » 23 gru 2017, 08:43

kozalec pisze:
22 gru 2017, 18:49
Nadal draże temat bo nie chce mi sie przerabiać płytki.
W poszukiwaniu w internecie natrafiłem na strone z biblioteką IRLibAll.h

Znalazłem bibliotekę
ale niestety nic nie działa ta biblioteka nawet przy prostym odczycie kodów.
Moze znalazł by ktoś chwilkę by sprawdzić czy to moja wina



Kod: Zaznacz cały

#include "IRLibAll.h"

//Create a receiver object to listen on pin 2
IRrecvPCI myReceiver(7);

//Create a decoder object 
IRdecode myDecoder;   

void setup() {
  Serial.begin(9600);
  delay(2000); while (!Serial); //delay for Leonardo
  myReceiver.enableIRIn(); // Start the receiver
  Serial.println(F("Ready to receive IR signals"));
}

void loop() {
  //Continue looping until you get a complete signal received
  if (myReceiver.getResults()) {
    myDecoder.decode();           //Decode it
    myDecoder.dumpResults(true);  //Now print results. Use false for less detail
    myReceiver.enableIRIn();      //Restart receiver
  }
}
ODPOWIEDZ

Strony partnerskie: