ハードウェア技術者のスキルアップ日誌

某家電メーカーの技術者がスキルアップのために勉強したことを記録するブログです

【電子工作】ー 踏切の遮断機を作ってみた

これまで学んだラズパイの動かし方を応用して、子どもと遊ぶための踏切の遮断機を作ってみました。

仕上がりはこんな感じです。子どもと一緒に作ったら結構喜んでくれました!


【電子工作】ラズパイで踏切の遮断機を作ってみた

 この記事では簡単に作り方をご紹介したいと思います。

 

回路構成

f:id:masashi_k:20200712025913p:plain

LED制御、ステッピングモーター制御、スピーカーから成ります。
ステッピングモーターはこちらの記事で作った回路をそのまま使っています。

masaeng.hatenablog.com

段ボールで作った踏切に赤色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