スキップしてメイン コンテンツに移動

Raspberry Pi Zero WをGo言語で触ってみる

※この記事は、IoTLTAdvent Calendar 2019の22日目の記事として書いています。

qiita.com

こんにちは、ニャンパス株式会社の登尾です。今回、手元に転がっていたRaspberry Pi Zero WをGo言語で触ってみようと思い、その模様をまとめてみました。

なぜGo言語をRaspberry Piで触ってみようとしたのかというと、下記の記事を読んで確かにJavaScriptRaspberry Pi上でもサクッとかけて便利だけれどちょっとメンテナンスしなくなると古いランタイムでしか動かない状況になるなと思い、Go言語であればバイナリとして配布できて、安定性があると感じているため、今回Raspberry Piで試して見ました。

techblog.kayac.com

Rasberry Piのセットアップ

SDカードにRaspbianを入れました。今回GUI等は必要としないので、 Raspbian Buster Lite を選んでいます。

www.raspberrypi.org

解凍したimgファイルを、Macから書き込みました。(/dev/disk2にマウントされていることを確認して以下のコマンドを打っています。)

# diskutil unMountDisk /dev/disk2
Unmount of all volumes on disk2 was successful
# sudo dd if=/Users/<user name>/Downloads/2019-09-26-raspbian-buster-lite.img  of=/dev/rdisk2 bs=1m

しばらく待って書き込まれたSDカードをRaspberry Piに指し、HDMIとキーボードをつなぎます。

以下のような画面が表示され、piユーザでログインします。ログイン後に、Wifiの有効化(raspi-configでサクッと設定)とsshdの立ち上げを行っています。

Go言語で記述したプログラムを送り込んで見る

ここからは、手元のMac環境でプログラムを書いて見ます。

IoT用のフレームワークとして、Gobotというものがあり、Raspberry Piや様々なプラットフォームに対応しているというものなので今回始めて触ってみます。

gobot.io

まずはインストールを行います。

go get -d -u gobot.io/x/gobot/...

しばらくまつと、以下のようにインストールされたことが確認できます。

ls ~/go/src/gobot.io/x/gobot/
CHANGELOG.md           appveyor.yml           drivers                helpers_test.go        sysfs
CODE_OF_CONDUCT.md     ci                     event.go               master.go              travis_build_opencv.sh
CONTRIBUTING.md        cli                    eventer.go             master_test.go         utils.go
LICENSE.txt            commander.go           eventer_test.go        platforms              utils_test.go
Makefile               commander_test.go      examples               robot.go               version.go
README.md              connection.go          examples_test.go       robot_test.go
ROADMAP.md             device.go              go.mod                 robot_work.go
adaptor.go             doc.go                 go.sum                 robot_work_test.go
api                    driver.go              gobottest       

まずはサンプルのLチカを試してみます。16番ピンを制御する以下のプログラムを記述します。

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, "16")

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

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

    robot.Start()
}

手元の環境でビルドして転送するということをするので、以下のようなMakefileを用意しました。

build:
    GOARM=6 GOARCH=arm GOOS=linux go build main.go

deploy:
    scp main pi@raspberrypi.local:./

こうしておくとmakeによってビルドだけ行ったり、make build deployのようにビルドとデプロイを同時に行えるので便利です。(ただ、プロジェクトとして開発するのであれば、ディレクトリ構成やビルドの依存関係を記述するべきだとは思います。)

ともあれ、Lチカが実現で来ました。

GobotでAPIサーバを立てよう

Gobotのドキュメントを読んでいるとAPIサーバとしても立ち上がってくれて、かつブラウザ上で動くAPIクライアントも同梱されていることが分かりました。 最後にこの機能を使ってみようと思います。さきほどのLEDをAPI用のコマンドとして定義してます。

package main

import (
    "gobot.io/x/gobot"
    "gobot.io/x/gobot/api"
    "gobot.io/x/gobot/drivers/gpio"
    "gobot.io/x/gobot/platforms/raspi"
)

func main() {
    master := gobot.NewMaster()
    api.NewAPI(master).Start()

    r := raspi.NewAdaptor()
    
    led := gpio.NewLedDriver(r, "16")

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

    robot.AddCommand("toggleLed", func(params map[string]interface{}) interface{} {
        led.Toggle()
        return "ok"
    })

    master.AddRobot(robot)

    master.Start()
}

toggleLedというコマンドが増え、このコマンドが呼ばれるとLEDの点灯が切り替わるという意図です。cURLをターミナルから実行し、実行のたびにLEDの点灯消灯が切り替わることが確認できます。

> curl 'http://raspberrypi.local:3000/api/robots/blinkBot/commands/toggleLed'

また、 http://raspberry.local:3000/ にアクセスすると、以下のように先程定義したコマンドが表示されてブラウザからも叩けるようになっています。

まとめ

軽い気持ちでRaspberry PiでGo言語のプログラムを実行してみたいということで書き始めましたが、最後にGobotのAPIサーバとしての出来に感動しました。

IoTにおいて、PoC等の用途でさくっとAPIサーバが立ち上がり、デバイスの状態を取得したりあるいは更新できるというのは大変便利な機能だと思いますので、Go言語 + Gobotの組み合わせは今後も試してみたいと思います。

コメント

このブログの人気の投稿

Phaser3 + Typescriptを使ってRPGゲームの基礎を作ろう!その2

前回の記事 に引き続きPhaser3+Typescriptを使って RPG の基礎を作っていきます。 この記事は前回の記事を呼んだ前提で説明していきますので、ぜひそちらを先に読むことをお勧めします。 また、今回の記事は前回よりも難易度と内容量が上がっていますが、記事の最後に作業後の リポジトリ のリンクがありますので、そちらを先にダウンロードしてそちらと比較しながら学習することができます。 前回まで作成した状態のプログラムが以下の リポジトリ からダウンロードできますので前回まででうまくいっていない方は参考にしてみてください。 github.com 最終目標(再掲) ・Phaser3とTypescriptで RPG ゲームの基礎を作る。 ・Phaser3をTypescriptで使う方法を学ぶ ・Phaser3の使い方を学ぶ 今回の目標 ・ゲームの作り方の断片を知る ・キャラの表示できるようにする ・キャラを移動できるようにする ・当たり判定をつける ・ NPC の追加してみる ・話しかけられるようにする 開発前提(再掲) ・Nodejsの環境・知識がある ・ Javascript ・Typescriptがある程度かける ・当ページ紹介の環境を試す場合はgit・ github の知識がある 使用した主要Nodeモジュール(再掲) ・typescript(Typescriptの コンパイル 用) ・phaser(フロントの Javascript 用ゲームライブラリ) ・live-server(ソースを監視してブラウザのページをリロード) ・ts-loader(webpackがTypescriptをバンドルする用)webpack(言わずと知れたモジュール依存をいい感じに解決しバンドルする) ・webpack- cli (webpackを コマンドライン で使用するのに必要) 注:各Nodeモジュールバージョンは後述 当ブログ仕様の画像素材の注意点 当ブログで使用する画像素材は『 ピポヤ倉庫 』より許可なしで無償再配布・改変が認められたものを改変して作成されたものです。 中には許可なく再配布・改変してはいけない素材もインターネット上には多く存在するのでそれらを使用するときは十分に規約を呼んでから使用しましょう。 1. キャラの表示 想定画面 今回は、はじめにキャラつまり操作

M5Stackで、においセンサー(TGS2450)を使ってみる。(LCDに表示編)

今回は、においセンサー(TGS2450)から取得したデータをM5Stackの LCD にグラフ表示をしていきます。 今回主に使用したもの M5Stack 10Ω抵抗 5本 Pch  MOSFET  2SJ334(スイッチとして利用) M5StackSideBB(ブレッドボード) M5Stackのピンはそのままだと配線するとき手間がかかるかと思いますので、今回はM5StackSideBBを利用しました。 ブレッドボードも付いているので、手軽に電子工作できるので個人的にオススメです。 SideBB for M5Stack www.switch-science.com 諸注意 本ブログのプログラムはArduinoIDEまたはPlatformIOでM5Stackの開発ができる状態であること前提のものですので、各自導入をお願いします。 過去に Windows のArduinoIDEで M5Stackの開発環境を構築する記事 があるので、参考にしてください。 においセンサー(TGS2450)について 今回使用したセンサーは 秋月電子通商 で購入できます。 http://akizukidenshi.com/catalog/g/gP-00989/ akizukidenshi.com TGS2450には4つのピンがあり、使用するのはそのうちの3本でヒーターを温めるピン、センサー情報を得るピン、GNDがあります。 ここで注意したいのは、ヒーター電圧は1.6Vと記述されているのでM5Stackで利用するときは分圧して3.3Vを1.6V近くまでに降圧することをお勧めします。 TGS2450のセンサーは可変抵抗になっており、データシートには5.62kΩ〜56.2kΩの間を抵抗が変化し、においが強いとより低くなると記述されていました。 よって、センサーの値をM5Stackで取得するにはセンサー抵抗と外部に接続する任意の値の抵抗による分圧回路によって求めることができます。 TGS2450の動作方法は、250ms周期でセンサーに電圧を5ミリ秒on、245ミリ秒offの状態にしてヒーターは8ミリ秒on、242ミリ秒offにすることで値を取得します。 配線 においセンサーとM5Stackの配線 上の図が配線図です。 30Ωの抵抗は10Ωの抵抗を三つ直列に接続して作成しました。 また、上部の抵抗10Ω二

Phaser3 + Typescriptを使ってRPGゲームの基礎を作ろう!その1

今回はPhaser3とTypescriptを使って簡単な RPG ゲームを作る方法を紹介していきます。 内容はPhaser3およびゲーム作りについての記事なので、Nodejsの周辺モジュールなどの説明は一部省いての説明になりますのでご了承ください。 またこの記事では Phaser2 ではなく Phaser3 を使用するので注意してください。 この記事は二部構成になりますので、この記事を読んだ際はぜひ次の記事も読むことをお勧めします。 最終目標 ・Phaser3とTypescriptで RPG ゲームの基礎を作る。 ・Phaser3をTypescriptで使う方法を学ぶ ・Phaser3の使い方を学ぶ 今回の目標 ・開発環境を整える ・Phaser3の開発構成を知る ・スタート画面を作る ・マップ表示をさせる 開発前提 ・Nodejsの環境・知識がある ・ Javascript ・Typescriptがある程度かける ・当ページ紹介の環境を試す場合はgit・ github の知識がある 使用した主要Nodeモジュール ・typescript(Typescriptの コンパイル 用) ・phaser(フロントの Javascript 用ゲームライブラリ) ・live-server(ソースを監視してブラウザのページをリロード) ・ts-loader(webpackがTypescriptをバンドルする用)webpack(言わずと知れたモジュール依存をいい感じに解決しバンドルする) ・webpack- cli (webpackを コマンドライン で使用するのに必要) 注:各Nodeモジュールバージョンは後述 1. 最低限の開発環境の準備 今回最低限の環境を整えるために、『Typescript + Phaser3』の開発テンプレートを github リポジトリ で公開しました。 以下からZIPをダウンロードするか、 git clone コマンドで各自環境に展開してみてください。 ここから先は リポジトリ のプログラムを元に説明していきます。 github.com 展開するとファイル構造は以下のようになっているかと思われます。 注: 他にもファイルやフォルダがあるかと思われますが、表記されているのは今回使うものになっています。 - src/ (これから書くプログラムの保存領域)