Edited at

CHIRIMEN for Raspberry Pi 3 チュートリアル 3. I2C 応用編(その他のセンサー)

本記事は、CHIRIMEN for Raspberry Pi Ver.2018/03/08以前のVersionに対応しています。

新しいCHIRIMEN for Raspberry Piをお使いの方は、新しいCHIRIMENチュートリアルを参照ください。


  • 概要


  • 1.準備

  • 2.光センサーを使ってみる


  • 3.測距センサーを使ってみる


  • 4.3軸加速度センサーを使ってみる

  • 5.演習:複数のセンサーを組み合わせて使ってみよう

  • 6.他のI2Cモジュールも使ってみる

  • まとめ



概要

CHIRIMEN for Raspberry Pi 3 を使ったプログラミングを通じて、Web I2C API の使い方を学びます。

前回は温度センサーを使いながらWeb I2C APIの基本的な利用方法を学びました。今回は温度センサー以外のI2Cセンサーの使い方を見ていきましょう。


(※1) CHIRIMEN for Raspberry Pi 3とは

Raspberry Pi 3(以下「Raspi3」)上に構築したIoTプログラミング環境です。


Web GPIO API (Draft)や、Web I2C API (Draft)といったAPIを活用したプログラミングにより、WebアプリからRaspi3に接続した電子パーツを直接制御することができます。

CHIRIMEN Open Hardware コミュニティにより開発が進められています。


前回までのおさらい

本チュートリアルを進める前に前回までのチュートリアルを進めておいてください。

前回までのチュートリアルで学んだことは下記のとおりです。


  • CHIRIMEN for Raspberry Pi 3 では、各種exampleが ~/Desktop/gc/配下においてある。配線図も一緒に置いてある

  • CHIRIMEN for Raspberry Pi 3 で利用可能なGPIO Port番号と位置は壁紙を見よう

  • CHIRIMEN for Raspberry Pi 3 ではWebアプリからのGPIOの制御にはWeb GPIO API を利用する。GPIOポートは「出力モード」に設定することでLEDのON/OFFなどが行える。また「入力モード」にすることで、GPIOポートの状態を読み取ることができる


  • async function を利用すると複数ポートの非同期コードがすっきり書ける

  • CHIRIMEN for Raspberry Pi 3 ではWebアプリからI2C通信に対応したモジュールの制御にWeb I2C API を利用することができる


1.準備


複数のI2Cモジュールを接続するために

前回はRaspberry Piと温度センサーを4本のジャンパケーブルで直接接続しました。


I2Cバスには複数のモジュールが接続できますので、今回は複数のI2Cモジュールを容易に追加・削除できるようにGrove I2C Hubを利用することにします。

Grove I2C Hubは、4つのGroveコネクタを備えたI2Cモジュールを接続するためのハブです。

4ピンの Grove 4ピン ケーブルを経由すれば、後述するGrove Digital Light SensorなどGroveコネクタを備えたI2Cモジュールを直接接続することができます。

Raspberry Pi 3 や前回のADT7410などピンヘッダを備えた(あるいは事前にスルーホールにピンヘッダをはんだ付けしてある)モジュールとの接続には、Grove 4ピン ジャンパ メスケーブル 経由で接続することができます。


用意するもの

ここでは、1つのGroveコネクタつきI2Cモジュールと1つのピンヘッダつきI2Cモジュールを接続することを想定し、下記を用意しておきましょう。

ハブとケーブル

上記に加え今回紹介するセンサーが必要となりますが、センサーについては各センサーの説明のパートに記載します。

11/10 追加

測距センサーをSRF02からGP2Y0E03しました。

この変更に伴い、下記が追加で必要になります。


  • ブレッドボード x 1

  • ジャンパーケーブル(オス-オス) x 2


2.光センサーを使ってみる

光の強度に反応するセンサーを使ってみましょう。


a. 部品と配線について

「1.準備」のパートに記載したものに加え、下記を用意してください。

Raspberry Pi 3との接続方法については、下記回路図を参照ください。

/home/pi/Desktop/gc/i2c/i2c-grove-light/schematic.png

回路図

このセンサーモジュールはGroveコネクタを備えていますので、接続方法に応じてコネクタを選んでください。


  • Grove I2C Hub経由で接続する場合 :Grove 4ピン ケーブル経由で接続してください。

  • Raspberry Pi 3へ直接接続する場合:Grove 4ピン ジャンパー メス ケーブル経由で接続してください。


b. 接続確認とexampleの実行

i2cdetectで接続を確認しておきましょう。


$ i2cdetect -y -r 1


SlaveAddress 0x29 が見つかれば接続OKです。

次にexampleを動かします。

/home/pi/Desktop/gc/i2c/i2c-grove-light/index.html

画面の回路図の下の数値が明るさの値です。

センサーに当たる光を遮断してみてください。数値が小さくなるはずです。

逆にセンサーにLEDの光を直接当てると数値が大きくなることが確認できるでしょう。


c.コード解説

exampleのコードから、光センサーに関係する部分を見ていきます。

今回はドライバーライブラリの中までは深入りせずに、アプリケーションの流れを追ってみましょう。

ADT7410の時とほとんど同じであることがわかるはずです。


c-1. index.html

下記がindex.htmlの中から主要な部分を抜き出したコードです。


index.html

  : 

<script src="../../polyfill/polyfill.js"></script>
<script src="../../drivers/i2c-grove-light.js"></script>
<script src="./main.js"></script>
:
<body>
:
<p id="head">TEST</p>
:
</body>

HTMLはADT7410の時とほとんど同じです。

ドライバーライブラリが、i2c-grove-light.jsに変わりました。


c-2. main.js

次に、main.jsを見てみましょう。(重要な部分以外は削っています)


main.js

navigator.requestI2CAccess().then((i2cAccess)=>{

var port = i2cAccess.ports.get(1);
var grovelight = new GROVELIGHT(port,0x29);
grovelight.init().then(()=>{
setInterval(()=>{
grovelight.read().then((value)=>{
head.innerHTML = value ? value : head.innerHTML;
});
},200);
})
})

main.jsも温度センサーとほとんど同じです。

var grovelight = new GROVELIGHT(port,0x29)

ここで光センサー用のドライバーライブラリのインスタンス生成を行なっています。

ライブラリ名が変わっただけでADT7410と同様に、portオブジェクトと、SlaveAddressをパラメータで渡しています。

grovelight.init()

init()では、インスタンス生成時に指定したportオブジェクトとslaveAddress(0x29)を用いてI2CPort.open()を行ない、返却される I2CSlaveDevice を保存後にresolve()で呼び出し元に処理を返しています。

** grovelight.read()**

Grove Digital Light Sensorの仕様に基づくデータ読み出し処理をここで実施しています。


3.測距センサーを使ってみる (11/10変更)

モノまでの距離を測定する測距センサーを使ってみましょう。


a. 部品と配線について

「1.準備」のパートに記載したものに加え、下記を用意してください。

Raspberry Pi 3との接続方法については、下記回路図を参照ください。

/home/pi/Desktop/gc/i2c/i2c-GP2Y0E03/schematic.png

回路図

このセンサーモジュールには、細い7本のケーブルが付属していますが、このままではRaspberry Piと接続することができません。

この細いケーブルを2.54mm のジャンパーピンにハンダづけするなどしてブレッドボード経由でRaspberry Piと接続できるよう、加工しておいてください。

ピンの加工例

加工例


b. 接続確認とexampleの実行

i2cdetectで接続を確認しておきましょう。


$ i2cdetect -y -r 1


SlaveAddress 0x40 が見つかれば接続OKです。

次にexampleを動かします。

/home/pi/Desktop/gc/i2c/i2c-GP2Y0E03/index.html

画面の回路図の下の数値が距離の値(cm)です。

センサーの前面(小さな目玉のような部品が着いた面)を障害物の方向に向けてみてください。障害物とセンサーの距離に応じて数字が変化するはずです。


GP2Y0E03 が計測できる距離は 60cm くらいまでです。

測定できる範囲を超えている場合、out of range と表示されます。



c.コード解説

exampleのコードから、測距センサーに関係する部分を見ていきます。


c-1. index.html

下記がindex.htmlの中から主要な部分を抜き出したコードです。


index.html

  : 

<script src="../../polyfill/polyfill.js"></script>
<script src="../../drivers/i2c-GP2Y0E03.js"></script>
<script src="./main.js"></script>
:
<body>
:
<p id="distance">init</p>
:
</body>

HTMLはADT7410の時とほとんど同じです。

ドライバーライブラリが、i2c-GP2Y0E03.jsに変わりました。


c-2. main.js

次に、main.jsを見てみましょう。(重要な部分以外は削っています)


main.js

navigator.requestI2CAccess().then((i2cAccess)=>{

var port = i2cAccess.ports.get(1);
var sensor_unit = new GP2Y0E03(port,0x40);
var valelem = document.getElementById("distance");
sensor_unit.init().then(()=>{
setInterval(()=>{
sensor_unit.read().then((distance)=>{
if(distance != null){
valelem.innerHTML = "Distance:"+distance+"cm";
}else{
valelem.innerHTML = "out of range";
}
}).catch(function(reason) {
console.log("READ ERROR:" + reason);
});
},500);
});
});

main.jsも温度センサーとほとんど同じです。

var sensor_unit = new GP2Y0E03(port,0x40)

ドライバーライブラリのインスタンス生成処理です。

sensor_unit.init()

こちらも、内部でI2CSlaveDeviceインタフェースを取得する処理で、他のセンサーと同様です。

** sensor_unit.read()**

測距センサーGP2Y0E03の仕様に基づくデータ読み出し処理をここで実施しています。


4.三軸加速度センサーを使ってみる

傾きなどに反応するセンサーを使ってみましょう。


a. 部品と配線について

「1.準備」のパートに記載したものに加え、下記を用意してください。

Raspberry Pi 3との接続方法については、下記回路図を参照ください。

/home/pi/Desktop/gc/i2c/i2c-grove-accelerometer/schematic.png

回路図

このセンサーモジュールはGroveコネクタを備えていますので、接続方法に応じてコネクタを選んでください。


  • Grove I2C Hub経由で接続する場合 :Grove 4ピン ケーブル経由で接続してください。

  • Raspberry Pi 3へ直接接続する場合:Grove 4ピン ジャンパー メス ケーブル経由で接続してください。


b. 接続確認とexampleの実行

i2cdetectで接続を確認しておきましょう。


$ i2cdetect -y -r 1


SlaveAddress 0x53 が見つかれば接続OKです。

次にexampleを動かします。

/home/pi/Desktop/gc/i2c/i2c-grove-accelerometer/index.html

画面の回路図の下に表示されている3つの数値が加速度センサーの値です。

画面左から、X、Y、Zの値となっています。

加速度センサーの値

センサーを傾けると数値が変化するはずです。


c.コード解説

exampleのコードを見てみましょう。


c-1. index.html

下記がindex.htmlの中から主要な部分を抜き出したコードです。


index.html

  : 

<script src="../../polyfill/polyfill.js"></script>
<script src="../../drivers/i2c-grove-accelerometer.js"></script>
<script src="./main.js"></script>
:
<body>
:
<div id="ax" class="inner">ax</div>
<div id="ay" class="inner">ay</div>
<div id="az" class="inner">az</div>
:
</body>

ドライバーライブラリが、i2c-grove-accelerometer.jsに、そしてX、Y、Z、3つの値を表示するため要素が3つに変わりましたが、それ以外は今回もこれまでとほとんど同じです。


c-2. main.js

次に、main.jsを見てみましょう。(重要な部分以外は削っています)


main.js

navigator.requestI2CAccess().then((i2cAccess)=>{

var port = i2cAccess.ports.get(1);
var groveaccelerometer = new GROVEACCELEROMETER(port,0x53);
groveaccelerometer.init().then(()=>{
setInterval(()=>{
groveaccelerometer.read().then((values)=>{
ax.innerHTML = values.x ? values.x : ax.innerHTML;
ay.innerHTML = values.y ? values.y : ay.innerHTML;
az.innerHTML = values.z ? values.z : az.innerHTML;
});
},1000);
})
})

main.jsも温度センサーとほとんど同じです。

var groveaccelerometer = new GROVEACCELEROMETER(port,0x53)

ここで加速度センサー用のドライバーライブラリのインスタンス生成を行なっています。

grovelight.init()

これまでのドライバーライブラリ同様にinit()では、インスタンス生成時に指定したportオブジェクトとslaveAddress(0x29)を用いてI2CPort.open()を行ない、返却される I2CSlaveDevice を保存後にresolve()で呼び出し元に処理を返しています。

groveaccelerometer.read()

read() では、加速度センサーの X、Y、Zの値が一度に返却されます。


5.演習:複数のセンサーを組み合わせて使ってみよう

せっかくGrove I2C Hubを用意しましたので、これまでの復習と応用を兼ねて下記のような組み合わせで2つのセンサーを繋いで動かしてみましょう。


  • 温度センサー(ADT7410)か、「超音波センサー(SRF02)」のどちらか 1つ

  • 「光センサー(Grove Digital Light Sensor)」か「三軸加速度センサー」のどちらか1つ

※この組み合わせなら、冒頭で用意したケーブルで足りるはずです。

オンライン版のドライバーライブラリは下記にあります。

まずはセンサーを繋いでから、jsbinjsfiddle を使ってコードを書いてみましょう。


6.他のI2Cモジュールも使ってみる

前回からこれまでに4つのI2Cセンサーを使ってみました。

本稿執筆中の CHIRIMEN for Raspberry Pi 3 には、他にも /home/pi/Desktop/gc/i2c/ 配下に下記のようなI2Cモジュールの examples が含まれています。


  • i2c-grove-gesture : 「Grove Gesture」(簡単なジェスチャーを判定するセンサー)の接続例です。

  • i2c-grove-oledDisplay : 「Grove OLED Display」(Grove端子で接続できるOLED Display)の接続例です。

  • i2c-grove-touch : 「Grove Touch Sensor」(Grove端子で接続できるタッチセンサー)の接続例です。

  • i2c-PCA9685 : 「PCA9685 16-CHANNEL 12-BIT PWM/SERVO DRIVER」(I2C経由でLEDやサーボモータを16個まで制御可能なモジュール)の接続例です。

  • i2c-S11059 : 「S11059 カラーセンサー」(カラーセンサー)の接続例です。

  • i2c-VEML6070 : 「VEML6070 紫外線センサー」(紫外線センサー)の接続例です。

  • i2c-multi-sensors : 2つのセンサー(ADT7410とSRF02)を利用する例です。

  • i2c-canzasi-blink : 「Canzasi」(筆者が開発を進めるI2C Slave Device開発環境) の接続例です。

ご興味がありましたら、ぜひ触ってみてください。


まとめ

このチュートリアルでは 下記について学びました。


  • Grove I2C Hubを使ったI2Cモジュールの接続方法

  • 2.光センサーの使い方


  • 3.超音波センサーの使い方


  • 4.3軸加速度センサーの使い方

  • 複数のセンサーを繋いだ演習

次回のCHIRIMEN for Raspberry Pi 3 チュートリアルはいよいよ最終回!

Web GPIO APIとWeb I2C APIを組み合わせたプログラミングに挑戦してみたいと思います。

お楽しみに!


CHIRIMEN for Raspberry Pi 3 チュートリアル一覧