ハリマブログ

ラズパイでチャイムとか作った話

ラズパイでチャイムとか作った話

おはようございます!

僕たちはラジオ体操で毎朝元気に体を動かしています!
この時スピーカーに一番近いという理由で、毎朝毎朝、上長である「見た目より手先が器用マン」さんがスマホでラジオ体操を再生してくれます。たまに「見た目より手先が器用マン」さんが席を外している時は、僕や周りの誰か気づいた人がラジオ体操を再生します。

これが、面倒。

毎日定刻に決まった音を流す。
たまにでもやってみると、これがマジ面倒なんです。(個人の感想です)
見た目より手先が器用マン」さんいつもありがとう。。

アレクサでも置いてやろうかと思ったのですが、せっかくだし面白そうなので、簡単な『定刻に規定の音を鳴らすデバイス』を作ってみました。
・朝定刻にラジオ体操
・始業時、お昼の前後、定時にチャイム(キンコンカンコン)
・夕礼の時間にミニジングル
の3つの音を流していきたいと思います!

昔買ったラズパイ3

手元には昔買ったラズパイ3とラズパイゼロがあったのですが、今回はイヤホンジャックのあるラズパイ3を使います。

RaspbianOS

まずはラズパイにOSをインストール。
最近小4の息子がラズパイや電子工作に興味を持っているので、息子の手順書となるように書いていきます。
初学者はとにかくオーソドックスに。ラズビアンOSをインストールします。
僕はこちらのサイトを参考にしました。ありがとうございます!
【2022年最新版】OSインストールから初期設定まで|開始手順のすべて | sozorablog
https://sozorablog.com/raspberrypi_initial_setting/

まずはHDMI、マウス、キーボード

ラズパイ3にはHDMI端子もUSB端子もついているので、普通のPCみたいにモニターに映してマウスとキーボードで操作できます。いきなりSSH接続もできなくはないのですが、まずはスタンドアロンで起動してみる方が別のPCを動かしている実感があり、感覚的にもわかりやすいと思います。

Wi-Fi設定

弊社では社内ネットワークにはIP制限をかけていますので、IPアドレスを固定します。
ターミナルでもGUIでもOKです。GUIが使えるならGUIの方がラクです。

私はこちらのサイトを参考にさせていただきました。
大変わかりやすくて助かりました!
Raspberry Pi のWi-Fi設定(初期設定) | ラズパイダ
https://raspida.com/wifi4raspbian
CUI(黒い画面)に慣れている方は、ターミナルからすることもできます。

SSH接続

Wi-Fi設定ができたら、いつものマイマシンからSSH接続しましょう。
セキュリティのため、デフォルトのユーザー名やパスワードを使い続けることは絶対にダメです!
必ず後で変更してくれよな!
おじさんとの約束だぞ!

$ ssh pi@raspberrypi.local

mpg321インストール

まずはラズパイに「音を鳴らす」喜びを感じてもらいましょう。
まあ喜びを感じるかどうかは置いておいて、普通に音声再生ライブラリをインストールします。
音声再生ライブラリはいくつかありますが、ここでは「mpg321」を選びました。

# 最初に以下のコマンドでupdateを行う
$ sudo apt-get update

# 続いて以下のコマンドでmpg321をインストールする
$ sudo apt-get install mpg321

SCPで音源転送

音声ファイルをマイマシンからラズパイに転送します。
自分のマシンのどこかのディレクトリにある「sample.mp3」というファイルを、ラズパイ上の「pi」というユーザーディレクトリ直下に転送します。

[別のターミナルウィンドウにて]
$ scp [自分のマシンのどこかのディレクトリの絶対パス]/sample.mp3 pi@192.138.***.***(固定したIPアドレス):/home/pi/

mp3再生テスト

ホームディレクトリ直下の「sample.mp3」を再生してみます。

$ mpg321 ./sample.mp3

イヤホンジャックをアクティブに

おや?音が出ない??
おうちで試した時は出たのに???

HDMIを刺したりイヤホンを差し替えたりすることで、音声出力の設定が変わってしまっているようでした。
イヤホンジャックが非アクティブになっていたので、明示的にアクティブ化します。

// ラズパイのBoot画面に入る
$ sudo raspi-config

Pythonでmp3再生スクリプト

最終的にCronで定期実行するので、一連の実行をpythonで書いてみます。
実行時にはpython3で実行します。
まずは最小コードで音声再生だけ。

from time import sleep
import subprocess

MP3_PATH = 'sample.mp3'
SLEEP = 15
args = ['mpg321', MP3_PATH]
process = subprocess.Popen(args)
sleep( SLEEP )

args = ['kill', str(process.pid)]
subprocess.Popen(args)

音を止めたい時は、Ctrl + C でスクリプト実行を停止して止めてください。

次に、IF分岐で「〇:〇〇 には △△△.mp3 を再生」みたいなことを書いていきます。今回は

  • 08:30 チャイム
  • 09:00 ラジオ体操
  • 12:00 チャイム
  • 13:00 チャイム
  • 17:00 夕礼アラーム
  • 17:30 チャイム

を書いていきます。

from time import sleep
import subprocess
import datetime

now = datetime.datetime.now()
h = now.hour
i = now.minute

if (h == 9 and i == 0):
    MP3_PATH = 'radio_taisou.mp3'
    SLEEP = 197
elif (h == 8 and i == 30) or (h == 12 and i == 0) or (h == 13 and i == 0) or (h == 17 and i == 30):
    MP3_PATH = 'chime.mp3'
    SLEEP = 16
elif (h == 17 and i == 0):
    MP3_PATH = 'private.mp3'
    SLEEP = 10
else:
    PLAY = 0

if PLAY:
    args = ['mpg321', MP3_PATH]
    process = subprocess.Popen(args)
    sleep( SLEEP )

    args = ['kill', str(process.pid)]
    subprocess.Popen(args)

cron

次はCronを有効にします。
Cronとは、パソコンの中のプログラムを定期実行するための機能です。
鳴らしたいタイミングは8:30〜17:30の中で30分単位なので、
・月〜金曜
・8:30〜17:30
・30分ごと
に実行することにします。

# cronの書式
分 時 日 月 曜日 '実行したいコマンドまたはスクリプト'

# 毎日 2:00に一回だけ実行したい場合
0 2 * * * '実行したいコマンドまたはスクリプト'

# 5分間隔で実行したい場合
/5 * * * * '実行したいコマンドまたはスクリプト'

では、以下のコマンドを実行し、書式に従って設定を書いていきます。

$ crontab -e

> 0,30 8-17 * * 1-5 /usr/bin/python3 /home/pi/music.py > /var/log/myjob.log 2>&1

さて、動きましたか?

実行の時を待つか、取り急ぎ毎分設定にするなどしてcronそのものの稼働を確認してくださいね。

ノイズ乗るから音量は70まで

僕の環境では音量が小さく感じたので、イヤホンジャックの設定を変更。
音量を上げすぎると出力信号が割れちゃうようなので、70/100がMAXくらいでした。

$ alsamixer

音を出す直前にちょっとだけ音を出す

スピーカーの省エネ機能で、しばらく音が出ないとスピーカーがスリープします。
あといきなり音を出るとびっくりするという声があったため、ラジオ体操の前にピンポンパンポン音を追加します。
適当な実装で恐縮ですが…^^;汗

from time import sleep
import subprocess
import datetime

now = datetime.datetime.now()
h = now.hour
i = now.minute
PLAY = 1

if (h == 9 and i == 0):
    MP3_PATH = 'radio_taisou.mp3'
    SLEEP = 197
    PLAY = 2
elif (h == 8 and i == 30) or (h == 12 and i == 0) or (h == 13 and i == 0) or (h == 17 and i == 30):
    MP3_PATH = 'chime.mp3'
    SLEEP = 16
elif (h == 17 and i == 0):
    MP3_PATH = 'private.mp3'
    SLEEP = 10
else:
    PLAY = 0

if PLAY:
    if (PLAY == 2):
        args = ['mpg321', 'announce.mp3']
        process = subprocess.Popen(args)
        sleep(7)

    args = ['mpg321', MP3_PATH]
    process = subprocess.Popen(args)
    sleep( SLEEP )

    args = ['kill', str(process.pid)]
    subprocess.Popen(args)

イイ感じ〜!

日々の業務の中には『定刻に規定の音を鳴らす』というような自動化のチャンスがたくさんありますね。
気づいていないくらいのちょっとした面倒臭さが解消されるだけでも、昨日よりも楽しくお仕事することができるのではないでしょうか。

なんでもお気軽にご相談ください。
いつでもご連絡をお待ちしております!

お問い合わせ

制作のご依頼、
お問い合わせはこちらからお願いいたします。