top of page

プラレール × RFID × QUBOで自動運転してみた!

  • 執筆者の写真: Naoaki Mochida
    Naoaki Mochida
  • 6月2日
  • 読了時間: 3分


🎯 今回のチャレンジ:RFIDで電車の「今ここ」をリアルに検出


これまでのプラレール自動運転では、カメラで位置認識をしていましたが、今回は全く別のアプローチ。

  • 電車にRFIDタグをつける

  • レールに2つのRFIDリーダーを配置する

  • → 電車が「どこをいつ通ったか」をリアルタイムで取得!

この情報に基づいて、電車の進行状態を更新し、分岐の制御につなげています。


📡 RFIDリーダー×2台を同時に使用!


使用しているのは、MFRC522という安価なRFIDリーダー(SPI接続)。Arduino側で2台を同時に制御するため、各リーダーに以下のような 専用の接続ピンと識別番号(SS/RST) を割り当てています。

例:

  • リーダー1:分岐前のストレートレール(セグメント6)

  • リーダー2:迂回ルートの後半(セグメント19)



🧾 UID(タグID)で電車を識別


各電車には異なるRFIDタグを取り付け、それぞれ固有のUID(例:"CE6DAB6B")をPython上で次のように登録しています:

uid_to_train_info = {
"CE6DAB6B": {"name": "Train1", "speed": 36.0, "color": "red"},

    "AEA8AA6B": {"name": "Train2", "speed": 25.5, "color": "green"},

}


📍 読み取ったリーダー=レール位置に変換


どのリーダーで読まれたかによって、今どこにいるかを次のようにマッピング:

reader_to_segment = {
 1: 6,   # リーダー1 → セグメント6(直進レール)

    2: 19,  # リーダー2 → セグメント19(カーブ経路の最後)

}

🧵 RFID読み取りは別スレッドで非同期処理!


リアルタイム性を確保するため、シリアル通信によるリーダーからのデータ読み取りは別スレッドで実行しています。PythonのQueueにUID文字列を蓄積し、メインループではそれを非同期に処理。

また、フォーマットの違い(例:「UID: XXXXXXX」「Reader1 XXXXXXX」など)にも柔軟に対応できるよう、複数パターンに対応したパーサーを自作しています。



🔁 初回認識で電車を登録、その後は位置だけ更新!


RFIDタグが読み取られると、以下のような処理が行われます:

  1. UIDとリーダー番号(1 or 2)を取得

  2. 既存電車の中に該当する名前がなければ、新規にTrainClassを生成・追加

  3. すでに存在する電車なら、その位置(セグメント)と進行度(progress)を初期化

この設計により、電車がレールを通過しただけで「今いる場所」が確定します。カメラのように画像解析や閾値設定をせず、正確なレール位置が取得できるのが最大の強みです。


🔧 実装上の工夫ポイント


  • 複数のリーダーの読み取りデータが混ざらないよう、各行に「どのリーダーから来たか」の情報を含めています。

  • UIDの大小文字やフォーマットの違いを吸収するため、upper()やパターン分岐を実装。

  • 各電車に対して「最後に読み取られた時刻」も記録しており、長時間読み取られなければ停止とみなす処理も可能です(未使用だが拡張用)。


🏁 まとめ

RFIDを使うことで、

  • カメラや画像処理の必要がなく、

  • タグを読み取るだけで電車の位置が特定でき、

  • 複数台を同時に管理できる!

という大きなメリットが得られました。

2台のリーダーを使い分けることで、ルートの分岐と合流を判断する上での十分な解像度が得られ、後続の分岐制御(=QUBO)へとスムーズに連携できます。

 
 
 

Comments


bottom of page