
電子工作はやっぱり面白い
会社から「DX!」「業務効率化!」と言われて覚え始めたpython。エクセル操作やメール操作、スクレイピングなど色々出来ることはあるとは言え、やっぱりPC上で動かしているだけでは眠気がzzz。そう言えば、会社のタイムカードのピッ!を忘れて帰る人が多いって上司が言ってたな…という事で会社の通用口の打刻マシンの前にロボットを設置、人が通ったら「タイムカード切るのを忘れないでね!」というありがた迷惑なアナウンスが流れるロボットを作ってみることにしました。
とはいえ、作りたいのでお金使わせてくださいなんて上司が許すわけがないので、できる限り余り物の資材で作ります。用意したものは
- ラズベリーパイ4(余っていたもの、1万円ちょい?)
- 人感センサー(アマゾンで数百円)
- スピーカー(ダイソーで昔1,000円で購入したもの)
たったのこれだけ。しめて12,000円。おそらくこの単純な仕組みなら、ラズパイ4ですらオーバースペックなので、ゼロから準備するのであれば、バージョン違いのさらに安いラズパイでも問題ないと思います。
音声は2種類を準備
朝の出勤時と、夜の退勤時に合わせて音声は2種類のmp3を準備。朝出勤したばっかりなのに、「お疲れさまでした」なんて音声が流れたら、ほかの社員からボコボコに怒られそう(笑)
色々な無料の音声生成サービスを試してみましたが、個人的には
日本語 音声読み上げソフト|音読さん
が一番自然な声質でおススメです。間違いなく、自分の声を録音するよりいい声してます。
- おはようございます。出勤時には打刻を忘れないでください。
- お疲れさまでした。退勤時には打刻を忘れないでください。
この「おはようございます」「お疲れさまでした」がポイントで、いくら合成音声とはいえ挨拶をされて悪い気がする人はいないので、これがあるのとないのとでは印象が全然違います。
人感センサーとラズパイとスピーカーを繋ぐコードを書こう
人感センサーのつなぎ方については、他に詳しく説明しているサイト様があります。
ラズベリーパイで人感センサー(焦電型赤外線センサー)の使い方
とても分かりやすいです。
以下は、人感センサーとラズパイを連携させるコードのサンプルです。
import time
from datetime import datetime
from gpiozero import MotionSensor
import pygame
# PIRセンサーの設定(GPIOピン番号)
pir = MotionSensor(17)
# 音声再生の初期化
pygame.mixer.init()
# 時間帯ごとのMP3ファイルのパス
morning_audio = "/home/●●●/audio/おはようございます.mp3"
evening_audio = "/home/●●●/audio/おつかれさまでした.mp3"
# クールダウンタイム設定(秒)
cooldown_time = 10 # 再生間隔を10秒に設定
last_played_time = 0
def play_audio(audio_file):
"""
音声ファイルを再生
"""
global last_played_time
current_time = time.time()
time_since_last_play = current_time - last_played_time
# クールダウンタイムを確認
if time_since_last_play >= cooldown_time:
pygame.mixer.music.load(audio_file)
pygame.mixer.music.play()
last_played_time = current_time
print(f"再生しました: {audio_file}")
else:
print(f"クールダウン中(経過時間: {time_since_last_play:.2f}秒)。再生しません。")
def get_audio_file():
"""
現在の時間帯に応じて再生する音声ファイルを取得
"""
now = datetime.now()
current_time_in_minutes = now.hour * 60 + now.minute # 現在時刻を分単位に変換
# 時間帯設定(分単位)
morning_start = 8 * 60 # 8:00 = 480分
morning_end = 10 * 60 # 10:00 = 600分
evening_start = 17 * 60 # 17:00 = 1020分
evening_end = 21 * 60 # 21:00 = 1260分
# 時間帯に応じた音声ファイルを選択
if morning_start <= current_time_in_minutes < morning_end:
return morning_audio
elif evening_start <= current_time_in_minutes < evening_end:
return evening_audio
else:
return None # 時間帯外
try:
print("システムが起動しました。動きを待機中...")
while True:
# 動きを検知する
pir.wait_for_motion()
print(f"人を検知しました!時刻: {datetime.now()}")
# 再生する音声ファイルを取得
audio_file = get_audio_file()
if audio_file:
play_audio(audio_file)
else:
print("再生する音声はありません(時間帯外)。")
# 動きがなくなるまで待機
pir.wait_for_no_motion()
except KeyboardInterrupt:
print("プログラムを終了します...")
finally:
pygame.mixer.quit()
自分でざっと書いた後に、Chatgptに修正してもらいました。もはや最初からお任せでもよかったかもしれないレベルで高性能です。レベルの高い方であれば、ここに小型カメラなども繋いで形状認識させて、誰が通ったのかなどの認識まで出来たりするんでしょうか…私には無理💦
応用範囲が非常に広い
このままだとラズパイ、スピーカー、センサーがむき出しなのでセンスがある人は自作ケースを作ってあげたらより一層いいものになると思います。一つ注意点は、スピーカーはラズパイとつなぐことで給電出来るものにしましょう。そうでないと数日で充電切れで切れてしまいます。
初めてpythonとリアル装置を繋げるという経験をしましたが面白いですね。これって、会社の入り口に自動音声案内つけたり、応用していけば監視カメラとかも自作できてしまうかも。人がいる→何かが動作するっていう仕組みなら大抵のものがいけるのではないかと(大げさすぎるかもしれませんが)
とはいえ、あくまで作ってみたかったから作ったレベルの物で、お金があれば絶対市販のサービスや製品をお勧めしますね。この程度の音声アナウンスなら問題はないですが、監視カメラとかそういったレベルになってくると、いざというときの保守・点検はどうするんだ、自分が転勤になったらどうするんだっていういろんな問題が出てきますから。その会社に骨を埋める覚悟なら別ですけど( ´∀` )
pythonでの自動化・効率化って便利だけど、けっきょくわかる人が数人いないと継続性がないしpythonスクリプトをEXE化して配布しても、環境の変化に対応できない場合があり、保守が難しい。この辺が課題だな~と感じてます。上級者の方、どうしていらっしゃいますか?
コメント