作為前端工程師,寫出來的程式都是跑在瀏覽器上的畫面,因為待在物聯網公司裡,不免開始好奇同事們是如何寫程式去控制硬體的。剛好團隊有一個應用樹莓派的案子,讓我接觸到樹莓派,查了一下樹莓派是什麼,發現到原來是小朋友也能用來學電腦的東西,於是我決定自己也買一台在家裡玩玩。
我紀錄了自己玩樹莓派的時候所劃下的里程碑:
- 成功開機
- 成功 ssh
- scp 丟入 compiled binary go 並成功執行 hello world
- 打亮 LED 燈
- 連結溫濕度感測器: DHT22
這篇文章就是來分享以上里程碑的實現過程,以及我遇到的一些坑,至於實作細節就請有興趣的讀者去看外部連結的資料或是自己去查閱更多了。
Hello Raspberry Pi
要開啟樹莓派你可能需要...
- Raspberry Pi (我買的是 raspberry pi 4 model B 4GB,最近好像剛出一款 8GB 的)
- 充電線 (我是買官方的充電線)
- Micro SD 卡 (我買 8GB)
- 螢幕轉接頭 (我買的是 MicroHDMI to VGA,用來接家裡的舊螢幕)
- 樹莓派外殼 (純粹是覺得外殼設計很炫買的)
- Micro SD 卡的讀卡機 (用於寫入 Raspberry Pi OS (Raspbian) 用的)
- 螢幕、鍵盤、滑鼠
這批食材我大部分都是從網路上訂購,一開始要先認識樹莓派,有些基本概念後,要做的就是用你的筆電,插上 SD 卡,把 Raspberry Pi OS 寫入到卡上,然後再用那張 SD 卡搭配電源去啟動樹莓派。
我一開始是下載 image(recommended) 到 Macbook 後,用 terminal 下命令的方式寫入 SD 卡,結果失敗 ... 樹莓派開不起來,於是我改用官方提供的 imager,一個可以把 Raspbian 寫入 SD 卡的軟體,自動寫入 SD 卡後,再試一次就成功開機嘍!
遠端控制樹莓派
接觸樹莓派一開始最讓我興奮的就是遠端控制機器了,讓樹莓派與筆電在同一個區域網路下,找到樹莓派的 ip 位址,使用 ssh 就能連線到樹莓派的目錄。
在樹莓派外接螢幕滑鼠鍵盤後,下 hostname -I
就能知道樹莓派的 IP 位址了。比較厲害的方法是在筆電上找到樹莓派的 IP,我參考了官網的教學但還是找不到...
要進入樹莓派,下 ssh pi@192.168.x.x
,小老鼠後面接樹莓派的 IP,輸入樹莓派的密碼後就能成功進入樹莓派的目錄底下了。
此時,要更新樹莓派,或是安裝軟體等等操作,都能夠在筆電進行控制。
其實,更高階的做法只需要 SD 卡跟電源線,一開機後就 ssh 進樹莓派做設定,根本不需要外接螢幕鍵盤滑鼠,有興趣的讀者可以嘗試搜尋 how to setup pi without monitor.
Golang + Pi
網路上用 python 去控制樹莓派的文章應該是最多的,畢竟 pi 裡面就內建了 python,當然,也可以用 javascript,只是還需要在樹莓派上裝 node.js。
那我使用的是 golang,它可以編譯成二進制檔,非常方便,在筆電上寫好程式後,只要編譯出能夠在樹莓派上跑的二進制檔(binary code),如下:
GOARM=6 GOARCH=arm GOOS=linux go build main.go
接著使用 scp ./main pi@192.168.2.4:
,最後在樹莓派上簡單的命令 ./main
就可以執行程式囉!
Hello IoT
物聯網的 Hello World 是什麼?就是把 LED 燈給打亮!
這裡開始要接觸硬體,我對於電阻電力正極負極接地線完全沒概念,於是我找來電機系的幫手,帶我去電子材料行逛了一圈,以下列出我這趟買了哪些小玩具:
- 麵包板
- 公對母杜邦線數條
- 蜂鳴器(接上去後可以嗶嗶叫,很好玩!)
- 按鈕 + 按鈕蓋 (看了很感動,終於可以控制實體按鈕而不是
<button>虛擬按鈕</button>
了) - LED 燈泡
- 電阻:10K、200、800 (用來減少電流避免電流太大毀損器材)
- 溫濕度感測器模組 DHT22
有了這些,剩下來的就是要了解 GPIO 以及杜邦線要怎麼接,然後我使用一個很棒的 golang 框架 gobot,點進去連結,就能看到 IoT 的起手式,點亮 LED 燈的程式碼。
試著用 golang 把 LED 燈給打亮吧!能做到這裡,任督二脈就算打通了。
更多發想
LED 燈只是第一步,接著可以玩玩蜂鳴器,就像 LED 燈一樣電流流過去就會有效果。
按鈕也非常好玩,我用了兩顆按鈕,分別做了樹莓派的開機鍵與關機鍵,簡單的把開機按鈕的線路經過蜂鳴器,開機鍵按一下就能發出聲音。
最後,來說說最有趣的 DHT22 溫濕感測器,由於 DHT22 gobot 沒有提供介面,我選擇 https://github.com/MichaelS11/go-dht 這個開源專案來使用,也是非常方便就能印出溫度與濕度。
做 IoT 的重點,就是要把物聯網的「物」連上雲端,所以我最後做的專案就是去紀錄我房間的溫濕度歷史變化,並用網頁呈現圖表數據。我用的工具廣為人知,就是 prometheus + grafana。
我用 docker 在我的筆電架設 prometheus 和 grafana,然後在樹莓派寫一支程式,使用 prometheus/client_golang 在樹莓派上起一個 server,並且定時更新溫濕度,在我筆電上的 prometheus 就會定時向樹莓派去抓資料,然後用 grafana 去呈現漂亮的圖表。
相關程式碼
- 樹莓派 GPIO https://github.com/chnejohnson/pi
- prometheus & grafana https://github.com/chnejohnson/prom_client
Happy Coding ~