ラベル arduino の投稿を表示しています。 すべての投稿を表示
ラベル arduino の投稿を表示しています。 すべての投稿を表示

2026年8月2日日曜日

FX-502Pでライプニッツ級数で円周率ためす

 Σn=0~100  4*(-1)^n/(2n+1)  をFX502Pのプログラム機能で試してみた。

分子がM2 分母がM3  カウンタがM0 総和をM1とすると

MODE 2> P2 >Min 0 >  0 Min 1 > 4 Min 2 >1 Min 3 > LBL 0 >MR 2 ÷ MR 3 =  M+ 1 >2 M+ 3> MR 2 +/- Min 2 > INV DSZ >GOTO 0 > MR 1

MODE 1>1000 > P2で実行すると 3.140592187

FX-502Pが発売当時、大型計算機のFORTRANだと、自分の知識では倍精度とかもできなかったので、ディフォルトでは桁数が小さく、すぐ精度がおちてしまって、級数計算(ミー理論と実測値の比較で使いました)は無理だった。級数計算は、大型計算機より、むしろ、プログラム電卓が重宝しました。

2026年3月27日金曜日

苗床管理Esp32c3による温度調整

 しばらく利用してみたが、手元から温度を細かく調整できるのは便利。外気温によって、リレーonの比率が変わるのもグラフから一目瞭然で、異様に比率が高いときは、熱が逃げている可能性もあったりするので、それをみて再度苗床をセットしなおしたりしている。

D2,D3はそれぞれヒーターに密着したセンサーのためかなり高めの温度になっている。D1,D3が制御用のセンサー。発芽までは温度高くてもいいけれど、発芽後はあまり温度が高くても徒長しやすいらしいので、途中から少しさげるようにしている。


2026年3月15日日曜日

ESP32にスピーカとマイクをつけて実験

 短い音の録音再生(エコー)が可能か実験してみた。今後、raspi経由でいろいろ処理を予定していますが。

 配線の数が多いときは、意外とエナメル線が使いやすい。裏表に通したりしてなるべく干渉しないようにした。PCB等の発注も考えたけれど、配線の変更の可能性もあるし、それなりの料金はかかるので、最小限のユニバーサル基板にしてみた。モジュールが基板からはみ出しているところは、あとでサイズがあいそうな百均のケースに固定できないか、考えたい。

2026年2月8日日曜日

esp32温度センサ動作で苦労する

 カメラも動作させているためか、FNK0060なるESP32 は、BMP280ライブラリの中の名称のダブりなどでうまくビルドできず、苦労した。google AIからかなりハードよりのコードを出してもらいなんとか解決。 また、I2Cは、2つが限度らしく、リレー動作がひとつあまってしまう。結局、DS18B20(苗床には土にさせるし、3個以上も追加できるのでこちらのほうがいい)、SSRも使用することに。


いくつか動作させるためのポイントがあった。
・BMP280は、SDO端子をアースするか、電源につなぐかで、2つのセンサを判別する。
・GPIO33,32は、プルアップ4.7KΩを入れたほうがいい。

※その後、温度が上がりすぎたときと、指定した時間以上Onが続いたときアラーム音声がraspiから出るようにしてみた。ただし、常時スピーカがOnになっていると無音状態でも、わずかな音が出るので、再生時のみスピーカを接続するようなリレー動作を入れてみた。
 2sc1815でリレー動作させる際に、最初ベースへの抵抗を10KΩとしてみたが、うまくいかず、2.2KΩに変更する必要があった。10KΩだとリレーに必要な電流が流れないようだった。
※実際に、使ってみるとちょっとしたことで、うまくいかないことがでてくる。最初発泡スチロールトレーに水を浸したりして、サツマイモや種の芽出しをしていたが、ヒーターが高温になるわりに、肝心のトレーの中の温度が上がりにくい。リレーOn率やヒーターセンサなどがあったためにわかったことだけれど、これがないとたぶん気づかなかったかも。対策としては、薄い豆腐ケースなどが熱を通しやすくてよかった。といっても、ヒーターとケースの間には割りばし等で多少のスペースは入れないとだめですが。
*加熱不足で、一つのBoxの中で2つセンサー+ヒーターの組み合わせを使っていますが、その場合の温度設定は、同じ設定温度にすると、チャタリングが起きやすいことが判明。リレーが同時にOnなるとどうしても電流不足で不安定になるようだ。0.1度程度差をつけるだけで、チャタリングは解消した。
*その後、センサのケーブルの不具合や12Vアダプタの不安定さのためか、センサ異常やリレー異常もあったが、はんだづけし直しや平滑コンデンサを入れることでなんとか改善している。スーパーで購入したサツマイモからも芽が出てきた。
ESP32のカメラ画像 牛乳パックを鉢代わりにした
さつまいもの切れ端から芽だししたもの




2026年2月7日土曜日

苗床温度調整をesp32で

 3月ぐらいから、小さめの衣装ケースに発泡スチロールを入れ、5Vヒーターで温度調整しながら、試してみようかと思い準備中。念のため、ヒーターには70度ぐらいの温度ヒューズを直列に入れるといいらしい。コードはこれから考える予定。ハードは、センサ部分の残してほぼできてきた。


 配線図では、12Vを降圧コンバータで5VにしてたものをEsp32に使っているが、安定せずうまくいかなかったので、専用の5Vを用意する予定。



念のため、温度調整用のセンサーに加えて、ヒーターマット直接測定するセンサー(DS18B20)も追加予定。万が一、高温になったらraspiに知らせて、Wav音を鳴らす仕組み準備中。




2026年1月18日日曜日

FreeNove Esp32 Wroverで間欠WebCam動作テスト

  Freenoveのesp32 wroverについては、ストリーミングだと負荷がかかりすぎるし、付属のサンプルコードはカメラとGPIOを同時に細かい制御ができないコードのようなので、間欠で静止画をWebで表示しつつ、GPIOの操作するようなコードを試してみた。FNK0060というパッケージに合わせてライブラリなどそろえる必要あるようだった。

index.htmlは、IDEがver2だとアップロードできないので、Ver1を使う必要があった。

2026年1月10日土曜日

dfplayerをesp32C3で動かしてみた

dfplayerはネットラジオをraspiでタイマー録音した英語教材 をmicroSDにもってきて再生、whisper使って音声認識したテキストをrapiにおいてwifiで読み取ったものをOLEDで表示できるようにしてみた(Qtで準備のためのツールも作成)。LGT8F328Pを使っていたけれど動作が不安定になってきたので、esp32c3に置き換えたついでに、テキスト表示できるようにバージョンアップしてみた。数百円で入手できるので、コスパがとてもよくなっていると思う。

GPIO5:IN2  ...file番号2桁を順に長押しで入れる。モード切り替えたら、テキスト番号のインクリメントをする。

GPIO6:IN1 ...Cmd機能とし、長押し1回でファイル番号をインクリメント、長押し2回でデクリメント。モード切り替えたら、テキスト番号のデクリメント

GPIO7:IN3 ...モード切替。テキスト番号を変更して表示するようにした。

esp32C3は小型のわりに機能満載で、便利に使える。

※GPIO7を長押し(2回Beep)で、テキスト番号指定表示可能に変更。GPIO7を押しながら、GPIO5,6を押すことで、音量調整可能にした。
※GPIO7を押しながら、GPIO5,6両方押すと、サーバーモードになり、SSID:ESP32_Config, Pass:12345678で192.168.4.1にアクセスでSSID,Pass,URLを設定変更可能にした。ただ、スマホ(android)では、うまくいかず、PCのChromeだと設定できた。
*サーバーモードにすると、OLEDを使えなくなるようだったので、あらかじめ、サーバーモード時のSSID、パスワード、URLはどこかにメモしておく必要あり。
*文字数が多いときは、電光掲示板方式でスクロールして見えるように修正。(2026/3/18)

2025年11月1日土曜日

ESP32 DEVKIT_Cで容量をWIFIでロギング

間欠動作で12時間ごとにGPIO4を容量センサとして使い、ロギングしてみた。raspiにGETでデータを保存し、スマホ等で取り出すアプリを作れば完成の予定。 はたして、灯油タンク残量が容量センサで計測実用なるか、テスト予定。(PICのCPSも検討したが、かえって複雑になりそうなので、このパターンにしてみた。)
PICに比べると、至れり尽くせりでesp32は開発しやすい。それでも、ネットワークがからむとプロトコルやポートとかいろいろ調整が必要になってくる。

2024年8月23日金曜日

CWデコーダ製作

 arduino Unoが一つ余っていたので、LCDを339円でアマゾンから購入して、作ってみた。

CWデコーダと言えば、デンマークの方が作成されたものが有名。

http://oz1jhm.dk/content/very-simpel-cw-decoder-easy-build

上記リンクを参考にして、コードや配線図も公開されていたので、それをもとに試してみた。配線図では、LCDの配線とLEDの極性が違っていたので修正必要だったが、なんとかうまく動作させることができた。以前作ったアプリで生成させたCW音であれば、ほぼ正しくデコードできている。

配線には、以前、壊れた炊飯ジャーから取り出したエナメル線が役立った。細くて目立たないので、電子工作にはいいようだ。スズメッキ線だとショートの恐れがあるし、ビニル線だとかさばってしまう。

和文モードを追加して、タッチセンサスイッチTTP223を12番Pinにつなぎ、Bのみショートして、オルタネートにして、切り替えるようにしてみた。プルダウン抵抗2k入れています。
(写真の左側で赤く光っているところがTTP223)

 原作者の許可を得てないので、コードは公開できませんが、変更点は以下のとおりです。
 これで、いちおう、和文モードにも切り替えられるようになりました。

LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //ここは、元のサイトの配線図に合わせました
const int colums = 16; /// have to be 16 or 20 16列×2行タイプなので
const int rows = 2;  /// have to be 2 or 4
bool JEflg=true; //flag for Japanese 追加
setup()に  pinMode(12, INPUT);  // japanese/english mode change 追加
loop()に  int sensorValue = digitalRead(12);
  if (sensorValue == HIGH ) {
    JEflg=true;    
  } else {
    JEflg=false;
  } 追加
decode()を以下のように変更
void docode(){
 if(JEflg){
  decodeJ(); 
 }else{
  decodeE(); //これまでの decode()です
 }

void decodeJ(){
if (strcmp(code,".--.-") == 0) printascii(176); // -
  if (strcmp(code,"--.--") == 0) printascii(177);    
  if (strcmp(code,".-") == 0) printascii(178);
  if (strcmp(code,"..-") == 0) printascii(179);
  if (strcmp(code,"-.---") == 0) printascii(180);
  if (strcmp(code,".-...") == 0) printascii(181);
  if (strcmp(code,".-..") == 0) printascii(182);
  if (strcmp(code,"-.-..") == 0) printascii(183);
  if (strcmp(code,"...-") == 0) printascii(184);
  if (strcmp(code,"-.--") == 0) printascii(185);
  if (strcmp(code,"----") == 0) printascii(186);
  if (strcmp(code,"-.-.-") == 0) printascii(187);
  if (strcmp(code,"--.-.") == 0) printascii(188);
  if (strcmp(code,"---.-") == 0) printascii(189);
  if (strcmp(code,".---.") == 0) printascii(190);
  if (strcmp(code,"---.") == 0) printascii(191);
  if (strcmp(code,"-.") == 0) printascii(192);
  if (strcmp(code,"..-.") == 0) printascii(193);
  if (strcmp(code,".--.") == 0) printascii(194);
  if (strcmp(code,".-.--") == 0) printascii(195);
  if (strcmp(code,"..-..") == 0) printascii(196);
  if (strcmp(code,".-.") == 0) printascii(197);
  if (strcmp(code,"-.-.") == 0) printascii(198);
  if (strcmp(code,"....") == 0) printascii(199);
  if (strcmp(code,"--.-") == 0) printascii(200);
  if (strcmp(code,"..--") == 0) printascii(201);        
  if (strcmp(code,"-...") == 0) printascii(202);
  if (strcmp(code,"--..-") == 0) printascii(203);
  if (strcmp(code,"--..") == 0) printascii(204);  
  if (strcmp(code,".") == 0) printascii(205);  
  if (strcmp(code,"-..") == 0) printascii(206);
  if (strcmp(code,"-..-") == 0) printascii(207);
  if (strcmp(code,"..-.-") == 0) printascii(208);
  if (strcmp(code,"-") == 0) printascii(209);
  if (strcmp(code,"-...-") == 0) printascii(210);
  if (strcmp(code,"-..-.") == 0) printascii(211);
  if (strcmp(code,".--") == 0) printascii(212);
  if (strcmp(code,"-..--") == 0) printascii(213);
  if (strcmp(code,"--") == 0) printascii(214);
  if (strcmp(code,"...") == 0) printascii(215);
  if (strcmp(code,"--.") == 0) printascii(216);
  if (strcmp(code,"-.--.") == 0) printascii(217);
  if (strcmp(code,"---") == 0) printascii(218);
  if (strcmp(code,".-.-") == 0) printascii(219);
  if (strcmp(code,"-.-") == 0) printascii(220);
  if (strcmp(code,".-.-.") == 0) printascii(221);
  if (strcmp(code,"..") == 0) printascii(222);
  if (strcmp(code,"..--.") == 0) printascii(223);  
  if (strcmp(code,".---") == 0) printascii(166);
  if (strcmp(code,".----") == 0) printascii(49);
  if (strcmp(code,"..---") == 0) printascii(50);
  if (strcmp(code,"...--") == 0) printascii(51);
  if (strcmp(code,"....-") == 0) printascii(52);
  if (strcmp(code,".....") == 0) printascii(53);
  if (strcmp(code,"-....") == 0) printascii(54);
  if (strcmp(code,"--...") == 0) printascii(55);
  if (strcmp(code,"---..") == 0) printascii(56);
  if (strcmp(code,"----.") == 0) printascii(57);
  if (strcmp(code,"-----") == 0) printascii(48);
  if (strcmp(code,"..--..") == 0) printascii(63); // ?
  if (strcmp(code,".-.-.-") == 0) printascii(161); // full stop
  if (strcmp(code,"--..--") == 0) printascii(164); // comma
  if (strcmp(code,".--.-.") == 0) printascii(64);//@
  if (strcmp(code,"---...") == 0) printascii(58);//:
  if (strcmp(code,"-.--.-") == 0) printascii(40);// (
  if (strcmp(code,".-..-.") == 0) printascii(41);// )
  if (strcmp(code,"...-.") == 0) printascii(126);//correction
  if (strcmp(code,".-.-..") == 0) printascii(163); //square brackets
  if (strcmp(code,".-..-") == 0) printascii(168); // old katakana i
  if (strcmp(code,".--..") == 0) printascii(170); // old katakana e
}


※その後、マイクのMAX9814をアマゾンで買って、スピーカ音を拾うこともできるようにしてみた。
※また、感知する音の周波数も変えられるようだったので、2種類の周波数を切り替えられるようにしてみた。そのために、タッチセンサーを追加するのも面倒だったので、Off>On>Offの切り替えを素早く行うと、切り替えるようなものにしてみた。(家の玄関のセンサーライトの切り替え設定がこの方式を使っているので、参考にした。)

2024年5月30日木曜日

LGT8F328Pのシリアル通信でDfPlayerを操作

  以前、うまくいってなかった、arduino互換 LGT8F328Pのシリアル通信によるDfplayer操作に再度挑戦してみたら、今回はうまくいきました。音量をあまり大きくすると、電圧降下が起きるためか、不安定になるようなので、初期化で音量を下げるようにしています。DfplayerとつなぐPinは5,6にしたらうまくいくようです。スイッチはタッチセンサttp223を使用。LGT8F328Pはサイズが小さいのでコンパクトにまとめることができました。

 使い方は、一方のスイッチをOnにするたびに、フォルダを変更します。もう片方のスイッチをOnにするたびに、そのフォルダ内のファイルを順に再生します。なお、今回は01~05までのフォルダにしてみました。必要に応じて、スケッチの定数maxfを変更すれば、98までフォルダを増やせます。99のフォルダには001.mp3に「フォルダ1です」のように音声ファイルを入れておきます。フォルダ内のファイル名は先頭が0の3桁数字が必要です。多くの音声ファイルを手軽に再生するのに便利に使えそうです。 

 ただ、先頭に数字をつける作業があるので、ここは、.netでツールを作成してなるべく効率よくできるようにしているところです。

Pin接続とスケッチは以下のようにしてみました。

delay時間を調整したりしないと、各フォルダ内のファイル数の取得がうまくいかず、試行錯誤必要だった。まだ、完全でないところもあるかもしれません。


※追加機能として、内蔵LEDでカレントFile番号を光モールス信号で、電子ブザーでも出力する形式にしてみた。ChatGPTに必要な関数を聞いて、それを使ったところ、速攻で完成。
電子ブザーは、音量調整できるように可変抵抗とともに9番ピンに接続した。ディスプレイなしで手軽に扱えるようにしてみた。
※さらに、追加機能として、ファイルのタッチスイッチは長押しすると、ピッという音が何回か鳴るようにし、鳴った回数だけファイル番号を先に進めるようにした。これで、スムーズにファイル番号を先に進められるようになった。使っているうちに、いろいろアイデアが出てくるが、それを簡単にコードに反映できるのが、arduinoの利点。
※フォルダ切り替えスイッチを長押し(ピッピッが3回以上)すると、連続再生できるようにした。必要なmp3音声ファイルは、コード内にコメントを入れました。
※しばらくぶり(2025/4/18)コンパイルしようとしたらうまくいかない。フォルダに関係ファイル集めたがかえって、うまくいかないので、すべて関連ファイルアップデートして、フォルダ内をきれいにしたら、うまくいった。