Go言語で書かれたフレームワークGobotを触ってみる
担当のプロダクトでGo言語を使う機会が増えてきたため、チーム内で定期的に勉強会を開催しています。
今回はその勉強会で発表した内容を抜粋してまとめたのですが、Gobotという Go言語で書かれたフィジカルコンピューティングなどのためのフレームワークを見てみました。
Gobotとは
- Go言語で書かれた、ロボット工学やフィジカルコンピューティング、IOTなどのためのフレームワーク
- Raspberry PiやArduinoなどの複数のプラットフォームをサポート
- アナログセンサーなど複数のドライバーをサポート
- デバイスに接続したり、コマンドを実行するRESTful APIが用意されている
下記のようなサイトでなんだかワクワクしてしまいました。
作ったもの
スイッチを押したらLEDが光る
使ったもの
手順
1.Gobotインストール
$ go get -d -u github.com/hybridgroup/gobot/... $ go install github.com/hybridgroup/gobot/platforms/firmata $ go install github.com/hybridgroup/gobot/platforms/gpio
2.パーツ組み立て
スイッチとLEDをArduinoのGPIOと接続します。
3.プログラミング
4.ビルド&実行
$ go build main.go $ ./main
完成系は下記のようになります。
ソースコード
今回もぼぼサンプルそのままで動かせました。
NewFirmataAdaptorの第2引数はシリアルポートに接続するためのポートで今回はUSBを指定しています。
package main import ("github.com/hybridgroup/gobot" "github.com/hybridgroup/gobot/platforms/firmata" "github.com/hybridgroup/gobot/platforms/gpio" ) func main() { gbot := gobot.NewGobot() firmataAdaptor := firmata.NewFirmataAdaptor("myFirmata", "/dev/tty.usbmodem1421") button := gpio.NewButtonDriver(firmataAdaptor, "myButton", "2") led := gpio.NewLedDriver(firmataAdaptor, "myLed", "13") work := func() { gobot.On(button.Event("push"), func(data interface{}) { led.On() }) gobot.On(button.Event("release"), func(data interface{}) { led.Off() }) } robot := gobot.NewRobot("buttonBot", []gobot.Connection{firmataAdaptor}, []gobot.Device{button, led}, work, ) gbot.AddRobot(robot) gbot.Start() }
gbot.Start()実行のところだけもう少し詳しく見てみる
1) robotのStart()
- 接続を開始
- 各デバイスのStart()を呼び出し
- 定義された処理を実行 https://github.com/hybridgroup/gobot/blob/master/robot.go#L135
2) button_driverのStart()
- ボタンのステータス変更をポーリングして、ステータス変更されたらイベントを通知
- Driver interfaceを実装している https://github.com/hybridgroup/gobot/blob/master/platforms/gpio/button_driver.go#L55
3) led_driverのStart()
- 中身は何もしていない
- Driver interfaceを実装している https://github.com/hybridgroup/gobot/blob/master/platforms/gpio/led_driver.go#L53
4) Driver interface
https://godoc.org/github.com/hybridgroup/gobot#Driver
Driver interfaceを実装した各種ドライバーで各デバイスを表現しているのがわかりました。
まとめ
- マイコンを制御する部分や各デバイスを制御する部分が実装されているので簡単にパーツを動かす事ができる。
- インターフェースの使い方など異なる仕様のものをまとめて処理する実装の参考になる。
おまけ
他の言語の姉妹プロジェクトもあります。