Arduino制御によるプラレール自動踏切(1)サーボモーターの制御

Arduino踏切について

プラレールの踏切というとプラレール車両が踏切内に突入しないと遮断棒が下りないわけですが、Arduinoを使ってもう少し実感的に動作する踏切を作ってみました。

何年か前にArduinoで制御する踏切を作ったことがあるのですが、工作が雑だったので今回はもう少し綺麗な仕上がりを目指して作成しました。以前作ったArduino踏切の動画はこちらです。

動作原理

今回作成するArduino踏切は、上記で説明しているものと原理は同じです。
・Arduinoにサーボモーターを接続して角度を制御
(今回は遮断棒を2本→4本に増やしました)
・警報灯は赤色LEDをArduinoから制御して点滅
・列車が来たことの検知はCDSセル(光センサーの簡単なもの)を使用
・遮断棒が降りている時間は一定とする

サーボモーターの制御

Arduinoに用意されているServoライブラリを使用することで、任意の角度を指定するだけでサーボモーターを制御できるようになります。

Arduinoでサーボモーターを動かす最も簡単なソースコードは下記のような感じになります。1秒間隔で0°と90°の角度に動くはずです。

#include <Servo.h>

Servo servo1;

void setup() {
  servo1.attach(9);
}

void loop() {
  servo1.write(0);
  delay(1000);
  servo1.write(90);
  delay(1000);
}

サーボモーターの接続

サーボモーターからは通常3本の線が出ています。今回使用したサーボモーターは茶赤オレンジの3色のものでした。
茶=GND、赤=電源正極、オレンジ=制御パルス入力
上記のソースコードの例では制御パルスが9番ピンということになっていますので、オレンジを9番ピンにつなぎこみ、茶をGND、赤を5Vにつなぎこみます。

接続したらPCからプログラムを転送して走らせると、ビュッ、ビュッ、と思いのほか元気よくサーボモーターが動きました。

今回は遮断棒を4本にしたいのですがリンク機構等ではなく単にサーボモーターを4個使うことにしました。ブレッドボードを使って信号線を2つに分岐させる配線を作成し、1系統に2個ずつ、合計4個のサーボモーターをつなぎました。

遮断棒の動きとしては向かい合ったもの同士が逆回転に動くので、対角線同士のものが同じになるよう2系統になるようプログラムしました。

2系統のサーボモーターでちゃんと遮断棒がそれぞれの方向から降りてくるかをテストするために、適当な板に4つのサーボモーターを固定し遮断棒に見立てた棒をつけて動かしてみましたが、ビュッ、ビュッ、という動きが速すぎて、とても踏切の動作とは思えない状態になっています(動いている様子は動画をご覧ください)。

いちおう実感的な踏切を目指していますので、Arduinoのプログラム上で指定する角度を段階的に変化させることで、動きがゆっくりになるように改造してみました。

※サーボモーターの動作速度を調整できるライブラリとして VarSpeedServo というものがあるそうです。これから作成される諸氏におかれましては、こちらを使っていただくようお願いします。
GitHub – netlabtoolkit/VarSpeedServo: Arduino library for servos that extends the standard servo.h library with the ability to set speed, and wait for position to complete

#include <Servo.h>

#define DEG_MIN 0
#define DEG_MAX 80
#define DEG_SPEED 1
#define P_UP 1
#define P_DOWN 2

Servo servo1;
Servo servo2;
int deg = 0;
int phase = P_DOWN;

void setup() {
  servo1.attach(8);
  servo2.attach(9);

  deg = DEG_MIN;
  servo1.write(deg);
  servo2.write(DEG_MAX - deg);
}

void loop() {
  if(phase == P_DOWN){
    if(deg <= DEG_MIN){
      //下がりきったら上昇に転じる
      phase = P_UP;
    }else{
      //下がりきるまで下げる
      deg -= DEG_SPEED;
    }
  }else if(phase == P_UP){
    if(deg > DEG_MAX){
      //上がりきったら下降に転じる
      phase = P_DOWN;
    }else{
      //上がりきるまで上げる
      deg += DEG_SPEED;
    }
  }

  servo1.write(deg);
  servo2.write(DEG_MAX - deg);

  delay(10);
}

プログラムは loop() の中をぐるぐる回るわけですが、その間に角度(deg)をちょっとずつ変えてサーボモーターに送信するようにしています。最初は下降(P_DOWN)で始まりますが、下限値(DEG_MIN)になったら上昇(P_UP)に転じるようになっています。そして上限値(DEG_MAX)になったら、今度は下降します。

これだとサーボモーターの動く速度は Arduino が loop() を1周する時間に依存してしまうのであまりよろしくないのですが、試作ということでこれでいくことにします。遮断棒が動くスピードは loop() の最後に delay を入れて調整したのですが、しかしそうすると、遮断棒がガタガタガタガタ…とぎこちない動きになってしまいました。動画ではそれほど気にならないのですが、やはり VarSpeedServo のような専用のライブラリを使うのが良さそうです。

次は列車が来たら遮断棒が下りる仕組みについて進めていきたいと思います。

メイキングの動画はこちら。

See You!

Leave a Comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です