名刺サイズの超小型PC「ラズパイ」で遊ぶ(第56回)

Nゲージの模型をラズパイで動かす “らずてつ”その5――線路にセンサーを設置する

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

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

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

 反射型フォトセンサーもさまざまな種類があるのですが、線路の上に置くには小さいものでないといけません。秋月電子通商では「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秒ごとになっています。これよりも間隔を開けると数値の変化を読み取れませんでした。ただしこれはそれぞれの環境で変わると思いますので、調整してみてください。

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

印刷する
SNSでシェア
SpecialPR

名刺サイズの超小型PC「ラズパイ」で遊ぶ

今やスマートフォンアプリで何でも完結できてしまう時代。しかし、一から自分の手でデバイスを作り上げ、試行錯誤しながらアイデアを具現化する楽しさは格別です。この連載では、テーマや用途にあわせてマイクロコンピュータ(マイコン)と呼ばれる名刺サイズの超小型PC「Raspberry Pi」(通称ラズパイ)の活用方法から具体的な工作手順までを紹介します。

この連載の記事をもっと見る

この記事の著者

関連記事

こんなメディアも見られています

ITmedia NEWSに関連する情報をお探しであれば、こちらのメディアもお役に立てるかもしれません。

メールマガジンを配信中
メールマガジンを配信中

国内外の業界動向、AIやクラウドなどの最新技術、キャリア情報など今知りたい情報をまとめてお届けします。

いますぐご登録

本日の新着記事

アクセスランキング

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10

ITmedia NEWS SNS

X @itmedia_newsをフォロー

インフォメーション

ITmediaNEWSをフォロー

あなたにおすすめの記事PR