エモトの取り扱い説明書を読むと、ローティターの指針方位とアンテナ方位の合わせ方云々と書いてあります。ローティターの回転始め位置に設定し、それに対してアンテナ方向も同じに設定するのが基本ということになっています。この場合も基準をS(南)、N(北)、E(東)、W(西)の内の自分のアンテナの設置状況で都合のいい方向にあわせて基準を設定するわけです。その後に1回転させて同じ位置になるようにVRで調整して終了です。基本的な方位基準方向は分かり易く言えば、たった4つだけです。
いままでの私のESP32DEVKITCのスケッチで対応させたのは、N(北)、S(南)の方位STD_SWによる2つの方位設定の切り替えのみです。結局は、ローテーターを左回転の止まる位置を基準角度とするのがSTD_SWがHIGHでは S(南)で、STD_SWがLOWで N(北)が基準の2つだけの対応です。通常はこの2つぐらいで十分だと思います。通常の方位同期でローテーターの回転を1°から360°の1回転に調整した後にアンテナの方位をローテーターと同期させる調整がはいります。 ここで、この作業は物理的にマストに取り付けたアンテナを少し上に吊った状態でマストクランプを緩めてアンテナを回してローテーター基準方位に合わせるのですが、このアンテナとのローテーターの方位の同期をソフトウェアで対応しようと思います。何が言いたいかというと、マストクランプのボルトを緩めてアンテナの方位調整を不要にすることを可能にするという事です。ローテーターが1°から360°の回転する状態に調整済みにしてあれば、アンテナの方位調整はしなくてもソフトウェアが現在のローテーターの基準方位の時のアンテナの方位角度情報を設定する事で、プログラムが計算し通常通りの設定送出UDPデータの角度にアンテナを向けるようにしてくれるという事です。誰もやっていない事だと思います。アンテナの方位調整不要なんです。大げさに言います。画期的なアンテナ方位設定方法になります。肉体労働でのアンテナの方位調整をしなくてもいいのですから、現状のローテーター基準位置でアンテナの向いている角度情報を設定するだけです。S、N、E、Wの基準にアンテナを同期調整する必要はないんです。もう一度言います。アンテナの方位を調整しなくていいんです。ローテーター1回転を調整した後であれば、どの位置にアンテナが向いていても設定データの方位にアンテナを向けてくれる仕様です。現在もスケッチ進行中です。アンテナの方位が1°から360°(0°)どの方向に向いていても大丈夫、アンテナの方位設定送出データにきちんと向けてくれます。なんで、こんなことを考えたかというと、私の不注意で足の小指を母親の歩行器の鉄のパイプにぶつけて今現在タワーに登れない状況になりました。ぶち色に足の小指が腫れました。足の指の痛みが取れるまで、1か月位はタワーに登って方位設定作業ができない状況になってしまったのです。この為、苦肉の方法としてソフトウェアを駆使する方法を考えてみたという事なんです。怪我がきっかけで、検討を進めることになりました。怪我の功名?あくまでも、現在はテスト中ですがほぼ9割できたと思います。アンテナの方位をあらかじめ固定指定することで問題なく動作しています。
次に、具体的にアンテナの方位をどのような方法で入力するかです。ESP32DEVKITCで角度を入力する方法は何があるかという事です。簡単な方法として、考えられるのはロータリーエンコーダーです。DDS-VFOでもメインで使われています。ローテーターの角度範囲を1°~360°(0°)設定とし、ロータリーエンコーダーで設定した角度をアンテナの向いている方位角度として利用するという方法です。次にロータリーエンコーダーで設定した角度はどのようにどこに表示させるかです。サーバー側のESP32DEVKITCで使用している1.8インチのTFT液晶では表示する場所がありません。表示を別に追加する必要があります。まずは実験として小型のSSD1306液晶とロータリーエンコーダー(秋月:クリックなし)を使いSSD1306液晶に1°~360°(0°)を表示するスケッチを試してみました。ロータリーエンコードのポートはサーバーで使用していないGPIO18 をA、GPIO19をBで使用することにします。Copilotで1.8インチTFT液晶とSSD1306液晶両方は同時使用できるかという事を確認したところ、大丈夫という風に回答が得られています。これで進めています。現状、SSD1306用のI/Oは角度設定のSWとダブルところがありました。サーバー側での角度設定SW類は一切使わないようにすればよいので、ダブりは解消です。液晶で使用するのはSDAなので必然的にGPIO21、同様にSCKはGPIO22、後は+5VとGNDの4つです。それと、いつでもロータリーエンコーダーで設定した角度をリセット0°にできるSWも用意しました。これはアンテナ方位をローテーター基準に合わせることができた時の設定方位 N(0°)360°に使えます。もう一つクリアする必要があるのが、電源をリセットしたときの角度のリセットがされないようにメモリする機能(レジューム機能)も考えておかなければなりません。これはこれから検討です。現状のロータリーエンコーダとSSD1306への表示スケッチを下記します。このスケッチもCopilotのAIを使用して作成しています。これをサーバーに組み入れてゆくことになります。Hi!

ESP32DEVKITC とロータリーエンコーダーとSSD1306

関係ありませんが、いたずらで液晶を2つ並列にしてみました。動作します。

このスケッチをサーバーのスケッチに組み入れてうまく動作するかの確認が次のステップになります。また、レジューム機能の検討も並行して進めたいと思います。
サーバー、クライアントの2方位(N北、S南)仕様版はひとまず完成として、今回はいわば、応用編という感じでしょうか?ともかく、ハードルのあるトライアルではあります。
とにかく、問題が起き、解決方法を探すといった方向で進めてきてますが、アイデア、内容としては実用性も備えたある意味、画期的な方法のトライアルになっていると思います。
つづく?
いままでの私のESP32DEVKITCのスケッチで対応させたのは、N(北)、S(南)の方位STD_SWによる2つの方位設定の切り替えのみです。結局は、ローテーターを左回転の止まる位置を基準角度とするのがSTD_SWがHIGHでは S(南)で、STD_SWがLOWで N(北)が基準の2つだけの対応です。通常はこの2つぐらいで十分だと思います。通常の方位同期でローテーターの回転を1°から360°の1回転に調整した後にアンテナの方位をローテーターと同期させる調整がはいります。 ここで、この作業は物理的にマストに取り付けたアンテナを少し上に吊った状態でマストクランプを緩めてアンテナを回してローテーター基準方位に合わせるのですが、このアンテナとのローテーターの方位の同期をソフトウェアで対応しようと思います。何が言いたいかというと、マストクランプのボルトを緩めてアンテナの方位調整を不要にすることを可能にするという事です。ローテーターが1°から360°の回転する状態に調整済みにしてあれば、アンテナの方位調整はしなくてもソフトウェアが現在のローテーターの基準方位の時のアンテナの方位角度情報を設定する事で、プログラムが計算し通常通りの設定送出UDPデータの角度にアンテナを向けるようにしてくれるという事です。誰もやっていない事だと思います。アンテナの方位調整不要なんです。大げさに言います。画期的なアンテナ方位設定方法になります。肉体労働でのアンテナの方位調整をしなくてもいいのですから、現状のローテーター基準位置でアンテナの向いている角度情報を設定するだけです。S、N、E、Wの基準にアンテナを同期調整する必要はないんです。もう一度言います。アンテナの方位を調整しなくていいんです。ローテーター1回転を調整した後であれば、どの位置にアンテナが向いていても設定データの方位にアンテナを向けてくれる仕様です。現在もスケッチ進行中です。アンテナの方位が1°から360°(0°)どの方向に向いていても大丈夫、アンテナの方位設定送出データにきちんと向けてくれます。なんで、こんなことを考えたかというと、私の不注意で足の小指を母親の歩行器の鉄のパイプにぶつけて今現在タワーに登れない状況になりました。ぶち色に足の小指が腫れました。足の指の痛みが取れるまで、1か月位はタワーに登って方位設定作業ができない状況になってしまったのです。この為、苦肉の方法としてソフトウェアを駆使する方法を考えてみたという事なんです。怪我がきっかけで、検討を進めることになりました。怪我の功名?あくまでも、現在はテスト中ですがほぼ9割できたと思います。アンテナの方位をあらかじめ固定指定することで問題なく動作しています。
次に、具体的にアンテナの方位をどのような方法で入力するかです。ESP32DEVKITCで角度を入力する方法は何があるかという事です。簡単な方法として、考えられるのはロータリーエンコーダーです。DDS-VFOでもメインで使われています。ローテーターの角度範囲を1°~360°(0°)設定とし、ロータリーエンコーダーで設定した角度をアンテナの向いている方位角度として利用するという方法です。次にロータリーエンコーダーで設定した角度はどのようにどこに表示させるかです。サーバー側のESP32DEVKITCで使用している1.8インチのTFT液晶では表示する場所がありません。表示を別に追加する必要があります。まずは実験として小型のSSD1306液晶とロータリーエンコーダー(秋月:クリックなし)を使いSSD1306液晶に1°~360°(0°)を表示するスケッチを試してみました。ロータリーエンコードのポートはサーバーで使用していないGPIO18 をA、GPIO19をBで使用することにします。Copilotで1.8インチTFT液晶とSSD1306液晶両方は同時使用できるかという事を確認したところ、大丈夫という風に回答が得られています。これで進めています。現状、SSD1306用のI/Oは角度設定のSWとダブルところがありました。サーバー側での角度設定SW類は一切使わないようにすればよいので、ダブりは解消です。液晶で使用するのはSDAなので必然的にGPIO21、同様にSCKはGPIO22、後は+5VとGNDの4つです。それと、いつでもロータリーエンコーダーで設定した角度をリセット0°にできるSWも用意しました。これはアンテナ方位をローテーター基準に合わせることができた時の設定方位 N(0°)360°に使えます。もう一つクリアする必要があるのが、電源をリセットしたときの角度のリセットがされないようにメモリする機能(レジューム機能)も考えておかなければなりません。これはこれから検討です。現状のロータリーエンコーダとSSD1306への表示スケッチを下記します。このスケッチもCopilotのAIを使用して作成しています。これをサーバーに組み入れてゆくことになります。Hi!
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// ピン定義
const int encoderPinA = 18;
const int encoderPinB = 19;
const int encoderSW = 25;
volatile int32_t angle = 0;
int lastEncoded = 0;
bool lastSWState = HIGH;
void IRAM_ATTR updateEncoder() {
int MSB = digitalRead(encoderPinA);
int LSB = digitalRead(encoderPinB);
int encoded = (MSB << 1) | LSB;
int sum = (lastEncoded << 2) | encoded;
if (sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) angle++;
if (sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) angle--;
if (angle < 0) angle += 360;
if (angle >= 360) angle -= 360;
lastEncoded = encoded;
}
void setup() {
pinMode(encoderPinA, INPUT_PULLUP);
pinMode(encoderPinB, INPUT_PULLUP);
pinMode(encoderSW, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(encoderPinA), updateEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(encoderPinB), updateEncoder, CHANGE);
Serial.begin(115200);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("OLED init failed"));
while (true);
}
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
}
void loop() {
// SWピンの状態をチェック
bool swState = digitalRead(encoderSW);
if (swState == LOW && lastSWState == HIGH) {
angle = 0;
Serial.println("SW pressed: angle reset");
}
lastSWState = swState;
// 3桁右詰め表示
char angleStr[4];
sprintf(angleStr, "%03d", angle);
display.clearDisplay();
display.setCursor(0, 20);
display.print("Angle: ");
display.print(angleStr); // ← 整形済み文字列を表示
//display.println(" deg");
display.display();
delay(100);
}
ロータリーエンコーダーで設定した180°の角度
ESP32DEVKITC とロータリーエンコーダーとSSD1306

関係ありませんが、いたずらで液晶を2つ並列にしてみました。動作します。

このスケッチをサーバーのスケッチに組み入れてうまく動作するかの確認が次のステップになります。また、レジューム機能の検討も並行して進めたいと思います。
サーバー、クライアントの2方位(N北、S南)仕様版はひとまず完成として、今回はいわば、応用編という感じでしょうか?ともかく、ハードルのあるトライアルではあります。
とにかく、問題が起き、解決方法を探すといった方向で進めてきてますが、アイデア、内容としては実用性も備えたある意味、画期的な方法のトライアルになっていると思います。
つづく?