Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Pilot IR - brak wpisów w rejestrze, pytania o zależności

Wini 230 04 Mar 2021 10:31 450 16
  • #1
    Wini 230
    Level 23  
    Witam, posiadam klon Arduino Uno, chciałem zaprogramować reakcję na dany przycisk z pilota IR, wgrałem kilka bibliotek, ale w monitorze zdarzeń, otrzymuję albo ciąg wpisów, nawet gdy pilot nie wysyła sygnału, lub żadnych informacji, w zależności, jaki program wgram z internetu. Jako odbiornika używam TSOP31236, układ działa, sprawdzałem pisząc prosty program z migającą diodą w rytm sygnału z odbiornika. Co może być przyczyną braku kodów z pilota w rejestrze ?

    Szukam też odpowiednich komend, które umożliwiały by np. wykonanie programu, typu: jeśli przycisk będzie wciśnięty określoną ilość czasu - wykonaj daną pętlę Używałem formy "delay", ale program sumował czas wszystkich naciśnięć przycisku, mi zależy natomiast żeby każde zwolnienie switcha resetowało zegar.
    Zastanawiam się też, jakiej komendy użyć, żeby w przypadku niespełnienia jakiegoś warunku zatrzymać działanie pętli i wrócić na jej początek, lub wykonywać alternatywną pętlę. Używałem komend "if", "break", ale mam problem z zaprogramowaniem układu, tak, aby program wracał na początek pętli

    Szukam też informacji, jak zrealizować opcję zaprogramowania np. wykonania danego programu, jeśli będzie wciśnięty przycisk, a, lub przycisk b. Umieszczałem dwie komendy "while", jedna pod drugą, wtedy program wogóle nie reagował na przyciski

    Samodzielnie udało mi się np. taki działający program napisać

    
    void setup() { // Ustawienia parametrów
      pinMode(3, OUTPUT);
      pinMode(6, OUTPUT); // Ustawienia pinów 3,6 i 8, jako wyjścia
      pinMode(8, OUTPUT);
      pinMode(7, INPUT_PULLUP); // Ustawienia pinu 7 jako wejścia z podciągnięciem do Vin
      digitalWrite(3, LOW);
      digitalWrite(6, LOW); // Ustawienie na pinach 3,6 stanu niskiego, po włączeniu zasilania
    }
    void loop() { // Docelowy program
    
      delay(500); // Opóźnienie niwelujące skutkti drgania syków przycisku
      while(digitalRead(7) == HIGH) {} // Odbiór sygnału z przycisku
      digitalWrite(3, HIGH); // Załączenie niebieskiej dioody 
    
      if(digitalRead(3) == HIGH) // Jeśli niebieska dioda świeci
      digitalWrite(8, HIGH); // Włączenie brzęczyka
      delay(100); // Czas 0,1s 
      digitalWrite(8, LOW); // wyłączenie brzęczyka po czasie 0,1s
    
      delay(300); // Opóźnienie niwelujące skutkti drgania syków przycisku
      while (digitalRead(7) == HIGH) {} // Odbiór sygnału z przycisku
      digitalWrite(6, HIGH); // Załączenie pomarańczowej dioody 
    
      if(digitalRead(6) == HIGH) // Jeśli pomarańczowa dioda świeci
      for ( int i=0 ; i<2 ; i++) { // Ustawienie dwukrotnego wykonania poniższego zadania
      digitalWrite(8, HIGH); // Włączenie brzęczyka po czasie 0,1s
      delay(100); // Czas 0,1s
      digitalWrite(8, LOW); // Wyłączenie brzęczyka po czasie 0,1s
      delay(100); } // Czas 0,1s
     
      delay(300); // Opóźnienie niwelujące skutkti drgania syków przycisku
      while(digitalRead(7) == HIGH) {} // Odbiór sygnału z przycisku
      digitalWrite(3, LOW); // Wyłączenie diody niebieskiej
      
      delay(300); // Opóźnienie niwelujące skutkti drgania syków przycisku
      while (digitalRead(7) == HIGH) {} // Odbiór sygnału z przycisku
      for ( int i=0 ; i<5 ; i++) { // Ustawienie 5 krotnego wykonania poniższego zadania
      digitalWrite(3, HIGH); // Włączenie niebieskiej diody
      delay(500); // 0,5s
      digitalWrite(3, LOW); // Wyłączenie niebieskiej diody po czasie 0,5s
      delay(500); // Czas 0,5s
      if(digitalRead(7) == LOW) break; // Wcześniejsze zakończenie programu 
                                  // jeśli przycisk zostanie wciśnięty na co najmniej 1s
      };
      
      digitalWrite(3, HIGH); // Włączenie niebieskiej diody po czasie 0,5s
      delay(500); // Czas 0,5s
      digitalWrite(6, LOW); // Wyłączenie pomarańczowej diody po czasie 0,5s
      digitalWrite(3, LOW); // Wyłączenie niebieskiej diody po czasie 0,5s
    
      if(digitalRead(3) == LOW) 
      if(digitalRead(6) == LOW) // Jeśli obydwie diody zgasły 
      digitalWrite(8, HIGH); // Włączenie brzęczyka
      delay(300); // Czas 0,3s
      digitalWrite(8, LOW); // Wyłączenie brzęczyka, po czasie 0,3s
      
    
    }
     
    


    Film przedstawiający działanie programu

    https://filmy.elektroda.pl/89_1614850531.mp4
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • Helpful post
    #2
    User removed account
    Level 1  
  • Helpful post
    #3
    User removed account
    Level 1  
  • #4
    Wini 230
    Level 23  
    Sprawdzałem z pilotem od wieży Grundig UMS 4700 SPCD z 2008 roku, z pilotem od żarówki led, z pilotem od telewizora Samsung z 2012 roku, czy zmiana odbiornika podczerwieni pomoże ?
  • Helpful post
    #5
    emarcus
    Level 38  
    Wini 230 wrote:
    Sprawdzałem z pilotem od wieży Grundig UMS 4700 SPCD z 2008 roku, z pilotem od żarówki led, z pilotem od telewizora Samsung z 2012 roku, czy zmiana odbiornika podczerwieni pomoże ?


    Ten odbiornik powinien pracować z wszystkimi pilotami IR jakie posiadasz w domu, albo zapożyczone od sąsiadów...
    Być może, że ten od żarówki LED nie jest IR (?)
    Sprawdzisz to obserwując jego emiter przez cyfrową kamerę albo komórkę.

    Najprościej wytestujesz odbiornik IR podłączając zasilanie (5V) do pinów oznaczonych V+ i GND albo (-); pod trzeci pin podłącz jakąkolwiek diodę LED z rezystorem 300 do 500 ohmów w polaryzacji: minus diody do ' S' natomiast jej (+) do 5V zasilania.
    W tej konfiguracji dioda nie powinna świecić.
    Oświetlaj odbiornik IR twoim pilotem i jeżeli po naciśnięciu dowolnego przycisku dioda mruga to masz komunikację.
    Reszta to sprawa odpowiedniej biblioteki i programu precyzującego co ma robić...

    Taka uwaga już na marginesie:
    Ten przedstawiony wyżej program na obsługę przycisków i diod jest fatalny...
    Zbyt wiele tematów w jednym wątku...

    e marcus
  • #6
    User removed account
    Level 1  
  • #7
    emarcus
    Level 38  
    Erbit wrote:
    emarcus wrote:
    ... albo komórkę.


    Jeśli przyjąć, że Iphone to nie komórka tylko Iphone ;) to Kolega ma rację.

    Zaś nieco poważniej - Iphone ma filtry i na tym urządzeniu tego nie będzie widać. Na innych komórkach tak.


    Rozumiem że ten twój post ma charakter 'zaczepny' !
    Nie wciągnisz mnie w tą twoją dyskusję o I-phonach prowadzącą do nikąd (!)
    Załóż swój wątek tematyczny i tam się popiszesz swoją 'nabytą' inteligencją .

    Jestem zbyt poważny na takie bzdety...
    Co właściwie wniosłeś do tego tematu oprócz trollowania?

    e marcus
  • #8
    User removed account
    Level 1  
  • #9
    emarcus
    Level 38  
    Erbit wrote:


    Ma jedynie wyjaśnić, że na Iphonie autor tego nie sprawdzi. Brak tej informacji powoduje, że autor wykonując testy Iphonem zostanie przez Ciebie wprowadzony w błąd.

    Nie, przełączy i-phone na inną kamerę , tą z frontu, ta jest bez filtra i nie będzie w błędzie.

    e marcus
  • #10
    Wini 230
    Level 23  
    Ale ja już sprawdziłem odbiornik na samym Arduino. Napisałem prosty program, który zapalał diodę w rytm pojawiania się stanu niskiego na wyjściu odbiornika. Zaprogramowałem też płytkę tak, aby można było zapalać i gasić diodę dowolnym przyciskiem pilota, bez odczytywania kodu, wszystko działało prawidłowo. Występuje natomiast problem ze sczytaniem kodów. Wgrywałem do Arduino wszystkie ogólnodostępne programy do obsługi pilotem i w monitorze zdarzeń nie pojawiają się żadne kody, albo bez podawania żadnego sygnału wczytuje się szybko ciąg kodów, aż do zawieszenia programu. Kiedy wciskałem przycisk na pilocie w momencie generowania ciągu kodów, pojawiał się kod z cyfrą 0. Czy jest to wina nieodpowiedniej biblioteki ? Wgrałem wiele różnych bibliotek, czy powinna być tylko jedna ?

    emarcus wrote:
    Taka uwaga już na marginesie:
    Ten przedstawiony wyżej program na obsługę przycisków i diod jest fatalny...
    Zbyt wiele tematów w jednym wątku...


    Ale ten program pisałem w celach edukacyjnych, testowałem różne rozwiązania. Jest szczegółowo podpisany, ponieważ prezentowałem go też gdzie indziej, dla osób, które nie mają do czynienia z programowaniem i chciałem żeby był dla nich jak najbardziej czytelny. Myślę że po wycięciu części kodu może on służyć, jako prosty wyłącznik czasowy
  • Helpful post
    #11
    emarcus
    Level 38  
    Wini 230 wrote:
    Ale ja już sprawdziłem odbiornik na samym Arduino. Napisałem prosty program, który zapalał diode…
    …. Zaprogramowałem też płytkę tak, aby można było zapalać i gasić diodę dowolnym przyciskiem pilota, bez odczytywania kodu,

    Występuje natomiast problem ze sczytaniem kodów. Wgrywałem do Arduino wszystkie ogólnodostępne programy do obsługi pilotem i w monitorze zdarzeń nie pojawiają się żadne kody…

    Jak już wcześniej pisałem, widocznie te skopiowane programy nie przewidywały odczytu tych kodów, ani też wysłania czegokolwiek do monitora.
    Jeżeli jednak w innym przypadku masz ‘nadmiar’ wyświetlanych niezrozumiałych informacji, świadczyłoby to o pewnej nieciągłości lub niezgodności programu z dołączoną w nim biblioteką
    Nowsza wersja tej samej biblioteki, pochodząca od tego samego autora może wprowadzać tak duże zmiany że zajdzie potrzeba skorygowania programu tworzonego na podstawie starszego wydania tej biblioteki.
    Biblioteki stosowane w środowisku Arduino IDE nie należą do tego systemu, lecz są tworzone przez doświadczonych i dobrze wyedukowanych entuzjastów tego środowiska, najczęściej nie mających żadnych powiązań administracyjnych lub finansowych z twórcami tego systemu.
    Jest to robione na zasadzie „otwartego systemu”, gdzie każdy, (jeżeli potafi (!)), może takie biblioteki tworzyć na swój sposób i publikować je.
    Wini 230 wrote:

    Wgrałem wiele różnych bibliotek, czy powinna być tylko jedna ?

    W zasadzie tak, dołączasz w programie tylko bibliotekę, do której odwołują się funkcje i procedury tam umieszczone, na podstawie której był tworzony kopiowany program.
    Na początek potrzebowałbyś przestudiować jakiś tutorial w tej relatywnie szerokiej dziedzinie
    Na przykład:
    https://www.circuitbasics.com/arduino-ir-remote-receiver-tutorial/

    Dużo w tej materii i nie tylko (!) , dowiesz cię czytając blog redagowany przez Ken Shirriff:
    http://www.righto.com/2009/08/multi-protocol-infrared-remote-library.html
    O popularności i zainteresowaniu tym tematem świadczy ilość uczestników w dyskusji pod artykułami.

    Jeżeli celem twoich badań jest tylko odczytanie kodów pilota IR, to poniższy program to zrobi.
    W załączeniu jest biblioteka (versja 2.x) współpracująca z nim. Ostatnio opublikowana versja 3.1 tej biblioteki wymaga pewnych zmian w programie , które są opisane w pakiecie publikacji nowszej versji.
    Oto twój przykładowy sketch dla odczytu 10-ciu przycisków:
    Code: c
    Log in, to see the code


    Załączoną niżej bibliotekę zdekompresuj (unzip) i umieść w folderze :
    Documents>Arduino>libraries-
    Utworzony w ‘unzip’ folder będzie: „Arduino-IRremote” - tak go tam umieść.
    To powinno zrealizować twój cel chociaż dla któregoś z posiadanych pilotów.

    e marcus
  • #12
    Wini 230
    Level 23  
    Ten program działa, w monitorze zdarzeń pojawiają się kody, czy można je podstawić do jakiegoś innego programu ? Wstawiałem otrzymane wyniki, do innych programów i linijka z kodem z pilota podświetla się jako bląd
  • Helpful post
    #13
    emarcus
    Level 38  
    Wini 230 wrote:
    w monitorze zdarzeń pojawiają się kody, czy można je podstawić do jakiegoś innego programu ? Wstawiałem otrzymane wyniki, do innych programów i linijka z kodem z pilota podświetla się jako bląd


    Tak, można je wykorzystaywać w innych programach; - po to właśnie się je odczytuje.
    Podaj konkretny przykład, w którym masz problem i opisz co konkretnie chcesz osiągnąć, tak abym nie musiał zgadywać..
    Podaj też otrzymane wyniki odczytanych kodów.

    Chyba nawet nie zaglądałeś do linku z tutorialem podanym wcześniej i chcesz mieć osobisty tutorial tu na grupie(!!??)
    Tam masz opisane różne kombinacje i zastosowania.

    e marcus
  • #14
    Wini 230
    Level 23  
    Chciałem wykonać poniższy program:

    #include <IRremote.h>
    
    const int receiverPin = 11;
    const int yellowPin = 2;
    const int greenPin = 3;
    
    IRrecv irrecv(receiverPin);
    decode_results results;
     
    void setup() {
      pinMode(yellowPin, OUTPUT);
      pinMode(greenPin, OUTPUT);
      irrecv.enableIRIn();
    }
     
    void loop() {
      if(irrecv.decode(&results)) {
        switch(results.value) {
          case FF926D: digitalWrite(greenPin, !digitalRead(greenPin)); break;
          case FF7A85: digitalWrite(yellowPin, !digitalRead(yellowPin)); break;
        }
        irrecv.resume();
      }
    }
    


    Podstawiłem otrzymane kody, ale wyświetla się błąd:

    Arduino:1.8.13 (Windows 7), Płytka:"Arduino Uno"
    
    C:\Users\Dell\AppData\Local\Temp\arduino_modified_sketch_562307\sketch_mar14a.ino: In function 'void loop()':
    
    sketch_mar14a:19:12: error: 'FF926D' was not declared in this scope
    
           case FF926D: digitalWrite(greenPin, !digitalRead(greenPin)); break;
    
                ^~~~~~
    
    sketch_mar14a:20:12: error: 'FF7A85' was not declared in this scope
    
           case FF7A85: digitalWrite(yellowPin, !digitalRead(yellowPin)); break;
    
                ^~~~~~
    
    Znaleziono wiele bibliotek w "IRremote.h"
    
    Wykorzystane: C:\Users\Dell\Documents\Arduino\libraries\Arduino-IRremote
    
    Niewykorzystane: C:\Users\Dell\Documents\Arduino\libraries\Arduino-IRremote-master
    
    exit status 1
    
    'FF926D' was not declared in this scope
    
    
    
    


    W monitorze zdarzeń otrzymałem minn. takie kody: FF926D, FF609F, 15AA5

    Staram się sam uczyć ale na odbiorniku podczerwieni utknąłem. Wgrywam gotowe oprogramowania, przypisane do nich biblioteki, wykonuje wszystko według instrukcji i w monitorze zdarzeń zwykle nie pojawiają się kody. Po wpisaniu otrzymanego programu pojawiły się, ale po zastosowaniu ich w programie wyświetla się błąd. Pytam tutaj na forum, ponieważ w internecie są tylko opisy działań, kiedy wszystko działa, u mnie pojawiły się problemy, jeśli chodzi o odbiornik ir
  • Helpful post
    #15
    khoam
    Level 41  
    W kodzie powinny zostać użyte 0xFF926D (zapis szesnastkowy) zamiast FF926D itd. - to drugie jest traktowane jako nazwa zmiennej, stąd błąd o braku jej deklaracji.
  • #16
    Wini 230
    Level 23  
    Dopisałem wartości do kodów, działa wszystko, dziękuję. Poćwiczę trochę z użyciem pilota w różnych programach. Czemu dostępne w internecie programy i biblioteki, nie chciały działać, mimo wczytywania ich według instrukcji ?
  • #17
    emarcus
    Level 38  
    Wini 230 wrote:
    Dopisałem wartości do kodów, działa wszystko, dziękuję. Poćwiczę trochę z użyciem pilota w różnych programach. Czemu dostępne w internecie programy i biblioteki, nie chciały działać, mimo wczytywania ich według instrukcji ?


    Skoro ta kwestia została wyjaśniona i wiesz w czym tkwił błąd/przeoczenie, to jednak nie zaszkodzi wskazać na inny sposób. Wystarczy skorygować dwie istotne linie programu; linia 111 i 112 (te na końcu, gdzie zachodzi przedstawienia wyniku w precyzowanej notacji )
    Pilot IR - brak wpisów w rejestrze, pytania o zależności

    e marcus