タイムカード連動で時報を鳴らす為の機能があるのですが、AMC-300と古くから使ってる時報(音楽)を鳴らす機械が故障した為、急遽購入しようとしましたら2012年に廃版で手に入りません、調べると他の製品はかなり高額な事が分かりました、時報を鳴らすだけで何十万の出費は痛いとの事でRaspberry Piで出来るんじゃないかと試行錯誤して鳴らすようにしました。
同じ機械を使ってるかは参考になると思います。
不具合を起こした機械
時報を鳴らすタイムカード・故障した音声(チャイム)を鳴らす機械。
今回不具合を起こし鳴らなくなった機械です。
AMC-300タイムカードのアマノから販売されていました。「※メーカーサイトAMC-300」
今回は裏の端子から「タイムカード接続」の端子に繋がっている配線を利用します。
用意した物・準備に必要な事
使用した機器はこちら
ケースの組み方などは「Raspberry Pi 積層ケース組み立ての注意点とコツ!」
今回用意した物と手順概要
- 用意したハードウェアの準備:
- Arduinoボード(Raspberry Pi)
- ブレッドボード
- 抵抗器
- 接続用端子
- 回路を組み立てます。無電圧コードデジタルピンに接続し、外部音声出力(イヤホンジャック)に接続します。
- Raspberry Piで動作するPythonプログラムを作成します。
タイムパック(タイムカード)
現状把握です。
時報ソフトを行ってるタイムカード。
こちらのタイムカードから時間になるとリレーが働き音楽を鳴らす機械に信号を送っています。
タイムカードタイムパックの時報におけるスイッチ出力仕様は以下の様になっていました。
外部起動:200ms パルスメイク方式、割込:メイクブレイク方式
無電圧メイク接点入力 開放電圧:DC3.3V、短絡電流:1mA
着脱式ターミナルブロック(2P)
そのままの入力ではラズベリーパイのGPIO電流入力が心配なので少し落としてから入力させます、ブレッドボードでもハンダ付けでも方法はお任せします。
瞬間で起動しますのであまり電流より電圧が掛かれば起動しました、乾電池3Vでも起動は確認出来ました。
音声出力設定
外部に音を鳴らす場合にはイヤホンジャックやHDMIがあります、今回はイヤホンジャックから音声出力を使うためにalsaaudio
ライブラリもインストールします。
既にインストールされてる方は必要ありません。
pip install pygame pyalsaaudio
鳴らす音声を用意する
入力された時に鳴らす音声を選択します。どれでも構いませんが今回は時報で使いたいのでネットからフリーの時報を落としました。
鳴らす音声をpygame
ライブラリを使って音楽を再生する方法。
まず、pygame
ライブラリをインストールします(すでにインストールしている場合はスキップしてください)
コマンドに以下のコードを入れエンターで自動インストールされます。
pip install pygame
次に、以下のPythonコードをRaspberry Pi上で実行します。このコードは指定されたファイルを再生するだけの簡単なプログラムです。
import pygame def play_music(file_path): pygame.mixer.init() pygame.mixer.music.load(file_path) pygame.mixer.music.play() def main(): music_file = "Japanese_School_Bell02-01(Slo).mp3" # 音楽ファイルのパスを指定 try: play_music(music_file) while pygame.mixer.music.get_busy(): continue except KeyboardInterrupt: pygame.mixer.music.stop() if __name__ == "__main__": main()
上記のPythonコードを実行すると、”Japanese_School_Bell02-01(Slo).mp3″ファイルが再生されます。
鳴らない場合はファイルの場所が間違っていないか確認して下さい。
全てを含んだサンプルコード例を下記で紹介します。
Raspberry Pi上で動作するPythonプログラムを作成
Raspberry PiにGPIOを制御するために、RPi.GPIOライブラリを使用しています。RPi.GPIOは多くのディストリビューションに標準で含まれていますが、もしインストールされていない場合は次のコマンドでインストールできます
sudo apt-get update sudo apt-get install python3-rpi.gpio
上記でサンプルコードを実行出来る準備が出来ました。
サンプルコード例
pythonプログラム例です。入力するアプリはpython対応でしたらどれでも構いません。
- 音楽ファイルパは自身場所に置き換えて:music_file = “/home/●●/Music/Japanese_School_Bell02-01(Slo).mp3”
- 無電圧メイク接点を接続したGPIOピン番号は実際に使うピン番号に置き換えて:switch_pin = 17
import RPi.GPIO as GPIO import time import pygame # ピン番号を設定 switch_pin = 17 # 無電圧メイク接点を接続したGPIOピン番号 # 音楽ファイルのパスを指定実際のファイルパスに変更して下さい music_file = "/home/●●/Music/Japanese_School_Bell02-01(Slo).mp3" def setup_audio_output(): pygame.mixer.init() pygame.mixer.music.set_volume(1.0) def play_music(file_path): pygame.mixer.music.load(file_path) pygame.mixer.music.play() def main(): # GPIOピンのモードを設定 GPIO.setmode(GPIO.BCM) GPIO.setup(switch_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 内蔵プルアップ抵抗を使用 setup_audio_output() try: while True: # 無電圧スイッチが押されるまで待機 while GPIO.input(switch_pin) == GPIO.HIGH: time.sleep(0.1) # 音楽を再生 play_music(music_file) # スイッチが放されるまで待機 while GPIO.input(switch_pin) == GPIO.LOW: time.sleep(0.1) except KeyboardInterrupt: GPIO.cleanup() pygame.mixer.quit() if __name__ == "__main__": main()
このプログラムは、無電圧スイッチが押す(入力)されると、指定の音楽(時報)を鳴らす関数が呼び出され、無電圧スイッチが放されると、プログラムは次の入力まで継続的に待機するプログラムです。
接続はGPIO17に入力、もう一方はグランド(アース)に接続しています、好みや空ピンで変更して下さい。
入力しましたら保存をします、今回の場合は後で電源を入れるだけで自動で実行するプログラムを使いますので、分かり易い名前と場所に保存しておくと便利です。
実際に鳴るかテスターの導通検査で鳴らす事も出来ます。
電源を切っても自動で実行させる
電源を入れる度にわざわざ「RUN(実行」を自身でするのは面倒ですし手間ですので起動と同時にバックグラウンドで動作し続けるよう実行(待機)される様にします。
これには systemd サービスを設定する方法が一般的です。
ここでは先ほどのPythonのファイルを保存した場所が必要となりますので見つけれる様にして下さい。
例として「zihiou」としての名前で保存したとします。※何パターンもテストした為、可笑しな名前なのはご了承ください。
systemd サービスの作成
ターミナルを開いて以下のコマンドを実行し、サービスファイルを作成します。
sudo nano /etc/systemd/system/zihiou.service
以下の内容をサービスファイルに貼り付けます。
[Unit] Description=Zihiou Service After=network.target [Service] ExecStart=/usr/bin/python3 /home/pi/zihiou.py WorkingDirectory=/home/pi/ StandardOutput=inherit StandardError=inherit Restart=always User=pi [Install] WantedBy=multi-user.target
ExecStart のパスは 実際に”zihiou.py” ファイルがある場所に合わせて修正してください。
ちなみにデスクトップに保存した場合は”/home/自身のPC名/Desktop/zihiou.py”
入力しましたら「Ctrl+O」で保存しEnter、「Ctrl+X」で終了します。
今保存したプログラムを実行します。
サービスの有効化と起動
先ほどのサービスを有効化します。
sudo systemctl enable zihiou.service
サービスを有効化して自動起動して待機させます。
sudo systemctl start zihiou.service
これで、指定したファイル “zihou.py” がRaspberry Piの起動時に自動的に実行されるようになります。
実行出来てるか確認する
sudo systemctl status zihiou.service
正常に動作している時はActive: active (running) since 日付 時間 JST; 23s agoと表示されます(日付・時間に起動され23秒間実行中です。と英語で表示)
systemd[1]: Started Zihiou Service.: とサービスが正常に開始されたことが示されています。
サービスは停止するまで実行し続ける為、停止する時は以下のコマンドを入力します。
sudo systemctl stop zihiou.service
問題発生時
手順通りにしても起動しない時に考えられる事
- Python実行コードが違ってる。
- 保存した名前と起動の名前が違っている
- ファイルパス(場所)が間違っている
- 実行出来るのに電源切ると実行されないは有効化(enable)してない、自動起動start)されていない
- 外部音声が繋がっていない
- 外部音声のファイルパスが間違っている
- スリープモードや待機状態が影響している可能性もあります
- GPIOの指定が間違っている
- GPIOの逆に付いている
- 物理的な破損
コメント