Go言語製IoTフレームワークGobotを用いてRaspberryPiの制御してみる① Lチカ編


Gobotは、Go言語で書かれたロボティクス開発・IoTフレームワークです。ラズパイやArduino、Microbitといったマイコンから、ドローンやトイロボットまで約35種類ののプラットフォームに対応しています。本稿では、ラズパイ内にGoの環境を整備した上で、Gobotをもちいて、電子工作の基礎であるLチカを実行してみす。

Gobotについて

Gobotは、Go言語で書かれたロボティクス/ドローン/IoT開発フレームワークです。こちらのページからGobotが対応しているプラットフォームを参照できます。

また、こちらのページにあるような、GPIOやI2C、SPIといった規格で通信、制御するセンサやモータを、提供されているAPIを用いて簡単に操作できます。

Gophar君も近未来的な見た目をしていて、かわいいです!

ラズパイにGo / Gobot環境をつくる

Go言語のインストール

Raspberry Piには標準だとGo言語が入っていないため、インストールしていきます。

手元にあるPC(筆者の場合mac OS)にgo1.12.7を圧縮形式でダウンロードし、scpでラズパイに転送して、展開する手順をとります。

なお、使用しているRapberry Piは、Raspberry Pi 3 Model B+です。

1. go1.12.7のダウンロード

こちらのページから、goを圧縮形式でダウンロードします。この時、使用しているRaspberry Piのモデルによって、CPUアーキテクチャが異なるため、Wikipedia なんかで先に確認しておいたください。

筆者は、Raspberry Pi 3 Model B+を使用しているため、LinuxのARMv8版のgo1.12.7.linux-arm64.tar.gzをダウンロードします。

公式ページ Getting Startedを参照。

2. 転送する

PCからRaspberry Piに上でインストールしたGoを転送します。あらかじめ、PCとRaspberry PIを同一のLANに接続しSSHでやり取りできることを確認しておいてください。

$ scp go1.12.7.linux-arm64.tar.gz  pi@raspberrypi.local:/home/pi

3. 展開

ここからは、Raspberry Pi上で実行していきます。

pi@raspberrypi:~$ sudo tar -C /usr/local -xzf go1.12.7.linux-arm64.tar.gz

これで、/usr/lacal以下にgoがインストールされたはずです。確認します。

pi@raspberrypi:~ $ cd /usr/local/
pi@raspberrypi:/usr/local $ ls
bin  etc  games  go  include  lib  man  sbin  share  src

goがあるのが確認できます。

4. パスを通す

これだけだと、goの実行ファイルと在りかをコンピュータが特定できないので、パスを通してあげます。

pi@raspberrypi:~ $ vi .bash_profile

.bash_profileに以下を追加

export PATH=$PATH:/usr/local/go/bin

読み込みんで、パスが通っているのか確認します。

pi@raspberrypi:~ $ source .bash_profile
pi@raspberrypi:~ $ which go
/usr/local/go/bin/go

5. Hello World

お決まりのHello Worldをしておきます。

ホームディレクトリ以下にgoのワーキングディレクトリを作成して、以下にsrcディレクトリを配置します。

pi@raspberrypi:~$ mkdir -p go/src/hello
pi@raspberrypi:~$ cd go/src/hello
pi@raspberrypi:~$ vi hello.go

hello.goを次のように編集しましょう。

package main

import "fmt"

func main() {
    fmt.Printf("hello, world\n")
}

実行します。

次のような出力が得られれば成功です。

pi@raspberrypi:~/go/src/hello$ go run hello.go
hello, world

)もし、実行した際に、バイナリ形式が違うと怒られた時には、1に戻ってgo1.12.7.linux-armv6l.tar.gzをインストールし直して実行してみてください。理論上では、3Model B+だと Linux ARMv8版のgo1.12.7で良いはずなのですが、私の場合Linux ARMv6版じゃないと動きませんでした。

Lチカ

最後にLチカです。Goのインストールが完了したので、Gobotをインストールしておきます。

pi@raspberrypi:~/$ go get -d -u gobot.io/x/gobot

LEDを点灯するソースファイルled.goを作成します。

pi@raspberrypi:~$ mkdir -p go/src/led
pi@raspberrypi:~$ cd go/src/led
pi@raspberrypi:~$ vi led.go

ソースファイルを以下のように編集してください。

ラズパイの7番ピンをもちいて、LEDを2秒おきに点滅させるコードになります。

package main

import (
        "time"

        "gobot.io/x/gobot"
        "gobot.io/x/gobot/drivers/gpio"
        "gobot.io/x/gobot/platforms/raspi"
)

func main() {
        r := raspi.NewAdaptor()
        led := gpio.NewLedDriver(r, "7")

        work := func() {
                gobot.Every(2*time.Second, func() {
                        led.Toggle()
                })
        }

        robot := gobot.NewRobot("blinkLED",
                []gobot.Connection{r},
                []gobot.Device{led},
                work,
        )

        robot.Start()
 }

回路図を載せておきます。7番ピンを使用しています。

ついでに、写真も載せときます。

実行して、LEDが点滅すれば成功です。もし、依存パッケージが不足しているとエラーが出た場合には、一個ずつgo getしてあげると、エラーが解消されるはずです。

以下のコマンドで実行。

pi@raspberrypi:~/go/src/led$ go run led.go
2019/07/31 13:58:16 Initializing connections...
2019/07/31 13:58:16 Initializing connection RaspberryPi-7D8873A9 ...
2019/07/31 13:58:16 Initializing devices...
2019/07/31 13:58:16 Initializing device LED-4C5C36A6 ...
2019/07/31 13:58:16 Robot blinkLED initialized.
2019/07/31 13:58:16 Starting Robot blinkLED ...
2019/07/31 13:58:16 Starting connections...
2019/07/31 13:58:16 Starting connection RaspberryPi-7D8873A9...
2019/07/31 13:58:16 Starting devices...
2019/07/31 13:58:16 Starting device LED-4C5C36A6 on pin 7...
2019/07/31 13:58:16 Starting work...

ledドライバーのソースコード自体はそんなに大きくないので、読んでみると全体像を把握できて良さそうです。

最後に

Gobotを触ってみた感想を述べると、公式ドキュメントも簡潔で分かりやすく、使いやすい印象を受けました。対応しているプラットフォームやドライバの範囲内であれば、提供されているAPIを使用することで 、効率的にセンサやモータを制御できそうです。

処理速度がC++やPythonと比較した時、どうなっているのか気になるところではあります。

GoでもIoTできるので、皆さんも是非使ってみてください!!

参考文献

thehybridgroup:Gobot公式ページ

comments powered by Disqus