JJYリピータ自作アンテナ編

 

材料

エナメル線

Amazon CAPTCHA 

f:id:devmakot:20180806012558p:plain

10m

 タッパー

shop100.iwinz.net 1.25L

加工

エナメル線10mをタッパー底に這わせただけ

あとは以下の通り

neocat.hatenablog.com

検証

ameblo.jp

電波・磁気測定器で測定

エナメル線買ったままの小さい輪の状態(直径およそ3cm)の場合と

タッパーの底を這わせる位の大きな輪(10cmx20cm)では

電波の飛び方が違う

輪を大きくすれば大きくする程有利っぽい事が解った

もっと大きくするのかー

壁に貼るのかなー?

それなら大きくできそうだけど

あとは、LとかCとかQとかって話になるっぽ

総括

40kHz(60kHz)のループタイプのアンテナは大きくすればする程電波が飛ぶ距離が長くなるっぽい

今が10cmx20cmのループだけど、これ以上は大きくしたくない

あとは電子回路的にコイルLとかコンデンサCとかを使ってQの値とかを計算して電波の飛び方を良くする方向で対処したい

40kHzと60kHzと68.5kHzの3波の電波を同時に飛ばしたい

同時に液晶を付けて時計機能を持たせたい

GPS時計を作って、GPS受信を試してみたい

確かArduinoキットにGPSも・・・入ってなかった

高いから入っていないんだ

秋月で買って来よう・・・どれがいいんだろう

Arduinoのライブラリで使えるGPSじゃないと困る

アンテナを知らな過ぎて困るから

 

有線と無線

周波数が高い信号は自然と電波が飛ぶ

飛び易く工夫したものがアンテナ

アンテナの基本は1/4波長

低周波だと波長が恐ろしく長く、非実用的

低周波だと情報量も少なく、非実用的

低周波だと障害物をも通り抜ける特性がある

だから、JJYは40Khz/60kHzを使用している

detail.chiebukuro.yahoo.co.jp

電波の分類

www.circuitdesign.jp 

ここのページの情報がすごいっ

f:id:devmakot:20180805222759p:plain

3kHz~3THzが電波ゾーン

f:id:devmakot:20180805222808p:plain

JJYは長波(LowFrequency)

f:id:devmakot:20180805223406p:plain

f:id:devmakot:20180805223437p:plain

f:id:devmakot:20180805223446p:plain

f:id:devmakot:20180805223458p:plain

f:id:devmakot:20180805223816p:plain

f:id:devmakot:20180805223824p:plain

f:id:devmakot:20180805223832p:plain

f:id:devmakot:20180805223841p:plain

アンテナモデル

www.murata.com

f:id:devmakot:20180805224812p:plain

f:id:devmakot:20180805224824p:plain

f:id:devmakot:20180805224833p:plain

f:id:devmakot:20180805224841p:plain

f:id:devmakot:20180805224848p:plain

f:id:devmakot:20180805224853p:plain

f:id:devmakot:20180805224858p:plain

f:id:devmakot:20180805224904p:plain

f:id:devmakot:20180805224910p:plain

f:id:devmakot:20180805224915p:plain

f:id:devmakot:20180805224920p:plain

f:id:devmakot:20180805224928p:plain

f:id:devmakot:20180805224935p:plain

f:id:devmakot:20180805224942p:plain

f:id:devmakot:20180805224949p:plain

f:id:devmakot:20180805224955p:plain

f:id:devmakot:20180805225001p:plain

f:id:devmakot:20180805225006p:plain

f:id:devmakot:20180805225011p:plain

f:id:devmakot:20180805225016p:plain

f:id:devmakot:20180805225022p:plain

f:id:devmakot:20180805225027p:plain

f:id:devmakot:20180805225038p:plain

f:id:devmakot:20180805225043p:plain

f:id:devmakot:20180805225053p:plain

f:id:devmakot:20180805225059p:plain

f:id:devmakot:20180805225105p:plain

アンテナの動作原理

Antennas for Listening to DX Radio

f:id:devmakot:20180805231009p:plain

f:id:devmakot:20180805231018p:plain

ループアンテナの巻き数

ループアンテナの巻き数

 

ループアンテナと電波と波長

ループアンテナと電波の波長

 

指向性アンテナ(ループアンテナ)

EEM-MOM

 

小型ループアンテナのインピーダンスマッチング方法

http://www.cqpub.co.jp/dwm/contents/0057/dwm005701590.pdf

 

ループアンテナ

ループアンテナ | ため息^2ばかりのブログ

 

自作AMループアンテナ

自作 AM ループアンテナ

 

B4ファイルケースでループアンテナ

tagisuya.blog12.fc2.com 

f:id:devmakot:20180805233559j:plain

ループアンテナって何?

aomorikuma.web.fc2.com

f:id:devmakot:20180805233919p:plain

f:id:devmakot:20180805234013p:plain

f:id:devmakot:20180805234121p:plain

f:id:devmakot:20180805234709j:plain

 

中華製電波時計は、中国の電波時計だった

 

どうしても時刻の合わない(自動受信してくれない)電波時計を分解

バーアンテナだったけど

どう見ても手巻きっぽかったけど

ちゃんと動作しそうだなーって思って

WEBで調べて

電波時計について | 電波時計全機種 | Q&A(よくある質問と答え) | 時計 | お客様サポート | CASIO

f:id:devmakot:20180805163043p:plain

f:id:devmakot:20180805163058p:plain

f:id:devmakot:20180805163117p:plain

これらを加味して、68.5kHzで送信したら

まぁ何てことでしょう~自動補正しちゃいました

つまり、Maid in China で China向けの電波時計だった訳でした

プログラムの改造ポイント

1日を3等分に分けて、8h毎

00~08時:40kHz送信

09~16時:60kHz送信

17~24時:68.5kHz送信

ってすれば全対応できる

もっと言えば、アンテナ3つ付ければ、マルチ対応になる!!!

すごい!!!これだ!

電波時計リピータを作るのではなくて、wifiで自動補正する時計を作れば良いって今気づいた

 

どうして電波時計リピータを作ろうと思った

既存の時計の活用

既存の時計の性能が悪いのに辟易

こんなのに時間を費やしている事自体が勿体ない

いつまでも、どこまでも、電波を受信しているんだか、受信していないんだか解らない時計を相手に、試行錯誤の時間が無駄

だって、もう、捨てるか、分解して部品取るしか意味が無い時計

自動補正しないのだもの

朝の時間って貴重

部屋中のどれも同じ時間を示して欲しいもの

どの時計を見ても同じ時間を示して欲しいもの

だったら、wifiでネットワークに接続して自動補正する時計を作ればよいと気付いた

これなら間違いなく正しい時間を刻んでくれる

間違っていたら、作った人が悪いから、直す手間を惜しまない

後の問題は

  • コンパクトに作る方法
  • 電池で動かす方法
  • 頑丈に作る方法
  • 視認性の高い文字盤(デジタルでも構わない)

の模索

ちょっと落として壊れちゃったら、不憫な時計だもの

既存の時計にアルデュイーノ本体を組み込んで、時計を改造出来ないものだろうか

次はイーサシールドじゃなくて、wifiシールドでネットに繋いで自動補正する時計本体をアルデュイーノで作ろう。そんなに難しくない筈だから

だって、あとは時刻表示させるだけ

だって、時刻は既に持ってるし

液晶、LCD、バックライト常時点灯

小さな液晶だと、時間が見えないだろうな~

このブログにプログラムを貼るとおかしくなる問題

 

プログラムを貼ってはイケナイブログらしい

プログラムが長すぎて貼るとおかしくなる訳で無く

プログラムの何かの書き方が表示できなくて、表示がおかしくなるみたい

プログラムだけを貼ってもダメ

プログラムを半分ずつ、前編・後編にしたら、後編の表示がおかしい

見たまま編集では問題ないのに、プレビューにするとおかしくなる

だから、この問題は他の方法を探すしかない、という事が解った

プログラムを貼ってみる実験(小分け編2/2

// send an NTP request to the time server at the given address
void sendNTPpacket(char* address) {
// set all bytes in the buffer to 0
memset(packetBuffer, 0, NTP_PACKET_SIZE);
// Initialize values needed to form NTP request
// (see URL above for details on the packets)
packetBuffer[ 0] = 0b11100011; // LI, Version, Mode
packetBuffer[ 1] = 0; // Stratum, or type of clock
packetBuffer[ 2] = 6; // Polling Interval
packetBuffer[ 3] = 0xEC; // Peer Clock Precision
// 8 bytes of zero for Root Delay & Root Dispersion
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;

// all NTP fields have been given values, now
// you can send a packet requesting a timestamp:
Udp.beginPacket(address, 123); //NTP requests are to port 123
Udp.write(packetBuffer, NTP_PACKET_SIZE);
Udp.endPacket();
}

//=========================== NTP ===========================
void NTPSetTime()
{
int packetSize;
do{
sendNTPpacket(timeServer);
Serial.println("Waiting NTP response ...");
delay(1000*5);
packetSize = Udp.parsePacket();
Serial.print("Received packet of size ");
Serial.println(packetSize);
}
while(!packetSize);
Udp.available();
// バッファに受信データを読み込む
Udp.read(packetBuffer, NTP_PACKET_SIZE);

// 時刻情報はパケットの40バイト目からはじまる4バイトのデータ
unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);

// NTPタイムスタンプは64ビットの符号無し固定小数点数(整数部32ビット、小数部32ビット)
// 1900年1月1日0時との相対的な差を秒単位で表している
// 小数部は切り捨てて、秒を求めている
unsigned long secsSince1900 = highWord << 16 | lowWord;
Serial.print("Seconds since Jan 1 1900 = " );
Serial.println(secsSince1900);

// NTPタイムスタンプをUNIXタイムに変換する
// UNITタイムは1970年1月1日0時からはじまる
// 1900年から1970年の70年を秒で表すと2208988800秒になる
const unsigned long seventyYears = 2208988800UL;
// NTPタイムスタンプから70年分の秒を引くとUNIXタイムが得られる
unsigned long epoch = secsSince1900 - seventyYears;
Serial.print("Unix time = ");
Serial.println(epoch);

// Timeライブラリに時間を設定(UNIXタイム)
// 日本標準時にあわせるために+9時間しておく
setTime(epoch + (9 * 60 * 60));

Serial.print("JST is ");
Serial.print(year());
Serial.print('/');
Serial.print(month());
Serial.print('/');
Serial.print(day());
Serial.print(' ');
Serial.print(hour());
Serial.print(':');
Serial.print(minute());
Serial.print(':');
Serial.println(second());
Serial.println();

Serial.print("localtime = ");
Serial.println(epoch);
}

//=========================== JJY ===========================

unsigned int calcTimeCodeDuration()
{
int s = second();
if (s == 0)
setupTimeCode();
return timecode[s] * 100;
}

void setupTimeCode()
{
int i;
memset(timecode, 8, sizeof(timecode));

setupTimeCode100(minute(), 0);
timecode[0] = 2;

setupTimeCode100(hour(), 10);

int d = dayOfYear();
setupTimeCode100(d/10, 20);
setupTimeCode100(d%10*10, 30);

int parity1 = 0, parity2 = 0;
for (i = 12; i < 20; i++) parity1 ^= timecode[i] == 5;
for (i = 1; i < 10; i++) parity2 ^= timecode[i] == 5;
timecode[36] = parity1 ? 5 : 8;
timecode[37] = parity2 ? 5 : 8;

setupTimeCode100(year()%100, 40);
for (i = 44; i > 40; i--)
timecode[i] = timecode[i-1];
timecode[40] = 8;

int w = weekday() - 1;
timecode[50] = (w & 4) ? 5 : 8;
timecode[51] = (w & 2) ? 5 : 8;
timecode[52] = (w & 1) ? 5 : 8;
timecode[59] = 2;

/* dump */
for (i = 0; i < 60; i++) {
Serial.print(timecode[i], DEC);
Serial.print(i % 10 == 9 ? "\r\n" : " ");
}
Serial.println();
}

void setupTimeCode100(int m, int i)
{
timecode[i+0] = *1};
time_t t = makeTime(tm);
return (now() - t) / SECS_PER_DAY + 1;
}

*1:m/10) & 8) ? 5 : 8;
timecode[i+1] = ((m/10) & 4) ? 5 : 8;
timecode[i+2] = ((m/10) & 2) ? 5 : 8;
timecode[i+3] = ((m/10) & 1) ? 5 : 8;
timecode[i+4] = 8;
timecode[i+5] = ((m%10) & 8) ? 5 : 8;
timecode[i+6] = ((m%10) & 4) ? 5 : 8;
timecode[i+7] = ((m%10) & 2) ? 5 : 8;
timecode[i+8] = ((m%10) & 1) ? 5 : 8;
timecode[i+9] = 2;
}

int dayOfYear()
{
tmElements_t tm = {0, 0, 0, 0, 1, 1, CalendarYrToTm(year(

プログラムを貼ってみる実験(小分け編1/2

#include <Time.h>
#include <TimeLib.h>
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>

// bit set / clear
#ifndef cbi
#define cbi(PORT, BIT) (_SFR_BYTE(PORT) &= ~_BV(BIT))
#endif
#ifndef sbi
#define sbi(PORT, BIT) (_SFR_BYTE(PORT) |= _BV(BIT))
#endif


// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};

unsigned int localPort = 8888; // local port to listen for UDP packets

char timeServer = "time.nist.gov"; // time.nist.gov NTP server

const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message

byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

byte timecode[60];
unsigned long lastNTPTime = 0;

void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}

// start Ethernet and UDP
if (Ethernet.begin(mac) == 0) {
Serial.println("Failed to configure Ethernet using DHCP");
// no point in carrying on, so do nothing forevermore:
for (;;)
;
}
Udp.begin(localPort);
NTPSetTime();
setupTimeCode();
}


void loop()
{
int wait_start = second();
while (wait_start == second()); // wait until time is corrected
unsigned long startTime = millis();

// generate 40khz from 3 pin using PWM
pinMode(3, OUTPUT);
digitalWrite(3, LOW);
TCCR2A = _BV(WGM20);
TCCR2B = _BV(WGM22) | _BV(CS20);
OCR2A = F_CPU / 2 / 40000/*hz*/;
OCR2B = OCR2A / 2; /* 50% duty */
sbi(TCCR2A,COM2B1);

// calc signal duration (ms)
int ms = calcTimeCodeDuration();

// wait ms and stop PWM
while (millis() - startTime < ms);
cbi(TCCR2A,COM2B1);

if (millis() - lastNTPTime > 60*60*1000L) {
NTPSetTime();
setupTimeCode();
lastNTPTime = millis();
}
}