14
遙控電器開關 18.1 使用樹莓派顯示紅外線遙控器的訊號 18.2 遙控器控制樹莓派上的 LED 燈開關

遙控電器開關epaper.gotop.com.tw/PDFSample/AEH002500.pdfChapter 18 遙控電器開關 18-3 實驗硬體設備 遙控器的接收端稱為receiver,IR receiver 的外型如下,在電子零件都可以購買到。

  • Upload
    dokhanh

  • View
    239

  • Download
    3

Embed Size (px)

Citation preview

Page 1: 遙控電器開關epaper.gotop.com.tw/PDFSample/AEH002500.pdfChapter 18 遙控電器開關 18-3 實驗硬體設備 遙控器的接收端稱為receiver,IR receiver 的外型如下,在電子零件都可以購買到。

遙控電器開關

18.1 使用樹莓派顯示紅外線遙控器的訊號

18.2 遙控器控制樹莓派上的 LED 燈開關

Page 2: 遙控電器開關epaper.gotop.com.tw/PDFSample/AEH002500.pdfChapter 18 遙控電器開關 18-3 實驗硬體設備 遙控器的接收端稱為receiver,IR receiver 的外型如下,在電子零件都可以購買到。

18-2 Raspberry Pi 超炫專案與完全實戰

18.1 使用樹莓派顯示紅外線遙控器的訊號

實驗介紹

這個專案將會介紹如何自製一個遙控器。為了達成這個目的,需要了解以下的知識:

樹莓派如何接收遙控器的訊號

了解遙控器的原理

首先介紹遙控器,家中可能有很多的遙控器,不管是開門的遙控器、看電視的遙控

器,現在連窗簾、冷氣機都有遙控器,本實驗會介紹如何將樹莓派透過遙控器,做

互相溝通和聯絡,有這樣的技術就更可以把玩家的動作和需求,在第一時間傳遞給

樹莓派,達到彼此之間的互動,並把比較複雜的計算,交給樹莓派這個小電腦,做

出合適的反應與處理動作。

遙控器是由發射器、接收器和微處理器組成。接收器和微處理器部分都在家電主機

上,例如電視機。遙控器產生不同的編碼脈衝,以決定不同的按鍵,而遙控器輸出

各種以紅外線為媒介的控制脈衝訊號,這些脈衝是特定的樣式,當接收器收到之

後,將紅外線訊號進行放大、限幅、檢波、整形後送到微處理器,微處理器根據不

同的訊號,再做不同按鍵的反應。需注意的是,根據發射不同編碼指令脈衝設計成

相應的控制功能,這些功能是生產廠商預先設計好的,再燒錄在遙控器裡面,所以

各種遙控器是不能通用的,而且各家廠商會刻意做不同的調整,以免互相干擾。

發送和接收端之間的方法,目前有兩種,分別是:

IR紅外線

RF(Radio Frequency)射頻

要知道遙控器是哪一種類,可以用照相機的預覽鏡頭,對著遙控器,按下時發射端

可以看到這個紅外線的亮度,但一般肉眼是看不到的。而另外一種 RF(Radio Frequency)射頻,就會看不到紅外線燈光,這是因為 RF 射頻遙控器是用頻率來做到這些事情,所以它的範圍比較廣,並可以穿越阻礙物,不會妨礙到資料傳輸。

實驗目的

透過 IR receiver接收遙控器送出來的資料,並且顯示在螢幕上。

Page 3: 遙控電器開關epaper.gotop.com.tw/PDFSample/AEH002500.pdfChapter 18 遙控電器開關 18-3 實驗硬體設備 遙控器的接收端稱為receiver,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 訊號輸出 接地 電源

Page 4: 遙控電器開關epaper.gotop.com.tw/PDFSample/AEH002500.pdfChapter 18 遙控電器開關 18-3 實驗硬體設備 遙控器的接收端稱為receiver,IR receiver 的外型如下,在電子零件都可以購買到。

18-4 Raspberry Pi 超炫專案與完全實戰

只要確定是 IR 紅外線遙控器就可使用在本章實驗,如果不確定的

話,可以把家中所有的遙控器都準

備好,到時候只要經過本專案測試

之後,如果可以讀出遙控器編碼的

話,那就是 IR紅外線遙控器。

圖 18-3 紅外線遙控器的外型

實驗硬體設備

本實驗需要以下的硬體:

Raspberry Pi板子

麵包板

一個 IR receiver

一個 IR遙控器

接線

本實驗需要以下的軟體:

Python

Python GPIO函式庫

實驗接線

Raspberry Pi 接腳 元件接腳

接腳 24紅外線接收器 紅外線接收器

訊號輸出接腳

5V(接腳 2) 紅外線接收器

電源接腳

GND(接腳 6) 紅外線接收器

接地接腳

Page 5: 遙控電器開關epaper.gotop.com.tw/PDFSample/AEH002500.pdfChapter 18 遙控電器開關 18-3 實驗硬體設備 遙控器的接收端稱為receiver,IR receiver 的外型如下,在電子零件都可以購買到。

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

Page 6: 遙控電器開關epaper.gotop.com.tw/PDFSample/AEH002500.pdfChapter 18 遙控電器開關 18-3 實驗硬體設備 遙控器的接收端稱為receiver,IR receiver 的外型如下,在電子零件都可以購買到。

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程式是放在哪裡的路徑。

Page 7: 遙控電器開關epaper.gotop.com.tw/PDFSample/AEH002500.pdfChapter 18 遙控電器開關 18-3 實驗硬體設備 遙控器的接收端稱為receiver,IR receiver 的外型如下,在電子零件都可以購買到。

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 紅外線接收器所接收到的訊號

Page 8: 遙控電器開關epaper.gotop.com.tw/PDFSample/AEH002500.pdfChapter 18 遙控電器開關 18-3 實驗硬體設備 遙控器的接收端稱為receiver,IR receiver 的外型如下,在電子零件都可以購買到。

18-8 Raspberry Pi 超炫專案與完全實戰

教學影片

完整的影片請參考光碟中的 RaspberryPi_IR_Read_Signal。

補充資料

對 C語言熟悉的開發者,可以使用一個處理遙控器相當普遍的函式庫 LIRC,來處理遙控器的按鍵反應和工作。

圖 18-7 C 語言的遙控器函式庫 LIRC

Page 9: 遙控電器開關epaper.gotop.com.tw/PDFSample/AEH002500.pdfChapter 18 遙控電器開關 18-3 實驗硬體設備 遙控器的接收端稱為receiver,IR receiver 的外型如下,在電子零件都可以購買到。

Chapter 18 遙控電器開關 18-9

18.2 遙控器控制樹莓派上的 LED 燈開關

實驗目的

本實驗接續着上一個章節,會把剛剛所讀到的遙控器訊號,加以判斷來確認玩家所

按下的是哪一個按鍵後,再來調整 LED 燈的明亮。本實驗的挑戰在於,一般的紅外線遙控器即使是同一個按鍵,每次送出來的訊號都會有誤差,所以在開發程式的

時候需要將這些問題排除。還有不同型號的遙控器所送出來的訊號也都不一樣,到

時候請依照實際的遙控器,再把資料稍微做調整就可正常運作。

硬體設備介紹

同上一章節。

實驗硬體設備

本實驗需要以下的硬體:

Raspberry Pi板子

麵包板

一個 IR receiver

一個 IR 遙控器

LED燈 × 2

接線

本實驗需要以下的軟體:

Python

Python GPIO函式庫

Page 10: 遙控電器開關epaper.gotop.com.tw/PDFSample/AEH002500.pdfChapter 18 遙控電器開關 18-3 實驗硬體設備 遙控器的接收端稱為receiver,IR receiver 的外型如下,在電子零件都可以購買到。

18-10 Raspberry Pi 超炫專案與完全實戰

實驗接線

Raspberry Pi 接腳 元件接腳

接腳 24 紅外線接收器

訊號輸出接腳

5V(接腳 2) 紅外線接收器

電源接腳

GND(接腳 6) 紅外線接收器

接地接腳,第一個 LED燈的短腳,第二個 LED燈的短腳

接腳 23 第一個 LED燈的長腳

接腳 24 第二個 LED燈的長腳

圖 18-8 紅外線遙控器接收器連結到樹莓派的線路

實驗步驟

本實驗是由「使用樹莓派顯示紅外線遙控器的訊號」實驗延伸而來,需要先完成本

書章節的:

使用樹莓派顯示紅外線遙控器的訊號

Page 11: 遙控電器開關epaper.gotop.com.tw/PDFSample/AEH002500.pdfChapter 18 遙控電器開關 18-3 實驗硬體設備 遙控器的接收端稱為receiver,IR receiver 的外型如下,在電子零件都可以購買到。

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

Page 12: 遙控電器開關epaper.gotop.com.tw/PDFSample/AEH002500.pdfChapter 18 遙控電器開關 18-3 實驗硬體設備 遙控器的接收端稱為receiver,IR receiver 的外型如下,在電子零件都可以購買到。

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

Page 13: 遙控電器開關epaper.gotop.com.tw/PDFSample/AEH002500.pdfChapter 18 遙控電器開關 18-3 實驗硬體設備 遙控器的接收端稱為receiver,IR receiver 的外型如下,在電子零件都可以購買到。

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。

Page 14: 遙控電器開關epaper.gotop.com.tw/PDFSample/AEH002500.pdfChapter 18 遙控電器開關 18-3 實驗硬體設備 遙控器的接收端稱為receiver,IR receiver 的外型如下,在電子零件都可以購買到。

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。