樹莓派控制紅外線收發


 

上淘寶買了兩個紅外線模塊,一個是接收器,另一個是發送器。
問了賣家,沒有資料,但是根據電路板上打印的信息,似乎是標准的模塊。於是先插上樹莓派試試看。
 
 
(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歐姆就可以了。
面包板搭建圖如下:
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM