goo blog サービス終了のお知らせ 

南無ちゃんのブログ https://namva.net/blog2

上記のアドレスに引っ越しました。

ローテータをブラウザでコントロール

2025-03-16 11:10:41 | プログラミング
 3月7日のブログで紹介している「WiFiでローテータを遠隔操作する装置」のソフトウェアを開発しています。ステップバイステップでデバックや動作確認をしながら進めてきましたが、今日ようやくブラウザで制御できるようになりました。Microsoft Edgeで表示した時のスナップショットを示します。

 見ての通りのGUIなので、使い方はご想像の通りです。YAESUのコントローラ本体では、プリセット動作中に停止することができませんが、プリセット動作中でもstopボタンを押せば停止するようにしました。
 フライングキャパシータは、ローテータが回転中のみスイッチングするように工夫しています。暫く、これで運用してノイズの影響で誤動作しないかなど確認して行きたいと思います。


車載用リチウム電池放電コントローラ

2025-02-28 12:26:49 | プログラミング
 ラズパイpico多目的ボードを利用して製作していた車載用リチウム電池放電コントローラを、キャンピングカーに設置しました。名称を色々考えた結果、「放電コントローラ」と呼ぶことにしました。

 車載用リチウム電池放電コントローラは、リチウム電池の過放電を予防し、ポタ電をバックアップとして、車載冷蔵庫にAC100を供給し続けるために製作しました。このコントローラは次のように動作します。
 リチウム電池の電圧が10.8V以下になると放電を停止し、ポタ電に切替ます。この時、ラズパイpicoボード上のLEDは1秒周期(デューティ比10%)で点滅するようにしています。ソーラーパネルによって充電が進み、12.4V以上になると負荷への電源供給は、ポタ電からリチウム電池+インバータに切替ます。この他、電圧が11.6Vまで低下すると警告としてLEDが1秒周期(デューティ比50%)で点滅するようにしました。この状態は不足電圧と言うらしいのですが、12Vに回復すると点滅を停止し、常時点灯します。
 以下にソースプログラム(全部)を示します。
// filename: reizokoSWpico.ino
// description: sketch for the Li battery discharge controller
// 2025.02.23 rev 0.1 by H.NAMVA
//io asignment
#define ADC0 26
#define DO1 10
#define DO2 7
//voltage lebel
#define V12R4 2824
#define V12R0 2741
#define V11R6 2638
#define V10R8 2476
//state
#define LVDisc 1
#define LVWarn 2
#define Normal 0


uint16_t vInp;
int state;


void setup() {
Serial.begin(115200);
analogReadResolution(12);
pinMode(LED_BUILTIN, OUTPUT);
pinMode(DO1, OUTPUT);
pinMode(DO2, OUTPUT);
digitalWrite(DO1, LOW);
digitalWrite(DO2, LOW);
vInp = analogRead(ADC0);
if(vInp
state = LVDisc;
}else if(vInp
state = LVWarn;
}else{
state = Normal;
}
}


void loop() {
vInp = analogRead(ADC0);
Serial.println(vInp);
digitalWrite(LED_BUILTIN, HIGH);
switch(state){
case LVWarn:
if(vInp > V12R0){
state = Normal;
}else if(vInp
state = LVDisc;
}
delay(500);
break;
case LVDisc:
if(vInp > V12R4){
state = Normal;
}
delay(100);
break;
default: // inclede Normal
if(vInp
state = LVWarn;
}else if(vInp
state = LVDisc;
}
delay(1000);
break;
}


switch(state){
case LVWarn:
digitalWrite(LED_BUILTIN, LOW);
delay(500);
break;
case LVDisc:
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(DO1, LOW);
digitalWrite(DO2, LOW);
delay(900);
break;
default: // inclede Normal
digitalWrite(DO1, HIGH);
digitalWrite(DO2, HIGH);
break;
}
}

5N9DTGをワッチしながらデバッグ

2025-02-19 19:46:00 | プログラミング
 天気予報通り寒い日が続いています。今朝も雪で白くなっていました。無線小屋に籠って、5N9DTGをワッチしながらリニアアンプ用操作パネルのデバッグをして過ごしました。

 DX worldを見ると、5N9DTGのログがClublogにアップロードされたとのことでしたので、早速確認すると、昨日QSOできた20mと15mにチェックがありました。Clublog Livestreamsなどによるリアルタイムなログチェックはできないようですが、1日程度の遅延なら問題ありません。
 5N9DTGの運用状況をPSKreporterでモニターしていますが、彼方此方のバンドを飛び回っているという感じです。パスがそれほど良くないので、結構苦労しましたが、午前8時半頃40mで、午後1時前に12mで、午後2時半頃に10mで、午後4時前に17mで、午後5時頃に30mで、いずれもFT8でQSOできました。これにて当初目標としていたバンドニューとなる17/15/12/10mでのQSOは達成できました。
 80/160mもバンドニューですが、難易度が高いかもしれません。できればQSOしたいものですが、両方とも夜のバンドなので、日本とニジェールの両方がお日様の陰になる午前3時頃から午前7時頃が可能性のある時間帯です。日中でも寒いのに、こんな時間帯に起きて無線小屋に行く?

AsyncWebserverでボタン押下を処理するには

2025-02-10 16:19:10 | プログラミング
 AsyncWiFiWebServerライブラリのAsyncAdvancedWebServer.inoというサンプルプログラムを見ながら、リニアアンプ用操作パネルアプリに移植しています。表示できるようになりましたが、ボタンを押す操作の処理方法が分かりません。
 ブラウザのボタンを操作でラズパイpicoのLEDをONするために、HTMLでは次のように記述しています。
  <form action="/" method="post">
  <button name="btnLED" value="LED_ON" class="green">LED</button>
  </form>
 このpostメソッドを受ける処理が必要です。サーバー側では、nameとvalueの組合せにより、「どのボタン」が押されて「どのような要求」があったのかを受け取る必要があります。
 AsyncWiFiWebServerライブラリには、多くのサンプルプログラムがあります。今日は、ボタン操作の方法を学習するためにAsync_PostServer.inoをコンパイルして実行してみました。

 ブラウザに表示される2つのフォームの内の、下側のフォーム(イメージは上図参照)のSubmitボタンを押すと、ブラウザの画面には次のように表示されました。


 Aysnc_PostServer.inoでは、次のように記述されています。

void handleForm(AsyncWebServerRequest *request){
 if (request->method() != HTTP_POST){
  request->send(405, "text/plain", "Method Not Allowed");
  }else{
  String message = "POST form was:\n";
  for (uint8_t i = 0; i < request->args(); i++){
  message += " " + request->argName(i) + ": " + request->arg(i) + "\n";
 }
 request->send(200, "text/plain", message);
 }
}
 このサンプルのHTMLでは該当するフォームは次のような内容です。
  <form method="post" enctype="application/x-www-form-urlencoded"   action="/postform/">
  <input type="text" name="hello" value="world"><br>
  <input type="submit" value="Submit">
  </form>
 以上のことから、 request->argName(i)がnameとしてhelloを、request->arg(i)がvalueとしてworldを受け取っていることがわかりました。






AsyncWebServerを試す

2025-02-07 15:47:17 | プログラミング
 Webサーバー(ブラウザの通信相手)をラズパイpicoWで製作しています。WevServer、WiFiWebServerという2つのライブラリーを試してみましたが、いずれも長時間運用するとハングアップしてしまいました。いくらオープンソースとは言え、ライブラリの中味にまで手を入れるのは面倒臭そうです。
 彼是調べていると、AsyncWebServerというライブラリを見つけました。ウェブサーバーというのはUNIXに実装された頃から一般的にシンクロナス方式なので、クライアントから要求があるまでブロックされてしまいます。Asynchronousというのは非同期式なので、受信待ち時にブロックされず、同時並行的に他の処理を行うことができるという利点があります。私はラズパイpicoWがデュアルコアであることを利用して、コア1でウェブサーバーを処理を行い、コア0で他の処理を行うという方式を採用しているので、同期式であるWebServerでも良いや!と思っていましたが、クラッシュするという問題にぶち当たったので、AsyncWebServerを試してみることにしました。
 Github には幾つかのサンプルプログラムがありますが、AsyncAdvancedWebServer.inoというのを試してみました。実行時のブラウザの画面を以下に示します。

 午前9時過ぎから6時間近く経過していますが、クラッシュすることなく正常に動作しています。このプログラムでは5秒毎に更新するようになっていて、ヒープ領域の容量も表示しています。6時間近く経過してもヒープのサイズは殆ど変化していません。このように、ヒープのサイズを表示しているということは、私が経験したようにWevServer等を使っていてクラッシュするという問題があるということを暗示しているようにも思えます。クラッシュの原因は、メモリリーク臭いと思っていましたが、ヒープのサイズをチェックすることでメモリリークの有無をチェックする方法も示してくれた有益なサンプルプログラムです。
 これは使えそうです!!問題解決の光が射して来ました。