目的
BLEペリフェラルとして,以下のときにBLEセントラルに通知するデバイスを作る.
- ドアが閉まっていること
- 部屋の中が暗いこと(≒シーリングライトが消灯)
ただし,通知するのはドアが閉まっているときのみ
この記事では,上記1.のほうの部屋のドア開閉判定について記載する.
- 事前にSoftDevice書込み等,Arduino IDEで作成したArduinoスケッチが書込みできる環境の整備:
☞STM32 Nucleoを用いたnRF51向けのArduino開発環境をつくる - GPIOやADC,シリアルインターフェースの機能確認:
☞Arduino環境でAE-TYBLE16のピンファンクションを確かめる - BLEの接続/非接続の確認:
☞Arduino環境でAE-TYBLE16のBLEを始める(その1:接続/非接続) - BLE経由のLチカ確認:
☞Arduino環境でAE-TYBLE16のBLEを始める(その2:BLE経由のLチカ) - 照度センサー明暗判定原理試作:
☞Arduino環境でAE-TYBLE16のBLEペリフェラルデバイスを作る~明暗判定編~ - リードスイッチドア開閉判定原理試作(本記事)
結論
ドアセンサースイッチSPS-320Nと2.2[MΩ]のプルアップ抵抗で構成した回路で,部屋のドア開閉判定ができることを確認した.
プルアップ抵抗に2.2MΩなんていうメガ級を初めて使いましたが、まぁフツーのボタンの回路と同じですよね。リードスイッチくん。写真2枚目はプルダウン抵抗版なので論理が逆です!
— AKETO, Tomu (@so2akt) 2023年1月23日
※割込みにしてません pic.twitter.com/p2TgTpOwN3
本記事で紹介するおもな環境は下表のとおり:
ハードウェア名称 | 規格 | 製造会社 | 備考 |
---|---|---|---|
BLEモジュール | AE-TYBLE16 | 秋月電子通商 | 購入時1,280JPY 太陽誘電製EYSGJNAWY-WX(SoCはNordic Semiconductor製nRF51822) |
デバッガー | NUCLEO-L053R8(STSW-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シリーズでのスリープ復帰割込み版
改訂履歴
# | 日付 | 内容 |
---|---|---|
1 | 2023/01/24 | 節 Arduino言語での割込み版を追記 |
データシート等
参考文献
- 国野亘ほか:超特急Web接続!ESPマイコン・プログラム全集[CD-ROM付き],pp.64-68,CQ出版,2019
参考サイト
リンク先はすべて2023/01/24現在のもの
*1:3.3[V]結線し忘れていて,どこかから電源が回り込んでいる...