mitsu-at3 / esp32_ntp_repeater

ESP32でNTPの時刻を電波時計の電波(JJY)として出力するための制御プログラム
1 stars 0 forks source link

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

Open changxinchang opened 2 months ago

changxinchang commented 2 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

mitsu-at3 commented 2 months ago

返事が遅くなってごめんなさい。 あなたがどこまで実装できているのか、どこが上手くいっていないのか、等が分からないので、 BPC仕様に変更するにあたり、必要と考えられるものを書きます。 あなたの求めている回答と違っていたら、ごめんなさい。

・ハードウェア 「68.5kHz」で送信するためには、NANDゲートより後の ・アンテナ(コイル) ・キャパシタ ・抵抗器 を変更する必要があります。

例えば、アンテナが「3.2mH」の場合、キャパシタは「約1.7nF」で抵抗器が「約1.1kΩ」になりました。 https://crystal-set.com/calc/frequency_resonance_lc.php ↑のサイトで「68.5kHz」のときの、コイルのインダクタンス・キャパシタの容量を求めて、 「CircuitJS1」で組んでみて、ちょうど良い波形になる抵抗値を探しました。 image (私もこれについては、よく理解できていません。ごめんなさい。)

・ソフトウェア https://github.com/mitsu-at3/esp32_jjy_test/blob/master/JJY_TEST.ino ひとまず正常に送信できるかどうかを確認するために、 こちらのテストコードをBPCの仕様に改造して実験することをお勧めします。

このコードの中身は、createJjyTimeCode() でJJYのタイムコードを生成し、 メインループで時間に沿ってGPIOをON/OFFするだけの単純なものです。

BPCに改造するなら、例えば・・・

#define BPC_0 0x01
#define BPC_1 0x02
#define BPC_2 0x03
#define BPC_3 0x04
#define BPC_GET_ONTIME(v) v * 100

void createBpcTimeCode(const struct tm* time, unsigned char pTimecode[20]) {
  // 000 12 000 12 2 023 11 1201
  pTimecode[0] = BPC_0;
  pTimecode[1] = BPC_0;
  pTimecode[2] = BPC_0;

  pTimecode[3] = BPC_1;
  pTimecode[4] = BPC_2;

  pTimecode[5] = BPC_0;
  pTimecode[6] = BPC_0;
  pTimecode[7] = BPC_0;

  pTimecode[8] = BPC_1;
  pTimecode[9] = BPC_2;

  pTimecode[10] = BPC_2;

  pTimecode[11] = BPC_0;
  pTimecode[12] = BPC_2;
  pTimecode[13] = BPC_3;

  pTimecode[14] = BPC_1;
  pTimecode[15] = BPC_1;

  pTimecode[16] = BPC_1;
  pTimecode[17] = BPC_2;
  pTimecode[18] = BPC_0;
  pTimecode[19] = BPC_1;

  // 実際のBPCのタイムコード生成については、私はBPCの仕様が全く分からないので頑張ってください。
  // 四進数が出てきたり、かなり難しそうです・・・
}

// 省略

void loop() {
  struct timespec nowTime;
  if (clock_gettime(CLOCK_REALTIME, &nowTime) == -1) {
    // TODO: ERROR
  }
  struct tm* nowDateTime = localtime(&nowTime.tv_sec);

  unsigned char timecode[20];

  createBpcTimeCode(nowDateTime, timecode);

  for (int i = nowDateTime->tm_sec % 20; i < 20; ++i) {
    int ontime = BPC_GET_ONTIME(timecode[i]);
    digitalWrite(32, HIGH);
    delay(ontime);
    digitalWrite(32, LOW);
    delay(1000 - ontime);
  }

このような感じで・・・

あまり参考にならなかったら、ごめんなさい。 頑張ってください。

changxinchang commented 2 months ago

ご返事ありがとうございます。 インターネットでBPCの時間信号をどのように4進数に変換するかの資料を見つけましたが、今では時間を4進数に変換できるようになりました。 今必要なのは、変換された4進データをGPIOで出力することです。 今、あなたからもらったプログラムを使ってコンパイルします。 またありがとうございます

changxinchang commented 2 months ago

def dropandfill(l,s):return '0'*(l - len(s[2:])) + s[2:]#用0补位 def time2code(date_time, dt = datetime.timedelta(0)): '''

''' date_time -= dt date = [date_time.day, date_time.month, date_time.year] timet = [date_time.hour,date_time.minute,date_time.weekday()+1] date[2] = date[2]%100#year timet[0] = timet[0]%12#am.pm p1 = dropandfill(2,bin(date_time.second/20))#seconds p2 = '00'#reserved sec1 = (p1+p2)+''.join(map(dropandfill,[4,6,4],map(bin,timet))) p31 = str(int(date_time.hour>=12)) p32 = str((sec1.count('1'))%2) p3 = p31 + p32 sec2 = ''.join(map(dropandfill,[6,4,6],map(bin,date))) p41 = str(int(date_time.year%1000>100)) p42 = str(((sec2.count('1'))%2)) p4 = p41 + p42 code2 = sec1 + p3 +sec2 + p4 bin2four = {'00':'1','01':'2','10':'3','11':'4'}#to base4 return '0'+''.join([bin2four[code2[2i:2i+2]] for i in range(len(code2)/2)]) これは見つけた参考プログラムです。