[Arduinoのすすめ][ArduinoConf][ArduinoMonitor][iArduino]

Arduinoで時計にいたずら

目次:はじめに, 調べる, 作ってみた, 液晶とボタンをつける, 逆転させる

はじめに

まずは動画を見てください。左の時計の動きがおかしくありませんか? 普通に動いているかと思うと、止まって、倍速、10倍速、337拍子、お休みをして、また動き始めます。ベースは以前にIKEAで買った時計なのですが、遅れ気味になったので改造してみました。

上の動画は動作パターンが決まっていますが、次の動画では、ボタンを押すと動きを変えられるようにしてみました(説明は下へ)。

調べる

改造するには針が動くしくみを調べる必要があります。まずは分解してみました。ネジを使わずはめ込み式で簡単にバラバラになるので分解には注意が必要です。写真に写っている電線と足は動作を調べるためにつけた配線です。


分解したところ


左のコイルで右の磁石になっているギアを回す

オシロでコイルにかかる電圧を調べたところ、1秒ごとに50msだけコイルに、ほぼ電池一本分の電圧がかかっていました。電圧の向きは1秒ごとに切り替わっています。 向きを変えないとギアは回らず針はその位置でぴくっとするだけです。 動作が分かったらコイルとオリジナルの回路はパターンカットで切り離します。 コイルの直流抵抗は200Ωでした。

作ってみた

電源電圧が5VのArduinoを使ったので、470Ωの抵抗とコイルを直列に、Arduinoの2ピンと3ピンをつなぐことにしました。スケッチを以下に記載します。pulse()関数で針を駆動します。コイルに電圧をかける時間は少し短め(30ms)にしています。(液晶、ボタンつきの説明は下へ)。

const int A = 2;
const int B = 3;
bool AB = false;
const int PULSE_W = 30;

void pulse() {
  if (AB) {
    digitalWrite(A, HIGH);
    delay(PULSE_W);
    digitalWrite(A, LOW);
    delay(50-PULSE_W);
  } else {
    digitalWrite(B, HIGH);
    delay(PULSE_W);
    digitalWrite(B, LOW);
    delay(50-PULSE_W);
  }
  AB = !AB;
}

void setup() {         
  digitalWrite(A, LOW);
  digitalWrite(B, LOW);
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
}

void loop() 
{
  // 10s, 10pulses
  for (int i=0; i<10; i++) {
    pulse();
    delay(950);
  }
  
  // 10s( 5s + 4s + 1s), 20 pulses
  delay(5000);
  for (int i=0; i<10; i++) {
    pulse();
    delay(350);
  }
  for (int i=0; i<10; i++) {
    pulse();
    delay(50);
  }
  
  delay(1000); // 1s, 0 pulse  
  T337();      // 4s, 13 pulses
  delay(8000); // 8s, 0 pulse

  delay(10000); // 10s 0 pulse

  // 17s, 17pulses
  for (int i=0; i<17; i++) {
    pulse();
    delay(950);
  }
}

void T337()
{
  pulse();
  delay(250);
  pulse();
  delay(250);
  pulse();
  delay(550);
  // ここまで 900ms

  pulse();
  delay(250);
  pulse();
  delay(250);
  pulse();
  delay(550);
  // +900ms

  pulse();
  delay(250);
  pulse();
  delay(250);
  pulse();
  delay(250);
  pulse();
  delay(250);
  pulse();
  delay(250);
  pulse();
  delay(250);
  pulse();
  delay(350);
  // +2200ms
  // 合計 4000ms;
}

液晶とボタンをつける


上と同じ動画

さらに液晶(16x2のパラレル接続キャラクタ液晶)とボタンをつけて、ボタンを押すと次のように動作させてみました。

ボタン動作
Pause (Resume)一次停止/解除(10秒無操作で自動解除)
+1一秒進める
Dash10倍速で10回進める
337三三七拍子をする
ボタン操作で針が進んだり、遅れたら自動で調整します。進んでいる場合は3秒に1回だけ秒針を進め、遅れている場合には一気に追いつきます。

回路図

スケッチ

逆転させる

ラジオペンチさんのblogで「時計の秒針を正転/逆転させてみた」という記事をみかけて真似してみました。上の時計は100円ショップのセリアで買ってきた時計です。IKEAの時計では、うまく逆転しなかったからです。机の上に水平に置いて撮影しています。

その後、セリアの時計を垂直に置くと針の位置で逆転しなかったりすること、IKEAの時計でもタイミングを調整して、ちょうどいい姿勢にすると逆回転することが分かりました。ここまでは動作原理を理解せずに、パルスを作るプログラムを書いていたので、調べてみました。

ちょっと web 上を探してみると「クオーツ時計のステップモーターの回転する仕組み」という解説をみつけました。要約すると、モータ(最初のギア)は永久磁石になっていて、静止しているときは鉄に引き寄せられています(コイルに対しては斜め)。正転の場合にはコイルに電流を流して、磁石を反発させて回転させます。コイルの電流を切ると、鉄に引き寄せられて静止します。回転角度は180度です。つぎのステップで回転させるにはコイルに流す電流を反転させます。

そうすると逆転は次のようにして実現できているはずです。コイルに流す電流を正転の時とは逆向きにして一旦磁石を引き寄せて逆回転をはじめさせます。タイミングよくコイルに流す電流を反転し磁石を反発させると、慣性があるので逆転を続け、電流を切ると鉄に引き寄せられて静止します。タイミングが悪いと、正転方向に回転を始め、勢いがよければ1秒進み、悪ければピクッと動くだけになります。肝心なのは「タイミング」ですが、地球上には重力があるので文字盤を水平にしているとき以外は、秒針の角度によって適切なタイミングが変わってきます。

実はIKEAの時計はセリアの時計よりも直径が大きいので、タイミングの変動が大きくなります。ラジオペンチさんの場合は、だいぶ小さいめの時計のようですので安定して動いたのではないかなと思います。

おまけ

クオーツ時計の仕組みや歴史に少し興味が出たので見ていたら、セイコーが腕時計の特許を取得して、(特許だから)公開されライセンスされたから世界が変わったということが分かって面白かったです。


戻る, Arduinoのすすめ
(本を出しました: はじめてのPICアセンブラ入門 | センサとデジカメで遊ぶ電子工作入門 | 玄箱PROと電子工作で遊ぼう )
Copyright (c) 2013, 2015, Noriaki Mitsunaga