2013年9月20日 星期五

Raspberry PI : 以 Scratch 控制 GPIO

2013年9月20日 星期五
Scratch 是一套圖形化界面的程式開發平台,寫程式時只要拖曳一個個元件組合,就如同在玩積木一般,簡單易用,頗有親和力的操作界面,連沒學過程式語言的小孩子都很容易上手。之前就在想,如果可以利用 Scratch 來控制 Raspberry PI 的 GPIO 腳位,玩起來一定比用 Python 來得輕鬆些。利用「raspberry pi scratch gpio」的關鍵字一查,哇!有位 Raspberry PI 的玩家 Simon Walters 已經寫了一個名為「ScratchGPIO2 (Scratch GPIO Version 2)」的小工具,他的 blog 網址如下:
有了裡面的「scratch_gpio_handler2.py」,我們甚至可以用另一台電腦中的 Scratch 經由無線網路來遠端控制 Raspberry PI 的 GPIO。



這台遙控車是用 Lego + Raspberry PI ,然後用 Scratch 來操控 Raspberry PI 的 GPIO 及插在小麵包板上的「L293D」晶片和 Lego 馬達。小孩子玩得很開心。



來一小段玩耍的影片:


測試環境

  • Raspberry PI B + Raspbian (“wheezy”)
  • Scratch 1.4


程式安裝

取得 source :
sudo wget https://dl.dropbox.com/s/oql4qzm8jlnsbeb/install_scratch_gpio2.sh -O /boot/install_scratch_gpio2.sh

進行安裝:
sudo /boot/install_scratch_gpio2.sh


安裝完畢,使用者目錄中會新增以下的檔案:
  • x window 桌面的圖示:
    Desktop/scratchgpio2.desktop
  • Scratch 範例腳本檔:
    Documents/Scratch  Projects/blink11.sb
  • Scratch 範例腳本檔:
    Documents/Scratch  Projects/GPIOexample.sb
  • 啟動 Scratch RSC 的腳本檔:
    Documents/Scratch  Projects/rsc.sb
  • 桌面圖示開啟的腳本檔,會執行 scratch_gpio_handler2.py 監聽程式及啟動 Scratch 開啟 rsc.sb 腳本檔:
    simplesi_scratch_handler/scratch_gpio2.sh
  • 和 Scratch RSC 通訊並控制 Raspberry PI GPIO 的 Python 腳本檔,最重要的一個檔案:
    simplesi_scratch_handler/scratch_gpio_handler2.py

Scrach 有所謂的「遠端感應器」「Remote Sensor Connections (RSC)」,當我們在 Scratch 中啟動了「RSC」,它就會開始監聽 port 42001 (TCP/UDP),等待別人來連線,如果建立了連線,兩邊就可以交換訊息(指令)。
Simon 用 Python 所寫 scratch_gpio_handler2.py 可以和指定 IP (預設為本機的 127.0.0.1) 的 Scratch 透過 RSC 連線並交換訊息,如果 Scratch 送來的是 scratch_gpio_handler2.py 中所認識的指令,就可以依指令傳送給指定的 GPIO port,並達到控制電子元件的功能。

如果是在 Raspberry PI 本機的 x window 操作,當我們開啟桌面的「Scratch GPIO」圖示,它會執行 scratch_gpio2.sh 的腳本檔,背景執行 Simon 的 scratch_gpio_handler2.py ,讓它透過 TCP port 4200 和 Scratch 通訊。然後啟動 Scratch,並自動啟用 Scratch 的「遠端感應器」(Remote Sensor Connections) 功能。接著,我們就可以在 Scratch 裡「廣播」(傳送) scratch_gpio_handler2.py 認得的「訊息」,並控制 Raspberry PI 的 GPIO。

除了這種全部都在 Raspberry PI 中用 Scratch 寫程式並控制 GPIO 以外,我們也可以先在另一台電腦中的 Scratch 啟用「遠端感應器」,再讓 Raspberry PI 中的「scratch_gpio_handler2.py」透過無線網路來建立連線,「遙控」Raspberry PI。這種玩法會更有趣一點。下面就來看看,如何讓電腦上的 Scratch 來遠端控制 Raspberry PI 上的 GPIO。


讓 Scratch 和 Raspberry PI 連線

前面提過,在 Scratch 中啟用「遠端感應器」(Remote Sensor Connections)是重點,所以,想遠端控制 Raspberry PI 的 Scratch 必須先啟動「偵測器」的「RSC」。
進入 Scratch 以後 (以 1.4 版為例) ,先點選程式區塊中「偵測」的分類,然後再對準「偵測器」按滑鼠右鍵,點選「啟動遠端感應器」就可以啟動 RSC。如果想關閉 RSC,也是用同樣的方法。

當我進行完上述的操作以後,Scratch 就開始在 port 42001 等候連線了。接著,我們可以在 Raspberry PI 中執行 scratch_gpio_handler2.py ,讓它和電腦裡的 Scratch 連線。
假設執行 Scratch 的電腦 IP 為「192.168.2.100」,而 scratch_gpio_handler2.py 是放在預設的安裝路徑,我們先遠端登入 Raspberry PI ,然後執行以下這一行指令:
sudo python simplesi_scratch_handler/scratch_gpio_handler2.py 192.168.2.100

成功的話應會有「Connected!」、「Running....」的訊息。接下來就可以準備開始在 Scratch 中寫程式了。


用 Scratch 控制 Raspberry PI 的 GPIO

如果只是要送訊號(指令)給 Raspberry PI 的 GPIO,利用程式區塊「控制」分類裡的「廣播」就可以一招走天下了!

上圖的程式在 Scratch 裡加一個「廣播 alloff」,當「scratch_gpio_handler2.py」收到 Scratch 送來的「alloff」就會將所有的(all) GPIO 都設為低電位(off),而「廣播 pin11on」則會將 GPIO pin 11 設為高電位(on),如果 Raspberry PI GPIO pin 11 上接的是 LED ,它就會發光;反之,當 Raspberry PI 收到「廣播 pin11off」時,GPIO pin 11 就會被設為低電位(off),LED 自然就熄滅了。

除了使用「廣播」以外,我們也可以使用「變數」來達到相同的效果:

先產生兩個變數「allpins」和「pin11」,再利用將它們的值設為「on」或「off」達到控制開關的目的。

對「scratch_gpio_handler2.py」來說,在 Scratch 可以設定以下的變數的 on/off 來控制 Raspberry PI 的 GPIO:

  • pinX:output 的部份,X 可以是 11,12,13,15,16,18 中任一個數字;其它腳位基本上為 input。
  • allpins:代表所有的腳位。
  • pinpattern:同時控制多個 output,例如,它的值以二進位的方式代表 output 腳位的開或關,最低位(最右)代表 pin 11,而最高位(最左)代表 pin 18,共有六個 bit,例如「101101」表示 pin 11, 13,15 及 pin 18 為 on ,而 pin 12 及 pin 16 為 off。

詳細的說明可以參考「ScratchGPIO2 (Scratch GPIO Version 2)」作者 blog 中的說明:



檔案下載




參考網站




4 則留言:

  1. 你好,我最近剛開始接觸RPi,對於Linux還在摸索。
    想請問一下:我自己寫的程式,或由網路下載的資料,我該放在哪個目錄底下呢?
    因為我是用16G 的SD card,沒有做磁碟分割,所以看起來只有5xMB的boot及14.xGB兩個磁區,
    一般使用者都習慣將自己的資料放在哪呢?

    回覆刪除
    回覆
    1. 您好:
      您的問題有一點大吔,
      假如您想問的是自己的 Scratch 程式與資料, 就放在該帳號下的 "Documents/Scratch Projects" 下, 其它的則要看是什麼 "資料" 而定。如果您是 Linux 新手, 要玩 RPi , 且想深入的玩, 它和 Windows 有很大的不同, 建議您還先找一本 Linux 管理的相關書籍來研究一下可能較好,

      刪除
  2. 您好: 拜讀過您很多篇Wii Remote跟白板的文件,也看到您介紹Scratch的文章,感恩、感謝。可是就還沒找到Wii Remote如何跟Scratch連線的測試大作! 透過藍芽我一直只能把Wii Remote跟電腦連線而已,為何我用wii2scratch這中介軟體,在Windows 7 32bit家庭版的系統下,怎麼樣去跟Scratch連結也都連不上呢? 不知道問題出線在哪裡? 中介軟體的用法說明裡有•Start the HID (Human Interface Device) service of the WiiMote這個步驟,我就是不知道怎麼去開啟HID呢? 如蒙賜教,感激不盡!

    回覆刪除
    回覆
    1. 關於 Start the HID service of the Wiimote 的步驟,就是我 Wiimote 電子白板中的連線,個人偏好使用自己寫的 WiimoteAutoConnect,如果有 bluesoleil 或是 toshiba ......等藍芽連線軟體也不錯。
      玩了一下,前述的藍芽連線如果完成了,再啟動 Scratch,並於偵測器中啟動遠端感應器的功能後,執行 wii2scrach 才會成功。

      刪除

 
雄::gsyan © 2009. Design by Pocket