2012年12月5日 星期三

Raspberry Pi GPIO 介紹及基本使用

開始要玩 gpio 時,才發現買的外殼不合,要拆開蓋子才能插排線,所以若有買殼時要注意一下,若不合不如不要用外殼。不過,最近看新版的壓克力殼有在上方開一條縫能走 gpio 排線就是。最好買只有上下二片的外殼最適合玩 gpio(註1)。

樹莓派連麵包板的 gpio 排線,可以拿現成的磁碟機或硬碟排線來改,不過要注意,有些排線中間是有跳過的(註2)。小弟本身是用硬碟排線來改,花了些錢買一堆小零件,加工了好幾個小時,終於做好,結果拍賣上賣的一條也不過 70 元,又精緻又美觀(註3),光買零件就花了大概 30 元,弄了好久,後來還發現有時會接觸不良,實在不划算,因此建議直接買現成的就好。

一開始看文件時,由於型號分成 model A、model B,然後版本又分 rev 1、rev 2,版本間的 port 又有小部份修改,有些文章寫出要接在哪個 port,甚至連圖都有,但麵包板插好還是不會動,而且很多網頁都有提到要小心,否則會將 Raspberry Pi 給燒掉,所以文件 k 到第三天後才敢開始在麵包板上插零件。而且一開始還鬼打牆真的弄錯,上下顛倒,還好沒燒掉。最主要不要去接到 5V 就好。
建議先做個保護電路來用(註4),否則燒掉了可惜,但是,完全看不懂啦,只好小心點就是。

gpio 腳位:
P1: The Main GPIO connector:

wiringPi Pin BCM GPIO Name Header Name BCM GPIO wiringPi Pin
– – 3.3v 1 | 2 5v – –
8 R1:0/R2:2 SDA0 3 | 4 DNC – –
9 R1:1/R2:3 SCL0 5 | 6 0v – –
7 4 GPIO7 7 | 8 TxD 14 15
– - DNC 9 | 10 RxD 15 16
0 17 GPIO0 11 | 12 GPIO1 18 1
2 R1:21/R2:27 GPIO2 13 | 14 DNC – –
3 22 GPIO3 15 | 16 GPIO4 23 4
– – DNC 17 | 18 GPIO5 24 5
12 10 MOSI 19 | 20 DNC – –
13 9 MISO 21 | 22 GPIO6 25 6
14 11 SCLK 23 | 24 CE0 8 10
– – DNC 25 | 26 CE1 7 11


P5: The auxilliary GPIO connector on Rev. 2 boards:

wiringPi Pin BCM GPIO Name Header Name BCM GPIO wiringPi Pin

– – 5v 1 | 2 3.3v – –
17 28 GPIO8 3 | 4 GPIO9 29 18
19 30 GPIO10 5 | 6 GPIO11 31 20
– – 0v 7 | 8 0v – –
表1

其中 DNC -> Do Not Connect 接腳就是不要使用的意思,因為未來可能會改變配置。

P1 總共有 26 支腳,有 8 個 GPIO port,其他的有 i2c, UART, SPI, 3.3V, 5V, GND 等等。

其中 2 個 5V、2 個 3.3 V、5 個 GND,除了這 9 個以外,其他都可以設定成 GPIO 來使用,加起來共有 17 個。

rev 2 則多加了 P5,只要焊上針腳,又多了4個 gpio 可使用,總共 21 個。


如何控制 gpio port

- 從命令列直接控制
- 使用 WiringPi
- 使用 python
- 使用 Webiopi
- 多種語言範例(註5)


從命令列操作 :


$ ls -l /sys/class/gpio/
--w------- 1 root root 4096 Nov 30 19:37 export
lrwxrwxrwx 1 root root 0 Nov 30 19:34 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
--w------- 1 root root 4096 Nov 30 19:34 unexport

假設要使用 gpio17,送出一個 port number 到 export 即可起始這個 port
$ sudo sh -c “echo 17 > /sys/class/gpio/export”

由於使用到輸出入轉向,又用 sudo 的話,命令變得不易閱讀,所以乾脆切到 root 去
$ sudo su -

重覆剛才指令
# echo 17 > /sys/class/gpio/export

# ls -l /sys/class/gpio/
total 0
--w------- 1 root root 4096 Nov 30 19:37 export
lrwxrwxrwx 1 root root 0 Nov 30 19:38 gpio17 -> ../../devices/virtual/gpio/gpio17
lrwxrwxrwx 1 root root 0 Nov 30 19:34 gpiochip0 -> ../../devices/virtual/gpio/gpiochip0
--w------- 1 root root 4096 Nov 30 19:34 unexport
執行完就可看到多出一個 gpio17 連結

# ls -l /sys/class/gpio/gpio17/
total 0
-rw-r--r-- 1 root root 4096 Nov 30 19:58 active_low
-rw-r--r-- 1 root root 4096 Nov 30 19:58 direction
-rw-r--r-- 1 root root 4096 Nov 30 19:58 edge
drwxr-xr-x 2 root root 0 Nov 30 19:58 power
lrwxrwxrwx 1 root root 0 Nov 30 19:37 subsystem -> ../../../../class/gpio
-rw-r--r-- 1 root root 4096 Nov 30 19:37 uevent
-rw-r--r-- 1 root root 4096 Nov 30 19:58 value

顯示目前 gpio17 是輸入或輸出
# cat /sys/class/gpio/gpio17/direction
in

將方向改成輸出
# echo out > /sys/class/gpio/gpio17/direction

已改變為輸出
# cat /sys/class/gpio/gpio17/direction
out

顯示目前 gpio17 的值
# cat /sys/class/gpio/gpio17/value
0

更改 gpio17 的值
# echo 1 > /sys/class/gpio/gpio17/value

檢查看是否有改過
# cat /sys/class/gpio/gpio17/value
1


使用 WiringPi:

看過上面直接在 console 下指令由 /sys 對 gpio 做修改,是不是覺得滿麻煩的,所以有人寫出 Wiring 來簡化整個設定過程。

由於 gpio 編號並沒有按照順序排,跳來跳去的,初學者根本弄不清楚,常常會搞錯。
Wiring,原本是 Arduino 系統在用的,將 gpio 重新編號,由 0 開始,循序往上的命名方式的工具,好處是若哪天板子改版,gpio 編號有跳動,wiring 編號也是不變。

後來樹莓派出來後,移植到樹莓派的版本就叫 WiringPi。當然,也支援原本的編號方式。

網頁:
https://projects.drogon.net/raspberry-pi/wiringpi/

安裝:
https://projects.drogon.net/raspberry-pi/wiringpi/download-and-install/

$ tar xvf wiringPi.tgz
$ cd wiringPi
$ sudo ./build

可直接下載 tarball 安裝,完成後在命令列下就有 gpio 這指令可用。

由於使用及存取 gpio port 都必需有 root 權限,但 gpio 這指令有 setuid,所以用一般使用者來執行即可。

檢查這塊板子的版本是 rev 1 或 rev 2
$ gpio -v
gpio version: 1.4
Copyright (c) 2012 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

This Raspberry Pi is a revision 2 board.


$ gpio readall
+-----------------+--------+------------+-----------+
| wiringPi | GPIO | Name | Value |
+-----------------+--------+------------+-----------+
| 0 | 17 | GPIO 0 | Low |
| 1 | 18 | GPIO 1 | High |
| 2 | 27 | GPIO 2 | Low |
| 3 | 22 | GPIO 3 | Low |
| 4 | 23 | GPIO 4 | Low |
| 5 | 24 | GPIO 5 | Low |
| 6 | 25 | GPIO 6 | Low |
| 7 | 4 | GPIO 7 | High |
| 8 | 2 | SDA | High |
| 9 | 3 | SCL | High |
| 10 | 8 | CE0 | Low |
| 11 | 7 | CE1 | Low |
| 12 | 10 | MOSI | Low |
| 13 | 9 | MISO | Low |
| 14 | 11 | SCLK | Low |
| 15 | 14 | TxD | High |
| 16 | 15 | RxD | High |
+----------------+---------+------------+------------+
| 17 | 28 | GPIO 8 | Low |
| 18 | 29 | GPIO 9 | Low |
| 19 | 30 | GPIO10 | Low |
| 20 | 31 | GPIO11 | Low |
+----------------+---------+-------------+----------+

顯示所有 port 的目前狀況(板子上的 P1),0 - 16 共 17 port,最後面 4 個為 P5 (rev 2 才有) 在板子上 P1 的旁邊有 8 個小洞,要使用自己焊。聽說未來的板子,連現在的 P1 的 26 port 出廠都不會焊好,使用者買回家後,要直的、彎的接腳都可以自己來,以後要玩樹莓派 gpio 要先準備好烙鐵和吸鍚器了。

第一列為 wiring 的編號,第二列為 broadcom 的 BCM_GPIO 編號方式,第三列為原本每個 port 的名稱,最後一行為目前的值。

存取方式:(預設為 wiring 編號模式)
$ gpio read 0
0

以 BCM_GPIO 編號來讀取( -g):
$ gpio -g read 17
0

二個指令都讀取同一個 port

將 17 port mode 改成輸出
$ gpio -g mode 17 out

寫入:
$ gpio -g write 17 1

檢查值果然改變為 1
$ gpio -g read 17
1

好像沒參數可看目前是輸出或輸入,不過沒關係,每次要用前都直接先設定一次就好。



使用 python:

檢查看看 Python GPIO module for Raspberry Pi 有沒有安裝,若是官方的 rasbian 已經安裝好,其他的可能要檢查看看。

$ dpkg --list|grep gpio
ii python-rpi.gpio 0.4.1a-1 armhf Python GPIO module for Raspberry Pi
ii python3-rpi.gpio 0.4.1a-1 armhf Python 3 GPIO module for Raspberry Pi

python-rpi.gpio 為 python 2.6 及 2.7 版
python3-rpi.gpio 為 python 3.x 版


若沒有則手動安裝:
$ sudo apt-get install python-pip
$ sudo pip install rpi.gpio


範例: test.py
import RPi.GPIO as GPIO, time
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)

try:
while True:
GPIO.output(17, True)
time.sleep(2)

GPIO.output(17, False)
time.sleep(2)
except KeyboardInterrupt:
GPIO.cleanup()

執行:
$ sudo python test.py
執行後,GPIO 17 上的 led 就會閃二秒、滅二秒,一直重覆,按 Ctrl-C 結束程式。



使用 Webiopi:

http://code.google.com/p/webiopi/

下載並安裝:
$ tar xvf WebIOPi-0.5.1.tar.gz
$ cd WebIOPi-0.5.1
$ sudo ./setup.sh

執行
$ sudo /etc/init.d/webiopi start
$ sudo python -m webiopi [port]


開機就啟動:
$ sudo update-rc.d webiopi defaults


以瀏覽器開啟:
http://192.168.1.105:8000

預設帳號 "webiopi" 及密碼 "raspberry"


實作:


- 紅綠燈模擬

http://www.skpang.co.uk/blog/archives/656

$ wget http://skpang.co.uk/dl/traffic_light.py
由於 rev 1 和 rev 2 腳位有改變,所以這裡的 code 也要跟著改
$ vi traffic_light.py
第9 行 21 → 27 即可

$ chmod +x traffic_light.py
$ sudo ./traffic_light.py


- Ladder Game

http://www.youtube.com/watch?v=35YXhS-NfPM
https://projects.drogon.net/raspberry-pi/gpio-examples/ladder-game/

下載並編譯,不過系統上要有裝 wiringPi 才行
$ wget http://project-downloads.drogon.net/files/gpioExamples/ladder.c
$ cc -o ladder -Wall -I/usr/local/include -L/usr/local/lib ladder.c -lwiringPi -lm
$ sudo ./ladder




參考連結:


1. http://moebiuslinux.sourceforge.net/hardwarehacks/raspberry-pi-barebone-development-case/
2. http://www.drobe.co.uk/extra/usbmedia/cable1.jpg
3. http://search.ruten.com.tw/search/s000.php?searchfrom=indexbar&k=gpio+%B1%C6%BDu&t=0
4. http://elinux.org/RPi_Tutorial_EGHS:GPIO_Protection_Circuits
5. http://elinux.org/Rpi_Low-level_peripherals

沒有留言:

張貼留言