- 最終更新日
- 記事公開日
ミッキーが喋るトンネルを作ってみた
前回、ウッディーを喋らせてみたのですが「音が小さい」「音質が悪い」「背の低い車両では反応しない」と不完全なものだったので、今回はその改良版です。
トンネルを車両が通過すると、ミッキーのボイスが再生されます。
「 プラレール ディズニードリームレールウェイ トゥーンタウン ベーシックセット by タカラトミー 」に付属されているトンネルを使用しました。
作り方[目次]
配線・回路図
使用部品
- 赤外線LED(OSI5FU5111C-40)
- 赤外線受信センサ(OSRB38C9AA)
- DFPlayer mini + MicroSDカード
- 電源用スイッチ
- 電池ケース(単三×3)
- Raspberry Pi Pico
プログラム(MicroPython)
# ハードウェア関連のライブラリを読み込み
from machine import UART, Pin, ADC, PWM
# 時間関連のライブラリを読み込み
import time
# UART初期設定(UART番号,クロックレート,TXピン:GP4/6Pin,RXピン:GP5/7Pin)
uart = UART(1,baudrate=9600,tx = Pin(4),rx = Pin(5))
# ステータス確認用LED
# ラズパイPico本体に搭載されているLEDを出力ピンに設定
led = Pin(25, Pin.OUT)
# 赤外線受信センサーに接続するピン
# アナログ-デジタル変換を行うピンをADC0(31Pin)に設定
sens = ADC(0)
# 赤外線LEDを接続するピン
# PWM制御を行うピンをGP17(22Pin)に設定
pwm = PWM(Pin(17, Pin.OUT))
# PWM制御の動作周波数(一秒間に繰り返す波の数)を設定
# 値を小さくすると感度が上がる
f = 60000
pwm.freq(f)
# 永久リピート
while True:
# PWM制御にて、赤外線LEDからダミー信号を発信
# PWMのデューティー比(HIGHとLOWの比率)をHIGH:1/3、LOW:2/3に設定
# 16bitの最大値 = FFFF(16進数)= 65535(10進数)
# 65535 * 0.3333 = 21845(10進数)= 5555(16進数)
pwm.duty_u16(0x5555)
# 赤外線LEDからのダミー信号を受信して、AD変換
# read_u16() ・・・アナログ値を読込み[0-65535]の整数を返す関数
# 16bit・2進数の最大値:1111111111111111 ⇒ 10進数の最大値:65535
# 電圧の最大値3.3Vを「65535」に置き換え
adc = sens.read_u16() * (3.3 / 65535)
# 赤外線受信センサーがの値が1.0Vより小さいときに実行(赤外線通信を受信している)
if adc > 1.0:
# ステータス確認用LEDを点灯
led.value(1)
# 赤外線受信センサーがの値が1.0Vより大きいときに実行(赤外線通信が遮断されている)
else:
# DFPlayerに送るシリアルデータの作成(一曲ずつ再生)
sdata = bytearray([0x7E,0xFF,0x06,0x01,0x00,0x00,0x02,0xEF])
# DFPlayerにシリアルデータを送信
uart.write(sdata)
# ステータス確認用LEDを消灯
led.value(0)
# 赤外線通信を区切る
pwm.duty_u16(0)
# 音が途切れないよう音の長さ分だけ待機
time.sleep(10)
解説
赤外線LEDから常に信号が出ていて、赤外線受信センサーは常にその信号を受信しています。
ところが車両が通過すると、LEDとセンサー間の通信が遮断され、通信が途絶えます。
その瞬間を検知して、音声が再生される仕組みになっています。
さらに詳しい解説は、下記の記事をご覧ください↓