ИК-датчик выдает неправильные коды
- Войдите на сайт для отправки комментариев
Вс, 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.