nobcha23の日記

PICマイコンやArduinoを使う電子回路遊びを紹介します

R909-VFO-GPS-OLED グリッドロケータも表示する

GPSで周波数較正するVFOですが、Si5351aモジュールの個別較正値を調べるという機能以外に何か使い道はないか。緯度運用で必要なのはグリッドロケータがありました。GPS++からの出力で計算することにします。計算式はJARLのサイトに紹介されています。

変換プログラムがArduinoのライブラリにないかとChatGPTに聞いてみましたら、Cでのプログラムを紹介されました。実装してみましたが、一筋縄ではうまくいきません。

 

●グリッド・ロケーターを求める式は、

 

(経度+分÷60+秒÷3600)+180

 

 

(緯度+分÷60+秒÷3600)+90
 

 

20

 

10

 

の2つです

●実際にJARL事務局(東経139度43分44秒、北緯35度43分42秒)を例にして計算してみましょう。

(139+43÷60+44÷3600)+180  ≒ 15.98644 ………………………………………①

 

20
(35+43÷60+42÷3600)+90    ≒ 12.57282 ………………………………………②

 

10
第1文字目……… ①の整数部分が0ならA、1ならB、2ならC…………………………と数える………………………………「P」
第2文字目……… ②の整数部分が0ならA、1ならB、2ならC…………………………と数える………………………………「M」
第3文字目……… ①の小数点以下第1桁が、そのまま第3文字目となる……………………………………………………「9」
第4文字目……… ②の小数点以下第1桁が、そのまま第4文字目となる……………………………………………………「5」
第5文字目……… ①の小数点以下第2桁以降を取り出し先頭の数字を1の位に置いた後2.4を乗じ、 その整数部分を第1文字目と同様にアルファベットをわりあてる
  8.644×2.4=20.7456 20番目のアルファベットは「U」
第6文字目……… ②を第5文字目と同様に操作し、アルファベットをわりあてる
  7.282×2.4=17.4768 17番目のアルファベットは「R」

 

1~4桁目まではLongをintにキャストしたりすれば得られますが、5,6桁目は今一つArduino対応の逃げ道が見つかりません。うまくいかないじゃないかと文句言ったら、Arduinoのmathライブアリーのフロート小数剰余を使う事を提案されました。すなわち、fmod()と言う関数を使うと実装できました。

 

-------------The part of SKETCH---------------------------------------------------------

#include <math.h>                               // To be asked for GPS calculation
//**************************************************************************************
//                       GridLocator calculation
//**************************************************************************************
void calculateGridLocator(float latitude, float longitude) {
    // 1. The adjustment for data
    longitude += 180.0;
    latitude += 90.0;

    // 2. The first fields (1–2 column)
    locator[0] = 'A' + (char)(longitude / 20);
    locator[1] = 'A' + (char)(latitude / 10);

    // 3. The square (3–4 column)
    locator[2] = '0' + (char)*1;
    locator[3] = '0' + (char)(fmod(latitude, 10));

    // 4. The sub-square (5–6 column)
    locator[4] = 'a' + (char)(fmod(longitude * 12, 24));
    locator[5] = 'a' + (char)(fmod(latitude * 24, 24));

    // 5. The delimitter
    locator[6] = '\0';
}

-----------------------------------------------------------------------

 

 

ただし、メモリー使用量が98%/62%まで増加しました。そのせいか動作安定性に不安があります。どれかライブラリー引き込みをやめて、必要な部分だけの関数にするなどの対策検討が必要なように思います。

 

表示の方はグリッドロケータと緯度経度(ただし十進法表記)を切り替えられるようにしました。

R909-VFO-GPS-OLED 画面表示例


回路、基板、スケッチなどについてはGITHUBにて順次公開しています。

 

*1:fmod(longitude, 20) / 2