ブログを検索

2024/06/05

[TIPS] LoRa 端末 LRA1 時刻設定

 LoRa 端末 LRA1 は独自の BASIC言語でプログラムが書けて、電源さえ付ければ単体でプログラムの通り動作するんで助かっていますというかまだ運用していないので助かりたい、という段階

で、プログラムを書いていろいろ実験しつつ、ひとつ困ったことがありました
それは時刻というか日時設定です
電源が入ってからカウントアップするクロックはあるものの、電源が入るたびに0スタートになります。
そう、RTCの電源バックアップが無いのです。

じゃあ電源バックアップするかRTCを後付けするか考えると微小ながら電力を喰うのでNoです
GPSモジュール付けて時刻取得するか?もっと電力を喰うのでNoです

で、考えてみました


BASICで Print DATETIME(Clock)
のように DATETIMEコマンドを文字列中で使用したとき Clock変数は
「2020/1/1 00:00:00」からの経過秒数
で扱われるとのことなので

現在unixtimeから「2020/1/1 00:00:00」の unixtime 1577804400 を引けば Clock値がでます
Clock変数は LRA1のコマンドで Clock=1 のように設定できるので
ラズパイとLRA1をUART接続し、ラズパイから下記シェルコマンドを入力してLRA1のClockを設定

× uxtime1=$(date '+%s');uxtime2=$(($uxtime1-1577804400));echo -e "Clock=${uxtime2}\n" >/dev/ttyS0

〇 uxtime1=$(date '+%s');uxtime2=$(($uxtime1-1577804400));echo -e "Clock=${uxtime2}\r\n" >/dev/ttyS0

# 「/dev/ttyS0」部分は環境によっては「/dev/ttyAMA0」とか他のものになっているかも

この時 LRA1に UARTでコンソール接続していると device busy みたいな感じのエラーになるので注意が必要


Clockが設定できたらあとは LRA1のBASICプログラムで
Print "20";DATETIME(Clock)
とかすれば
2024/06/05 10:25:17
のように表示されてめでたし

あ、これはラズパイ接続している基地局LRA1のハナシで
リモートLRA1 はスタンドアロンなのでClock値をセットするとしたら別のやり方になります
それはこれから実験してみます

と思ったけど厳密な時刻を求めないのなら基地局が受信したときの日時をデータ発生日時として使えば良いのでリモートLRA1 の時刻合わせは要らないかな?

PS. 2024/06/11 に気がついたが、Clockを設定しても1日で10分以上ズレ進む。こんなものなのかな?個体差?ま、基地局側は毎日時刻合わせすればいいか

2024/06/13 また気付いた。時刻がズレていくのはリモート局LRA1だけみたい
10分で4、5秒くらい進む
1日あたり720秒(12分)か

Delay や Sleep に入る前や後で待機時間のようなものがあるんだろうか?
いやリモート局のClockは進んでいくんだから待機時間じゃない。何だろうか???
LRA1ファームウェアは基地局とリモート局で同じもの
>ver
i2-ele LRA1
Ver 1.26.f+
OK

いろいろ試して切り分けしたいけど
いま動かしてる2台のLRA1はソーラーバッテリーシステムの実験で使用中だから止めたくない
切り分けのため3台目のLRA1を開封する時が来たか・・・汗

■基地局側LRA1 BASICプログラム(Clockズレない)
  1 RxStop
 10 Recv 0
100 _LOOPSTART:
200   If Stat=10 Then
210     Print "20"; Datetime (Clock);" From:";Rxdw(2);" RSSI:";Rssi;" ";Rxd
220     Stat=0
230   Else
240     If Stat!=0 Then
250       Print "20"; Datetime (Clock);" Error! stat:";Stat
260       Stat=0
270     EndIf
280   EndIf
400   Delay 100
999 Goto _LOOPSTART

■リモート局LRA1 BASICプログラム(Clockズレる)
110 SpiBaud=0
120  ^=""
999 RxStop
1000 Do
1010   For I=1 To 5 Step 1
1020     C=Adc(10)
1030     If I=1 Then V=C EndIf
1040     If I=2 Then W=C EndIf
1050     If I=3 Then X=C EndIf
1060     If I=4 Then Y=C EndIf
1070     If I=5 Then Z=C EndIf
1080     Gosub _wait
1090   Next
1100   ^="Clock=";Clock;" ";V/250;".";Form("D02",((V-((V/250)*250))*100)/250);" ";W/250;".";Form("D02",((W-((W/250)*250))*100)/250);" ";
1110   ^=^;X/250;".";Form("D02",((X-((X/250)*250))*100)/250);" ";Y/250;".";Form("D02",((Y-((Y/250)*250))*100)/250);" ";Z/250;".";Form("D02",((Z-((Z/250)*250))*100)/250)
1120   Print "20"; Datetime (Clock);" Send Data=";^
1130   Send ^:^=""
9999 Loop
10000 _wait
10010   Sleep 20
10020   Delay 20000
10030   Sleep 20
19999 Return

■リモート局LRA1 10010行から10030行をこうしてみた
10010   'Sleep 20
10020   Delay 60000:' Delay 20000
10030   'Sleep 20
↑ 上記やったが変わらずClockズレる(ズレ進む量も同じ)
となると Sleep は原因ではなさそう
Delayも基地局側で使っているので問題ないだろう
Adc? あ、もしかして文字変数 ^(キャレット)の使い方だろうか?

■文字変数 ^ キャレットの使い方を間違っているかもしれず、キャレットを使わないよう 1100行目から1130行目をこうして ↓ みた
1100
1110
1120   Print "20"; Datetime (Clock);" Send Data=";Z/250;".";Form("D02",((Z-((Z/250)*250))*100)/250)
1130   Send Z/250;".";Form("D02",((Z-((Z/250)*250))*100)/250)
↑ 上記やったらClockズレなくなった
と思ったけどズレ進む量が小さくなっただけで4時間で39秒進んだ
1日あたり234秒(3分54秒)か
これくらいなら普通なんだろうか!?

Clockがズレ進むのは主に文字変数 ^ キャレットの使い方がマズイようなので何がマズイのか調べよう







0 件のコメント:

コメントを投稿

MySQL で SELECT into outfile 出来なくてハマった件

 Windows上の MySQL で SELECT into outfile で CSVファイルをエクスポートしようとしてハマったので残しておく 環境 Windows10 Pro バージョン 1809 MySQL 8.4.0 という環境で SELECT * FROM table1...