GPS時計がタイムサーバと無線接続するときに使う ESP-WROOM02 の設定の話。
消費電力を抑えるため、ESP-WROOM02通信モジュールのスリープモードを調査しました。
モデムスリープ(15mA)、ライトスリープ(0.9mA)、ディープスリープ(10μA)の3種類があることがわかりました。
定期的にESPを起こして便利に使うには、ライトやモデムスリープがよさそうですが今回はGPSと時刻を同期するときだけ必要な無線通信です。できれば1ヶ月に一回とか自動で接続に行って欲しいので、ディープスリープを選択しようと考えました。
月一回のために常に数mAを流しておくのは無駄だとの思いです。
ディープスリープするには、どのくらい寝るのか数値を指定します。マニュアル抜粋。
単位は ms ミリセカンド。ですが、最大どれだけ寝ていられるのか記述がありません。
検索すると、deepSleep 関数がマイクロセカンド指定で符号無し32bit整数というのがあり、どうやら71.5分が限界らしいです。
これではあまりに頻繁です。今回使うリアルタイムクロックDS3234はかなりの高精度で仕様上月±5秒以内(±2ppm)、自分でエージング設定を施して実際月1秒程度しかずれません。
最大71.5分を調査した人も気が付いていませんでしたが、実は0を指定することで無限に寝ていられるようです。←マニュアルに書いておいて欲しかった。
無限に寝ているやつを起こすには、RST信号を入れればいいようです(こうなるとチップイネーブルピン(2番ピン)との差異がよくわからなくなってきますが)。
ともあれ、最終的にGPS時計本体からは、ESPが立ち上がったら「AT+GSLP=0」コマンドを送り、必要なときにRST信号を送り、タイムサーバから時刻取得が終わったら再び「AT+GSLP=0」を送って眠らせるようにしました。
これでほとんど消費電流はありません。
HWを組む際は、ピン数節約のため、RST信号自体を押しボタンに接続し、ESPを人間がREST。PICがボタン押し下げを検知したら数秒待ってタイムサーバへのAP接続要求をUSART経由でESPに送るようにしました。
基板を作成して、新規に降ろしたESPを半田付けした後、悲劇が待ってました。
どうにもこうにもタイムサーバへの接続にタイムアウトで失敗します。
急遽USARTを盗み見するためのピンを半田付けしますが、ESPが無反応に見えてなりません。これは初期不良か、見えないところで半田不良を引き起こしているに違いないと考え、ESPを剥がすことにしました。接点は剥がれ落ちモジュール内の結線の一部も取れて、使用不能になりました(400円ロスト;;)。
新しいESPを半田付けしたところやっぱり動きません。そこでやっと気が付きました。
一度でもWiFiモードを設定したESPはそれを覚えていることを。
ブレッドボード試験環境で使っているESPは最初に「AT+CWMODE=1」ステーションモード(=2ならソフトアクセスポイントモード)のコマンドを一度は設定されているので、タイムサーバへの接続は、「AT+CWJAP="アクセスポイント名","パスワード"」からで良かったのでした。
新規で降ろしたばかりのESPは、WiFiモード未設定なので、自分がステーションになるのかアクセスポイントになるのかわからなかったため、AP接続要求をERRORではじいていたわけです。
ちなみに、AT+CWMODE というコマンドは非推奨(deprecated)で、「AT+CWMODE_DEF」—Sets the Default Wi-Fi mode; Configuration Saved in the Flash を使うべきです。_DEFが付かないコマンドはたしかに一時的にWiFiモードを設定するのか永続的に設定するのか不明です。実際は永続的な設定だったわけで、試験環境と本番で勘違いを生みやすいと思いました。
リアルタイムクロックDS3234について別立てで書こうかとも思いましたが、失敗は1つだけなのでここに書いておきます。
DS3234に曜日を設定する際、1~7の値を設定します(0~6であって欲しかった)。
時計本体のプログラムは日付から曜日を計算して、0から6の値を求めていました。昔のプログラムを流用したため、設定時に1加算していたことを忘れ、取得して曜日文字列に変換するとき0~6のテーブルを使ってしまい、曜日表示が1日ずれてしまいました。
前回のGPS時計では月日を表示しても曜日を表示することがなかったので、設定は正しくとももし表示されていたら間違っていたことに気が付かなかったということでした。
