2023年4月21日金曜日

液晶に大きな数字を書く

秋月電子で販売している液晶ディスプレイAQM0802とAQM1602は、I2C接続でArduinoやESP32、RaspberryPiPicoなどに接続できます。動作電流が1mAなので、電池駆動したい場合などに重宝します。

ただ、文字が小さいため、温度や時刻などを表示すると空白が余ります。そこで大きな数字を表示できるようにしてみました。

(ちなみに、ここに書いた方法以外にも、FunctionSetコマンド(0x38)を送信してDHを1にすることで、縦が2倍のdoubleHeightFontを使うことができます)

RaspberryPiPicoとAQM0802の接続

  • Pico -> AQM0802またはAQM1602
  • GP20(I2C0SDA)-> SDA
  • GP21(I2C0SCL) -> SCL
  • 3V3 -> VDD
  • GND->GND

           RESETは変換基板上でVDDにプルアップされているためオープンでOK

ArduinoUNOなどの5Vデバイスで使用する場合の注意

SDA、SCLにレベル変換を入れるほうが良いと思います。

(入れなくても3.3Vにプルアップすれば動きますが、壊れても文句言わない)

Picoのボードファイルについて

mbedにする場合、SDA、SCLはGP6、GP7に固定されていますので注意が必要です。

特別こだわりがなければ、'Earle F. Philhower, III'バージョンを使ったほうがI2Cのピンを変更できたり、いろいろ便利です。

他の液晶

似たような液晶パネルに、ACM1602NIなどがありますが、キャラクタパターンが違うので使えません。


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

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