2012/07/31

以Raspberry Pi的GPIO腳位讓LED閃爍

Raspberry Pi板子(以下簡稱rpi)上有26個GPIO 針腳(2x13),可用來連接其他電子元件。本篇將以其中兩個針腳連接LED,並寫Python程式讓它閃爍。我知道這很簡單、很無聊,但總是個開始。

注意,本篇將直接使用GPIO針腳,這是很危險的,搞不好的話會弄壞板子、弄壞板子上的晶片,安全的用法則該使用緩衝板(譬如Mike Cook的Buffer Board)。若你把rpi板子搞壞了,可別說我沒警告你喔。

下圖是rpi的功能區塊圖,左上角就是GPIO的排針。


雖然針腳有26個,但其中6個保留不用,另外有3個是5v、3.3v、0v(GND),所以還有17個針腳可用。


首先是硬體的部份,需製作一條排線,將rpi的針腳接出來。至少需要買一條排線與一個牛角母座。

26線的排線。我買彩色的,比較容易分辨。


牛角母座(2x13),用來壓排線。


將排線平平放進牛角母座的中間,不要突出來。


然後,應該用虎鉗壓緊,但我沒有,於是用鐵鎚敲一敲,嗯,還不錯嘛。


這一端就可以插進rpi的GPIO針腳了。


至於排線的另一端,在這篇裡只需要腳位1(3.3V)與腳位11(GPIO 0),所以我把這兩條線剝皮,腳位1接到紅線,腳位11接到藍紫線。


然後將這兩條線接到麵包板。
紅線(腳位1、3.3V)接LED的正極長腳,
LED負極短腳接1k ohm電阻,
電阻另一腳接藍紫線(腳位11、GPIO 0)。


硬體的部份完成囉。

然後是軟體的部份,將使用RPi.GPIO這套Python程式庫控制GPIO,請到這裡http://pypi.python.org/pypi/RPi.GPIO找到下載網址,我下載的是RPi.GPIO 0.3.1a(RPi.GPIO-0.3.1a.tar.gz)。

下載後解壓縮,
$ tar zxvf RPi.GPIO-0.3.1a.tar.gz

然後切換進入解壓縮後的目錄,以下列指令進行安裝,
$ sudo python setup.py install

但是卻安裝失敗,錯誤訊息說少了Python.h檔,到網路上搜尋後發現需要安裝python-dev這個套件,
$ sudo apt-get install python-dev

然後就能成功安裝RPi.GPIO了。

(目前需要自己手動安裝RPi.GPIO,將來此程式庫應該會被打包成套件。)
(2012.09.27更新:新的映像檔2012-09-18-wheezy-raspbian.img已經內建RPi.GPIO套件。)


接下來要開始寫程式了,請以root身分執行python,
$ sudo python

匯入程式庫,
>>> import RPi.GPIO as GPIO

使用rpi板子的腳位編號,
>>> GPIO.setmode(GPIO.BOARD)

將腳位11(GPIO 0)設為輸出模式,此時LED應該會亮起來,
>>> GPIO.setup(11, GPIO.OUT)

設定為HIGH,LED會熄滅,
>>> GPIO.output(11, GPIO.HIGH)

設定為LOW,LED又會亮起來,
>>> GPIO.output(11, GPIO.LOW)

然後寫個迴圈,讓LED不停閃爍,
>>> while True :
...     GPIO.output(11, GPIO.HIGH)
...     time.sleep(1)
...     GPIO.output(11, GPIO.LOW)
...     time.sleep(1)

哇,成功啦,想停止的話請按下Ctrl-C。


後記:

最好還是用虎鉗或老虎鉗壓排線,若用鐵鎚敲可能會敲壞喔,如下所示。

嗚嗚,壞掉啦,壓不緊了。


既然壞了,就拆開看看裡面的樣子吧。



參考資料:

Dr. Monk's DIY Electronics Blog的GPIO LED blink from Python using Slice of Pi。 我用排線接出GPIO針腳,而Dr. Monk使用Slice of Pi這塊擴充板將GPIO腳位接出來。


Raspberry Pi Spy的Simple Guide to the RPi GPIO Header and PinsControl LED Using GPIO Output Pin,也是以Python程式庫RPi.GPIO以GPIO腳位讓LD閃爍。

RPi.GPIO程式庫的網站

Hardware lesson with Gert: make your own ribbon cable connector,自己製作排線,比較省錢。

各種牛角母座牛角公座。我在這篇將排線剝皮直接使用,一般來說會以母座與公座相連接。

Raspberry Pi的GPIO腳位配置

RPi Low-level peripherals,rpi維基百科裡關於低階周邊的資料。

Tutorial: How to use your Raspberry Pi like an Arduino,以python、bash、c寫程式控制GPIO腳位。

Benchmarking Raspberry Pi GPIO Speed,以shell script、python、c、perl寫程式測試rpi的rpi的速度。

Jeremy's Blog的Raspberry Pi 7 segment displays,驅動七段顯示器。

21 comments:

  1. 請問
    $ sudo python
    匯入程式庫,
    >>> import RPi.GPIO as GPIO
    之後
    會出現 ImportError: No module named RPi.GPIO
    這是怎麼了?謝謝。

    ReplyDelete
    Replies
    1. 你還沒安裝RPi.GPIO這套程式庫吧,
      試試看
      $ sudo apt-get install RPi.GPIO

      Delete
    2. 有裝ㄟ
      我現在是裝最新的RPi.GPIO 0.5.2a
      但是一樣會出現ImportError: No module named RPi.GPIO

      Delete
    3. 嗯,真奇怪。找不到RPi.GPIO?
      試試看python3吧。

      我也不知道。

      Delete
    4. 剛剛將系統upgrade之後就OK了.....
      感謝您的回覆~~~~

      Delete
  2. Anonymous28/8/14 15:43

    您好,不好意思!想請問GPIO的使用問題~~
    若將腳位11(GPIO 0)設為輸入模式時 --是否是代表腳位11可以外接到sensor的DO腳位?
    而在sensor DO輸出高電位時,此時在 raspberry read 腳位11(GPIO 0)時,是否會呈現高電位'1'呢?還是會造成raspberry燒掉??
    以上請教,謝謝!
    (如土壤溼度 sensor http://goods.ruten.com.tw/item/show?21211063217433#auc)

    ReplyDelete
    Replies
    1. 根據該sensor網頁的描述:
      模組在土壤濕度達不到設定值時,DO輸出高電位,當土壤濕度超過設定值時,模組DO輸出低電位

      所以接法的確正如你所說的,
      但要注意的是,該土壤溼度模組的DO輸出電壓是3.3V還是5V,
      因為Raspberry Pi針腳能容忍的電壓上限是3.3V,若接到5V的東西,就會燒壞。

      另外,為了保護raspberry pi針腳,作為輸入模式時,應該加上一個3.3V的Zener diode(稽納二極體)。

      Delete
  3. Anonymous28/8/14 20:54

    謝謝您的提醒及回覆
    想再請教您:3.3V的Zener diode的正確接法是?
    我參考http://elearn.ccut.edu.tw/1000112215/www/zener.htm
    推想的接法是-
    1. raspberry 腳位11接sensor DO腳(點位a)
    2.再將Zener diode 的逆向徧壓(+)接腳,接到點位a,Zener diode 的另一腳位再接到地
    這樣對嗎?需接Rs當作限流電阻嗎?

    感恩~~

    ReplyDelete
  4. Zener diode的負極(有環的那一邊)接到raspberry pi的腳位,正極接地。

    限流電阻要不要接就看你的判斷。

    ReplyDelete
  5. Anonymous28/8/14 22:20

    感謝,受教了....

    ReplyDelete
  6. 請問 raspberry pi 己 set gpio pin mode=out ,and write gpio value=1,
    但實際量gpio pin 輸出却只有3.3v, 為何不是輸出5v呢? 如何可讓 出輸電玉為5v呢?
    是不是那裏沒弄對呢? 謝謝

    ReplyDelete
    Replies
    1. raspberry pi的gpio針腳,其電壓準位就是3.3V,不是5V。

      Delete
  7. 板主blog http://yehnan.blogspot.tw/2012/08/raspberry-pigpio.html 提到 "這些GPIO腳位的運作電壓為3.3V" 是否一定要加升壓模組來提升電壓才行呢? 謝謝

    ReplyDelete
    Replies
    1. 想控制/連接5V晶片的話,可在中間加入電壓準位轉換器。

      Delete
    2. 譬如TXB0108、74LVC245、74AHCT125等等,
      有些轉換器只能單向、有些可以雙向,要先釐清。

      Delete
  8. 板主blog : http://coopermaa2nd.blogspot.tw/2012/09/hc-sr04.html可用在arduno
    想請問 HC-SR04 可以用在 raspberry pi上嗎?

    賣場:http://tw.taobao.com/item/15500765405.htm?fromSite=main&spm=a1z09.2.9.159.lhMY1h&_u=f1ovt306d0fc
    提到--
    注: TRIP引腳是內部上拉10K的電阻,用單片機的IO口拉低TRIP引腳,然後給一個10us以上的脈沖信號。

    這是什麼意思呢?還要加電阻嗎?不太知道如何做?
    Orz.. 謝謝

    ReplyDelete
  9. 請問一下: 給一個10us以上的脈沖信號 >
    這個信號是指: Trig pin 的電位狀態
    由3.3v高電位->0v 維持10us ?
    ,還是要5v高電位->0v 維持10us
    echo才會有信號輸出呢?

    若有Trig pin 有正確trigger時,
    用電表量echo pin輸出時,可以量得電位值變化嗎?它會有輸出高電位嗎 ?

    以上請教,謝謝

    ReplyDelete
  10. 不好意思: 以上是針對http://coopermaa2nd.blogspot.tw/2012/09/hc-sr04.html HC-SR04 的使用提問
    VCC、trig(控制端)、 echo(接收端)、 GND
    注: TRIP引腳是內部上拉10K的電阻,用單片機的IO口拉低TRIP引腳,然後給一個10us以上的脈沖信號。

    ReplyDelete
    Replies
    1. rpi想連接HC-SR04的話,可參考這篇
      https://www.modmypi.com/blog/hc-sr04-ultrasonic-range-sensor-on-the-raspberry-pi
      其中也有用分壓器解決3.3V/5V的困擾。

      Delete
  11. 感謝..葉兄^^

    ReplyDelete