ITmedia NEWS > STUDIO >

Nゲージの模型をラズパイで動かす “らずてつ”その5――線路にセンサーを設置する名刺サイズの超小型PC「ラズパイ」で遊ぶ(第56回)

» 2022年03月29日 07時00分 公開
[岩泉茂ITmedia]

 前回である程度は自動運転っぽいものが出来上がりました。ここからはもう一歩進めて、センサーで模型の位置を把握して、ポイントを変えたり停車させたりすることについて考えていきます。

 模型の位置を把握するのはどうしたらよいでしょう。要はそこを通過したことが分かればいいので、センサーの上を模型が通過するとラズパイに知らせる、という仕組みを作ればよさそうです。

 このような時に使うセンサーに「反射型フォトセンサー」(フォトリフレクター)があります。ラズパイの工作でよく見るのは、ラインを判断して自動的に進む車、などでしょうか。この場合は動く方に反射型フォトセンサーが搭載されており、白い紙の上に引かれている黒い線を反射率で判断しながら進んでいく、というものです。今回は逆に、線路上に反射型フォトセンサーを置いておき、そこを通過したときにラズパイへ知らせる、ということになります。

 反射型フォトセンサーもさまざまな種類があるのですが、線路の上に置くには小さいものでないといけません。秋月電子通商では「TPR-105」という反射型フォトセンサーを販売しています。サイズも3.2(横)×2.7(縦)mmと小型なので、Nゲージの線路に置けそうです。筆者が持っているトミックスのレールにはDCフィーダーNを差すためのスペースがあり、そこに設置するとよさそうです。実際にトライしてみましたが、スペースにすっぽりとはまるのは無理でしたが、模型の通行の邪魔にならないで済みそうです。

Raspberry Pi 反射型フォトセンサー「TPR-105」
Raspberry Pi DCフィーダーNを差すための場所

 ただしTPR-105を設置するのはちょっと面倒でした。TPR-105は線が細くてぐにゃぐにゃと曲がる上にかなり弱く、曲げたり伸ばしたりするとすぐに断線します。またDCフィーダーNの入る場所は狭いので、太いリード線は入りません。このため、手元にあった「協和ハーモネット 架橋ポリエチレン電線」を使いました。そのあと千石電商で購入した1mmの熱収縮チューブを入れて、隣り合うコードと絶縁するようにしました。加えてホットボンドを線路の下に流し込んで固定するとともに、熱収縮チューブで覆えなかった部分を絶縁しました。ただしこのやり方は非常にアナログなので、うまいやり方があったら教えていただきたいです。

Raspberry Pi 実際に設置したところ

 ではTPR-105を使う方法について考えていきます。TPR-105はアナログ出力しか扱えませんので、途中にデジタル−アナログ(DA)コンバーターを入れる必要があります。DAコンバーターを使う方法については第40回 庭の水やりで身近なIoTを体験、自動水やりシステムの構築 〜水分センサーの取り付け〜で解説しました。基本的な測定はこれと変わらないので、参考にしつつ組み上げていきましょう。

 まずTPR-105ですが、左側に赤外線LED、右側にセンサーが取り付けられており、赤外線LEDからの反射光を捉えてデータを送信します。このためLEDに取り付ける抵抗と、センサー側に取り付ける抵抗の2種類が必要になります。LED側には220Ω、センサー側には20kΩを取り付けました。

 TPR-105の左側に赤外線LED、右側にフォトトランジスタが配置されています。本体で言うと、左上に切り欠きがある方が上になりますので注意しましょう。

Raspberry Pi 左上に切り欠きがある
Raspberry Pi TPR-105の回路図(データシートより)

 フォトトランジスタが吐き出す信号はアナログです。これをいったんDAコンバーターに読み込ませてから、コンバーター経由でラズパイに入力します。今回使うのはMCP3008です。第40回では2チャンネル分のデータを扱えるMCP3002を使いましたが、今回は3個以上のデータを読み込む必要があるので、8チャンネルを使えるMCP3008を使います。プログラム上の基本的な扱いはそれほど変わりませんので、特に迷うこともないかと思います。

 ラズパイとMCP3008、TPR-105の接続は以下の図のようになります。TPR-105の右上からMCP3008のCH0へデータを送り、そしてSPIで接続されたラズパイにデータが送られる、という仕組みです。

Raspberry Pi ラズパイとTPR-105を接続する

 これを元に以下のプログラムを走らせて、ちゃんと認識するかチェックしましょう。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
from gpiozero import MCP3008
Vref = 3.3
try:
    while True:
        sen01 = MCP3008(channel=0)
        rail1 = round(sen01.value * Vref * 100,2)
        print(str(rail1))
        time.sleep(0.1)
        
except: KeyboardInterrupt
print("End")
sensortest.py

 コンソールから以下のコマンドを入力します。

$ python sensortest.py

 すると以下のように数字が流れます。

47.56
47.23
47.56
47.23
47.56
47.23
47.23
47.23
47.23
47.56
47.23
47.56
47.56
47.56
47.56
…………

 試しにセンサーの上に指をかざしてみましょう。数値が変わります。

47.56
47.56
47.88
47.56
47.56
47.23
47.23
47.56
41.43
42.72
47.23
71.09
80.12
310.98
89.47
46.91
33.69
38.53
47.56
47.56
…………

 ほぼふさぐと310.98という数字に変わりました。つまり模型が通ったらセンサーをふさぐため数字が大きくなるので、数値を指定して動きを変化させればOKですね。なおセンサーから信号を受けるタイミングですが、現状は0.1秒ごとになっています。これよりも間隔を開けると数値の変化を読み取れませんでした。ただしこれはそれぞれの環境で変わると思いますので、調整してみてください。

 次回は線路の上に設置したセンサーから模型を制御する方法について解説します。

Copyright © ITmedia, Inc. All Rights Reserved.