プラレール × RFID × QUBOで自動運転してみた!
- 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タグが読み取られると、以下のような処理が行われます:
UIDとリーダー番号(1 or 2)を取得
既存電車の中に該当する名前がなければ、新規にTrainClassを生成・追加
すでに存在する電車なら、その位置(セグメント)と進行度(progress)を初期化
この設計により、電車がレールを通過しただけで「今いる場所」が確定します。カメラのように画像解析や閾値設定をせず、正確なレール位置が取得できるのが最大の強みです。
🔧 実装上の工夫ポイント
複数のリーダーの読み取りデータが混ざらないよう、各行に「どのリーダーから来たか」の情報を含めています。
UIDの大小文字やフォーマットの違いを吸収するため、upper()やパターン分岐を実装。
各電車に対して「最後に読み取られた時刻」も記録しており、長時間読み取られなければ停止とみなす処理も可能です(未使用だが拡張用)。
🏁 まとめ
RFIDを使うことで、
カメラや画像処理の必要がなく、
タグを読み取るだけで電車の位置が特定でき、
複数台を同時に管理できる!
という大きなメリットが得られました。
2台のリーダーを使い分けることで、ルートの分岐と合流を判断する上での十分な解像度が得られ、後続の分岐制御(=QUBO)へとスムーズに連携できます。
Comments