2013年4月9日 星期二

Raspberry Pi 硬體控制-- Python 語言篇


Raspberry Pi 上面擁有26 pin 的 GPIO 接腳,我們可以使用這些接腳來進行硬體控制。目前用來控制Raspberry Pi 上的GPIO網路資源中常見使用有 PythonJava以及 C語言,其他如Ruby、Perl、PHP等在網路上也有人寫出函式庫提供使用。另外也有人直接使用Shell script來寫GPIO控制程式。


Raspberry Pi 上面的 26 pin GPIO 接腳定義如下圖:
(資料來源:Raspberry Pi and Breadboard)

需要注意的是Raspberry Pi 的GPIO :
 1.有電流輸出的限制;每個接腳輸出最大為16mA,全部接腳同時最大輸出為50mA,所以通常會透過電流放大電路來驅動裝置建議不要直接驅動負載。
 2.GPIO為3.3V準位加上沒有保護電路;千萬不要輸入5V電壓到接腳上,保護電路部分通常做法是接一個暫存器 (Register)或緩衝器(Buffer)來做緩衝。
 3.GPIO不是即插即用的介面;除了要非常小心避免電路接錯外,再開啟Raspberry Pi 電源情況下不要隨意增加或修改電路。

【免責聲明】:本實作有可能會造成Raspberry Pi 裝置損毀,恐危及到設備的保固或維修,請評估是否可以自行承擔相關風險,如無把握請勿嘗試將不負任何責任。

以下是實作:

事前準備:
Win8 專業版
Raspberry Pi rev 2 Model B 512MB
SanDisk Ultra 16GB Class10 SD card
麵包版、330歐姆電阻 x1 、紅色LED x1
1K歐姆電阻 x1、10K歐姆電阻 x1、4P TACT 開關 x1


電路圖:


註 : 開關部分 PullHigh 或 PullDown選擇其一即可,其中R1功能為上/下拉電阻;R2功能為避免不小心短路的保護電阻,C1為消除彈跳用(5RC=10mS~20mS)。

實作部分,我就懶點用麵包板來做沒有保護電路:

步驟:
實作分為三個部分,第一部分為Output實作是點亮LED;第二部分為Input實作是偵測按鍵輸入;第三部分則結合第一及第二步驟按下按鍵就點亮LED。步驟說明如下:

第一部分為Output -- HelloLED.py
1.按圖施工將電路先佈置好,記得開機後不要隨意插拔電路元件。
2.確定開機完成,在Windows作業系統上透過遠端連線軟體(Putty)連線到Raspberry Pi
3.新版本的Raspbian作業系統已經內建RPi.GPIO這是針對Python的GPIO函式庫。
4.用文字編輯器(nano或vi)將下列Python程式碼命名為HelloLED.py

#!/usr/bin/python
import RPi.GPIO as GPIO
import time

# Use physical pin numbers
GPIO.setmode(GPIO.BOARD)
# Set up header pin 12 (GPIO18) as an input
ledPin = 12
print "Setup Pin 12 is OutPut..."
GPIO.setup(ledPin, GPIO.OUT)

print "Starting... "
while True:
  print "Set Output False"
  GPIO.output(ledPin, False)
  time.sleep(1)
  print "Set Output True"
  GPIO.output(ledPin, True)
  time.sleep(1)


5.將上述檔案存檔離開後,用sudo python HelloLED.py指令執行。
  $ sudo python HelloLED.py

6.結果:
程式透過一個無窮迴圈在每隔一秒鐘進行LED閃爍,欲離開程式按下CTRL-C即可。


第二部分為Input -- HelloButtons.py
1.用文字編輯器(nano或vi)將下列Python程式碼命名為 HelloButtons.py

#!/usr/bin/python
import RPi.GPIO as GPIO
import time

# Use physical pin numbers
GPIO.setmode(GPIO.BOARD)
# Set up header pin 22 (GPIO25) as an input
buttonPin = 22
print "Setup Pin 22"
GPIO.setup(buttonPin, GPIO.IN)
prev_input = 0

while True:
  #take a reading
  input = GPIO.input(buttonPin)
  #if the last reading was low and this one high, print
  if ((not prev_input) and input):
    print("Button pressed")
  #update previous input
  prev_input = input
  #slight pause to debounce
  time.sleep(0.05)


2.將上述檔案存檔離開後,用sudo  HelloButtons.py指令執行。
  $ sudo python  HelloButtons.py

3.結果:
程式透過一個無窮迴圈在每隔0.05秒鐘偵測按鍵是否按下,欲離開程式按下CTRL-C即可。

第三部分按下按鍵就點亮LED -- HelloTest.py
1.用文字編輯器(nano或vi)將下列Python程式碼命名為 HelloTest.py

#!/usr/bin/python
import RPi.GPIO as GPIO
import time

#Alerts OFF
GPIO.setwarnings(False)

# Use physical pin numbers
GPIO.setmode(GPIO.BOARD)
# Set up header pin 12 (GPIO18) as an input
print "Setup Pin 12 is Output..."
ledPin = 12
GPIO.setup(ledPin, GPIO.OUT)
# Set up header pin 22 (GPIO25) as an input
buttonPin = 22
print "Setup Pin 22 is Input.."
GPIO.setup(buttonPin, GPIO.IN)
prev_input = 1
i = 0

while True:
  #take a reading
  input = GPIO.input(buttonPin)
  #if the last reading was low and this one high, print
  if ((not prev_input) and input):
    i += 1
    print("Button pressed ("+str(i)+")")
    GPIO.output(ledPin, True)
    time.sleep(0.1)
    GPIO.output(ledPin, False)
  #update previous input
  prev_input = input
  #slight pause to debounce
  time.sleep(0.05)


2.將上述檔案存檔離開後,用sudo HelloTest.py 指令執行。
  $ sudo python  HelloTest.py

3.結果:
程式透過一個無窮迴圈在每隔0.05秒鐘偵測按鍵是否按下,當按下按鈕後點亮LED 0.1秒,欲離開程式按下CTRL-C即可。


上述三個程式主要是靠下列四個指令的功能:
GPIO.setmode  --> 指定Board Pin 和 BCM GPIO編號,例如程式中點亮LED的接腳實體上是接到板子的 pin 12,這指的是Board Pin ;對應到的BCM GPIO為 pin 18 。這是兩者差別,請參考下表。
(出處:Raspberry Pi GPIO Pins @ Drogon)

GPIO.setup --> 這個部分就是指定Pin腳為輸入/輸出狀態。
GPIO.output -->當上述指定為輸出時狀態,這個指令用來定義高/低電位。
GPIO.input --> 當指定為輸入狀態時,這個指令用來監聽是否有輸入訊號。

後記:
Raspberry Pi 在GPIO硬體控制部分,通常使用 Python、Java及C語言,各有各的好處一般以選擇自己覺得方便或熟悉的語言即可,Python不需要編譯寫好程式就可以執行;Java則是比較普遍都會的語言;如果需要反應速度快的話 C 語言就很適合了(這部分請參考Benchmarking Raspberry Pi GPIO Speed)。

參考資料:
1. RPi.GPIO -- Python  Language
https://pypi.python.org/pypi/RPi.GPIO
http://www.raspberrypi-spy.co.uk/2012/05/install-rpi-gpio-python-library/ (安裝,新版Raspbian作業系統已經內建)

2. Pi4J -- Java  Language
http://pi4j.com/
http://pi4j.com/install.html  (安裝)

3. WiringPi -- C Language
https://projects.drogon.net/raspberry-pi/wiringpi/

4. github -- WiringPi
https://github.com/wiringPi

5.Got my Raspberry Pi!
http://robig.net/blog/blog/permalink/got-my-raspberry-pi/

6.Raspberry Pi and Breadboard
http://www.doctormonk.com/2013/02/raspberry-pi-and-breadboard-raspberry.html

7.Understanding Outputs
http://www.thebox.myzen.co.uk/Raspberry/Understanding_Outputs.html

8. A Buffer Board
http://www.thebox.myzen.co.uk/Raspberry/Buffer_Board.html

9. Raspberry Pi GPIO Pins @ Drogon
https://projects.drogon.net/raspberry-pi/wiringpi/pins/

10.Benchmarking Raspberry Pi GPIO Speed
http://codeandlife.com/2012/07/03/benchmarking-raspberry-pi-gpio-speed/


==============延伸閱讀=====================
1. Raspberry Pi 第一次接觸
http://cheng-min-i-taiwan.blogspot.tw/2013/02/raspberry-pi.html

2.Raspberry Pi 網路設定
http://cheng-min-i-taiwan.blogspot.tw/2013/02/raspberry-pi_23.html

3.Raspberry Pi 應用之Windows檔案伺服器
http://cheng-min-i-taiwan.blogspot.tw/2013/02/raspberry-pi-windows.html

4.Raspberry Pi 應用之DLNA影音伺服器
http://cheng-min-i-taiwan.blogspot.tw/2013/02/raspberry-pi-dlna.html

5.Raspberry Pi 硬體控制-- Python 語言篇
http://cheng-min-i-taiwan.blogspot.tw/2013/04/raspberry-pi-python.html

6.Raspberry Pi 硬體控制-- C 語言篇
http://cheng-min-i-taiwan.blogspot.tw/2013/04/raspberry-pi-c.html

7.Raspberry Pi 整合 GPS 模組教學
http://cheng-min-i-taiwan.blogspot.tw/2014/03/raspberry-pi-gps.html

8.Raspberry Pi 2 Model B 使用心得
http://www.cheng-min-i-taiwan.blogspot.tw/2015/02/raspberry-pi-2-model-b.html

9.Raspberry Pi 藍牙4.0應用之iBeacon 發射器
http://www.cheng-min-i-taiwan.blogspot.tw/2015/03/raspberry-pi-40ibeacon.html

10.Raspberry Pi安裝MQTT之應用 -- Android訊息推播
http://www.cheng-min-i-taiwan.blogspot.tw/2015/03/raspberry-pimqtt-android.html

11. Raspberry Pi安裝MQTT之IoT應用 -- Android示範
http://cheng-min-i-taiwan.blogspot.tw/2015/03/raspberry-pimqttiot-android.html

12.Raspberry Pi 3 Model B 使用心得
http://cheng-min-i-taiwan.blogspot.tw/2016/03/raspberry-pi-3-model-b.html

3 則留言:

  1. 請問您有沒有能力將 usb webcam 的驅動程式uvc 灌進去呢

    我目前有niche市場 的商業需求

    andyzhengster@gmail.com

    FEBON.blogspot.com

    回覆刪除
  2. 1. Raspberry Pi 已經可以買到camera模組,你可以試試看:
    http://www.raspberrypi.org/camera

    2.如果你要用webcam的話,只要有支援V4L2(Video4Linux),Kernel就有內建驅動你可以到下列網址查看你購買的webcam有無支援:http://www.ideasonboard.org/uvc/
    如果有的話,你網路搜尋一下Linux webcam有不少文章可以參考實作。

    回覆刪除
  3. 我想用raspberry pi 2 做一個用電腦控制的開關(在麵包板上),甚至可以遠端遙控,要用python嗎?或著是其他東西,請教一下~~

    回覆刪除