上淘寶買了兩個紅外線模塊,一個是接收器,另一個是發送器。
問了賣家,沒有資料,但是根據電路板上打印的信息,似乎是標准的模塊。於是先插上樹莓派試試看。

(update:上圖的發射器沒有三極管,所以只能做到1-2m)
看寶貝描述,這個模塊是給Arduino用的,於是搜索了一下Arduino相關的資料,發現github上有
Arduino-IRremote這個項目,里面有各種協議包括NEC紅外協議的實現。
舉個例子,代碼里面發送NEC的實現:


這里先發送一個頭部,然后按比特發送數據,
比特為1發560us的PWM,然后等待1690us
比特位0的時候發送560us的PWM,然后等待560us
最后發送一個560us的PWM結束
手頭上有一塊樹莓派和一個美的空調,所以先用這兩個硬件下手,實際上使用STM32會更方便,因為樹莓派自帶了操作系統,控制硬件沒有STM32這種單片機方便。后續准備將程序移植到STM32上面。
解析器
要知道美的空調的編碼,首先要做一個解析器。實際上,使用邏輯分析儀也可以得知。一開始並沒有拆開遙控器看看,先用IR接收器做了一個解析器。
代碼傳上去了,見:
https://github.com/tanhangbo/RaspberryIR
做解析器的時候首先要了解紅外頭的工作原理,首先它里面有一個濾波器,有38K數據的時候輸出'1',沒有38K數據的時候輸出'0'。外部供電3.3V。接下來就要對輸入的數據進行處理了。
首先對其產生的跳變進行響應,這里就注冊了一個中斷,INT_EDGE_BOTH表示不論下降沿和上升沿都進行響應,這樣就可以采集到數據了:
wiringPiISR(IR_INPUT, INT_EDGE_BOTH, &ir_int)
接下來要對響應做計數。一開始用gettimeofday測試了一下,並不准確,查資料得知樹莓派的ARM芯片內部有一個1MHZ的時鍾可以用來做計數器。不過因為樹莓派有linux操作系統,直接訪問時鍾地址是不行的。
首先要打開datasheet(網上可以搜到)
BCM2835-ARM-Peripherals.pdf
里面提到了兩種timer:


其中System Timer的定義


ARM timer的定義:


看它的描述還是使用System Timer比較好。
首先要知道System Timer的地址。
這里寫的是 0x7E003000,但是看圖說話(第5頁),還是要轉換成為0x20003000:


轉換好之后就要解決怎么用了。首先想到的就是寫一個驅動,不過寫驅動需要花一些時間調試,搞不好kernel搞掛了,為了簡單一點,這里有一個比較portable的辦法,就是使用mmap直接讀取/dev/mem的信息。詳情見代碼。
於是根據這個思路作了一個獲取時間間隔的一個API:
long long int get_timer_diff() { long long int ret; ret = *timer - prev_timer; prev_timer = *timer; return ret; }
這里為什么要用long long?因為這個timer是64bit的。
解析分為三步:1.解析波形,2.解析bit,3.解析Byte
解析完成之后就拿到我需要的東西了。
拿着遙控器對着紅外頭測試,發現美的空調的格式如下:
0xb2,0x4d,0xf5,0x0a,0xa5,0x5a
接下來查找了網上的資料,發現它的格式實際上是這個樣子的:
發射器
接下來做一個發射器,俗話說,上山容易下山難,編碼容易解碼難,過了解碼這個步驟,編碼也挺容易了,不過做發射器的時候還是有一些問題需要考慮的。
做發射器的時候需要打開樹莓派的PWM,並且使用1MHZ的時鍾做一個API:
void delay_us(int us) { long long int prev_timer; prev_timer = *timer; while (*timer - prev_timer < us) ; }
這樣就可以逐個將數據
抓到的遙控器波形(管腳端),手工查看,得知:
這樣就可以逐個將數據發送出去了。其中開關PWM的時候發現一個問題,關閉PWM倒是很快,開啟PWM有延時。於是在開啟之前將關閉PWM的時間縮短解決。如果能直接控制UART,我想可以用UART模擬一樣的波形,利用RTS-CTS快速關斷,比PWM的效果好。
用函數開關PWM有200us的延時,這里是要考慮下的。開的時候是200ms之后就打開了,
關的時候會立馬關閉,但是這個過程還是會延時200us。

目前的結果是,用兩個IR模塊對測,解析器也能解析出正確的結果,空調也能被控制。

波形
抓到的遙控器波形(管腳端),手工查看,得知:


0110010 01001101 00011111 11100000 01001000 10110111L (同一個波形發兩次)
第一個bit是MSB:
B2 4D 1F E0 48 B7
屏幕上顯示的是24度,和前面提到的資料一致。
遙控器的波形並不完美,我自己產生的波形可以完美的多:


現在已經可以控制美的空調了,空調被控制的時候也會產生‘滴’的聲音。不過控制距離只有1米,
可能是模塊的電流比較小導致的。
【0817更新】
通過自己搭電路,已經可以解決距離太小的問題,解決辦法是增加一個三極管,增大紅外管的電流,

另外將圖中的100歐姆換成10歐姆就可以了。
面包板搭建圖如下:
