鉄道模型コントローラ Model Railroad Controller
コンテンツ
今回やること
obnizを利用して、鉄道模型をスマホやPCから操作できるようにします。さらに、OpenCVを利用してセンサーを何も使わずに、カメラ映像だけで指定した位置に自動的に停止できるようにします。
用意するもの
- obniz Board
- 鉄道模型のレール x数本
- 鉄道模型
- 鉄道模型用モータドライバ1
- 鉄道模型用ポイントドライバ
- 12VのACアダプタ
- カメラ付きのタブレット
組み立て方
obniz Boardに鉄道模型用モータドライバ1・鉄道模型用ポイントドライバを配線します。
鉄道模型用のモータードライバやポイントドライバの配線については、以下のページも参考にしてください。
ここで使用している鉄道模型操作基板は、以下の機能を含みます。
- obnizへの電源供給機能
- 進行方向と、速さを表すPWM信号をobniz Boardから受け取り、線路に信号を供給する機能
- ポイントの直進・曲進の選択信号をobniz Boardから受け取り、ポイントに信号を出力する機能
プログラム
画像処理のためにOpenCV.jsを使用しています。プログラムでは processVideoMoving() 関数の中で画像の差分を取得して動体検知しています。
... cap.read(src); cv.cvtColor(src, gray, cv.COLOR_RGBA2GRAY); if (first_flag) { gray.copyTo(before); first_flag = false; } cv.addWeighted(gray, 0.5, before, 0.5, 2.2, before); cv.convertScaleAbs(before, b1, 1, 0); cv.absdiff(gray, b1, mdframe); let delay = 1000 / FPS - (Date.now() - begin); setTimeout(processVideoMoving, delay); ...
processVideoMoving() 関数は、繰り返し実行されています。この中で、cap.read(src);
のところでカメラ画像を配列に読み込み、 cv.cvtColor (src, gray, cv.COLOR_RGBA2GRAY);
のところでグレースケールに変換しています。また、 cv.addWeighted(gray, 0.5, before, 0.5, 2.2, before);
のところで前回ループの画像と今回ループの画像をブレンドさせ、その後の cv.absdiff(gray, b1, mdframe);
のところで差分を検出しています。
完成したプログラム
(コードはGitHub Gistにもあります。)
うごかす
UIによる手動制御
「マスコン台」または「簡易運転台」の操作により、手動で鉄道模型のスピードを調節したりブレーキをかけたりできます。「駆動設定」で、加速度やモータ駆動音、モータ車種類等の設定ができます。
画像処理(OpenCV)による自動制御
OpenCVを利用して、カメラの映像から指定した位置で自動的に停止できます。「カメラ制御」のタブから「カメラを起動」を選択し、カメラ画像内の2点をタップすると、その領域内で動体検知を行います。
動体検知されると、列車が通過したと判断され、鉄道模型のブレーキがかかります。停止した後一定時間経過すると、再び加速を開始します。
Appendix
- スイッチサイエンス販売ページ:鉄道模型用モータドライバ1
https://www.switch-science.com/catalog/5851/ - スイッチサイエンス販売ページ:鉄道模型用ポイントドライバ
https://www.switch-science.com/catalog/5852/