2022年8月12日金曜日

エレガントなdebounce(チャタリング防止)のためのArduinoコード

先日Arduinoのソースコードを書いてふと思ったのですが、 何かを作るたびに毎回同じようなコードを書いていることに気づいたため、エレガントに実装できないか考えてみました。

回路図

ESP32を使用していますが、ArduinoUNOやRaspberryPiPicoでも同じです。ただしピンを変更してください。

ソースコードと実装

SwitchInterface classの部分をコピーするなり、適当にSW_IF.hなどの名前で外部記述してincludeすれば、あとはグローバルでインスタンスするだけで使えます。(ここではBUTTONという名前)
あまりincludeするファイルを増やしたくないという方は、数十行のコードなので、inoファイルに直接コピーすると良いでしょう。

1 SwitchInterfaceクラスをコピー
2 SwitchInteface インスタンス名(ピン番号)をグローバルで記述
3 インスタンス名.onSWdown()でスイッチが押されたことを検出するので、そのあとの動作を記述


debounceについて

サンプリング周期(最後のほうに記述しているdelay)は3ms~20msで良いと思います。debounceの起こる時間はおよそ3msくらいらしいので、最低でも3msec以上は必要です。
上限は20msecでも100msecでも良いのですが、あまり大きくしすぎるとスイッチの反応が遅くなります。

2022年6月16日木曜日

ESP32 secureなWiFiリモートスイッチ

 せっかくSHAとAESのハードウェアアクセラレータが使えるようになったので、WiFiを使ったリモートスイッチを暗号化して、セキュアなWiFiリモートスイッチを作ってみました。クライアント側のスケッチ、サーバ側のスケッチを2つ用意し、それぞれのフォルダに共通ライブラリをコピー&ペーストしてコンパイルしてください。

接続

クライアント側の25Pinにスイッチ、26PinにLEDと抵抗をつけます。LEDと抵抗は通信エラーが起きたときのインジケータなので、なくても大丈夫です。

サーバ側の25PinにLEDと抵抗をつけます。


クライアント側のスケッチ


サーバ側のスケッチ


共通ライブラリ


普通のWiFiリモコンとの違い

通信の内容をAES128を使って暗号化しています。

LEDを制御するコマンドがLEDTGLのみなので、通信するデータに乱数(Salt)をのせて、暗号文が通信毎に変わるようにしています。ただし、通信1発目のリンクリクエストについては、Saltを加えてもサーバは反応するしかないため、何もしていません。

サーバ側からワンタイムパスワード(Challenge)を送信し、クライアント側からはコマンドにワンタイムパスワードを加えた文字列を暗号化してサーバに送信します。サーバ側でワンタイムパスワードを比較することで、リプレイアタックされてもコマンドを受け付けないようにしています。

より詳しく知りたい方は、

リプレイアタック、チャレンジーハンドシェイク、CHAP

などを検索してください。



2022年5月31日火曜日

ESP32EのAESハードウェアアクセラレータを使う

 前回のテストではSerial.print()の有り無しでAES_TEXT_n_REGからの読み出しが出来ていなかったりしていましたが、関数(クラス)に纏めることで正常に動作するようになりました。おそらくコンパイラの問題だとは思いますが、うまい記述が思いつかないし、とりあえず正常に動作しているのでOKとしました。

使い方

適当な場所に

ESP32E_AES_HA_Test.ino

を作成し、下記のコードをコピー&ペーストし、保存します。

inoファイルと同じ場所に、

ESP32E_AES_Hardware_Accelerator.h

ESP32E_AES_Hardware_Accelerator.cpp

を保存します。


応用など

AES192やAES256などのモードは記述していませんが、ESP32E_AES_Hardware_Accelerator.hにDefineだけ記述しているので、それを参考にモード設定関数を作成すれば、他のモードでも動作すると思います。

手元にESP32Eしか持っていないので他のバージョンで動作するか確認できていませんが、たぶん動きます。