botanicfields / BF-018

JJY Simulator for M5StickC, M5StickC Plus and Plus2
16 stars 4 forks source link

ESP32 JJY電波をBPC電波に変更 #3

Closed changxinchang closed 4 months ago

changxinchang commented 6 months ago

こんにちは。申し訳ありませんが、このような方法でメッセージをお送りします。 あなたのESP32 JJY電波製作を見て、あなたのチュートリアルに基づいてBPC電波に改造する予定です。 JJY電波の周波数、エンコード方式とBPC電波が全く異なるため、何度も修正しても成功しない。 ご協力をお願いします。 BPC電波の周波数は68.5kHzで、20sごとに完全な時間情報を取得し、1sごとに1つのデータを受信します。データ形式は00012000122023111201です。 0は100msパルス幅、1は200msパルス幅、2は300msパルス幅、3は400msパルス幅を表します。 取得した時間データを68.5kHzキャリアで送信する方法を教えてください。 どうもありがとうございます 7-1632556068 ![Uploading 7-1632556068.png…]()

uehara00 commented 5 months ago

どうか、以下を参考にしてください。プログラムの詳細を解説しています。 「標準電波 JJY もどきを M5StickC / M5Atom の Ticker で生成する」 https://qiita.com/BotanicFields/items/a78c80f947388caf0d36

changxinchang commented 5 months ago

ご協力ありがとうございます。BPC電波の資料が少なくて、今はゆっくりと修正を模索するしかありません。 後で教えてもらうかもしれませんが、お邪魔します

changxinchang commented 5 months ago

またお邪魔します。 私が修正したプログラムを見てもらえますか? TcoValue())のswitchの結果を常に出力できません。

changxinchang commented 5 months ago

int TcoValue() { int tco;

int nian, yue, ri, xingq, shi, fen, miao;

char buf[20];

gettimeofday(&tv, &tz);
tnow = time(nullptr);
// localtime / gmtime every second change static time_t lastv = 0; ts = *localtime(&tnow);
nian = ts.tm_year + 1900; yue = ts.tm_mon + 1; ri = ts.tm_mday; if (ts.tm_wday == 0) { xingq = 7; } else { xingq = ts.tm_wday; } shi = ts.tm_hour; fen = ts.tm_min; miao = ts.tm_sec;

int date[] = { ri, yue, nian }; int timet[] = { shi, fen, xingq }; date[2] = date[2] % 100; // year timet[0] = timet[0] % 12; // am.pm String p0 = "00"; String p1 = dropAndFill(2, String(ts.tm_sec / 20)); // seconds String p2 = "00"; // reserved String sec1 = (p1 + p2) + dropAndFill(4, String(timet[0], BIN)) + dropAndFill(6, String(timet[1], BIN)) + dropAndFill(4, String(timet[2], BIN)); String p31 = String(shi >= 12); String p32 = String(countOnes(sec1) % 2); String p3 = p31 + p32; String sec2 = dropAndFill(6, String(date[0], BIN)) + dropAndFill(4, String(date[1], BIN)) + dropAndFill(6, String(date[2], BIN)); String p41 = String(nian % 1000 > 100 ? "1" : "0"); String p42 = String(countOnes(sec2) % 2); String p4 = p41 + p42; String code2 = p0 + sec1 + p3 + sec2 + p4; //Serial.println(code2.c_str());

String result = bin2four(code2); Serial.print("result:"); Serial.println(result);

strcpy(buf, result.c_str());

for (int i = 0; i < 20; i++) { Serial.println(buf[i]); delay(1); } switch (miao) { case 0: tco = buf[0] + 1; break; case 1: tco = buf[1] + 1; break; case 2: tco = buf[2] + 1; break; case 3: tco = buf[3] + 1; break; case 4: tco = buf[4] + 1; break; case 5: tco = buf[5] + 1; break; case 6: tco = buf[6] + 1; break; case 7: tco = buf[7] + 1; break; case 8: tco = buf[8] + 1; break; case 9: tco = buf[9] + 1; break;

  case 10: tco = buf[10] + 1; break;
  case 11: tco = buf[11] + 1; break;
  case 12: tco = buf[12] + 1; break;
  case 13: tco = buf[13] + 1; break;
  case 14: tco = buf[14] + 1; break;
  case 15: tco = buf[15] + 1; break;
  case 16: tco = buf[16] + 1; break;
  case 17: tco = buf[17] + 1; break;
  case 18: tco = buf[18] + 1; break;
  case 19: tco = buf[19] + 1; break;

  case 20: tco = buf[0] + 1; break;
  case 21: tco = buf[1] + 1; break;
  case 22: tco = buf[2] + 1; break;
  case 23: tco = buf[3] + 1; break;
  case 24: tco = buf[4] + 1; break;
  case 25: tco = buf[5] + 1; break;
  case 26: tco = buf[6] + 1; break;
  case 27: tco = buf[7] + 1; break;
  case 28: tco = buf[8] + 1; break;
  case 29: tco = buf[9] + 1; break;

  case 30: tco = buf[10] + 1; break;
  case 31: tco = buf[11] + 1; break;
  case 32: tco = buf[12] + 1; break;
  case 33: tco = buf[13] + 1; break;
  case 34: tco = buf[14] + 1; break;
  case 35: tco = buf[15] + 1; break;
  case 36: tco = buf[16] + 1; break;
  case 37: tco = buf[17] + 1; break;
  case 38: tco = buf[18] + 1; break;
  case 39: tco = buf[19] + 1; break;

  case 40: tco = buf[0] + 1; break;
  case 41: tco = buf[1] + 1; break;
  case 42: tco = buf[2] + 1; break;
  case 43: tco = buf[3] + 1; break;
  case 44: tco = buf[4] + 1; break;
  case 45: tco = buf[5] + 1; break;
  case 46: tco = buf[6] + 1; break;
  case 47: tco = buf[7] + 1; break;
  case 48: tco = buf[8] + 1; break;
  case 49: tco = buf[9] + 1; break;

  case 50: tco = buf[10] + 1; break;
  case 51: tco = buf[11] + 1; break;
  case 52: tco = buf[12] + 1; break;
  case 53: tco = buf[13] + 1; break;
  case 54: tco = buf[14] + 1; break;
  case 55: tco = buf[15] + 1; break;
  case 56: tco = buf[16] + 1; break;
  case 57: tco = buf[17] + 1; break;
  case 58: tco = buf[18] + 1; break;
  case 59: tco = buf[19] + 1; break;
  default: tco = 0; break;
}
return tco;

}

changxinchang commented 5 months ago

0,1,2,3だけをサイクリックに出力し、

uehara00 commented 5 months ago

大変残念ですが、あなたのプログラムがどの様な働きをするのか、私には理解できません。申し訳ありません。

changxinchang commented 5 months ago

取得した時間データに基づいて4進数に変換し、生成した4進数(0、1、2、3)に対応して100ms、200ms、300ms、400ms幅のパルスを生成し、1秒おきにパルス信号を送る

uehara00 commented 5 months ago

やりたいことはわかりました。あなたのプログラムが、そのやりたいことをどうやって実現しているのかがわかりません。

changxinchang commented 5 months ago

arduinoとesp32に触れたばかりです。 手順がきちんと書かれていない。 よくミスをします。ミスをした後、普通はインターネットで資料を勉強します。資料が見つからなければ、他の人に助けを求めるしかありません。 今でも分からない知識がたくさんあります。ゆっくりと模索して勉強する必要があります。

changxinchang commented 5 months ago

今のプログラムにはまだエラーがあり、正常に機能しません。 頑張って修正していますが、それでも正常に機能しない場合は、メールでお送りしますので、お手数ですがご覧ください。

uehara00 commented 5 months ago

以下を参考にしてください。実際に時刻合わせができるかどうかの確認はできていません。 https://github.com/botanicfields/BPC-simulator

changxinchang commented 5 months ago

ご協力ありがとうございます。また自分のESP32でコードをテストします。 GPIOに1Kの抵抗と電線をつなぐだけで電波信号を送ることができますか? 受信機は送信された時間情報を受信できますか?

uehara00 commented 5 months ago

BPCを使う電波時計や受信機を持っていないので確認することができません。1kohmの抵抗についても十分な電波を送信できるかどうかは受信してみないとわかりません。

changxinchang commented 5 months ago

まず1Kohmの抵抗で試してみます。 送信した電波が受信できるかどうかを見る。

changxinchang commented 5 months ago

1Kohmの抵抗と導線を使ってテストしましたが、ESP32の出力の波形が完璧ではなく、受信機が受信した時間データの誤差が大きすぎます。 これは送信したデータです:1022321122102111200 Saturday May 18 2024 22:57:40。 これは受信したデータ23000100001000000000001です 2000-0-0 Week:0 Time: 12:16:480AM。 出力波形の調整が必要です。

uehara00 commented 5 months ago

テストをご苦労様でした。送信データは期待どおりでありプログラムは正しく動作しているということですね。波形についてはプログラムでの調整は難しいので、GPIOに繋がっている回路を改善してください。がんばってください。

changxinchang commented 5 months ago

ご協力とご指導ありがとうございました。 今、信号の波形を改善する方法について資料を探して勉強します。 ESP32が送信する波形をより完璧にし、受信機が受信するデータの誤差を小さくする。

changxinchang commented 5 months ago

お使いのPCB回路は68.5KHzのBPCに適していますか? 一部の回路を修正して使用できますか? よろしければ、しばらくお使いのPCB回路でテストしてみます。 それでも仕事ができない場合は、信号の波形を改善する方法を学ぶために、より多くの時間を費やすことになります。

uehara00 commented 5 months ago

厳密な回路ではないので、とりあえず、同じ回路で試してみる価値はあると思います。

changxinchang commented 5 months ago

まずこの回路で試してみて、同時に資料を探して勉強して、同時に進めます。 ご協力ありがとうございます。

uehara00 commented 5 months ago

BPCに対応しているCASIOの時計を入手して動作を確認しました。先日のプログラムの処理に致命的なミスがありましたので修正しました。再度ご確認をお願いします。1kohmの抵抗でも動作するかもしれません。

changxinchang commented 5 months ago

ご支援とご協力ありがとうございます。今テストを行う予定です。 もう一度お問い合わせください。お使いのPCB回路はAD8532を使用していますが、LM358で置き換えてもいいですか? 回路の修正は必要ですか?

uehara00 commented 5 months ago

LM358 の Slew Rate = 0.3V/us とあります。振幅 peak = 2V とすると、最大周波数は 24kHz 程度と考えられます。したがってLM358による置き換えは難しいと思います。AD8532 でなくても Slew Rate = 1V/us 以上で、Rail to Rail の Op-Amp であれば使えると思います。最大出力電流はコイルに流す電流に対し余裕のあるものを選んでください。

changxinchang commented 5 months ago

ご指導とご協力ありがとうございました。 設計したPCBを使用することにしました。 直面している課題を解決するために、再び専門的な指導に感謝します。

uehara00 commented 5 months ago

ところで、新しい修正済のプログラムのテスト結果はいかがですか?最初のプログラムは、TCO のオンとオフを逆にしていたので、正しいコードを送信できていませんでした。さらに、パリティの計算に誤りがありました。前回1kohmの抵抗と導線を使って失敗した原因は、プログラムの誤りによるものです。新しいプログラムは実際に電波制御時計を使って正しい動作を確認できました。新しいプログラムで1kohmの抵抗と導線を使って試してみる価値はあると思います。よろしくお願いします。

changxinchang commented 5 months ago

新しいプログラムで1kohm抵抗とリード線テストを使用した場合、受信機が受信した時刻情報に誤りがあります。 シリアルツールで見ると、ESP32から出力されたデータは正確で、ESP32が生成した波形が不完全で、干渉があって、受信機が受信したデータのいくつかが間違っているはずです。 今、あなたが設計したPCBを作成して、ESP32が出力する波形が干渉を低減できるようにします。PCBの作成が終わったら、もう一度テストを行います。 テスト後、私は最初の時間に結果をあなたにフィードバックします。 ご協力とご指導ありがとうございました。 改めてありがとうございます。

changxinchang commented 5 months ago

PCBは既に作成済みです。 今問題があります。コンデンサC5の先端にはESP32が発生した電波信号があり、信号電圧は2Vあり、オシロスコープで見ることができますが、C5を通過すると電波信号は検出されず、2.6Vの電圧しかありません。

uehara00 commented 5 months ago

そのPCBで電波時計の時刻を合わせることはできないのでしょうか? PCBのデータや完成写真を見せてくれませんか?

C5を通過後は2.5Vを中心に0.3V程度の振幅を観測できると思います。 また、アンテナコイルの直前にある抵抗R8の、コイルとは反対側の端子の電圧を調べてください。 この電圧をR8の抵抗値で割り算した電流値がアンテナコイルを流れます。

以前、お話しましたとおり、こちらでは修正したプログラムで、BPCの電波時計を合わせることができています。 https://github.com/botanicfields/BPC-simulator/blob/main/image/IMG_9505.JPEG

changxinchang commented 5 months ago

R8抵抗の先端の電圧は0.75Vで、正弦波状の信号がある。 R8抵抗の後端には波形信号がありません。R8抵抗先端の平均電圧0.18V

uehara00 commented 5 months ago

抵抗R8の後端は、アンテナコイルでグランドに接続されるため、ほぼグランド電位であり電圧波形は現れません。 R8の直前にコンデンサC8があるため、R8先端の平均電圧はゼロに近くなります。 抵抗R8を流れる電流値が、そのままアンテナコイルの電流値です。 アンテナコイルから放射される磁界は、アンテナコイルを流れる電流に比例します。 アンテナコイルに流れる電流を増やすには、R8の抵抗値を小さくします。

uehara00 commented 5 months ago

アンテナコイルには 0.75V / 510ohm = 1.5mA 程度は流れていて、相応の磁界が発生しています。この状態で時計を近づければ、時刻合わせができるのではないでしょうか。 また、R8を 51ohm に交換すれば アンテナ電流を15mA に増強できます。

changxinchang commented 5 months ago

抵抗を51ohmに交換してもう一度試してみます。

uehara00 commented 5 months ago

繰り返しになりますが、こちらでは修正済のプログラムで、510ohm の回路で、BPCの電波時計を合わせることができています。やみくもな修正ではなく、原因などを論理的に考えて改善を図ってください。 https://github.com/botanicfields/BPC-simulator

changxinchang commented 5 months ago

はい。 もう一度チェックし直して、問題の原因を見つけます。

changxinchang commented 4 months ago

検査の結果、PCBボードのコイルの制作に問題があることがわかった。 正常に機能しなくなり、PCBを作り直してテストする予定です。

changxinchang commented 4 months ago

修正したPCBを再作成し、テストを経て正常に動作するようになった。 ご協力ありがとうございます。 ご協力ありがとうございました。

uehara00 commented 4 months ago

お知らせをありがとうございます。期待された動作を確認することができ、大変良かったと思います。

uehara00 commented 4 months ago

本件は、完了(クローズ)といたします。