4/15(火)~17(木) 第5回量子コンピューティングEXPO春(東京ビッグサイト)に共同出展します☆彡
Raspberry Pi / Arduino

New!! サーボとPythonでプラレールのポイント切り替え

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信号と呼ばれるパルス波で司令します。パルスの山の長さがサーボの角度に対応します。

出典:ensatellite「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つのバージョンがあるようです。写真左側の「黄色が細い」タイプが適合しました。

これでもうサーボは怖くない!

プラレールを何に使うのでしょうか??お楽しみに!

リアクションのお願い

「参考になった!」「刺激された!」と思ったらぜひリアクションをしましょう。エンジニアの世界はGive and Takeによって成り立っています。これからも無料で良質な情報にアクセスできるよう、Giveする人への感謝をリアクションで示しましょう!

この記事をシェアする

自身のブログ等で使用する場合は引用を忘れずに!

また、寄付も受け付けています。コーヒー1杯でとても喜びます(*˘︶˘*)

 Amazonでギフト券(アマギフ)を贈る

こちらのリンク から金額を指定してお贈りください。(デフォルトで10000円になっているのでご変更ください)

配送:Eメール
受取人:staffあっとvigne-cla.com
贈り主:あなたのお名前やニックネーム
メッセージ:◯◯の記事が参考になりました。など

のようにご入力ください。見返りはありませんのでご了承ください。

 Amazonで食事券(すかいらーく優待券)を贈る

500円 1000円 2000円 5000円 からお贈りください。

配送:Eメール
受取人:staffあっとvigne-cla.com
贈り主:あなたのお名前やニックネーム
メッセージ:◯◯の記事が参考になりました。など

のようにご入力ください。見返りはありませんのでご了承ください。

 その他、ギフト券やクーポン券をメールで贈る

デジタルのギフト券/クーポン券はメールアドレス(staffあっとvigne-cla.com)までお送りください。受領の返信をいたします。
紙のギフト券/クーポン券は 「郵便物はこちらへ」の住所 まで送付してください。名刺やメールアドレスを同封していただければ受領の連絡をいたします。
余った株主優待券等の処理におすすめです。
いずれも見返りはありませんのでご了承ください。

不明点はSNSでお気軽にご連絡ください

ビネクラのTwitter・Youtubeでコメントをください!


Slack・Discordの場合はこちらの公開グループに参加してShoya YasudaまでDMをください!


※当ブログに関することは何でもご相談・ご依頼可能です。

この記事を書いた人
Yasuda

博士(理学)。専門は免疫細胞、数理モデル、シミュレーション。米国、中国で研究に携わった。遺伝的アルゴリズム信者。物価上昇のため半額弁当とともに絶滅寸前。

タイトルとURLをコピーしました