Skocz do zawartości

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


Pomocna odpowiedź

Napisano

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.
  

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

@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);
}
  

 

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);   
        
}
  

 

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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...