樹莓 RaspberryPi 派:

一般而言,我自己做些小東西來控制各種電子玩意我喜歡用 Arduino。 原因無他,因為晶片價格便宜,開發環境完備,資源多。但是 Arduino 還是有缺點的,畢盡ATmega 只是個簡單的八位元單晶片微處理器,不太可能在上面架上複雜的作業系統的,所以要做重量級的應用就很吃力了。

若要做極端複雜的重量級運用,上網查了一下,目前最流行的應該就是樹莓派 Raspberry Pi 囉!採用主流威力強大的 ARM 架構微處理器核心,以太網路,USB,HDMI 影像輸出的高度整合。採用 micro SD 來當巨量的儲存媒介,後期的版本連 wifi/藍芽都是內建的了。也有設計了 40 pins 的 GPIO 數位I/O來做各種外部控制的需求,仿效 Arduino 開源硬體的概念,吸引了各式各樣的硬體資源的進駐。最後配上特製的 Linux 作業系統。整個就是一台威到不行的超級迷你 Linux 電腦。有了 Linux 的威力進駐,那個使用幾乎是完全沒有任何極限的強大,甚至用一堆板子來組個超級電腦叢集都是可以囉!

極端迷你的體積,便宜的售價。這也使得 RaspberryPi 成為受歡迎的嵌入式系統平台。各種強大有趣的專案,例如 AI 人臉辨識,駭客用無線網路掃描儀,AI網路攝影機,家庭物聯網控制中心,掌上GameBoy 模擬器,... 有了 Linux 真的應用上幾乎沒有極限喲。

 

gFORTH 語言:

既然樹莓派採用的是 Linux 作業系統,自然我們這個核心是以 C 語言撰寫的,可以在各大 Linux/UNIX 核心下合作愉快的 gFORTH 公開 FORTH系統,也可以被輕易的安裝跟執行囉。這就是樹莓派的優勢囉,一採用了 Linux ,等於各種程式語言都可以直接進駐囉。從官方喜愛現在最紅的 Python, 或是 C++, ... 重新編譯安裝後就可以使用囉。要老骨頭的 FORTRAN,要年輕的 Apple Swift 可是都沒問題哪!

作為 FORTH 的愛好者,我們當然是要選用 FORTH 來做我們的控制語言啦!所以這篇就來個安裝篇,教你如何在樹莓派 RaspberryPi 上安裝 gFORTH,及一些對應的 GPIO 控制函式庫來做控制。

 

WiringPi GPIO 函式庫:

樹莓派對外部硬體控制的主角就是 40 Pins 的 GPIO, 這 40 Pins 都是數位 I/O 所以沒有 ADC/DAC 數位跟類比的轉換,這是唯一可惜比 Arduino 還弱的一個地方。另外一個小缺點,用的是 3.3V 的邏輯系統,也沒有設計保護,要很小心不然容易燒掉弄壞整片板子。(比 Arduino 脆弱多了)

目前由於非常受歡迎的 Python 語言官方已經有對應的函式庫來控制這些 GPIO。所以以樹莓派來做控制,目前看到最普遍跟受歡迎的還是採用 Python 語言,因為最簡單。 而其他語言,例如 C++ 語言想要控制的話,大家都是借助一個叫做 WiringPi (WiringPi 是一個免費的專案,官方連結在此!)的一個以C語言所撰寫的 RaspberryPi GPIO 控制函式庫來當作跟這些 GPIO 溝通的介面。WiringPi 設計上是仿效 Arduino 的開發環境,相類似的 I/O 控制語法,方便大家來使用並控制 GPIO 的輸入輸出囉。 

這邊 gFORTH 想要做控制,跟 C++ 語言一樣,我們也是透過 WiringPi 這個介面來控制 GPIO 啦!原本的 gFORTH 當然不可能知道有 WiringPi 這種東西,這裡要透過國外一位所撰寫的 FORTH 呼叫 WiringPi 程式,來銜接 WiringPi 函式庫,最後讓我們的 gFORTH 可以控制 GPIO。

 

所以接續下來整個流程如下:

1. 安裝 gFORTH, 2. 安裝 WiringPi 函式庫, 3. 下載 wiringPi.fs 串接 gFORTH 程式碼. 4. 測試 LED 點滅

這整個安裝流程來自於 RaspberryPi 社群的這篇討論串,對於來龍去脈有疑慮的請參考。然後要謝謝 wiringPi.fs 的作者 Kris Johnson,透過他的程式碼,現在讓我們可以很方便的透過 gFORTH 來呼叫 WiringPi 作控制囉。

 

1. 安裝 gFORTH

不像難搞的 Apple 那個麻煩的 MacOS。拜 Linux 有內建很方便的套裝安裝管理 apt-get 之賜,所以很簡單的,只要一行指令就搞定囉

sudo apt-get install gforth

 

(假如想自己從頭 build 整個 gforth, 請參考這篇樹莓論壇的文章.)

 

2. 安裝 WiringPi 函式庫

兩個步驟 (對 WiringPi 有興趣的,這裏有篇台灣的 BLOG 也有詳述安裝跟使用方法,也很值得參考)

sudo apt-get install libtool-bin

sudo apt-get install wiringpi

 

3. 下載 wiringPi.fs gFORTH 程式碼

作者 Kris Johnson 在 GitHub 的原始程式碼位置 重點其實是那個檔名叫 wiringPi.fs 的 FORTH 程式檔。

也可以照樹莓派論壇的方式用下列指令安裝

sudo apt-get install git-core

git clone https://github.com/kristopherjohnson/wiringPi_gforth.git

cp wiringPi_gforth/wiringPi.fs .

 

4. LED 點滅測試

軟體跟環境搞定了,讓我們來試看看能不能真的拿來控制囉!筆者拿來測試的這個樹莓派是 Zero W 的這個版本。這個版本真的是不錯,價格便宜,體積超迷你,又內建藍芽,wifi 這些很重要的通訊功能。真的是海放一些其他的控制板囉。

首先要先來搞懂 WiringPi 的 Pin 腳編號系統。 WiringPi  也支援 shell 指令,所以先鍵入下面指令,確認一下你的機型各接腳的編號分配的實際狀況。

sudo gpio readall

 

馬上會在終端機上顯示如下,所有 I/O 的目前狀況,各腳位的各種代碼及目前狀態 模式 IN/OUT, 數值 0/1 

RaspberryPi ZeroW 的分配情況

wiringPi ZeroW.png

要非常注意的, Physical 是實際的接腳編號。 RaspberryPi 有兩種編號系統,一個叫做 wPi ,另外一個叫做 BCM 。採用哪種編號系統是由我們一開始啟始 WiringPi 函式庫時所決定的!

如果用 wiringPiSetupGpio 來啟始 wiringPi 函式庫,這時候接腳編號採用的就是 BCM 編號系統。

如果用 wiringPiSetup  來啟始 wiringPi 函式庫,這時候接腳編號採用的就是 wPi 編號系統。

然後要再三提醒,這個 RaspberryPi 不比 Arduino,是比較脆弱些!邏輯系統是採用 3.3 V 的,內部沒有保護電路,所以接錯接腳不小心接到 5V,或者通過的電流過大可是會直接燒壞這片貴貴的板子的喲!不想破財的話接電前可是要再三的確認跟檢查。

 

簡單的 LED 測試接線如下,

因為太簡單了,接線圖就不列了。就 GPIO 左邊那排算過來第6根腳 (物理接腳 pin 11 = BCM 17 = wPi 0) 接到 LED 正極,LED正極前接上一根 220 ohm (紅紅棕)的限流電阻。 ( (3.3V - 2V) / 220 ohm = 5.9mA 左右的電流)

接地接在 GPIO 右邊那排算過來第3接腳(物理接腳 pin 6, 0V GND) 接到 LED 負極。

物理接腳 pin 11 = BCM 17 = wPi 0

wiring pic.png

 

程式解說

就先把 wiringPi.fs 這個 FORTH 跟 wiringPi 的函式庫介面程式碼先載進來

include wiringPi.fs

 

然後啟始 wiringPi 函式庫,它會回傳一個值,就直接忽視它 (哈..)

wiringPiSetupGpio  drop

 

因為用的是 wiringPiSetupGpio 來啟始,所以接腳編號採用的是 BCM 系統

(如果用 wiringPiSetup 來啟始,接腳編號會是 wPi 系統)

所以 物理接腳 pin 11 = BCM 17 = wPi 0

17 constant LED_Pin

 

我們是要控制 LED 的,所以這根 digital I/O 的模式是輸出 OUTPUT,利用 <pin> <INPUT/OUTPUT> pinMode 指令設定一下!

LED_pin OUTPUT pinMode

 

透過 <pin> <HIGH/LOW>  digitalWrite 的指令,對 pin 腳輸出 HIGH/LOW 訊號

: LED_ON  LED_pin HIGH digitalWrite ;

: LED_OFF LED_pin LOW  digitalWrite ;

 

透過 <milliseconds> delay 的指令,讓程式精確停止特定 milliseconds

: Pause 500 delay ;

 

主程式,點亮 LED 後停 0.5秒,關掉 LED 後再停 0.5秒,然後無窮重複下去

: Flashing
   begin  LED_ON  Pause
          LED_OFF Pause
   again
;

 

想要停下來,用 control-C 兩鍵同時按下去後強迫停止。

 

測試影片

 

 

誰掌握了 LED 閃滅,誰就掌握了世界! (握拳

 

 

完整測試程式碼如下

\
\ GPIO LED test for gforth wiringPi C library
\

include wiringPi.fs

wiringPiSetupGpio  drop

17 constant LED_Pin

LED_pin OUTPUT pinMode


: LED_ON  LED_pin HIGH digitalWrite ;

: LED_OFF LED_pin LOW  digitalWrite ;

: Pause 500 delay ;

: Flashing
   begin  LED_ON  Pause
          LED_OFF Pause
   again
;

 

xxx

 

 

arrow
arrow

    ohiyooo2 發表在 痞客邦 留言(0) 人氣()