最近、Golang に興味があり、たまたま手もとに Arduino UNO R3 あったので、このふたつをインテグレーションできないかと思っていたら、GOBOT というフレームワークを見つけたのでちょっと試してみました記録です。
ゴール
フィジカル・コンピューティングにおける "Hello, world" であるところの LED をチカチカさせる。
機材と材料
今回、利用した機材と材料はつぎのとおりです。
- MacBook Air / OS X 10.9.4 Darwin 13.3.0
- USB ケーブル ABタイプ
- Arduino UNO R3
- ブレッドボード: 1個
- LED (赤): 1個
- 1kΩ 抵抗 (茶黒赤金): 1本
- 柔らかいジャンパワイヤ: 2本
これらをコネクトした全体図。
緑のジャンパワイヤを Arduino UNO の GND ピンに刺しています。黄色のジャンパワイヤを 9 ピンに刺しています。
緑のジャンパワイヤをブレッドボードの j26
に、黄色のジャンパワイヤを i20
に刺しています。抵抗器は i22
と i26
に刺します。LED はマイナス側のカソード (足の短いほう) を h22
に、プラス側のアノード (足の長い方) を h20
に刺します。
セットアップ
go
を使えるようにします。
$ brew install go
$ vim ~/.bash_profile
export PATH=$PATH:/usr/local/opt/go/libexec/bin
export GOPATH=$HOME/.golang
export GOROOT=/usr/local/opt/go/libexec
$ go env
GOARCH="amd64"
GOBIN=""
GOCHAR="6"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/hoge/.golang"
GORACE=""
GOROOT="/usr/local/opt/go"
GOTOOLDIR="/usr/local/opt/go/pkg/tool/darwin_amd64"
CC="clang"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fno-common"
CXX="clang++"
CGO_ENABLED="1"
gobot
をインストールします。
$ go get -d -u github.com/hybridgroup/gobot/... && go install github.com/hybridgroup/gobot/platforms/firmata
プロジェクトのディレクトリを作成します。今回は、LED を点滅させるプロジェクトなので blink
としました。
$ mkdir ~/gobot-projects/blink
$ cd ~/gobot-projects/blink
$ vim blink.go
gobot のリポジトリにサンプルが用意されているので、それをベースにコードを準備します。
/* blink.go
* This small program lets you turn on and off a LED every 1s.
*/
package main
import (
"time"
"github.com/hybridgroup/gobot"
"github.com/hybridgroup/gobot/platforms/firmata"
"github.com/hybridgroup/gobot/platforms/gpio"
)
func main() {
gbot := gobot.NewGobot()
firmataAdaptor := firmata.NewFirmataAdaptor("arduino", "/dev/ttyACM0")
led := gpio.NewLedDriver(firmataAdaptor, "led", "13")
work := func() {
gobot.Every(1*time.Second, func() {
led.Toggle()
})
}
robot := gobot.NewRobot("bot",
[]gobot.Connection{firmataAdaptor},
[]gobot.Device{led},
work,
)
gbot.AddRobot(robot)
gbot.Start()
}
デヴァイスのポート (USB) を確認しておきます。
$ ls /dev/tty.usb*
/dev/tty.usbmodem1411
このままだとアダプタのデヴァイス /dev/ttyACM0
とピンの番号 13
がマッチしないので以下のように修正します。
...
func main() {
gbot := gobot.NewGobot()
firmataAdaptor := firmata.NewFirmataAdaptor("arduino", "/dev/tty.usbmodem1411")
led := gpio.NewLedDriver(firmataAdaptor, "led", "9")
...
}
実行
これで準備ができましたので、実行してみます。
$ go run blink.go
2015/11/15 20:46:47 Initializing Robot bot ...
2015/11/15 20:46:47 Initializing connections...
2015/11/15 20:46:47 Initializing connection arduino ...
2015/11/15 20:46:47 Initializing devices...
2015/11/15 20:46:47 Initializing device led ...
2015/11/15 20:46:47 Starting Robot bot ...
2015/11/15 20:46:47 Starting connections...
2015/11/15 20:46:47 Starting connection arduino on port /dev/tty.usbmodem1411...
2015/11/15 20:46:51 Starting devices...
2015/11/15 20:46:51 Starting device led on pin 9...
2015/11/15 20:46:51 Starting work...
LED が 1秒に 1回点滅するのが確認できたでしょうか(静止画でチカチカしてないけどイマジネーションで補完)
おまけ
gobot の周辺には、gort という "RobotOps" のためのコマンドライン・ツールキットや、ロボティックデヴァイスを管理する robeaux という AngularJS べースのダッシュボードなどもあるようです。
ソース
http://gobot.io/
http://golang.org/
http://gort.io/
http://robotops.com/
GopherCon 2014 Gobot: Go Powered Robotics and Physical Computing by Ron Evans and Adrian Zankich
Arduinoをはじめよう 第2版 (Make:PROJECTS)