5
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-10-15

本記事は、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 チュートリアル一覧

5
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6