ИК-датчик выдает неправильные коды
- Войдите на сайт для отправки комментариев
Вс, 19/04/2020 - 14:16
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);
}
Попробуйте освободить 11-ый пин, назначив вместо него 5-ый, 9-ый или 10-ый (3-й не трогайте!). Только сейчас заметил, что у Вас и третий пин тоже занят, освободите и его пока (скорее всего он не мешает до тех пор пока Вы только читаете IR, а сами не шлёте, но от греха подальше освободите). Должно помочь, по идее.
Спасибо за совет.
Переключение не помогает:(
Использовал три разных пульта: Arduino, Samsung, LG.
Arduino, Samsung врут чаще. LG работает более стабильно,
но в конце концов ИК обмен срывается.
Вероятно проблемы на физическом уровне (длина, формат пакета и т.д.) или датчик кривой.
Жаль осциллографа нет.
А где исправленный код?
Да там исправлять особо нечего. Поменял пины 11 с 5.
Ну, хозяин - барин.
Пардон!
Я забыл перекомпилировать!
Сделал около сотни нажатий - все ОК!
Спасибо еще раз.
А Вы уверены, что дело не в пультах? Ведь пульт (как правило) выдает код кнопки только один раз после нажатия, затем FFFF - это означает - повтор.
А Вы уверены, что дело не в пультах?
Да, нет, в данном случае проблема понятна. Библиотека IRremote делает свою настройку таймера-счётчика №2, а ТС использовал его пин для ШИМа (у которого свои настройки). Вот настройки передрались между собой. Это общее место - если используешь IRremote , то никаких ШИМ'ов на пинах 3 и 11.