Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 2487|回復: 1
打印 上一主題 下一主題

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2015-8-27 15:19:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最後由 lostsnow 於 2015-8-28 12:34 編輯

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


所以想換成無 filter 的接收器,
紅外線在發送只有很短的時間,小弟的用中斷計數的方法誤差很大,
要用什麼方法能快速又正確的抓出載波是多少 Khz 呢?
小弟是軟體工程師,對硬體知識很弱,
除了軟體解決,是否有硬體的方法,降低軟體的難度。
2#
 樓主| 發表於 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 int  Count = 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 分二次做。
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-6-6 23:43 , Processed in 0.194545 second(s), 7 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表