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 mainimport (
"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
- Shenzhen Jieshen Technology Co., Ltd.
- 価格¥ 1,400(2016/01/14 17:34時点)
- 商品ランキング128,023位
使用部品
- 赤外線モーションセンサー 1つ
- ブレッドボード 1つ
- ジャンパーワイヤ(オス-メス)2本
- 抵抗器(270Ω)1つ
モーションセンサーを付ける
こちらが赤外線モーションセンサーです。
手前にある3つのピンを、左からRaspberry Piの25番、7番、2番へとそれぞれつなぐように配線していきます。
上のようになります。
実装
gobotにはモーションセンサー用のドライバーが用意されていません。
なので、以下のようにして「RaspiAdaptor」が持っているピンのデータから直接センサーの値を読み取ります。
v, _ := r.DigitalRead("7")
[/sourcecode]これで取れる値を計測してみると
- 赤外線モーションセンサーから取得した値
- 通常時:0, 検知:1
で取れていました。これは都合いいですね。
今回はセンサーが動作を検知したら「slack」へ通知を飛ばす実装も追加します。
▼main.go
package mainimport (
"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 slackimport (
"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]以上で完成です!
これを実行し、センサーに手をかざしてみると……通知が来ました!
最後に
gobotを使えるようになると扱えるデバイスが増えるので、Go言語・ハードウェア・電子工作に興味があるなら触っておくべきフレームワークだと思います。
今回は軽く動作を確かめる程度の物しか作れていないので、今度は複数センサーを同時に使うなど、もっと凝った物作ってみます。エウレカではテックブログを公開中です。IoT以外にもGo言語やインフラ、ネイティブ開発、デザインなどの話題も掲載していますので、ぜひご覧になってください。