AI要約
マイクロサーボを用いてプラレールのポイント(正式名称「ターンアウトレール」)を切り替える方法を紹介します。PythonからArduinoを経由してサーボを制御し、自動でポイントを変更できる仕組みを構築します。自由研究や電子工作の入門としても最適です。
やること
マイクロサーボでプラレールのポイント切り替えを行ってみます。このレールは正式には「ターンアウトレール」と呼ぶそうです。

最終的にPythonから制御したいので、Python→Arduino→サーボという形になります。
参考文献
サーボモーターをArduinoで動かすコードはこちらを参考にさせていただきました。
Pythonからシリアル通信でArduino&サーボを動かすコードはこちらを参考にさせていただきました。
そして、サーボモーターをプラレールに取り付けるホルダーはVIVITABLOGさんで公開されている3Dモデルを使用させていただきました。こちらの記事を先に読むことをおすすめします。先達に感謝いたします。
ギアとサーボ
千石電商でピニオンギアを買いました(ギア?ギヤ?)。参考文献では12T(12歯)を使用していますが、品薄で売っていなかったので14Tにしました。

厚かったので半分に切りました。

秋月で買ったサーボ(FS90)に付属のネジで取り付けました。

ちなみに似たようなサーボがいくつか売られていて、形状も使い方も統一されているので基本的にどれでも大丈夫です。ただし「連続回転サーボ」は別物なので注意。
型番 | 特徴 | 価格 | パルス幅(0°~180°) |
---|---|---|---|
SG-90 | 普通(5V) | 600円 | 500~2400 μs |
SG92R | 高トルク | 700円 | 記載なし、たぶん500~2500 μs |
FS90 | 低トルク | 450円 | 500~2500 μs |
FT90B | 低電圧(3V) | 500円 | 500~2500 μs |
今回は一番安いFS90を選びました。また、それぞれデータシートでパルス幅も調べておいたので参考にしてください。
サーボの動作確認
Arduino IDEでこちらのコードを書き込み。標準のServoライブラリを使用しています。信号線は3番ピンに挿しています。
#include <Servo.h>
Servo servo;
void setup() {
servo.attach(3, 500, 2500);
pinMode(3, OUTPUT);
}
void loop() {
servo.write(0);
delay(1000);
servo.write(90);
delay(1000);
}
ちゃんと動きました。
少しお勉強。サーボはPWM信号と呼ばれるパルス波で司令します。パルスの山の長さがサーボの角度に対応します。

初期化の引数は「ピン番号」「0°のパルス幅」「180°のパルス幅」です。
servo.attach(3, 500, 2500);
FS90はデータシートを見ると「500~2500 μs」なのでこのように指定しています。省略するとデフォルト値で544と2400になるので可動域が少し狭くなってしまいます(大した問題ではないが)。
ホルダーの3Dプリント
先達の記事で3Dモデルが公開されていたのでありがたく使用させていただきました。
元は3パーツでしたが、少し設計を変更して2パーツになりました。

サーボを取り付けました。いいですね!

Pythonで制御①
Arduino IDEで、シリアル通信を待ち受けるコードを書き込みます。
#include <Servo.h>
Servo servo;
int var;
void setup() {
servo.attach(3, 500, 2500);
pinMode(3, OUTPUT);
servo.write(150); //初期化
Serial.begin(9600);
}
void loop() {
//Pythonから値を受けて指示
if(Serial.available() > 0){
var = Serial.read();
servo.write(var);
delay(1000);
}
}
サーボをプラレールに当てながら、こちらのPythonコードで角度を調べていきます。COMポートはArduino IDEから確認できます。
import serial, time
#サーボ接続
ser = serial.Serial('COM8', 9600)
time.sleep(2)
while 1:
#入力
a = input('角度[°]:')
#終了条件
if a == 'q':
break
#サーボ動かす
angle = int(a)
if angle < 0:
angle = 0
if angle > 180:
angle = 180
send_data = angle.to_bytes(1, 'big')
ser.write(send_data)
ser.close()
結果、今回の取り付けでは70°で直進、150°で右折に切り替えられると分かりました。
Pythonで制御②
この値を使用して最終的な制御コードを書きます。
import serial, time
#直進のサーボ角度
angle0 = 70
#右折のサーボ角度
angle1 = 150
#関数
def switch0():
angle = angle0
send_data = angle.to_bytes(1, 'big')
ser.write(send_data)
def switch1():
angle = angle1
send_data = angle.to_bytes(1, 'big')
ser.write(send_data)
#サーボ接続
ser = serial.Serial('COM8', 9600)
time.sleep(2)
#動作
for i in range(5):
switch0()
time.sleep(1)
switch1()
time.sleep(1)
ser.close()
完璧に動作していますね!
裏側はこのようになっています。
とても気持ちいい。
おわりに
ちなみに、ターンアウトレールには2つのバージョンがあるようです。写真左側の「黄色が細い」タイプが適合しました。

これでもうサーボは怖くない!
プラレールを何に使うのでしょうか??お楽しみに!