Raspberry pi2から, gobotでGPIOを制御 (LED点滅) してみる

Raspberry pi2で,電子工作が試してみたいと思います.
まずは、基本に忠実に、LEDを点灯させるところあたりから、チャレンジしたいと思います.
なお、golangでハードウェア制御が可能になる[gobot](http://gobot.io/documentation/getting-started/)というフレームワークに注目してみました.

# ◾️ Raspberry pi2のGPIO制御の動作確認から
Raspberry pi2でLEDを発光させる基本動作を確認します.
こちらの記事を参考にさせて頂きました.
https://tool-lab.com/2013/12/raspi-gpio-controlling-breadboard-2/

LEDとの結線ですが、物理ピン番号12（“GPIO 18″ピン）に接続しました。
実際にGPIO18ピンに接続したLEDを点灯してみます.

```
pi@raspberrypi:~ $ sudo echo 18 > /sys/class/gpio/export
pi@raspberrypi:~ $ sudo echo out > /sys/class/gpio/gpio18/direction
pi@raspberrypi:~ $ sudo echo 1 > /sys/class/gpio/gpio18/value
```
期待どおりに、LEDが点灯しました。
![IMG_0094.JPG](https://qiita-image-store.s3.amazonaws.com/0/103595/ca7dd8f1-5cca-25de-3721-91d620091f4d.jpeg)

うまく点灯できたので、LEDを消灯して、元の状態に戻しておきます.

```
pi@raspberrypi:~ $ sudo echo 0 > /sys/class/gpio/gpio18/value
pi@raspberrypi:~ $ sudo echo 18 > /sys/class/gpio/unexport
```


# ◾️ golang環境準備
gobotを動作させるためには、go 1.4以上のgolang環境が必要なようです.
>[Special note for Raspian Wheezy users](http://gobot.io/documentation/platforms/raspi/)
The go vesion installed from the default package repositories is very old and will not compile gobot. You can install go 1.4 as follows:

ちなみに、apt-get inatallでgolangをインストールすると古いバージョンがインストールされてしまいます.

```
pi@raspberrypi:~/golang $ apt show golang
Package: golang
Version: 2:1.3.3-1
Installed-Size: 91.1 kB
Maintainer: Go Compiler Team <pkg-golang-devel@lists.alioth.debian.org>
Replaces: golang-weekly
Provides: golang-weekly
Depends: golang-go (>= 2:1.3.3-1), golang-src (>= 2:1.3.3-1), golang-doc (>= 2:1.3.3-1)
Conflicts: golang-weekly
Download-Size: 25.0 kB
Homepage: http://golang.org/
Section: devel
Priority: optional
APT-Sources: http://mirrordirector.raspbian.org/raspbian/ jessie/main armhf Packages
Description: Go programming language compiler - metapackage
 The Go programming language is an open source project to make
 programmers more productive. Go is expressive, concise, clean, and
 efficient. Its concurrency mechanisms make it easy to write programs
 that get the most out of multicore and networked machines, while its
 novel type system enables flexible and modular program construction.
 Go compiles quickly to machine code yet has the convenience of
 garbage collection and the power of run-time reflection. It's a
 fast, statically typed, compiled language that feels like a
 dynamically typed, interpreted language.
 .
 This package is a metapackage that, when installed, guarantees
 that (most of) a full Go development environment is installed.
```

よって、gobotのホームページの記述どおりの手順で環境整備します.

```
pi@raspberrypi:~ $ wget -O - http://dave.cheney.net/paste/go1.4.linux-arm~multiarch-armv6-1.tar.gz|sudo tar -xzC /usr/local -f -
pi@raspberrypi:~ $ echo '# Setup for golang' |sudo tee /etc/profile.d/golang.sh
pi@raspberrypi:~ $ echo 'PATH=$PATH:/usr/local/go/bin'|sudo tee -a /etc/profile.d/golang.sh
```
gobotを動作させるには、root権限が必要なようです.
よって、以降は、rootユーザで作業を進めます.

```
pi@raspberrypi:~ $ sudo -i
root@raspberrypi:~#
``` 
`.profile`ファイルに以下の３行を追加しておきます.

```bash:.profile
export GOBIN=$HOME/golang/bin
export GOPATH=$HOME/golang
export PATH=$PATH:$GOPATH/bin:/usr/local/go/bin
```
作業用ディレクトリを作成しておきます.

```
root@raspberrypi:~# mkdir golang
root@raspberrypi:~# source .profile
root@raspberrypi:~# mkdir $GOPATH/bin
```
go環境のバージョンを確認してみます.

```
root@raspberrypi:~# go version
go version go1.4 linux/arm
```

さらに、試しに、goサンプルコードを動かしてみます.

```go:hello.go
package main
 
import "fmt"
 
func main() {
    fmt.Println("Hello world!")
}
```
"Hello world!"が表示されましたので、golangは正しく動作しているようです.

```
root@raspberrypi:~# go run hello.go 
Hello world!
```



# ◾️ gobotでLEDを発光させる
いよいよ、gobotの環境整備です.

```
root@raspberrypi:~# go get -d -u github.com/hybridgroup/gobot/... && go install github.com/hybridgroup/gobot/platforms/raspi
```

実際に、LEDを点灯させるサンプルコードです.
LEDとの結線ですが、物理ピン番号12（“GPIO 18″ピン）に接続しておりますので、一部修正しております。

```go:raspi_blink.go
package main
 
import (
    "time"
 
    "github.com/hybridgroup/gobot"
    "github.com/hybridgroup/gobot/platforms/gpio"
    "github.com/hybridgroup/gobot/platforms/raspi"
)
 
func main() {
    gbot := gobot.NewGobot()
 
    r := raspi.NewRaspiAdaptor("raspi")
    led := gpio.NewLedDriver(r, "led", "12")
 
    work := func() {
        gobot.Every(1*time.Second, func() {
            led.Toggle()
        })
    }
 
    robot := gobot.NewRobot("blinkBot",
        []gobot.Connection{r},
        []gobot.Device{led},
        work,
    )
    gbot.AddRobot(robot)
    gbot.Start()
}
```
それでは、gobotで、サンプルコードを実行して、LEDを点灯させてみます.

```
root@raspberrypi:~# go run raspi_blink.go 
2016/01/03 09:40:12 Initializing Robot blinkBot ...
2016/01/03 09:40:12 Initializing connections...
2016/01/03 09:40:12 Initializing connection raspi ...
2016/01/03 09:40:12 Initializing devices...
2016/01/03 09:40:12 Initializing device led ...
2016/01/03 09:40:12 Starting Robot blinkBot ...
2016/01/03 09:40:12 Starting connections...
2016/01/03 09:40:12 Starting connection raspi...
2016/01/03 09:40:12 Starting devices...
2016/01/03 09:40:12 Starting device led on pin 12...
2016/01/03 09:40:12 Starting work...
```

LEDは、点滅するようになりました.
![IMG_0098.JPG](https://qiita-image-store.s3.amazonaws.com/0/103595/a13146b7-930e-6bec-6251-a9d25f40decc.jpeg)

LEDは、点灯ではなくて、点滅でしたが、結果オーライでしょう.
LEDの点滅が確認できたので、最後にビルドしておきます。

```
root@raspberrypi:~# go install raspi_blink.go
```
以降は、ビルド済みのバイナリを起動することにします.

```
root@raspberrypi:~# raspi_blink 
2016/01/03 14:09:54 Initializing Robot blinkBot ...
2016/01/03 14:09:54 Initializing connections...
2016/01/03 14:09:54 Initializing connection raspi ...
2016/01/03 14:09:54 Initializing devices...
2016/01/03 14:09:54 Initializing device led ...
2016/01/03 14:09:54 Starting Robot blinkBot ...
2016/01/03 14:09:54 Starting connections...
2016/01/03 14:09:54 Starting connection raspi...
2016/01/03 14:09:54 Starting devices...
2016/01/03 14:09:54 Starting device led on pin 12...
2016/01/03 14:09:54 Starting work...
```

gobotは、IoTエンジニアリング分野において、有望なフレームワークだと思います.
これからも、いろいろなIoTデバイスを動作させてみたいと思います.


# ◾️ 参照元
+ [Raspberry PiのGPIO制御方法を確認する](https://tool-lab.com/2013/12/raspi-gpio-controlling-breadboard-2/)
+ [RaspberryPi×Go言語で電子工作](https://developers.eure.jp/go-language/advent-calender-9/)