ИК-датчик выдает неправильные коды

andrvbig
andrvbig аватар
Offline
Зарегистрирован: 19.04.2020
Arduino Uno. ИК-управление тележкой. Драйвер движков TB6612FNG.
PWMA - 6 порт, PWMB - 11 порт.
Выход ИК - 12 порт.
 
ИК-датчик в начале выдает правильные коды. В какой-то момент начинает выдавать FFFFFFFF,
либо другой код на любую кнопку.
 
#include <stdio.h>
#include <IRremote.h>

#define POWER  30

int RECV_PIN = 12;
int LED1 = 13;
int AIN1=2;
int AIN2=3;
int STBY=4;
int BIN1=5;
int BIN2=7;
int PWMA=6;
int PWMB=11;
IRrecv irrecv(RECV_PIN);
decode_results results;
long res;

void setup()
 {
  int i;
  Serial.begin(9600);
  for (i=2;i<=7;i++) // Ardunio motor driver module
  pinMode(i,OUTPUT); // set digital pins 2,3,4,5,6 as output
  pinMode(11,OUTPUT);
  pinMode(LED1, OUTPUT);  
  irrecv.enableIRIn(); // Start the receiver
 }
void loop() 
{
  if (irrecv.decode(&results))
  {
      res = results.value;
 
    if(res==0xFF629D)
       { forward(); 
          Serial.print("Forw ");
       }
    else if(res==0xFFA857)
       { back();
          Serial.print("Back ");
       }      
    else if(res==0xFF02FD)
       { stop1();
          Serial.print("Stop ");       
       }        
    else if(res==0xFF22DD)
       { left();
          Serial.print("Left ");
       }
    else if(res==0xFFC23D)
       { right();
          Serial.print("Right ");
       }
    else if(res==0xFF6897)       // On: key 1
       { digitalWrite(LED1, HIGH); 
          Serial.print("On ");
       }
    else if(res==0xFF9867)    // Off: key 2
       { digitalWrite(LED1, LOW);
          Serial.print("Off ");
       }
    else if(res==0xFFFFFFFF)
       {
        Serial.print("      FF- ");
       }

    Serial.print("res ");
    Serial.println(res, HEX);
    irrecv.resume(); // Receive the next value
    delay(100);
  } 
}

void forward() {
    digitalWrite(STBY,HIGH);
    digitalWrite(AIN1,LOW);
    digitalWrite(AIN2,HIGH);
    analogWrite (PWMA,POWER);
    digitalWrite(BIN1,LOW); 
    digitalWrite(BIN2,HIGH);
    analogWrite (PWMB,POWER);
}

void back() {
    digitalWrite(STBY,HIGH);
    digitalWrite(AIN1,HIGH);
    digitalWrite(AIN2,LOW);
    analogWrite(PWMA,POWER); 
    digitalWrite(BIN1,HIGH);
    digitalWrite(BIN2,LOW);
    analogWrite(PWMB,POWER); 
//        digitalWrite(LED1, HIGH); 
}

void stop1() {
  digitalWrite(STBY,LOW);
}

void left() {
   
    digitalWrite(STBY,HIGH);
    digitalWrite(AIN1,LOW);
    digitalWrite(AIN2,HIGH);
    analogWrite(PWMA,POWER); 
    digitalWrite(BIN1,HIGH);
    digitalWrite(BIN2,LOW);
    analogWrite(PWMB,POWER); 
}

void right() {
    digitalWrite(STBY,HIGH);
    digitalWrite(AIN1,HIGH);
    digitalWrite(AIN2,LOW);
    analogWrite(PWMA,POWER); 
    digitalWrite(BIN1,LOW); 
    digitalWrite(BIN2,HIGH);
    analogWrite(PWMB,POWER); 
}

 

 

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

Попробуйте освободить 11-ый пин, назначив вместо него 5-ый, 9-ый или 10-ый (3-й не трогайте!). Только сейчас заметил, что у Вас и третий пин тоже занят, освободите и его пока (скорее всего он не мешает до тех пор пока Вы только читаете IR, а сами не шлёте, но от греха подальше освободите). Должно помочь, по идее.

 

andrvbig
andrvbig аватар
Offline
Зарегистрирован: 19.04.2020

Спасибо за совет.

Переключение не помогает:(

Использовал три разных пульта: Arduino, Samsung, LG.

Arduino, Samsung врут чаще. LG работает более стабильно,

но в конце концов ИК обмен срывается.

Вероятно проблемы на физическом уровне (длина, формат пакета и т.д.) или датчик кривой.

Жаль осциллографа нет.

 

 

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

А где исправленный код?

andrvbig
andrvbig аватар
Offline
Зарегистрирован: 19.04.2020

Да там исправлять особо нечего. Поменял пины 11 с 5.

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

Ну, хозяин - барин.

andrvbig
andrvbig аватар
Offline
Зарегистрирован: 19.04.2020

Пардон!

Я забыл перекомпилировать!

Сделал около сотни нажатий - все ОК!

Спасибо еще раз.

 

svm
Offline
Зарегистрирован: 06.11.2016

andrvbig пишет:

 
ИК-датчик в начале выдает правильные коды. В какой-то момент начинает выдавать FFFFFFFF,
либо другой код на любую кнопку.
 

А Вы уверены, что дело не в пультах? Ведь пульт (как правило) выдает код кнопки только один раз после нажатия, затем  FFFF - это означает - повтор.

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

svm пишет:

А Вы уверены, что дело не в пультах? 

Да, нет, в данном случае проблема понятна. Библиотека IRremote делает свою настройку таймера-счётчика №2, а ТС использовал его пин для ШИМа (у которого свои настройки). Вот настройки передрались между собой. Это общее место - если используешь IRremote , то никаких ШИМ'ов на пинах 3 и 11.