arrow-righthamburgerlogo-marksocial-facebooksocial-githubsocial-twitter
2018.08.30

【ハンズオン資料】Nefry BTと人感センサで防犯LINE BOTを作ってみよう

ちゃんとく

Nefry BT
   このエントリーをはてなブックマークに追加  

この記事は8/30のIoT超入門!「Nefry BT」無料お試し体験ハンズオン!向け資料です。記事を読んで試せる内容になっているので、参加されていない方もぜひ試してみてください!

最終的にはこんなものが出来上がります。

Image from Gyazo

■ハンズオンの進行について

ハンズオンはこのページに沿って進めます。進められる方は、どんどん進めていきましょう!リンクは別タブや別ウィンドウで開くのがオススメです。

■Nefry BTドキュメントについて

この授業に合わせて諸々リニューアルしたため、WIP状態の部分が多いです。ご了承ください(わかりづらい部分ぜひ教えてください)。近日中にアップデートします。

今回やってみること

人が近づくと自分のLINEに通知がくる仕組みを、Nefry BT、LINE(、Azure)を使って作ってみます。近づくと点灯する玄関の防犯ライトに近いイメージです。

architecture

用意するもの

■Nefry BT&ディスプレイ

Nefry BTは「ESP-WROOM-32」というWi-Fi・BLE通信モジュールを搭載した、Arduinoと同じように開発できるマイコンボードです。

nefry

Groveという刺すだけで配線できるモジュール対応のコネクタを搭載していて、ハードウェアをあまり意識せずに開発できます。


■Grove PIRモーションセンサ

刺すだけで配線できるGroveシリーズの、人感センサです。

motion_sensor


■Arduino IDE

開発(プログラムの書き込み)にはArduino IDEというフリーソフトウェアを利用します。

こちらの手順を見ながらご自身のPCにインストールしてください。


■LINEアカウント

今回はLINE通知の機能を作成します。LINEアカウントをご用意ください。

また、PCから設定する際にメールアドレスでのログインが必要になります。あらかじめスマートフォンアプリでメールアドレスを設定しておいてください。


■Azureアカウント

WIP

事前準備(セットアップ)

Nefry BTのWi-Fi設定

まずはNefry BTがインターネットにつながるよう、会場のWi-Fi情報をNefry BTに教えてあげます。

Nefry BTとPCを直接通信させ(アドホックモード)、立ち上がるNefryポータル(設定ウィンドウ)からSSIDとパスワードを入力する手順です。こちらの手順を見ながら進めてみてください。

一度設定したら、同じWi-Fiを使っている間は起動するだけで接続されます。Wi-Fi情報は5つまで保存でき、消去もできます。

開発環境(Arduino IDE)にボードを追加

Nefty BTの開発にはフリーソフトウェアのArduino IDEを利用します。インストールがまだの方は「Arduino IDEのインストール」を見ながら進めてください。

Arduino IDEには、Nefry BTのボード情報の追加が必要です。「環境構築(Arduino IDE)」を見ながら追加してください。

■PCにUSB接続できない方

セキュリティやポートの問題でPCにUSB接続できない方は、Wi-Fi経由でプログラムの書き込みが可能です。給電はコンセントやモバイルバッテリーから直接行ってください。

はじめてのプログラムを書き込んでみる

まずはNefry BTに簡単なプログラムを書き込んでみましょう。Nefry BTは、最初から下記の機能が搭載されています。

まずはLチカ

最初のプログラムとして、Lチカをやってみます。LEDチカチカの略で、Webでいう”Hello, World!”です。


■Arduino IDEでプログラムを書く

Arduino IDEを立ち上げ、メニューからファイル > 新規ファイルを選択します。下記のような画面が開きます。

ide

エディタ部分に、下記のプログラムをコピーして貼り付けましょう。

#include <Nefry.h>

void setup() {
}

void loop() {
  Nefry.setLed(0, 0, 255); //色合いをRGBで指定
  Nefry.ndelay(1000); //1秒待つ
  Nefry.setLed(0, 0, 0); //LEDをオフにする
  Nefry.ndelay(1000); //1秒待つ
}

下記でプログラムの内容を解説しています。

■PCにUSB接続できない方

セキュリティやポートの問題でPCにUSB接続できない方は、Wi-Fi経由でプログラムのアップロードが可能です。その場合、下記の書き込み手順は不要です。給電はコンセントやモバイルバッテリーから直接行ってください。


■ボードを選択

メニューのツール > ボード > Nefry BT R2 / R3を選択します。この際、ボードは使っているリビジョンに合わせて選択してください。(参照:リビジョンを確認

例えば、使っている基板がR3の場合はツール > ボード > Nefry BT R2 / R3を選択します。

select_board

select_board2


■シリアルポートを選択

Nefry BTをPCのUSBポートにさします。プログラムはこのポートを介して、シリアル通信でNefry BTに流し込まれます。

Macの場合は、メニューのツール > シリアルポート > /dev/cu.usbserial-xxxxxxを選択します。環境によっては/dev/tty.usbserial-xxxxxxなどの場合もあります。

select_port

Windowsの場合は、ツール > シリアルポート > /dev/COM-XXを選択します。

※Nefry BTを抜き差しすると、シリアルポートの選択が解除される場合があります。適宜確認しましょう。

■シリアルポートが選択できない方

USBドライバのインストールが必要な場合があります。こちらを参照して、USBを認識させるためのドライバをインストールしてください。また、Arduino IDEの再起動やUSBの抜き差しで認識する場合があります。


■名前をつけて保存

ファイル>名前をつけて保存を選択して保存します。「NefryLedBlink」など、後からみてわかりやすい名前がオススメです。


■プログラムを書き込む

「✔️」を押してプログラムをコンパイルします。 この手順は省略しても大丈夫ですが、シンタックス(文法)チェックをしてくれるので実施するのがオススメです。

左上の「→」ボタンを押してNefry BTにプログラムを書き込みます。

ESP32モジュールの特性上、書き込みに1分ほどかかります。エラーが出てしまうときは、「コンパイルは成功するのに書き込みが失敗する」を参照してください。


■動作を確認

起動したら、「青いLEDが1秒ごとに光る」ことを確認しましょう。

Image from Gyazo


■プログラムの解説

プログラムの要所を説明していきます。

#include <Nefry.h>

冒頭でライブラリを読み込んでいます。Nefry BTのライブラリでできることは「Nefryのライブラリ」を参照してください。

void setup() {
}

起動時に処理される部分です。今回はなにもしません。

void loop() {
  Nefry.setLed(0, 0, 255); //色合いをRGBで指定
  Nefry.ndelay(1000); //1秒待つ
  Nefry.setLed(0, 0, 0); //LEDをオフにする
  Nefry.ndelay(1000); //1秒待つ
}

起動時に繰り返し実行する部分です。

Nefry.setLed()という関数で、光らせる色合いをRGBの順で指定します。始めにR=0, G=0, B=255を渡しているので、青く光ります。

続いてNefry.ndelay()という関数で次の処理まで指定した時間待ちます。Arduinoでは時間はミリ秒で指定するので、1000は1秒です。

Nefry.setLed()に0, 0, 0を渡すことで、LEDはオフになります。オンとオフのあと1秒ずつ待つことで、点滅を表現しています。

スイッチを押したらLチカ

■Arduino IDEでプログラムを書く

同様の手順で新規ファイルを作成し、下記のプログラムをNefry BTに書き込みます。おさらいがてら、やってみましょう。

#include <Nefry.h>

void setup() {
   // スイッチを有効化
   Nefry.enableSW();
}

void loop() {
    // スイッチが押されたら
    if (Nefry.readSW()) {
        Nefry.setLed(255, 0, 0);
        Nefry.ndelay(1000);
    }
    // 青色に戻す
    Nefry.setLed(0, 0, 255);
}

下記でプログラムの内容を解説しています。


■動作を確認

スイッチ(RSTではない方)を押したら、LEDが赤く光ることを確認します。

Image from Gyazo


■プログラムの解説

プログラムの要所を説明します。

void setup() {
   // スイッチを有効化
   Nefry.enableSW();
}

起動時の処理では、Nefry.enableSW()という関数でスイッチを有効化しています。マイコンボードでは、入力・出力に使うピンなどはsetup()関数内で有効化します。

void loop() {
    // スイッチが押されたら
    if (Nefry.readSW()) {
        Nefry.setLed(255, 0, 0);
        Nefry.ndelay(1000);
    }
    // 青色に戻す
    Nefry.setLed(0, 0, 255);
}

if(){}という条件式で、スイッチが押されたことを取得します。スイッチが押されたら1秒間赤いLEDを光らせます。スイッチが押されている以外のときは、青色のLEDを光らせます。

オフラインでGroveセンサを試す

次は、配線してセンサのデータを取得してみます。まずはインターネットに繋がらない電子工作、です。

エラーの切り分け(どこでエラーが起こっているか)を特定するために、自分で開発するときもステップバイステップでできているか確認しつつ進めるのがオススメです。

Grove PIRモーションセンサを接続

Groveは刺すだけで配線できるのでGNDや信号線などの確認は必要ありませんが、デジタル・アナログ・I2Cなどの通信方法はGroveモジュールによって違います。

seeed_wiki

PIRモーションセンサの製造元・SeeedStudioのWikiページを見てみると、デジタルで読みとることがわかります。

connection

Nefry BTのデジタル入力に対応する、「D2」というソケットに差し込みます。少し硬いですが、カチッと言うまで押し込めます。配線作業は常に電源オフの状態で行います。

■Nefry BT(無印)を使っている方

Nefry BT(無印)において、D0・D1ピンはディスプレイの制御(I2C通信)に使用されているため、正常に動作しないことがあります(Nefry BT R2以降では修正されています)。リビジョンの調べ方は「リビジョンの確認」をご参照ください。

プログラムを書き込む

■プログラム

以下のプログラムをNefry BTに書き込みます。

#include <Nefry.h>

#define PIR_MOTION_SENSOR D2

void setup()
{
    pinMode(PIR_MOTION_SENSOR, INPUT);
}

void loop()
{
    if(digitalRead(PIR_MOTION_SENSOR)) {
        Nefry.println("誰かきたよ");
    } else {
        Nefry.println("監視中");
    }
    delay(200);
}

書き込み手順は、上記の「はじめてのプログラムを書き込んでみる」を参照してくださいね。


■動作を確認

メニューのツール>シリアルモニタを選択して開きます。

serial_monitor

右下のbps設定を「115200bps」に変更します。

bps

人感センサに手をかざすと、シリアルモニタに「誰かきたよ」というメッセージが流れます。

Image from Gyazo


■プログラムの解説

プログラムの要所を解説します。

#define PIR_MOTION_SENSOR D2

#defineで、配線したピンの場所を定義しています。「PIR_MOTION_SENSOR」という名前の箱に「D2」という値を入れているイメージです。

こうしておくことで、あとでピンの場所を変えても、ここの値だけ変更すればOKになります。

void setup()
{
    pinMode(PIR_MOTION_SENSOR, INPUT);
}

setup関数内ではスイッチのとき同様、今回使うピンを有効化しています。pinMode({ピンの場所}, {モード})で指定します。

void loop()
{
    if(digitalRead(PIR_MOTION_SENSOR)) {
        Nefry.println("誰かきたよ");
    } else {
        Nefry.println("監視中");
    }
    delay(200);
}

loop関数では、モーションセンサに入力があったとき/それ以外のときで処理を分けています。

digitalRead({ピン番号})で指定したピンの信号を読み取っていて、戻り値は「人を検知している = HIGH」「検知していない = LOW」です。

if(digitalRead(PIR_MOTION_SENSOR)) {} の部分はif(digitalRead(PIR_MOTION_SENSOR) == HIGH) {と同義で、比較演算子を省略するとHIGHのときにに実行されます。

200ミリ秒待つことで、0.2秒に1回センサの値をチェックするようになっています。

LINEに通知してみる

それでは、人感センサが検知したら(= 人が来たら)自分のLINEに通知がくるようにしてみましょう。LINEが提供している、LINE Notifyというサービスを使っていきます。

LINEの設定

■LINE Notifyアカウントと友達になる

LINE Notifyでは、「LINE Notify」というアカウントからメッセージが届きます。

まずはQRコードを読み取り、アカウントと友達になっておきましょう。

■トークンを作成

自分のLINEと紐付けるために、トークン(鍵のようなもの)を発行します。

LINE Notifyの設定ページにいき、「トークンを発行する」ボタンを押します。

token_button

下記のようなウィンドウが表示されます。「トークン名」にはLINE Notifyが何のサービスと連携したかわかる名前をつけましょう。通知するルームは、今回は「1:1」を選択します。

token_config

トークンが発行されたら、コピーしてメモしておきます(あとで使います)。

token_create

プログラムを書き込む

■プログラム

以下のプログラムをNefry BTに書き込みます。すごく長いですが、後ほど説明します。

#include <Nefry.h>
#include <NefryLineNotify.h>

#define PIR_MOTION_SENSOR D2
String auth, message;

void setup() {
    pinMode(PIR_MOTION_SENSOR, INPUT);
    Nefry.setStoreTitle("LINE Auth",0);
    Nefry.setStoreTitle("LINEMessage",1);
    auth = Nefry.getStoreStr(0);   
    message = Nefry.getStoreStr(1);
    Nefry.enableSW();
}

void loop() {
    if(digitalRead(PIR_MOTION_SENSOR)) {
        Nefry.println("誰かきたよ");
        if (!LineNotify.send(auth, message)) {
            Nefry.setLed(255, 0, 0);
        }
        Nefry.ndelay(1000*30);
    } else {
        Nefry.println("監視中");
    }
    delay(200);
}

書き込み手順は、上記の「はじめてのプログラムを書き込んでみる」を参照してくださいね。

Nefry BTにトークン情報を設定

ディスプレイに表示されているIPアドレスに接続し、Nefryポータルを開きます。

nefry_portal

「DataStore」のページに行くと2つのフォームが用意されているので、「LINE Auth」には先ほどコピーしたトークン、「LINEMessage」には送りたいメッセージを入力します。

nefry_config


■動作を確認

さっそく完成したものを動かしてみましょう。

センサに人が近づくと……

Image from Gyazo

LINEに通知されました!

完成できた方、お疲れ様でした〜!

プログラムの解説

例のすごく長いコードについて、要所を説明します。大事なところはちょっとだけです。

void setup() {
    pinMode(PIR_MOTION_SENSOR, INPUT);
    Nefry.setStoreTitle("LINE Auth",0);
    Nefry.setStoreTitle("LINEMessage",1);
    auth = Nefry.getStoreStr(0);   
    message = Nefry.getStoreStr(1);
    Nefry.enableSW();
}

Nefry.setStoreTitle({タイトル}, {チャンネル番号})関数を使い、Nefry BTのDataStore機能に場所を作っています。この値はNefryポータル側から入力でき、変更があってもプログラムを書き換える必要はありません。

また値をgetStoreStr({チャンネル番号})で、ポータル側で設定した値を受け取っています。

void loop() {
    if(digitalRead(PIR_MOTION_SENSOR)) {
        Nefry.println("誰かきたよ");
        if (!LineNotify.send(auth, message)) {
            Nefry.setLed(255, 0, 0);
        }
        Nefry.ndelay(1000*30);
    } else {
        Nefry.println("監視中");
    }
    delay(200);
}

先ほど同様人感センサが検知したとき、という条件文を作っています。LineNotify.send()関数を使い、もし送れなかったときは赤いLEDを光らせるという処理をしています(!!==と同義で、FALSEが返ったときに実行されます)。

何度も連続してLINEが来るとウザいので、一度送ったあとは30秒待ちます。

LINE送信を実装している部分です、が、これ以降は気にしなくていいです。この部分は初期プログラムをコピーして作っています。たぶん近々ライブラリ化されます。

LINE Notifyがライブラリ化されたので編集しました!

応用課題: データをクラウドに送ってみる(ロギング)

WIP(追記します)

関連情報

Nefry BTはこちらから購入できます(送料無料)。その他にも千石電商、ツクモ、若松通商、共立電子などの実店舗やECサイトで購入できます。

Nefry BTでは、IFTTTを使ったWebサービスとの連携や、その他のクラウドサービスとの連携も簡単です。ディスプレイを使ったイラスト描画や、100以上あるGroveモジュールの活用なども、ぜひ試してみてください。

Nefryユーザ同士が交流するページです。質問を投稿して解決した事例もたくさんありますので、困った際などはぜひお気軽にご利用ください。開発者もよく登場します。

Nefryユーザによる開催イベントです。ハンズオンやLT会、もくもく会などを実施しています。

dotstudioによる開催イベントです。Nefry BT以外の題材を扱うことも多いです。

   このエントリーをはてなブックマークに追加