Skocz do zawartości

Odczytywanie błędnych sygnałów przez odbiornik podczerwieni


solowkidamian

Pomocna odpowiedź

Witam jestem po kursie Arduino dla poczatkujących z tej właśnie strony który bardzo fajnie moja strona wytłumaczył mi podstawy tego mikrokontrolera. Ostatni chciałem właśnie z tym mikrokontrolerem zrobić prostego, może nie zbyt estetycznie wyglądającego robota. Przyczepiłem dwa silniki z kółkami do deseczki dałem mostek H oraz odbiornik IR no i po krótkim poradniku jakiegoś hinduskiego pana jak obsługiwać odbiornik podczerwieni zacząłem programować. 

 

/*
 * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>
 
const byte IR_RECEIVE_PIN = 13;


void setup()
{
   Serial.begin(9600);
   Serial.println("IR Receive test");
   IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);

  pinMode(8, OUTPUT); //Sygnał PWM silnika nr 1
  digitalWrite(8, HIGH); //Ustawiamy (na stałe) stan wysoki na pinie 6
  pinMode(9, OUTPUT);
  digitalWrite(9, HIGH);
  
  pinMode(4, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 1
  pinMode(3, OUTPUT);

  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
}

void loop() {

 if (IrReceiver.decode())
   {
      Serial.println((IrReceiver.decodedIRData.command), HEX);
      IrReceiver.resume();
   }

   
  
      if( (IrReceiver.decodedIRData.command) == 1  ) {

        digitalWrite(8, HIGH);
        digitalWrite(9, HIGH);
        
        digitalWrite(3, HIGH);
        digitalWrite(4, LOW);
        
        digitalWrite(6, HIGH);
        digitalWrite(7, LOW);
      }
      
    if( (IrReceiver.decodedIRData.command) == 6 ) {

        digitalWrite(8, HIGH);
        digitalWrite(9, LOW);
        
        digitalWrite(3, HIGH);
        digitalWrite(4, LOW);
        
        digitalWrite(6, HIGH);
        digitalWrite(7, LOW);
      }
      
     if( (IrReceiver.decodedIRData.command) == 4 ) {

        digitalWrite(8, LOW);
        digitalWrite(9, HIGH);
        
        digitalWrite(3, HIGH);
        digitalWrite(4, LOW);
        
        digitalWrite(6, HIGH);
        digitalWrite(7, LOW);
      }

     if( (IrReceiver.decodedIRData.command) == 9 ) {

        digitalWrite(8, HIGH);
        digitalWrite(9, HIGH);
        
        digitalWrite(3, LOW);
        digitalWrite(4, HIGH);
        
        digitalWrite(6, LOW);
        digitalWrite(7, HIGH);
     }
     else if( (IrReceiver.decodedIRData.command) == 2 ){
        digitalWrite(8, LOW);
        digitalWrite(9, LOW);
        }
        
}

Oto co udało mi się zrobić może, może i jest prymitywny ale na logikę wydawało mi się że powinien działać. Niestety odbiornik ciągle odbiera sygnał "0" i w ogóle nie chce odbierać innych a jak już to strasznie topornie. Ogólnie nie da się tym ogóle sterować. Proszę o porady, będę bardzo wdzięczny bo naprawdę już tyle się z tym użeram i nie wiem co  robię źle.
  

Link do komentarza
Share on other sites

Nie pamiętam już jak działa tabibliotrka, ale może jest tak że po każdym odczytaniu wartości następuje wyzerowanie zmiennej, stąd twoje zero... spróbuj tak..

 if (IrReceiver.decode())
   {
      zmienna = IrReceiver.decodedIRData.command;
      IrReceiver.resume();
   } 
if (zmienna == 1)
  if (zmienna == 2
      if (zmienna == 3)
      //

 

  • Lubię! 1
Link do komentarza
Share on other sites

@farmaceuta Dałem tak i nie działa niestety

*
 * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>
 
const byte IR_RECEIVE_PIN = 13;


void setup()
{
   Serial.begin(9600);
   Serial.println("IR Receive test");
   IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);

  pinMode(8, OUTPUT); //Sygnał PWM silnika nr 1
  digitalWrite(8, HIGH); //Ustawiamy (na stałe) stan wysoki na pinie 6
  pinMode(9, OUTPUT);
  digitalWrite(9, HIGH);
  
  pinMode(4, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 1
  pinMode(3, OUTPUT);

  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
}

void loop() {
  
  int zmienna = 0;

 if (IrReceiver.decode())
   {
      zmienna = IrReceiver.decodedIRData.command;
      Serial.println(zmienna, HEX);
      IrReceiver.resume();
   }

   
  
      if( (IrReceiver.decodedIRData.command) == 1  ) {

        digitalWrite(8, HIGH);
        digitalWrite(9, HIGH);
        
        digitalWrite(3, HIGH);
        digitalWrite(4, LOW);
        
        digitalWrite(6, HIGH);
        digitalWrite(7, LOW);
      }
      
    if( (IrReceiver.decodedIRData.command) == 6 ) {

        digitalWrite(8, HIGH);
        digitalWrite(9, LOW);
        
        digitalWrite(3, HIGH);
        digitalWrite(4, LOW);
        
        digitalWrite(6, HIGH);
        digitalWrite(7, LOW);
      }
      
     if( (IrReceiver.decodedIRData.command) == 4 ) {

        digitalWrite(8, LOW);
        digitalWrite(9, HIGH);
        
        digitalWrite(3, HIGH);
        digitalWrite(4, LOW);
        
        digitalWrite(6, HIGH);
        digitalWrite(7, LOW);
      }

     if( (IrReceiver.decodedIRData.command) == 9 ) {

        digitalWrite(8, HIGH);
        digitalWrite(9, HIGH);
        
        digitalWrite(3, LOW);
        digitalWrite(4, HIGH);
        
        digitalWrite(6, LOW);
        digitalWrite(7, HIGH);
     }
     else if( (IrReceiver.decodedIRData.command) == 2 ){
        digitalWrite(8, LOW);
        digitalWrite(9, LOW);
        }
        delay(500);
}
  

 

Link do komentarza
Share on other sites

I jeszcze jedna najbardziej denerwująca rzecz kiedy na sam koniec programu dopisze żeby silniki się wyłączały to już magicznie wszystko płynnie perfekcyjnie wręcz działa ale wiadomo wtedy silniki chodzą na pół mocy

/*
 * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include <IRremote.h>
 
const byte IR_RECEIVE_PIN = 13;


void setup()
{
   Serial.begin(9600);
   Serial.println("IR Receive test");
   IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);

  pinMode(8, OUTPUT); //Sygnał PWM silnika nr 1
  digitalWrite(8, HIGH); //Ustawiamy (na stałe) stan wysoki na pinie 6
  pinMode(9, OUTPUT);
  digitalWrite(9, HIGH);
  
  pinMode(4, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 1
  pinMode(3, OUTPUT);

  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
}

void loop() {
  
  int zmienna = 0;

 if (IrReceiver.decode())
   {
      zmienna = IrReceiver.decodedIRData.command;
      Serial.println(zmienna, HEX);
      IrReceiver.resume();
   }

   
  
      if( (IrReceiver.decodedIRData.command) == 1  ) {

        digitalWrite(8, HIGH);
        digitalWrite(9, HIGH);
        
        digitalWrite(3, HIGH);
        digitalWrite(4, LOW);
        
        digitalWrite(6, HIGH);
        digitalWrite(7, LOW);
      }
      
    if( (IrReceiver.decodedIRData.command) == 6 ) {

        digitalWrite(8, HIGH);
        digitalWrite(9, LOW);
        
        digitalWrite(3, HIGH);
        digitalWrite(4, LOW);
        
        digitalWrite(6, HIGH);
        digitalWrite(7, LOW);
      }
      
     if( (IrReceiver.decodedIRData.command) == 4 ) {

        digitalWrite(8, LOW);
        digitalWrite(9, HIGH);
        
        digitalWrite(3, HIGH);
        digitalWrite(4, LOW);
        
        digitalWrite(6, HIGH);
        digitalWrite(7, LOW);
      }

     if( (IrReceiver.decodedIRData.command) == 9 ) {

        digitalWrite(8, HIGH);
        digitalWrite(9, HIGH);
        
        digitalWrite(3, LOW);
        digitalWrite(4, HIGH);
        
        digitalWrite(6, LOW);
        digitalWrite(7, HIGH);
     }
     else if( (IrReceiver.decodedIRData.command) == 2 ){
        digitalWrite(8, LOW);
        digitalWrite(9, LOW);
        }
     digitalWrite(8, LOW);
        digitalWrite(9, LOW);   
        
}
  

 

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

juz sprawdzilem...zapomiales dodac specjalnej zmiennej...ma byc tak jak ponizej i dziala 

#include <IRremote.h>

const int RECV_PIN = 10;

IRrecv irrecv(RECV_PIN);

decode_results results;

byte  sta = 0;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  irrecv.blink13(true);
 

  pinMode(9, OUTPUT);
    pinMode(8, OUTPUT);

  digitalWrite(9, LOW);
  digitalWrite(8, HIGH);

}

void loop() {
  if (irrecv.decode(&results)) {
    
    Serial.println(results.value, HEX);
    delay(1000);
   
   results.value = 0;
    }

    irrecv.resume(); // Receive the next value
  }

te dodatkowe digital mozesz pominac...nie chcialo mi sie szukac kabli do uno..

  • Lubię! 2
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.