lostsnow 發表於 2015-8-27 15:19:30

紅外線載波問題(已解決,都能當計頻器了)

本帖最後由 lostsnow 於 2015-8-28 12:34 編輯

小弟想把家裡所有的紅外線遙控器,改用電腦控制透過 Arduino發送,
使用的是 OS-1838B 接收器, 38KHz 載波可以把資料存入 EEPROM,並且發送,
但如果不是 38KHz 載波遙控器會失效。


所以想換成無 filter 的接收器,
紅外線在發送只有很短的時間,小弟的用中斷計數的方法誤差很大,
要用什麼方法能快速又正確的抓出載波是多少 Khz 呢?
小弟是軟體工程師,對硬體知識很弱,
除了軟體解決,是否有硬體的方法,降低軟體的難度。

lostsnow 發表於 2015-8-28 12:28:37

本帖最後由 lostsnow 於 2015-8-28 13:27 編輯

已自行解決 ^_^
小弟太小看 Arduino 了,在網路上查了些資料,本以為 Tick 跟不上所以誤差大,
覺得要靠硬體除頻,沒想到隨手改了一下還滿精準的,就獻醜了。

用二片開發板做實驗,pin 2 接 pin 2,
下次會帶去朋友那用示波器及頻率產生器在確認。

程式 Send_Freq.ino:利用 IRremote Library 發送從 32~100 Khz 之間的訊號
#include <IRremote.h>
int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
IRsend irsend;

void setup()
{
Serial.begin(9600);
}

unsigned int rawbufb[] = {9000, 4500};
int freq = 32;

void loop() {   
Serial.print(F("Send freq = "));
Serial.print(freq);
Serial.println(F(" Khz"));   
irsend.sendRaw(rawbufb, 2, freq /* kHz */);
freq++;
if (freq == 101) freq = 32;
delay(3000);
}

程式 Check_Freq.ino:接收端
volatile unsigned long StartTime = 0;
volatile unsigned intCount = 0;

void setup()
{
Serial.begin(9600);
pinMode(2, INPUT);
attachInterrupt(0, onTick, RISING);
}

void loop()
{
}

void onTick()
{
if (Count == 0) {
    StartTime = micros();
}
Count++;
if (Count == 128) {                                 // 取樣次數
    unsigned long Sumtime = micros() - StartTime;
    Count = 0;
    if (Sumtime < 10000){                               // 防止前次干擾
      unsigned long fq = ((1000000 * 128 / Sumtime));
      Serial.print(fq);
      Serial.print(" Hz   Time = ");
      Serial.print(Sumtime);
      Serial.println(" us");
    }
}
}

接收端結果:
....
100000 Hz   Time = 1280 us
100313 Hz   Time = 1276 us
100313 Hz   Time = 1276 us
100628 Hz   Time = 1272 us
100628 Hz   Time = 1272 us
32000 Hz   Time = 4000 us
33057 Hz   Time = 3872 us
34042 Hz   Time = 3760 us

心得:
一、「方法一:單位次數所花費的時間」、「方法二:單位時間所觸發的次數」
      上面是放方法一,稍微精準一些,缺點是偵測時間不固定。
二、取樣次數越少,誤差越大,如果能實際量測校正,可以用補正值的方法改善誤差。
三、sendRaw 頻率設太高或太低會有問題,32~100 Khz 已符合需求,就懶得在研究了。

結語:
小弟覺得最困難點克服,其他應該都不是問題,上面程式還有優化的空間....
偷紅外線訊號一小段做載波頻率偵測,decode 時在把偷的時間補償回去,
不然在差就先按一下載波頻率偵測,在按一下 decode 分二次做。
頁: [1]
查看完整版本: 紅外線載波問題(已解決,都能當計頻器了)