Upload
dokhanh
View
239
Download
3
Embed Size (px)
Citation preview
遙控電器開關
18.1 使用樹莓派顯示紅外線遙控器的訊號
18.2 遙控器控制樹莓派上的 LED 燈開關
18-2 Raspberry Pi 超炫專案與完全實戰
18.1 使用樹莓派顯示紅外線遙控器的訊號
實驗介紹
這個專案將會介紹如何自製一個遙控器。為了達成這個目的,需要了解以下的知識:
樹莓派如何接收遙控器的訊號
了解遙控器的原理
首先介紹遙控器,家中可能有很多的遙控器,不管是開門的遙控器、看電視的遙控
器,現在連窗簾、冷氣機都有遙控器,本實驗會介紹如何將樹莓派透過遙控器,做
互相溝通和聯絡,有這樣的技術就更可以把玩家的動作和需求,在第一時間傳遞給
樹莓派,達到彼此之間的互動,並把比較複雜的計算,交給樹莓派這個小電腦,做
出合適的反應與處理動作。
遙控器是由發射器、接收器和微處理器組成。接收器和微處理器部分都在家電主機
上,例如電視機。遙控器產生不同的編碼脈衝,以決定不同的按鍵,而遙控器輸出
各種以紅外線為媒介的控制脈衝訊號,這些脈衝是特定的樣式,當接收器收到之
後,將紅外線訊號進行放大、限幅、檢波、整形後送到微處理器,微處理器根據不
同的訊號,再做不同按鍵的反應。需注意的是,根據發射不同編碼指令脈衝設計成
相應的控制功能,這些功能是生產廠商預先設計好的,再燒錄在遙控器裡面,所以
各種遙控器是不能通用的,而且各家廠商會刻意做不同的調整,以免互相干擾。
發送和接收端之間的方法,目前有兩種,分別是:
IR紅外線
RF(Radio Frequency)射頻
要知道遙控器是哪一種類,可以用照相機的預覽鏡頭,對著遙控器,按下時發射端
可以看到這個紅外線的亮度,但一般肉眼是看不到的。而另外一種 RF(Radio Frequency)射頻,就會看不到紅外線燈光,這是因為 RF 射頻遙控器是用頻率來做到這些事情,所以它的範圍比較廣,並可以穿越阻礙物,不會妨礙到資料傳輸。
實驗目的
透過 IR receiver接收遙控器送出來的資料,並且顯示在螢幕上。
Chapter 18 遙控電器開關 18-3
實驗硬體設備
遙控器的接收端稱為 receiver,IR receiver的外型如下,在電子零件都可以購買到。
圖 18-1 IR receiver 的外型
硬體規格
紅外線接收器有三個接腳,這三個接腳分別會依照不同廠牌的紅外線感應器,該三
個接腳的功能都不太一樣,所以請依照實際使用的硬體來調整接線。
圖 18-2 紅外線接收器(PNA4602)的接線
這裡列出比較常見的紅外線接收器接腳功能:
紅外線接收器編號 最左邊接腳 中間接腳 最右邊接腳
VS 1838B 接地 電源 訊號輸出
PNA4602 接地 電源 訊號輸出
TSOP4836/ SFH5110 訊號輸出 接地 電源
TSOP1836/NJK61H380 訊號輸出 接地 電源
TSOP1736/SFH506/TFMS5360 接地 電源 訊號輸出
SFH505A 電源 接地 訊號輸出
IS1U60 訊號輸出 接地 電源
PIC120435 訊號輸出 接地 電源
18-4 Raspberry Pi 超炫專案與完全實戰
只要確定是 IR 紅外線遙控器就可使用在本章實驗,如果不確定的
話,可以把家中所有的遙控器都準
備好,到時候只要經過本專案測試
之後,如果可以讀出遙控器編碼的
話,那就是 IR紅外線遙控器。
圖 18-3 紅外線遙控器的外型
實驗硬體設備
本實驗需要以下的硬體:
Raspberry Pi板子
麵包板
一個 IR receiver
一個 IR遙控器
接線
本實驗需要以下的軟體:
Python
Python GPIO函式庫
實驗接線
Raspberry Pi 接腳 元件接腳
接腳 24紅外線接收器 紅外線接收器
訊號輸出接腳
5V(接腳 2) 紅外線接收器
電源接腳
GND(接腳 6) 紅外線接收器
接地接腳
Chapter 18 遙控電器開關 18-5
圖 18-4 紅外線遙控器接收器連結到樹莓派的線路
再次提醒不同的 IR 接收器的接腳都不太一樣,但都是接到樹莓派的電源、接地和接腳 24。
實驗步驟
Step 1 更新安裝軟體
透過以下指令,更新安裝軟體:
$sudo apt-get update $sudo apt-get upgrade
這是用來更新安裝程式的設定。
圖 18-5 更新安裝軟體
Step 2 下載 Python和 GPIO安裝相關的程式
安裝相關的程式和工具:
$sudo apt-get install python-dev $sudo apt-get install python-rpi.gpio
18-6 Raspberry Pi 超炫專案與完全實戰
Step 3 請打開編輯程式輸入以下的程式碼
接下來我們就需要撰寫 Python的程式語言,用來顯示出遙控器按鍵按下去
的訊號。在有機個方法可以使用,有人會推薦使用 LIRC的函式庫來處理遙
控器的動作和反應,但是考量到之後我們會集合其它的硬體,所以這一個
章節我們就使用 Python的程式語言,來達到目的。
$sudo nano irread.py
範例程式:sample\ch20_IRread\irread.py
01 #!/usr/bin/env python 02 # author: Powen Ko 03 import time 04 import RPi.GPIO as GPIO 05 GPIO.setmode(GPIO.BOARD) 06 GPIO.setwarnings(False) # 不要顯示警告訊息
07 GPIO_ECHO = 24 08 print "IR Signal" 09 GPIO.setup(GPIO_ECHO,GPIO.IN) # 設定接腳
10 11 start=0 12 stop=0 13 while True: 14 start = time.time() 15 duringDown=start-stop; 16 while GPIO.input(GPIO_ECHO)==0: 17 start = time.time() 18 19 while GPIO.input(GPIO_ECHO)==1: 20 stop = time.time() 21 22 #計算波型的時間
23 duringUp = stop-start 24 info = "Up:%7.f" % (duringUp *100000) + ",Down:%7.f" % (duringDown*100000) 25 print info 26 if duringUp>0.1: 27 print("------------------") 28 # 離開並恢復接腳
29 GPIO.cleanup()
程式解說
第 1行:這是執行環境的定義檔,到時候 Python程式是放在哪裡的路徑。
Chapter 18 遙控電器開關 18-7
第 2行:註解的寫法,前面加個 # 就可以成為註解。
第 7,9行:設定接腳 24為輸入接腳
第 16-17行:等待接腳變成高電位。
第 19-20行:等待接腳變成低電位。
第 23行:計算接腳的高電位的時間。
第 24行:顯示資料。
完成後請按下 Ctrl + O做出儲存,並按下 Ctrl + X離開文字編輯工具 nano。
Step 4 執行和測試
將其他硬體接到樹莓派上並且準備好遙控器,然後執行以下指令:
$ sudo python irread.py
把遙控器對準 IR接收器,並且按下遙控器上面的按鈕,就會顯示出訊號。
執行結果
執行這個專案時,除了執行程式之外,還需要把
遙控器對準紅外線接收器,並且按下按鍵,如果
看到畫面上顯示出一連串的數字,那就是紅外線
接收器所收到的遙控器按鍵的訊號。建議先把其
中幾個遙控器按鍵記錄下來,因為下一個專案就
會使用到。
圖 18-6 紅外線接收器所接收到的訊號
18-8 Raspberry Pi 超炫專案與完全實戰
教學影片
完整的影片請參考光碟中的 RaspberryPi_IR_Read_Signal。
補充資料
對 C語言熟悉的開發者,可以使用一個處理遙控器相當普遍的函式庫 LIRC,來處理遙控器的按鍵反應和工作。
圖 18-7 C 語言的遙控器函式庫 LIRC
Chapter 18 遙控電器開關 18-9
18.2 遙控器控制樹莓派上的 LED 燈開關
實驗目的
本實驗接續着上一個章節,會把剛剛所讀到的遙控器訊號,加以判斷來確認玩家所
按下的是哪一個按鍵後,再來調整 LED 燈的明亮。本實驗的挑戰在於,一般的紅外線遙控器即使是同一個按鍵,每次送出來的訊號都會有誤差,所以在開發程式的
時候需要將這些問題排除。還有不同型號的遙控器所送出來的訊號也都不一樣,到
時候請依照實際的遙控器,再把資料稍微做調整就可正常運作。
硬體設備介紹
同上一章節。
實驗硬體設備
本實驗需要以下的硬體:
Raspberry Pi板子
麵包板
一個 IR receiver
一個 IR 遙控器
LED燈 × 2
接線
本實驗需要以下的軟體:
Python
Python GPIO函式庫
18-10 Raspberry Pi 超炫專案與完全實戰
實驗接線
Raspberry Pi 接腳 元件接腳
接腳 24 紅外線接收器
訊號輸出接腳
5V(接腳 2) 紅外線接收器
電源接腳
GND(接腳 6) 紅外線接收器
接地接腳,第一個 LED燈的短腳,第二個 LED燈的短腳
接腳 23 第一個 LED燈的長腳
接腳 24 第二個 LED燈的長腳
圖 18-8 紅外線遙控器接收器連結到樹莓派的線路
實驗步驟
本實驗是由「使用樹莓派顯示紅外線遙控器的訊號」實驗延伸而來,需要先完成本
書章節的:
使用樹莓派顯示紅外線遙控器的訊號
Chapter 18 遙控電器開關 18-11
Step 1 請整理出遙控器四個按鍵的訊號
請依照上一個專案,把遙控器四個按鍵的訊號整理出來,並且透過 Python
的 array的方法排列。
Step 2 請打開編輯程式輸入以下的程式碼:
$sudo nano irled.py
範例程式:sample\ch20-IRLED\ir2led.py
01 #!/usr/bin/env python 02 # author: Powen Ko 03 import time 04 import RPi.GPIO as GPIO 05 KeyCurrent=range(100) 06 i=0 # 遙控器按鈕的訊號
07 key2=[446, 167, 29, 82, 29, 84, 26, 85, 37, 78, 27, 84, 08 25, 88, 32, 81, 38, 77, 163, 65, 161, 52, 158, 57, 09 168, 54, 162, 57, 162, 50, 163, 56, 157, 65, 51, 53, 10 55, 48, 46, 58, 162, 56, 162, 49, 29, 87, 50, 49, 11 52, 62, 159, 57, 165, 48, 165, 52, 19, 98, 54, 63, 12 160, 49, 166, 50, 171, 50,4001, 61, 221, 69]; 13 key4=[445, 152, 22, 89, 26, 87, 34, 77, 42, 77, 32, 82, 14 33, 79, 38, 75, 29, 85, 155, 69, 166, 52, 165, 53, 15 162, 61, 165, 52, 141, 86, 163, 52, 166, 60, 49, 50, 16 556, 58, 50, 5, 166, 49, 47, 57, 50, 59, 58, 51, 17 54, 57, 166, 56, 162, 49, 165, 52, 43, 71, 167, 58, 18 164, 50, 163, 52, 166, 62] 19 key6=[447, 157, 29, 83, 31, 81, 34, 82, 27, 79, 43, 77, 20 24, 87, 29, 84, 34, 78, 149, 80, 148, 80, 140, 85, 21 144, 78, 166, 57, 169, 55, 165, 61, 163, 50, 50, 56, 22 165, 48, 48, 60, 166, 51, 163, 51, 53, 52, 166, 48, 23 55, 53, 166, 49, 52, 57, 164, 49, 54, 57, 50, 51, 24 158, 72, 48, 61, 165, 50,4003, 56, 223, 63] 25 key8=[443, 161, 29, 82, 34, 78, 30, 85, 32, 83, 36, 76, 26 22, 91, 24, 87, 37, 78, 167, 53, 164, 57, 165, 50, 27 164, 61, 161, 63, 163, 51, 168, 52, 166, 51, 50, 63, 28 169, 50, 46, 50, 53, 55, 161, 49, 57, 58, 165, 53, 29 53, 52, 166, 56, 52, 56, 164, 59, 168, 51, 49, 58, 30 166, 49, 44, 57, 167, 51] 31 32 keys=[key2,key4,key6,key8] 33 GPIO.setmode(GPIO.BOARD) 34 GPIO.setwarnings(False) 35 GPIO_ECHO = 24 36 print "IR Signal" 37
18-12 Raspberry Pi 超炫專案與完全實戰
38 #函數 -用來判斷用戶按下哪個按鈕
39 def Funcheck(a,b,i): 40 if (a-b)>0.1: #判斷是否傳送結束
41 i=0 42 43 44 for j1 in range(len(keys)): 45 isThisKey=True 46 for j2 in range(5,len(keys[j1])-4): 47 value=keys[j1][j2] 48 currentValue=KeyCurrent[j2] 49 rangeValue=100 # 注意:請依照實際狀況調整此變數
50 if ((currentValue-rangeValue)<value and 51 (currentValue+rangeValue)>value)==False : 52 isThisKey=False 53 # print " error:j1=%d" % j1 + " j2=%d" %j2 + 54 " currentValue=%d" %currentValue+ " value=%d "%value 55 break 56 if isThisKey==True: 57 print "Get it key%d" % j1 # 顯示用戶按下哪一個按鈕
58 if j1==0: 59 GPIO.output(21,True) 60 elif j1==1: 61 GPIO.output(21,False) 62 elif j1==2: 63 GPIO.output(22,True) 64 elif j1==3: 65 GPIO.output(22,False) 66 i=0 # 清除記錄
67 for j3 in range(len(KeyCurrent)): 68 KeyCurrent[j3]=0 69 70 return i 71 72 73 74 # 主程式 設定 GPIO
75 GPIO.setup(GPIO_ECHO,GPIO.IN) 76 GPIO.setup(21,GPIO.OUT) 77 GPIO.setup(22,GPIO.OUT) 78 start=0 79 stop=0 80 while True: 81 start = time.time() 82 duringDown=start-stop; 83 84 while GPIO.input(GPIO_ECHO)==0: 85 start = time.time() 86
Chapter 18 遙控電器開關 18-13
87 while GPIO.input(GPIO_ECHO)==1: 88 stop = time.time() 89 i=Funcheck(stop,start,i) 90 91 duringUp = stop-start 92 KeyCurrent[i]=(duringUp *100000) 93 i=i+1 94 KeyCurrent[i]=(duringDown*100000) 95 i=i+1 96 i=Funcheck(stop,start,i) 97 98 # 結束離開程式並還原 GPIO 的設定
99 GPIO.cleanup()
程式解說
第 1行:這是執行環境的定義檔,定義 Python程式放在哪一個路徑。
第 2行:註解的寫法,前面加個 # 就可以成為註解。
第 39-70行:Funcheck此函數式用來判斷,用戶所按下的按鍵,是否為這四個按鈕。
第 46 行:這個迴圈的判斷式,為何不是從第一個判斷到最後一個呢?這是因為最前面和最後的訊號是等待的用戶按下按鈕的時間。
第 56-70行:判斷出遙控器的按鍵之後,所要作出的反應。
接下來就需要撰寫 Python 的程式語言,其中部分的矩陣資料,會依照實際遙控器的按鍵訊號不同,需要做些調整。
第一個的部分是在程式的第 7-30行,需要一張實際的遙控器按鍵,將所偵測出的訊號加以調整。
程式的第 49 行,請依照按鍵的數字,調整這個變數的大小,原則上當變數越小,就越精準。
程式的第 40 行,這個變數的資料是用來決定,等待多久如果沒有反應,就算是遙控器的訊號結束。
完成後請按下 Ctrl + O儲存,並按下 Ctrl + X離開文字編輯工具 nano。
18-14 Raspberry Pi 超炫專案與完全實戰
Step 3 執行和測試
將其他硬體接到樹莓派上並且準備好遙控器,然後執行以下指令:
$ sudo python ir2led.py
把遙控器對準 IR接收器,並且按下遙控器上面的按鈕,就會顯示出訊號。
執行結果
執行這個專案時,只要用戶在遙控器按下自訂按鈕時,就會讓 LED 燈做開或關的反應。
圖 18-9 實際執行結果圖
教學影片
完整的影片請參考光碟中的 18-2_RaspberryPi_IR_CheckKeys.mp4。判斷用戶按下哪一個按鍵,而使用遙控器來開和關 LED 燈的範例,完整的影片請參考光碟中的18-2_RaspberryPi_IR_CheckKeys_LEDOnOff.mp4。