オムロンが提供するUSB型の環境センサ、2JCIE-BU01とRaspberry Piを連携してセンシングを行い、取得したデータのグラフ表示に挑戦します。グラフ表示にはIoTのデータ可視化サービスであるAmbientを使っていきます。

2JCIE-BUについて

2JCIE-BU環境センサはUSB型のセンシングデバイスです。カバン型の環境センサ2JCIE-BLと同じBLE通信に加え、USBシリアルでの通信も可能となっています。取得できるデータは下記の通りです。

  • 温度
  • 相対湿度
  • 照度
  • 気圧
  • 騒音
  • 3軸加速度
  • eTVOC
  • eCO2
  • 不快指数
  • 熱中症警戒度
  • 振動情報

事前準備

必要なモノ

  • Raspberry Pi 3B/3B+
  • microSDカード
  • オムロン環境センサ(2JCIE-BU01)

環境センサはオムロンFAストアのほか、Digi-Keyなどから購入可能です。

また、isaax勉強会に参加している場合はインストール時間を節約するためにあらかじめ用意された、手元のSDカードを使用してください。公式のRaspbianを使って1からセットアップする場合はこの記事の最後にある付録をご覧ください。

必要なアカウント

ハンズオンで必要となるアカウントは下記の通りです。あらかじめアカウントを取得しておきましょう。

  • GitHub
  • Ambient
  • isaax

必要な知識

  • CUI操作の基本
  • Pythonプログラミングの基本

ハードウェアのセットアップ

Raspberry Piに環境センサ、SDカード、LANケーブル(勉強会では有線を使用します)を接続してください。その後、Raspberry PiのmicroUSBポートから電源を投入します。


勉強会に参加している方は、Raspberry Piに電源をいれたらisaaxのスタッフをお呼びください。スタッフがIPアドレスを調べますので、後ほどSSH接続するためにメモしておいてください。

環境センサの接続確認

Raspberry Piが環境センサを認識しているか確認します。

SSHでRaspberry Piにログインする

ターミナルを開いてssh pi@xx.xx.xx.xx(xx.xx.xx.xxの部分はRaspberry PiのIPアドレス)を実行し、Raspberry Piにログインします。

Windowsの場合はGoogle Chrome拡張機能のSecure Shell Appを使うことをおすすめします。

パスワードを聞かれるので、Raspberry Piのパスワードを入力します (デフォルトではraspberry)。

以下は、IPアドレスが192.168.1.37の場合の例です。

$ ssh pi@192.168.1.37
pi@192.168.1.37's password: 
Linux raspberrypi 4.14.79-v7+ #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue Feb  5 16:23:48 2019 from 10.0.1.11
pi@raspberrypi:~ $

Secure Shell Appの場合は、sshコマンドを実行する代わりに下図のようになります。

secure shellのss

USB接続を確認する

ログインに成功したら、環境センサが認識しているかどうか調べます。Raspberry Piのターミナル上で下記のコマンドを実行してください。

$ lsusb

Bus 001 Device 006: ID 0590:00d4 Omron Corp.の出力が確認できれば環境センサを認識しています。次に、シリアル通信を行う際のポートが存在することを確認します(生のRaspbianを使用している場合は先に付録1. SDカードのセットアップの節をお読みください)。

$ ls /dev/ttyUSB*

他に接続しているUSBデバイスがない場合は、/dev/ttyUSB0が表示されるはずです。こちらを使って環境センサとシリアル通信を行います。より詳細に確認する場合はdmesgコマンドを使用します。

$ dmesg | grep usb
... 中略 ...
[ 8976.300918] usb 1-1.4: FTDI USB Serial Device converter now attached to ttyUSB0

サンプルプログラムを動かそう

さっそくサンプルプログラムを動かしてみましょう。大まかな手順は、以下のとおりです。

  1. GitHubのリポジトリをフォークする
  2. isaaxプロジェクトの作成
  3. isaaxdをRaspberry Piにインストール

isaaxdをRaspberry Piにインストールすると、自動的にアプリケーションが起動し、isaaxのダッシュボード上で動作確認ができます(GitHub上のサンプルコードがあらかじめisaaxで動作するようにセットアップされています)。

サンプルコードのフォーク

isaaxでは、Raspberry Piに配信するプログラムをGitリポジトリ(以下、リポジトリ)として管理します。今回はあらかじめ用意したサンプルコードをフォークして使います。

リポジトリとは、ファイルやディレクトリの変更履歴を保持したプログラムファイルの集合です。Gitを使って開発する場合、大抵は1つのアプリケーションごとに1リポジトリ作成します(もちろん例外もあります)。

上記リンクを開き、右上の「Fork」ボタンをクリックして自分のGitHubアカウントにリポジトリをフォークしましょう。

isaaxプロジェクトの作成

前節で自分のGitHubアカウントにフォークしたリポジトリを使い、isaaxにプロジェクトを作成します。isaaxアカウントをまだ作成していない場合はこのタイミングで登録しましょう(GitHubアカウントを使って登録すると便利です)。

リポジトリ名のyutashi/study-picamera-examplesは、{あなたの名前}/{2jciebu-usb-raspberrypi}に書き換えてください。

プラットフォームはGitHubを選択し、上図のように設定し保存ボタンをクリックします。

isaaxdのインストール

作成したプロジェクトにデバイスを登録します。Raspberry Pi側にisaaxdというエージェントをインストールすことで、デバイス登録が完了します。

saaxdはRaspberry Piなどのデバイス上で動作するソフトウェアです。isaaxクラウドとの通信とユーザーアプリケーションの管理を担っています。 isaaxdとはより引用


プロジェクトトークンはデバイスの認証を行うのに必要となります。インストールスクリプトはそのトークンを引数としてisaaxdのインストールをワンコマンド実行するためのスクリプトです。下側のインストールスクリプトの文字列をコピーしてください。

コピーしたコマンドはラズベリーパイ上で実行します。WindowsならSecure Shell App、macやLinuxならTerminalを使ってラズパイにSSH接続しましょう。

ユーザー名はpi、初期パスワードはraspberryです。

上図のようにisaaxd installation completeが表示されればインストール成功です。

先ほどフォークしたリポジトリのプログラムがRaspberry Piに配信され、自動的にアプリケーションを起動してデータの収集をはじめました。

動作の確認

サンプルコードは、環境センサからシリアル通信でCO2を取得し、その値を標準出力するシンプルなスクリプトです。isaaxdはこのアプリケーションの標準出力と、標準エラー出力を監視してクラウドにログデータとして送信します。

isaaxのダッシュボード右上の「events」ボタンをクリックして、デバイスのログデータを確認しましょう。

上記ではCO2の値を表示しています。ためしに、USBセンサーに息を吹きかけて数値が変動するかどうか確認してみましょう。

データの可視化

前節までの内容で、サンプルコードをRaspberry Piに配信して実行することができました。isaaxを使っているため、配信したアプリケーションの更新を簡単に行うことができます。

本節では、取得したCO2データをクラウドで可視化する部分を実装します。

データ送信クライアントの作成

サンプルコードに変更を加え、Ambientにデータを送信してみましょう。ここでは送信処理をサンプルコードに直接書き込んでいきますが、Pythonに慣れている方はこちらのスクリプトのように、処理をわけるなど工夫してみましょう。

まずはじめに、サンプルコードenvsensor.pyの先頭でambientモジュールをインポートします(勉強会のSDカードを使用していない場合はテキストの最後にある付録からインストール方法を確認してください)。

import ambient
import os
from datetime import datetime

Ambient APIとやり取りするために必要な認証情報を環境変数から読み込ませます。99行目 if __name__ == "__main__": 以降に下記の処理を追加しましょう。

    try:
        CHANNEL_ID = int(os.environ['AMBIENT_CHANNEL_ID'])
        WRITE_KEY = os.environ['AMBIENT_WRITE_KEY']
    except KeyError as e:
        print('Missing environment variable: '.format(e))
        exit(1)

続けて、Ambientクライアントを作成します。

    am = ambient.Ambient(CHANNEL_ID, WRITE_KEY)

最後に、送信データの作成からアップロード処理まで記述します。tryブロック内のコードを下記のように書き換えましょう。

    last_uploaded = datetime.now()
    while True:
        try:
            timestamp = datetime.now()
            if (timestamp - last_uploaded).seconds > 10:
                 am.send({
                    "d1": e.get_co2(),
                    "created": timestamp.strftime("%Y/%m/%d %H:%M:%S")
                })
            time.sleep(1)
        except KeyboardInterrupt:
            break

変更を終えたら、コミットを作成してリポジトリにプッシュしましょう。isaaxがリポジトリの更新を自動的に検知して変更内容をRaspberry Piに配信します。

Raspberry Piが正しく更新されると、下記のようなログが確認できるはずです。上手く動作しない場合は、コードの全体像を確認してください。

このエラーは、読込先の環境変数AMBIENT_CHANNEL_IDAMBIENT_WRITE_KEYがセットされていないために表示されます。これらの設定方法は次節にて説明します。

チャネル作成

それでは、環境変数にセットする値の生成から始めましょう。Ambientアカウントにログイン後、「Myチャネル」->「チャネルを作る」ボタンからチャネルを新規作成します。


チャネルIDとライトキーを後ほど使います。

環境変数の追加

isaaxではAPIキーのような認証情報や環境によって異なるエンドポイントなど、ハードコーディングしたくないデータを切り分けてデプロイする機能があります。isaaxで登録したこれらのデータはデバイス上で環境変数としてアクセスできます。

サンプルアプリケーションがAmbientにデータを送信するために、先ほどコードを変更した際チャネルIDとライトキーを環境変数AMBIENT_CHANNEL_IDAMBIENT_WRITE_KEYから読み込むように変更しました。これらの変数をisaaxから設定します。

クラスターページから「Cluster Settings」をクリックしてドロップダウンを開きます


「ユーザー変数」タブから「+環境変数追加」をクリックします。


Ambientで作成したチャネルの情報を元に、AMBIENT_CHANNEL_IDAMBIENT_WRITE_KEYをそれぞれ登録しましょう。

動作の確認

環境変数を保存後、「restart」ボタンをクリックし、デバイスログが変更され、センサー値に置き換わっていれば成功です。

Ambientのダッシュボードを再度開き、該当するチャネルをクリックすると、数十秒後にチャートが自動的に作成されます。これで、クラウドでセンサーデータを可視化することができました。

時間に余裕がある方は…

課題1 送信頻度の変更

Ambientに送信する頻度を変更し、送信間隔を短く(または長く)してみましょう。Ambientへの最短送信間隔は5秒ですので、それ以上の間隔をあけてください。

5秒より短い送信間隔で送りたい方は、タイムスタンプとともにデータを配列に格納して送るように変更をくわえましょう。

Pythonライブラリ – Ambientへのデータ送信

課題2 複数データの表示

Ambientには、最大で8種類までのデータを送ることが可能です。EnvSensorクラスのメソッドget_temp()を使い、CO2に加えて温度も同時に送るように変更を加えましょう。

サンプルコード get_tempメソッド – GitHub

課題3 湿度取得メソッドの実装

EnvSensorクラスに実装されているget_co2()get_temp()メソッドを参考に、湿度を取得するためのメソッド、get_humi()を新しく実装し、湿度データをAmbientで可視化しましょう。この作業はおおきく4つのタスクに分かれます。

  • 湿度を格納するインスタンス変数の追加
  • _update()メソッドによる湿度データの更新
  • get_humi()メソッドの実装
  • get_humi()の呼び出し、Ambientへの送信

USBセンサのデータから、湿度データを取り出す方法は下記リンクのコードを参考にしてください。

サンプルコード 湿度データの取り出し – GitHub

課題4 LEDの制御

USB型環境センサでは、内部のフルカラーLEDを制御することができます。下記のサンプルコードを参考に、データの取得時やAmbientへのアップロード時にLEDをON/OFFするように変更をくわえてみましょう。

サンプルコード LED ON – GitHub

付録1. SDカードのセットアップ

勉強会で使用したOSはRaspbian Stretch Liteをベースに作成しました。下記ページよりダウンロードしてください。

サンプルコードを実行するために必要な依存パッケージをインストールします。

$ sudo apt install -y python3-pip
$ sudo pip3 install pyserial
$ sudo pip3 install git+https://github.com/AmbientDataInc/ambient-python-lib.git

環境センサとシリアル通信を行うために、ドライバーをロードします。

$ sudo modprobe ftdi_sio
$ sudo chmod 777 /sys/bus/usb-serial/drivers/ftdi_sio/new_id
$ sudo echo 0590 00d4 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id

上記の方法では、Raspberry Piを起動させるたびに同じコマンドを実行する必要があります。自動的に認識させたい場合は、/etc/udev/rules.d/99-ftdi.rulesファイルを作成し、以下の行を追加してください。

ACTION=="add", ATTRS{idVendor}=="0590", ATTRS{idProduct}=="00d4", RUN+="/sbin/modprobe ftdi_sio" RUN+="/bin/sh -c 'echo 0590 00d4 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id'"

付録2. 事後学習のために

isaaxについてより深く知るためには、公式のドキュメントを読んだり、コミュニティで質問してみましょう。

無料の勉強会も開催しているので、ハンズオンしたい方はこちらにもご参加ください。

本格的にIoTの開発を学びたい場合は、有料の講座もご利用ください。

SNSでもIoTに関する情報を発信しています。フォローお願いします。


0 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *