ATコマンドで時刻を取得
RX72N Envision Kitに搭載されているESP-WROOM-32Dをシリアル通信経由で"AT"コマンドを送信し、応答が正常に戻る("OK")ことまでは確認できていましたが、そのあと何をしようか考えていました。
いくつかサイトを見ていると現在時刻を取得できるとありましたので、Wifiルータへの接続などの確認も兼ねて試行しました。
結果、下記の通りNICTのサーバから時刻を取得することが出来ました。
参考サイト
今回参考にさせて頂いたのは下記のサイト様です。ATコマンドの解説と設定手順が分かりやすく記載されていました。
http://hello.world.coocan.jp/ARDUINO4/arduino4_5.html
こちらの時刻取得までの流れを参考に、シリアル通信でコマンドを送信しました。
プログラム
ATコマンドを送信するまでの設定は前のエントリと同じです。
メイン関数内でATコマンドを順に送信し、設定を進めていきます。
ee_printf_eps("AT+CWMODE=1\r\n");
serial_eps32_get();
ee_printf_eps("AT+CWMODE?\r\n");
serial_eps32_get();
ee_printf_eps("AT+CWJAP=\"***SSID***\",\"***PASSSWORD***\"\r\n");
serial_eps32_get();
ee_printf_eps("AT+CWJAP?\r\n");
serial_eps32_get();
ee_printf_eps("AT+CIPSNTPCFG=1,-9,\"ntp.nict.jp\"\r\n");
serial_eps32_get();
ee_printf_eps("AT+CIPSNTPTIME?\r\n");
serial_eps32_get();
- ESP32をステーションモードに設定
- Wifiアクセスポイントに接続
- SNTPでNICTのサーバから時刻を取得
という流れです。
CWMODEなどはESP32に設定が保存されるため、戻り値が正常なら省略可能とのことです。
試行中に色々なコマンドを送信するとエラーが発生したため、原因を確認していました。
結果戻り値をすべて受信バッファに貯める前に(EPS32->RX72Nへの送信中に)次のコマンドを送っていたのが原因でした。
ATコマンドの戻り値はセンサー類のように文字数が決まっているわけではないため、受信割り込み抜きで何かやるのは無理がありました。
ただ今回はとりあえずデータが取れればよいので、受信完了フラグが一定時間立たなければループを抜けるという原始的な方法を取りました。
int serial_eps32_get(void) {
int i,j;
uint8_t Return_Value[256];
for(i=0;i<10;i++) {}
i = 0;
j = 0;
while(SCI1.SSR.BIT.RDRF == 0);
Return_Value[i] = SCI1.RDR;
while(1) {
if (SCI1.SSR.BIT.RDRF == 0) {
j++;
}
else if(SCI1.SSR.BIT.RDRF == 1) {
Return_Value[i] = SCI1.RDR;
i+=1;
}
if (j>100000000) break;
}
for(j=0;j<i;j++) {
ee_printf("%c", Return_Value[j]);
}
return 0;
}
jの比較対象の数字がものすごく大きいですが、一桁足りないとCWJAPなどのコマンドでエラーになります。
受信したデータをその都度PCにシリアル転送すると、ボーレートの差のためMCUの受信のスピードに送信が間に合わず途中でおかしくなります。このため配列に格納して一気に送信しています。
待ち時間がものすごく長いため、本格的に運用する時は受信割り込みを使用するつもりです。
感想
センサーからのデータ取得、サーバからの時刻取得とくると、今度はLCDにデータを表示して時計のようにしてみたくなりました。大画面なので身構えてしまいますが…
