用 Gobot 跟 Firmata 來控制 LinkIt™ Smart 7688 Duo 的週邊設備
在上一篇嘗試使用 go 在 LinkIt™ Smart 7688 Duo 開發之後,這篇要來嘗試如何控制週邊設備,例如 LED 或者其他模組。
# Programming models on LinkIt™ Smart 7688 Duo
首先要在 LinkIt™ Smart 7688 Duo 上面控制硬體有很多種不同的方式:
- UART connectivity
- Firmata protocol
- Arduino Yun Bridge Library
詳細可以看 官方PDF (opens new window) 或者 線上官方文件 (opens new window) 。
# Firmata Protocol
這篇使用的是第二種方式 - Firmata protocol
原因是這種方式只需要將 StandardFirmata (opens new window) 燒進去 MCU(Arduino) 之後,就可以專心在 MPU(OpenWRT) 上面開發。
# Gobot
Gobot (opens new window) 是一個 Go-based 的框架支援多種 Platform 上的開發(撰文時總共 35 個 Platforms)。 這篇會介紹怎麼利用 Gobot 來控制 LinkIt™ Smart 7688 Duo 上面的 LED 燈。
# 開發過程
# 開發環境
- MacOS 10.15.6(19G73)
# 準備 Arduino
首先先下載 Arduino (opens new window),這篇使用的版本是 1.8.12
。
然後照著官方給的 步驟 (opens new window) 安裝 board support package 。
# 將 StandardFirmata 燒錄到 Arduino
先找到範例的 StandardFirmata:
然後依照官方文件的步驟,先找到以下這行:
Firmata.begin(57600);
並把它換成
Serial1.begin(57600);
Firmata.begin(Serial1);
除了更改這幾行以外,下面的 while loop 也要註解掉,否則從 MPU 上面的 process 在嘗試透過 Firmata 連線的時候會遇到 connection timeout。
while (!Serial) {
; // wait for serial port to connect. Needed for ATmega32u4-based boards and Arduino 101
}
總結來說是這樣:
之後就把 StandardFirmata 上傳:
記得要確認 USB 是不是接在板子上的 MCU 那一側,以及下圖的 Board 跟 Port 是否設定正確:
# 開始寫 Go!
Go 的部分就沒那麼複雜了,參考 Gobot 的範例 (opens new window),只要找到正確的 Serial Port 跟 Pin 就可以了!
先看範例:
package main
import (
"time"
"gobot.io/x/gobot"
"gobot.io/x/gobot/drivers/gpio"
"gobot.io/x/gobot/platforms/firmata"
)
func main() {
firmataAdaptor := firmata.NewAdaptor("/dev/ttyACM0")
led := gpio.NewLedDriver(firmataAdaptor, "13")
work := func() {
gobot.Every(1*time.Second, func() {
led.Toggle()
})
}
robot := gobot.NewRobot("bot",
[]gobot.Connection{firmataAdaptor},
[]gobot.Device{led},
work,
)
robot.Start()
}
根據官方的表格(如下所示),
必須要將
firmataAdaptor := firmata.NewAdaptor("/dev/ttyACM0")
改成
firmataAdaptor := firmata.NewAdaptor("/dev/ttyS0")
而 Pin 的部分則根據官方圖所示 (opens new window) ,都是 13 所以不用變動。
我把範例稍微修改過後放到 https://github.com/mkfsn/linkit-lab,有興趣的話可以參考看看。
# 執行結果
照 上一篇 的步驟 build 完以後,透過 scp 上傳到板子上執行的結果如下:
root@mylinkit:~# ./linkit-lab
2020/08/01 06:49:09 Initializing connections...
2020/08/01 06:49:09 Initializing connection Firmata-6567A5C ...
2020/08/01 06:49:09 Initializing devices...
2020/08/01 06:49:09 Initializing device LED-74654622 ...
2020/08/01 06:49:09 Robot bot initialized.
2020/08/01 06:49:09 Starting Robot bot ...
2020/08/01 06:49:09 Starting connections...
2020/08/01 06:49:09 Starting connection Firmata-6567A5C on port /dev/ttyS0...
2020/08/01 06:49:09 Starting devices...
2020/08/01 06:49:09 Starting device LED-74654622 on pin 13...
2020/08/01 06:49:09 Starting work...
^C2020/08/01 06:49:16 Stopping Robot bot ...
然後就看到板子上的 LED 燈一閃一閃的啦~
# 參考資料
- https://s3-ap-southeast-1.amazonaws.com/mediatek-labs-imgs/downloads/c9174962c0a4b65fe4a2d70f6c691937.pdf
- https://s3-ap-southeast-1.amazonaws.com/mediatek-labs-imgs/downloads/d0846032988f44428f790eb930f7e78c.pdf
- https://gobot.io/
- https://docs.labs.mediatek.com/resource/linkit-smart-7688/en/get-started/get-started-with-the-linkit-smart-7688-duo-development-board/install-arduino-ide-with-board-support-package
- https://docs.labs.mediatek.com/resource/linkit-smart-7688/en/tutorials/linkit-smart-7688-duo
- https://boywhy.blogspot.com/2016/05/linkit-samrt-7688-using-firmata-with.html
# 致謝
因為是第一次接觸硬體,所以感謝同事 LSChyi (opens new window) 的幫忙,讓我沒有走太多歪路 XD
另外要特別感謝 [LinkIt Samrt 7688] Using Firmata with Python 的作者,我找了一個晚上的問題跟翻了官方文件很多次,都沒注意到原來 StandardFirmata 上面的那段 while loop 要註解掉。