【電子工作】ー 踏切の遮断機を作ってみた
これまで学んだラズパイの動かし方を応用して、子どもと遊ぶための踏切の遮断機を作ってみました。
仕上がりはこんな感じです。子どもと一緒に作ったら結構喜んでくれました!
この記事では簡単に作り方をご紹介したいと思います。
回路構成
LED制御、ステッピングモーター制御、スピーカーから成ります。
ステッピングモーターはこちらの記事で作った回路をそのまま使っています。
段ボールで作った踏切に赤色LEDを取り付け、ステッピングモーターに遮断機のバーをつけます。
制御シーケンス
ソフトウェアでの制御手順は以下の通りです。
①GPIOの初期化
②踏切音再生開始(リピート再生)
③LED点滅を繰り返す
④(数秒後)ステッピングモーターを制御してバーを下ろす
⑤所定の時間になったらLED点滅と踏切音の再生を止め、バーを元に戻す
それでは1つずつ見ていきましょう。
①GPIOの初期化
今回使用するGPIOポートの使用モード、初期値を設定します。
import RPi.GPIO as GPIO # GPIOピンの定義 L_IN1 = 20 L_IN2 = 21 R_IN1 = 12 R_IN2 = 16 AIN1 = 2 AIN2 = 3 BIN1 = 4 BIN2 = 14 STBY = 15 # GPIOピンの設定 GPIO.setmode(GPIO.BCM) GPIO.setup(L_IN1, GPIO.OUT) GPIO.setup(L_IN2, GPIO.OUT) GPIO.setup(R_IN1, GPIO.OUT) GPIO.setup(R_IN2, GPIO.OUT) GPIO.setup(AIN1, GPIO.OUT) GPIO.setup(AIN2, GPIO.OUT) GPIO.setup(BIN1, GPIO.OUT) GPIO.setup(BIN2, GPIO.OUT) GPIO.setup(STBY, GPIO.OUT) # スタンバイ状態にする GPIO.output(L_IN1,0) GPIO.output(L_IN2,0) GPIO.output(R_IN1,0) GPIO.output(R_IN2,0) #モータードライバースタンバイ解除 GPIO.output(STBY,1)
②踏切音再生(リピート再生)
まず、事前準備としてラズパイのスピーカー出力を有効にします。
手順は以下の通りです。
1.$sudo raspi-config
2.「7 Advanced Option」を選択
3.「A4 Audio」を選択
4.「1 Force 3.5mm (‘headphone’) jack」を選択
参考サイト:https://tomosoft.jp/design/?p=33680
次にpythonのコードからmp3ファイルを再生するためにpygameというモジュールを使います。コードは以下の通りです。pygame.mixer.music.playの引数は再生回数を指定します。-1とするとループ再生になります。
import pygame.mixer #mp3再生 pygame.mixer.init() pygame.mixer.music.load("./fumikiri.mp3") pygame.mixer.music.play(-1)
踏切の音はこちらのフリー素材を使わせていただきました。
https://dova-s.jp/se/play769.html
③LED点滅を繰り返す
これはただのLチカですね。while文で繰り返します。
import time while True: GPIO.output(L_IN1,1) GPIO.output(L_IN2,0) GPIO.output(R_IN1,1) GPIO.output(R_IN2,0) time.sleep(0.2) GPIO.output(L_IN1,0) GPIO.output(L_IN2,1) GPIO.output(R_IN1,0) GPIO.output(R_IN2,1) time.sleep(0.2)
④(数秒後)ステッピングモーターを制御してバーを下ろす
LEDの点滅が始まって数秒後にバーを下ろします。モーターの回転中もLEDの点滅が止まらないようにモーターの回転は別スレッドで動かすようにします。
pythonでマルチスレッド処理をするにはthreadingというモジュールを使用します。threading.Tread()で別スレッドで動作させたい関数を指定します。targetは関数名を指定、argsはその関数に渡す引数を指定。argsは型がtupleなので、引数が1個でも(A, )という形にして渡します。thread.start()でそのスレッドをスタートさせます。
参考サイト:https://qiita.com/castaneai/items/9cc33817419896667f34
バーを下ろす処理はLED点滅開始後、5秒後に行います。これは1回だけでいいのでflagで初めての実施かをチェックしています。
import threading
f = 0.1 # 回転速度[rps] 1秒に何回転するか
s_angle = 5.625 # ステップ角[deg]
step_360 = 2048 # 1回転のステップ数
unit_step = step_360 * s_angle / 360 # ステップ角当たりのステップ数
wait = (1/f)*(s_angle/360)/unit_step # 1ステップの待ち時間
start_time = time.time() flag = 0 thread = threading.Thread(target=backward, args=(int(90 / s_angle * unit_step),)) while True: if(((time.time() - start_time) > 5 ) and (flag == 0)): thread.start() flag = 1
#以下③のLチカの処理
⑤所定の時間になったらLED点滅と踏切音の再生を止め、バーを元に戻す
一定時間経過後、mainのwhileループから抜けられるようにtry分の中に入れます。キーボードからの強制終了時と時間経過後、whileループをbreakで抜けたときに終了処理を行います。
終了処理ではLEDをすべて消す、mp3の再生を止める、モーターを元に戻すの3つの処理を行います。
f = 0.1 # 回転速度[rps] 1秒に何回転するか
s_angle = 5.625 # ステップ角[deg]
step_360 = 2048 # 1回転のステップ数
unit_step = step_360 * s_angle / 360 # ステップ角当たりのステップ数
wait = (1/f)*(s_angle/360)/unit_step # 1ステップの待ち時間
try: while True: #mainのwhileループ(➂、➃) if(time.time() - start_time) > args.wait : break except KeyboardInterrupt: GPIO.output(L_IN1,0) GPIO.output(L_IN2,0) GPIO.output(R_IN1,0) GPIO.output(R_IN2,0) pygame.mixer.music.stop() time.sleep(0.5) forward(int(90 / s_angle * unit_step)) else: GPIO.output(L_IN1,0) GPIO.output(L_IN2,0) GPIO.output(R_IN1,0) GPIO.output(R_IN2,0) pygame.mixer.music.stop() time.sleep(0.5) forward(int(90 / s_angle * unit_step))
まとめ
GPIO制御によるLED点灯とステッピングモーター制御を応用して踏切の遮断機を作ってみました。まだまだ単純な制御しかやっていないので、もう少し高度なことを含んだネタを考えていきたいと思います。
参考サイト
https://tomosoft.jp/design/?p=33680
https://qiita.com/Nyanpy/items/cb4ea8dc4dc01fe56918#1pygame
https://qiita.com/castaneai/items/9cc33817419896667f34