RaspberryPi×Go言語で電子工作!モーションセンサーからSlackへ通知を送る

RaspberryPi×Go言語で電子工作!モーションセンサーからSlackへ通知を送る

小島

小島

LEDを光らせる

まずはLEDを点滅させてみましょう。

使用部品

  • LED 1つ
  • ブレッドボード 1つ
  • ジャンパーワイヤ(オス-メス)2本
  • 抵抗器(270Ω)1つ

電子工作自体が初めての場合は「Raspberry Pi」の初心者キットが販売されているので、それを購入するのがおすすめです。ほとんどのセットには上記部品が含まれていると思います。(念のためご確認を……)

実装する

今回はGo言語製ロボティクスフレームワークの「gobot」を使用して開発します。
「Raspberry Pi」はもちろん、「Arduino」や「Leap Motion」など各種ハードウェア連携に対応させることができ、サンプルも充実しています。

まずは「gobot」のソースコードを「go get」で取得しましょう。


$ go get gitbhub.com/hybridgroup/gobot
[/sourcecode]

サンプルには既に「Raspberry Pi」でLEDを光らせるプログラムが用意されているので、そちらを動かしてみます。

▼gitbhub.com/hybridgroup/gobot/examples/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", "7")

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()
}
[/sourcecode]

とりあえず実行確認をします。

▼LED点滅実行確認


$ go run gitbhub.com/hybridgroup/gobot/exsamples/raspi_blink.go
2015/12/07 06:33:46 Initializing Robot blinkBot ...
2015/12/07 06:33:46 Initializing connections...
2015/12/07 06:33:46 Initializing connection raspi ...
2015/12/07 06:33:46 Initializing devices...
2015/12/07 06:33:46 Initializing device led ...
2015/12/07 06:33:46 Starting Robot blinkBot ...
2015/12/07 06:33:46 Starting connections...
2015/12/07 06:33:46 Starting connection raspi...
2015/12/07 06:33:46 Starting devices...
2015/12/07 06:33:46 Starting device led on pin 7...
2015/12/07 06:33:46 Starting work...
[/sourcecode]

これで動くかと思いきや、停止させた際にエラーが発生しました。

▼エラー


2015/12/07 07:30:58 Error: Robot "blinkBot": Connection "raspi": open /sys/class/gpio/unexport: permission denied
[/sourcecode]

調べると「GPIO」の操作にはroot権限がいるようです。
なので「sudo」をつけて再実行したところ、エラーが出なくなりました!

部品を配置

次は電子部品を電子基板(今回はブレッドボード)に設置していきます。
以下「gobot」のLEDサンプルページに設置例が載っているので以下のページを参考に配置します。

参考:http://gobot.io/documentation/drivers/led/

GPIOのピンはRaspberry PiのSDカードスロットを上に向けたとき、下記のようにピンに番号が振られています。

GPIOピン番号
SDカードスロット側
1 2
3 4
5 6
7 8

23 24
25 26

まず、GND側(-)の線を25番ピンへ・そしてPIN側(+)の線をサンプルコードで指定している7番ピンへと差し込みます。

これで準備は完了です。
再度、実行します。


$ sudo go run gitbhub.com/hybridgroup/gobot/exsamples/raspi_blink.go
2015/12/07 06:33:46 Initializing Robot blinkBot ...
[/sourcecode]

LEDの点滅が確認できました!

赤外線モーションセンサーを使ってみる

次は赤外線モーションセンサーを使用します。

Raspberry Pi 赤外線モーションセンサー PIR Infrared Motion Sensor

Raspberry Pi 赤外線モーションセンサー PIR Infrared Motion Sensor

  • Shenzhen Jieshen Technology Co., Ltd.
  • 価格¥ 1,400(2016/01/14 17:34時点)
  • 商品ランキング128,023位

使用部品

  • 赤外線モーションセンサー 1つ
  • ブレッドボード 1つ
  • ジャンパーワイヤ(オス-メス)2本
  • 抵抗器(270Ω)1つ

モーションセンサーを付ける

rasp_02

こちらが赤外線モーションセンサーです。

 
rasp_03

手前にある3つのピンを、左からRaspberry Piの25番、7番、2番へとそれぞれつなぐように配線していきます。

 
rasp_01

上のようになります。

実装

gobotにはモーションセンサー用のドライバーが用意されていません。
なので、以下のようにして「RaspiAdaptor」が持っているピンのデータから直接センサーの値を読み取ります。


v, _ := r.DigitalRead("7")
[/sourcecode]

これで取れる値を計測してみると

赤外線モーションセンサーから取得した値
通常時:0, 検知:1

で取れていました。これは都合いいですね。
今回はセンサーが動作を検知したら「slack」へ通知を飛ばす実装も追加します。

▼main.go


package main

import (
"time"

"github.com/bsoo/rasp_motion_censor/slack"
"github.com/hybridgroup/gobot"
"github.com/hybridgroup/gobot/platforms/raspi"
)

const (
SensorValueDetect = 1
SensorValueUndetect = 0
)

func main() {
gbot := gobot.NewGobot()
r := raspi.NewRaspiAdaptor("raspi")
postData := slack.NewPostData(`何かが動きました…`, `rasp`, `:ghost:`)

work := func() {
gobot.Every(3*time.Second, func() {
// 7番ピンから直接センサーの値を読み取る
v, _ := r.DigitalRead("7")
if v == SensorValueDetect {
slack.Post(postData)
}
})
}
robot := gobot.NewRobot("blinkBot",
[]gobot.Connection{r},
nil,
work,
)
gbot.AddRobot(robot)
gbot.Start()
}
[/sourcecode]

▼slack/slack.go


package slack

import (
"encoding/json"
"net/http"
nurl "net/url"
"strings"
)

const (
url = `https://hooks.slack.com/services/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`
)

type PostData struct {
Text string `json:"text"`
UserName string `json:"username"`
IconEmoji string `json:"icon_emoji"`
}

func NewPostData(txt, userName, icon string) PostData {
return PostData{
Text: txt,
UserName: userName,
IconEmoji: icon,
}
}

func Post(d PostData) error {
// json
jsonBody, err := json.Marshal(d)
if err != nil {
return err
}

// parameters
v := nurl.Values{}
v.Add("payload", string(jsonBody))

// request
req, err := http.NewRequest("POST", url, strings.NewReader(v.Encode()))
if err != nil {
return err
}

req.Header.Add("Content-Type", "application/x-www-form-urlencoded")

client := http.Client{}
resp, err := client.Do(req)

if err != nil {
return err
}

defer resp.Body.Close()
return nil
}
[/sourcecode]

以上で完成です!
これを実行し、センサーに手をかざしてみると……

rasp_04

通知が来ました!

最後に

gobotを使えるようになると扱えるデバイスが増えるので、Go言語・ハードウェア・電子工作に興味があるなら触っておくべきフレームワークだと思います。
今回は軽く動作を確かめる程度の物しか作れていないので、今度は複数センサーを同時に使うなど、もっと凝った物作ってみます。

エウレカではテックブログを公開中です。IoT以外にもGo言語やインフラ、ネイティブ開発、デザインなどの話題も掲載していますので、ぜひご覧になってください。

この記事のシェア数

小島
小島 pairs バックエンド・フロントエンド / 小島 広樹

pairsのweb版開発を担当しています。 主にバックエンドですが、フロントも少しやってます。 Androidが好きで学生時代からAndroidアプリ開発をやっていましたが、気がついたらなぜかwebエンジニアになってました。 最近は人工知能・機械学習に興味があります。

このメンバーの記事をもっと読む
電子工作部 | 15 articles
デザイン力×グローバルな開発体制でDXをトータル支援
お問い合わせ 会社概要DL