Golang meets Arduino

最近、[Golang](http://golang.org/) に興味があり、たまたま手もとに [Arduino UNO R3](http://arduino.cc/en/Main/arduinoBoardUno) あったので、このふたつをインテグレーションできないかと思っていたら、[GOBOT](http://gobot.io/) というフレームワークを見つけたのでちょっと試してみました記録です。

## ゴール

フィジカル・コンピューティングにおける "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本

これらをコネクトした全体図。

![141826.jpg](https://qiita-image-store.s3.amazonaws.com/938/7477/333726de-cbbd-0528-4944-448a0829f4e3.jpeg)

緑のジャンパワイヤを Arduino UNO の GND ピンに刺しています。黄色のジャンパワイヤを 9 ピンに刺しています。

![141527.jpg](https://qiita-image-store.s3.amazonaws.com/938/7477/076fb13e-23a2-a027-9987-47d266d088d9.jpeg)

緑のジャンパワイヤをブレッドボードの `j26` に、黄色のジャンパワイヤを `i20` に刺しています。抵抗器は `i22` と `i26` に刺します。LED はマイナス側のカソード (足の短いほう) を `h22` に、プラス側のアノード (足の長い方) を `h20` に刺します。
 
![20140810 141609.jpg](https://qiita-image-store.s3.amazonaws.com/938/7477/c8c433b3-47df-a1a6-b7bf-6504bfd02e0a.jpeg)

## セットアップ

`go` を使えるようにします。

```bash
$ 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` をインストールします。

```bash
$ 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 のリポジトリに[サンプル](https://github.com/hybridgroup/gobot/blob/dev/examples/firmata_blink.go)が用意されているので、それをベースにコードを準備します。

```blink.go
/* 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) を確認しておきます。

```bash
$ ls /dev/tty.usb*
/dev/tty.usbmodem1411
```

このままだとアダプタのデヴァイス `/dev/ttyACM0` とピンの番号 `13` がマッチしないので以下のように修正します。

```blink.go
...

func main() {
  gbot := gobot.NewGobot()

  firmataAdaptor := firmata.NewFirmataAdaptor("arduino", "/dev/tty.usbmodem1411")
  led := gpio.NewLedDriver(firmataAdaptor, "led", "9")

  ...
}
```

## 実行

これで準備ができましたので、実行してみます。

```bash
$ go run blink.go
2015/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回点滅するのが確認できたでしょうか（静止画でチカチカしてないけどイマジネーションで補完）

![163059.jpg](https://qiita-image-store.s3.amazonaws.com/938/7477/0b3014ab-9265-9b6d-6aad-5c91cd2724db.jpeg)

## おまけ

gobot の周辺には、[gort](http://gort.io/) という "RobotOps" のためのコマンドライン・ツールキットや、ロボティックデヴァイスを管理する [robeaux](https://github.com/hybridgroup/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](https://www.youtube.com/watch?v=Va-NE55AqBs)
[Arduinoをはじめよう 第2版 (Make:PROJECTS)](https://www.oreilly.co.jp/books/9784873115375/)