久々にUbuntuのarduino IDEを起動してエモトのローテーターコントロールスケッチのコンパイル状況を確認してみました。2022年11月10日以来全くと言っていいほどローテ―ターコントロール基板へは電源も入れていませんでした。IDEは最近かなりバージョンアップされていましたので、最新にしてみました。
バージョンはarduino-ide_2.3.6_Linux_64bit.Appimage になります。今までと違い、シリアルモニターがプラットフォーム上に組み込まれ同時に表示できるようになっています。今までの古いバージョンでは、シリアルモニターは独立画面でした。私としては、独立画面のほうが使いやすいと思います。とまあ、最新版のIDEもインストールしました。もちろん今までの使用していた旧バージョンも動作します。
まずは、古いIDEバージョンArduino 1.8.19でスケッチ動作を確認しました。
基盤となるesp32のby Espressif Systemsのバージョンで動作するしないがあります。
問題なく動作するのは バージョン2.0.2までです。バージョン2.0.3以降はエラー発生します。
もう少し古いIDEバージョンArduino 1.8.9ではバージョン2.0.2でもpyton関連のエラー発生します。
最新版の2.3.6でもやはり2.0.3以上では動作しませんでした。2.0.2まではうごきました。AIで確認すると最新版としてのby Espressif Systemsのバージョンは3.3.0なのですが、AIではこの番号は最新板ではないと回答してきています。ボードマネージャーでのバージョンからすると3.3.0が最新のように思えます。また、最近のESP32-S3も対応できるようになっていました。
あまり、スッキリしていないのですがひとまず、ここいらで動作可能なIDEバージョン1.8.19とESP32 by Espressif Systems バージョン 2.0.2でコンパイルして動作確認をすることにしました。UDPのデータはスマフォからアプリケーションで角度をコマンド”M180"のテキストデータとして送りUDP通信でのデコード動作を確認しました。
■基本送出角度コマンド仕様について
角度コマンド”M***" を送ります。
角度は3桁のテキスト数値”***”
角度1°から9°まではヘッダーに"00"追加 例)1°の場合 "M001"
10°から99°まではヘッダーに”0”追加 例)90°の場合 "M090"
100°から360°まではそのままの数値。例)180°の場合 "M180"
使用したスマフォアンドロイド用のアプリケーションはUDP Monitor です。送出と受信の両方ができますので主に使うのはコマンド送出です。受信はコードで角度ではないので受信してる事の確認程度になります。受信の角度はESP32のudp受信スケッチでコードから角度への変換を行い液晶に表示しています。UDP通信では0°から360°までの数値はコードとして角度全部は送ることができません。256以上は扱えないので角度を上位バイトと下位バイトに分割して送る工夫が必要となります。
一通り動作してくれましたので、今回は回転する基準点(スタートする方位)を通常はローティターでは北(North)を基準に0°から360°まで右回りで使用します。が、南を基準にする使い方をスケッチで対応を検討します。180°から181°まで左回りで使用するケースです。
南をスタート基準とする場合は、スタートから順に左回りなので主な角度を表示すると次になります。
180°ーー>90°ーー>0°(360°)ーー>270°ーー>181°
通常の北をスタート基準とする場合は右回転で
0°ーー>90°ーー>180°ーー>270°ーー>360°
通常では何もせずに仕様として作成していますので、どのようにして南をスタートとするケースに合わせたスケッチにすればいいかを考えます。
まずは、考えなければならないのが、北をスタート基準にするケースと南をスタート基準の切り替えです。
これは、単純にESP32の空いているI/Oを1つ探して使います。今回は空いているIO21を入力として使います。
SWをIO21端子とGND間に入れます。SWONでGND(LOW),SWOffで内部プルアップ(HIGH)です。これで北と南のスタート基準を切り替えます。
次に角度コマンドは方位の角度をそのまま今まで通り同じコマンドで使用するという条件です。ここが運用時を考えた時に一番重要な条件になると思います。
具体的には角度に対しての”M***”コマンドを南をスタート基準とした場合はどのようになればよいかを理屈で記述してみます。
現状 --> 変換後 : 対応
"M000"-->"M180" : +180°
"M090"-->"M270" : +180°
"M180"-->"M360" : +180°
"M270"-->"M090" : -180°
"M360"-->"M180" : -180°
上記の矢印の先のコマンドに変換する必要があります。
サブルーチンで対処します。少し今回はGoogleのAIのGeminiを使いコードを書き出してもらいます。
result 変数はグローバル変数としてスケッチの最初に移動します。サブルーチン上では定義しませんので//です。
void calculateKakudo(){
// int result;
// kakudoが0から180までの場合
if (kaku >= 0 && kaku <= 180) {
result = kaku + 180;
Serial.print("角度が0から180なので、180を加算します: ");
Serial.println(result);
}
// kakudoが181から360までの場合
else if (kaku >= 181 && kaku <= 360) {
result = kaku - 180;
Serial.print("角度が181から360なので、180を減算します: ");
Serial.println(result);
}
// 上記の範囲外の場合
else {
Serial.print("角度が指定された範囲外です: ");
Serial.println(kaku);
}
}
// int result;
// kakudoが0から180までの場合
if (kaku >= 0 && kaku <= 180) {
result = kaku + 180;
Serial.print("角度が0から180なので、180を加算します: ");
Serial.println(result);
}
// kakudoが181から360までの場合
else if (kaku >= 181 && kaku <= 360) {
result = kaku - 180;
Serial.print("角度が181から360なので、180を減算します: ");
Serial.println(result);
}
// 上記の範囲外の場合
else {
Serial.print("角度が指定された範囲外です: ");
Serial.println(kaku);
}
}
このサブルーチンを使いコマンド角度を変換します。
実際のスケッチではシリアル受信で角度はsuuchikakudo変数に入ってきます。例)"090"とか
北スタート基準では受信した角度は
kakudo = suuchikakudo;
です。
南スタート基準では受信した角度を一旦kaku変数に入れてサブルーチンをコールします。変換結果はresultに入ります。
これをIO21のSWを検出するコードで切り替えるだけです。
実際のコードは次です。
if(digitalRead(DIR_STD)==LOW){ //DIRECTION SOUTH STANDARD
// 180 South standard ***************************************************************
// 左回り 起点180 ,179,178,177,176,175,.....90.....(0,360),359,....270....181(end)
result = 0;
kaku =0;
kaku = suuchikakudo;
calculateKakudo();
kakudo = result;
// 180 South standard ***************************************************************
}else
if(digitalRead(DIR_STD)==HIGH){ //DIRECTION NORTH STANDARD
// 0 North standard ------------------------------------------------------------------------------------
kakudo = suuchikakudo;
// 0 North standard ------------------------------------------------------------------------------------
}
コマンドはDIR_STDのSW offで通常はHIGHで北スタート基準となります。SWをon(GND)でLOWで南スタート基準となります。
// 180 South standard ***************************************************************
// 左回り 起点180 ,179,178,177,176,175,.....90.....(0,360),359,....270....181(end)
result = 0;
kaku =0;
kaku = suuchikakudo;
calculateKakudo();
kakudo = result;
// 180 South standard ***************************************************************
}else
if(digitalRead(DIR_STD)==HIGH){ //DIRECTION NORTH STANDARD
// 0 North standard ------------------------------------------------------------------------------------
kakudo = suuchikakudo;
// 0 North standard ------------------------------------------------------------------------------------
}
コマンドはDIR_STDのSW offで通常はHIGHで北スタート基準となります。SWをon(GND)でLOWで南スタート基準となります。
TFTの液晶に表示しているNOW角度も,SET角度も同じで、サブルーチンを使い同じように変換し各タート基準に合わせます。
実際のコードです。
//*********************************************
tft.setTextColor(TFT_WHITE,TFT_BLACK);
tft.setTextSize(3);
tft.setCursor(0,0);
tft.print("Now :");
if(digitalRead(DIR_STD)== LOW){ //DIRECTION SOUTH STANDARD
// 180 South standard ***************************************************************
result = 0;
kaku =0;
kaku = Readkakudo;
calculateKakudo();
sprintf(ce,"%3d",result);//new try
// 180 South standard ***************************************************************
}else
if(digitalRead(DIR_STD)==HIGH){ //DIRECTION NORTH STANDARD
// 0 North standard ------------------------------------------------------------------------------------
sprintf(ce,"%3d",Readkakudo);
// 0 North standard ------------------------------------------------------------------------------------
}
tft.print(ce);
//**********************************************
tft.setTextColor(TFT_WHITE,TFT_BLACK);
tft.setTextSize(3);
tft.setCursor(0,44);
tft.print("SET :");
char cc[6];
if(digitalRead(DIR_STD)== LOW){ //DIRECTION SOUTH STANDARD
// 180 South standard ***************************************************************
kaku =0;
result = 0;
kaku = kakudo;
calculateKakudo();
sprintf(cc,"%3d",result); //new try
// 180 South standard ***************************************************************
}else
if(digitalRead(DIR_STD)== HIGH){ //DIRECTION NORTH STANDARD
// 0 North standard ------------------------------------------------------------------------------------
sprintf(cc,"%3d",kakudo);
// 0 North standard ------------------------------------------------------------------------------------
}
tft.print(cc);
//**********************************************
tft.setTextColor(TFT_WHITE,TFT_BLACK);
tft.setTextSize(3);
tft.setCursor(0,0);
tft.print("Now :");
if(digitalRead(DIR_STD)== LOW){ //DIRECTION SOUTH STANDARD
// 180 South standard ***************************************************************
result = 0;
kaku =0;
kaku = Readkakudo;
calculateKakudo();
sprintf(ce,"%3d",result);//new try
// 180 South standard ***************************************************************
}else
if(digitalRead(DIR_STD)==HIGH){ //DIRECTION NORTH STANDARD
// 0 North standard ------------------------------------------------------------------------------------
sprintf(ce,"%3d",Readkakudo);
// 0 North standard ------------------------------------------------------------------------------------
}
tft.print(ce);
//**********************************************
tft.setTextColor(TFT_WHITE,TFT_BLACK);
tft.setTextSize(3);
tft.setCursor(0,44);
tft.print("SET :");
char cc[6];
if(digitalRead(DIR_STD)== LOW){ //DIRECTION SOUTH STANDARD
// 180 South standard ***************************************************************
kaku =0;
result = 0;
kaku = kakudo;
calculateKakudo();
sprintf(cc,"%3d",result); //new try
// 180 South standard ***************************************************************
}else
if(digitalRead(DIR_STD)== HIGH){ //DIRECTION NORTH STANDARD
// 0 North standard ------------------------------------------------------------------------------------
sprintf(cc,"%3d",kakudo);
// 0 North standard ------------------------------------------------------------------------------------
}
tft.print(cc);
//**********************************************
上記の追加スケッチで、北スタート基準と南スタート基準を切り替えることができます。
実際のローテーターでは指針の向きを基準となる方位スタートに向けます。
北スタート基準では指針を北に合わせます。
南スタート基準では指針を南に合わせます。(北スタート基準状態時に指針だけ南に合わせるということです。)
上記のスケッチ追加修正にて北スタート基準と南スタート基準を利用できるようになりました。
久々のスケッチでしたが、AIのおかげもかなりありまして、うまく動作するスケッチを追加作成できました。色々とAI試していますが、GoogleのAIのGeminiも素晴らしいです。
少しデバッグを続けたいと思います。
つづく?