Arduino環境でAE-TYBLE16のBLEペリフェラルデバイスを作る~ドア開閉判定編~

目的

BLEペリフェラルとして,以下のときにBLEセントラルに通知するデバイスを作る.

  1. ドアが閉まっていること
  2. 部屋の中が暗いこと(≒シーリングライトが消灯)
    ただし,通知するのはドアが閉まっているときのみ

この記事では,上記1.のほうの部屋のドア開閉判定について記載する.

  1. 事前にSoftDevice書込み等,Arduino IDEで作成したArduinoスケッチが書込みできる環境の整備:
    STM32 Nucleoを用いたnRF51向けのArduino開発環境をつくる
  2. GPIOやADC,シリアルインターフェースの機能確認:
    Arduino環境でAE-TYBLE16のピンファンクションを確かめる
  3. BLEの接続/非接続の確認:
    Arduino環境でAE-TYBLE16のBLEを始める(その1:接続/非接続)
  4. BLE経由のLチカ確認:
    Arduino環境でAE-TYBLE16のBLEを始める(その2:BLE経由のLチカ)
  5. 照度センサー明暗判定原理試作:
    Arduino環境でAE-TYBLE16のBLEペリフェラルデバイスを作る~明暗判定編~
  6. リードスイッチドア開閉判定原理試作(本記事)

結論

ドアセンサースイッチSPS-320Nと2.2[MΩ]のプルアップ抵抗で構成した回路で,部屋のドア開閉判定ができることを確認した.

本記事で紹介するおもな環境は下表のとおり:

ハードウェア名称 規格 製造会社 備考
BLEモジュール AE-TYBLE16 秋月電子通商 購入時1,280JPY
太陽誘電製EYSGJNAWY-WX(SoCはNordic Semiconductor製nRF51822)
デバッガー NUCLEO-L053R8STSW-LINK009 2.0.2 STMicroelectronics タダ
201X年にSTの営業が会社に来たときのもの,ST-Link/V2-1として使用する
BLEモジュール用ソケット 2227P-16G-03 寬德 購入時100JPY
ハンダ不要でブレッドボード挿入に使える
ブレッドボード BB-801 万捷电子 ブレッドボードなら何でもよい
ジャンパーケーブル(オス・メス) DG01032-0024-RD-015など 協威亞洲 間違えないように色をわけたほうがよい
C-17228のほうが安い
USBケーブル(mini B) LDUC1011-1.5m EverU Electronics 充電専用でなければ何でもよい
黄緑色LED OSNG5113A,2.0[V],20[mA] OptoSupply 購入時500JPY
ドアセンサースイッチ SPS-320N 鋠泰科技 購入時250JPY
プルアップ抵抗 CF25J2M2B,2.2[MΩ],1/4[W]
ホストPC マザーボードB450 AORUS M,CPU:Ryzen 7 3700X,メモリー:32[GB] -
IDE Arduino IDE 1.8.19 ARDUINO
nRF5ライブラリー Nordic Semiconductor nRF5 Boardsパッケージ Sandeep Mistry
BLEライブラリー BLEPeripheralパッケージ 0.4.0 Sandeep Mistry
Nordic SoftDevice S130 2.0.1 Nordic Semiconductor BLEプロトコルスタック
ホストPCのOS Windows 10 Pro 64ビット版 Microsoft 英語版(インターナショナル)

また,nRF5ライブラリーの設定は以下のとおり:

項目名 設定値 備考
ボード Generic nRF51
Chip 32kB RAM, 256kB flash (xxac) データシートよりEYSGJNZWYは32kB
SoftDevice S130
Low Frequency RC Oscillator データシートよりEYSGJNZWYは水晶振動子が未実装で内蔵RC発振回路で代替指示
ポート COMn 環境による
Programmer ST-Link V2-1 (ST-Link On-Board) ☞以前の私の記事参照

詳細

ハードウェア

リードスイッチが組み込まれたドアセンサーを使用して,ドアの開閉検知を確認する.

照度センサーとして,鋠泰科技製ドアセンサースイッチSPS-320Nを使用した.大まかに言えば,リードスイッチは単にスイッチであるため,プロアップ抵抗もしくはプルダウン抵抗が必要となる.私の経験では,その抵抗には10[kΩ]程度を使用してきたが,今回作ろうとしているものは最終的に電池駆動とするために,電流を絞るため,2.2[MΩ]を用いることとした.

回路上は通常のスイッチと同等なのでプルアップするか,プルダウンするかの違いだけである.

最終的に,ドアセンサースイッチ部の回路は以下のとおりとして,AE-TYBLE16との結線は以下の写真のとおりとした.

結線写真*1 結線図
TBD
結線写真 結線図
TBD

ソフトウェア

通常のポート判定版

Arduinoプログラムは以下のとおりで,本当にシンプルな構成としている(上記,結線写真も参照のこと).

void setup() {
  pinMode(5, OUTPUT);             /* DIP9(P0.05) */
  pinMode(2, INPUT);              /* DIP7(P0.02,AIN3) */
}

void loop() {
  /* プルアップ抵抗使用時:ドアが開いていたらHIGHで,LED点灯
   * プルダウン抵抗使用時:ドアが閉まっていたらHIGHで,LED点灯
   */
  digitalWrite(5, digitalRead(2));
}

Arduino言語での割込み版

割込みで対応するポートを割り当てる.おそらくGPIOを割り当てられるポートなら使用可能と思われる.

割込みのトリガー(attachInterrupt関数の第3引数)は,リファレンスによると5種類ある.動作確認したところ,以下のとおりとなったため,レベルトリガーは動作しないようである.また,nRF5らしくスリープ状態からの復帰のイベントとして登録するには,追加で別の方法が必要である(後述).

使用可否 割込みトリガー
(第3引数)
意味 備考
× LOW ローレベル 少なくともDIP7のP0.02では動作せず
CHANGE 両エッジ
RISING 立ち上がりエッジ
FALLING 立ち下がりエッジ
× HIGH ハイレベル 少なくともDIP7のP0.02では動作せず
void setup() {
  pinMode(5, OUTPUT);             /* DIP9(P0.05) */
  pinMode(2, INPUT);              /* DIP7(P0.02,AIN3) */
  attachInterrupt(digitalPinToInterrupt(2), evt, RISING/* detect rising edge */);
}

void loop() {
  /* do nothing in loop function */
  //digitalWrite(5, digitalRead(2));
}

void evt() {
  /* this function invoked when registered event occurred */
  digitalWrite(5, !digitalRead(5));
}

回路動作は以下のとおりとなる.

回路構成 割込みトリガー 動作
プルアップ抵抗 RISING ドアを開けるごとにLED点灯→消灯を繰り返し
プルアップ抵抗 FALLING ドアを閉めるごとにLED点灯→消灯繰り返し
プルダウン抵抗 RISING ドアを閉めるごとにLED点灯→消灯繰り返し
プルダウン抵抗 FALLING ドアを開けるごとにLED点灯→消灯繰り返し
プルアップ/ダウン抵抗 CHANGE ドアを開け閉めするごとにLED点灯→消灯繰り返し

nRF5シリーズでのスリープ復帰割込み版

TBD

改訂履歴

# 日付 内容
1 2023/01/24 Arduino言語での割込み版を追記

データシート等

  1. 秋月電子通商AE-TYBLE16商品添付カード,2017/10/23発行
  2. 鋠泰科技:SPS-320N,2018/03/18発行
  3. ArduinoLanguage Reference

参考文献

  1. 国野亘ほか:超特急Web接続!ESPマイコン・プログラム全集[CD-ROM付き],pp.64-68,CQ出版,2019

参考サイト

  1. ボタン電池1個で数年持つ無線ドア開閉センサを作る - Qiita
  2. ラズパイで100均ドア開閉センサー検知

リンク先はすべて2023/01/24現在のもの

*1:3.3[V]結線し忘れていて,どこかから電源が回り込んでいる...