Open changxinchang opened 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」で組んでみて、ちょうど良い波形になる抵抗値を探しました。
(私もこれについては、よく理解できていません。ごめんなさい。)
・ソフトウェア 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);
}
このような感じで・・・
あまり参考にならなかったら、ごめんなさい。 頑張ってください。
ご返事ありがとうございます。 インターネットでBPCの時間信号をどのように4進数に変換するかの資料を見つけましたが、今では時間を4進数に変換できるようになりました。 今必要なのは、変換された4進データをGPIOで出力することです。 今、あなたからもらったプログラムを使ってコンパイルします。 またありがとうございます
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)]) これは見つけた参考プログラムです。
こんにちは。申し訳ありませんが、このような方法でメッセージをお送りします。 あなたのESP32 JJY電波製作を見て、あなたのチュートリアルに基づいてBPC電波に改造する予定です。 JJY電波の周波数、エンコード方式とBPC電波が全く異なるため、何度も修正しても成功しない。 ご協力をお願いします。 BPC電波の周波数は68.5kHzで、20sごとに完全な時間情報を取得し、1sごとに1つのデータを受信します。データ形式は00012000122023111201です。 0は100msパルス幅、1は200msパルス幅、2は300msパルス幅、3は400msパルス幅を表します。 取得した時間データを68.5kHzキャリアで送信する方法を教えてください。 どうもありがとうございます![7-1632556068](https://github.com/mitsu-at3/esp32_ntp_repeater/assets/55017188/2845132b-4279-4586-9744-b3b59024ec28)