Raspberry Pi 2でGrovePiを使う

はじめに

前回書いたはじめてのRaspberry Pi 2ではRaspberry Pi 2をセットアップしてみました。しかしRaspberry Pi 2はGPIOピンがそのまま搭載されているので、弊社にたくさんあるGroveシステムのセンサーが使えません。そこでRaspberry Pi用GroveシールドであるGrovePiを購入しました!

IMG_0658

ということで、早速使ってみました!これがまた結構ハマりました...

やってみた

外観

上側。ポートの構成が変則的で、左側にアナログポート、真ん中と右側にデジタルポートとI2Cポートが入り混じっています。きっと小さな基盤の中にたくさんのコネクタを配置するのに苦労したんでしょうね。

IMG_0659

下側。GPIOコネクタのみ。Dexter Industriesのロゴがカッコいいです。

IMG_0660

Raspberry Pi 2にGrovePiを合体させたところ。無印Raspberry Piで使われいたGPIO26Pinに合わせられているため、GPIO40PinであるRaspberry Pi 2ではGPIOピンがちょっと余ります。

またこの写真の左側、イーサネットポートとUSBポートの部分がGrovePiの基盤に接触するため、GrovePiの公式サイトでは「ショートする可能性があるからマスキングテープを貼るといいよ」と書いてありました。

IMG_0661

OS(Raspbian)のアップデート

とりあえず、OSは最新にしておきます。

$ sudo apt-get update
$ sudo apt-get upgrade

GrovePiリポジトリのclone

ファームウェアのアップデートやソフトウェアのインストールに使うために、GrovePiのGithubリポジトリgit cloneしておきます。

$ git clone https://github.com/DexterInd/GrovePi.git

GrovePiのファームウェアアップデート

GrovePiのファームウェアをアップデートします。最新のファームウェアを適用しないと、OSでi2cデバイスとして認識されませんでした。手順は公式サイトのUpdating the Firmwareに従います。

まず、リセット端子であるISPヘッダー6ピンとD4ピンをジャンパー線で繋ぎます。

IMG_0677

次にファームウェアアップデート用のシェルスクリプトを実行します。

$ cd GrovePi/Firmware
$ sudo ./firmware_update.sh

“avrdude: safemode: Fuses OK”というメッセージが出力されたら完了です。

GrovePi用ソフトウェアのインストール

次にGrovePiを操作するために必要なソフトウェアをインストールします。こちらの手順も公式サイトに従います。

$ cd GrovePi/Script/
$ sudo bash ./install.sh

インストール完了後、勝手に再起動されます。

config.txtの編集

GrovePi用ソフトウェアのインストールが完了すると、勝手に/etc/modulesを編集してくれたりして、必要なモジュールを組み込んでくれます。しかし、以下のように/boot/config.txtを編集しないと、GrovePiを認識してくれません。

# sudo vi /boot/config.txt
dtparam=i2c1=on
dtparam=i2c_arm=on

編集後はOSを再起動します。

# sudo reboot

再起動後、i2cdetectコマンドを実行すると、ちゃんとGrovePiをi2cデバイスとして認識してくれていることがわかります。

$ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- 04 -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Go言語環境のセットアップ

さて、個人的にRaspberry Pi 2での開発もGo言語を使いたいので、環境のセットアップを行います。Raspbianではapt-getコマンドでGo言語をインストールすることもできるのですが、残念ながらパッケージのバージョンが古いため、バージョンの新しいバイナリをダウンロードし展開しておきます。

$ wget -O - http://dave.cheney.net/paste/go1.4.linux-arm~multiarch-armv6-1.tar.gz|sudo tar -xzC /usr/local -f -

Go言語を使うための環境変数の設定を行います。

$ echo '# Setup for golang' |sudo tee /etc/profile.d/golang.sh
$ echo 'PATH=$PATH:/usr/local/go/bin'|sudo tee -a /etc/profile.d/golang.sh
$ echo 'export GOROOT=/usr/local/go'|sudo tee -a /etc/profile.d/golang.sh
$ echo 'export GOPATH=$HOME'|sudo tee -a /etc/profile.d/golang.sh
$ vi ~/.bashrc
source /etc/profile.d/golang.sh

なお、Raspberry Pi 2では無く別の環境でビルドする場合には、以下のようにクロスコンパイル可能なように設定をします。

$ cd $GOROOT/src
$ GOOS=linux GOARCH=arm ./make.bash --no-clean

GrovePiを動かしてみる

ようやく本題。GrovePiのD2ポートにGrove - Buttonを、D3ポートにGrove - LED Socketを接続します。書いたソースコードがこちら。

package main

import (
 "fmt"
 "github.com/DexterInd/GrovePi/Software/Go/grovepi"
)

func main() {
 var g grovepi.GrovePi
 g = *grovepi.InitGrovePi(0x04)

 err := g.PinMode(grovepi.D2, "input")
 if err != nil {
  fmt.Println(err)
 }

 err = g.PinMode(grovepi.D3, "output")
 if err != nil {
  fmt.Println(err)
 }

 for {
  button, _ := g.DigitalRead(grovepi.D2)
  if button == 1 {
   g.DigitalWrite(grovepi.D3, 1)
  } else {
   g.DigitalWrite(grovepi.D3, 0)
  }
 }
}

実行結果

Raspberry Pi 2 & GrovePi

smokey monkeyさん(@smokeymonkey)が投稿した動画 -

はい、動きました!

さいごに

gobotも試してみたのですが、うまく動きませんでした。GrovePi公式のライブラリを使うのが一番簡単そうです。

これでRaspberry Pi 2でもGroveシステムのセンサーを使えるようになりましたので、いろいろ試してみたいと思います。