photo credit: incurable_hippie via photopin cc
こんばんは、ボーノです。
親族がある病気にかかっているのですが、毎食前に薬を飲まなくてはいけないのですが、良く忘れてしまうとのこと。
毎食後であればご飯というトリガーがあるので大丈夫なようですが、確かに毎食前となると普通は自分で覚えておかない限りは思い出すのは難しいですね。
というわけで、そんな薬飲み忘れを防止するためのガジェットを作ってプレゼントしたのでやった事をまとめておきます。
コンテンツ
完成品
今回はおもちゃのロディちゃんの中にパッケージングしてみました。(せっかくおもちゃとして買ったのに、子供があまり遊ばなかったためこうやって有効活用するのもありですね笑)
仕様
主な仕様を書いておきます。
- 毎日6時、11時、17時という決まった時間に音が鳴る
- 音は、音楽とボイスの2種類用意
- 音楽は、親族が好きな布施明の"シクラメンのかほり"
- ボイスは、布施明の声で"何か忘れてませんか?"と話してくれる
- 既に家にあった、子供用のおもちゃにガジェットを仕掛けてサプライズ演出
必要なもの
ここでは、下記部品/材料を使用しています。
- ラズベリーパイTypeB
- SDカード:8GB
- スピーカー:ELECOMのASP-SMP100L
- Real Time Clock(RTC):DS3231
- ぬいぐるみ(パッケージできれば何でも良いです):おもちゃ用ロディ人形
- 電源
- 音素材(下記で説明します)
- スイッチ:ON/OFFの2段階切り替えタイプ
- ブレッドボードorユニバーサル基板
- 電線:オス-メスがあると基板とラズベリーパイを繋ぐのに便利
- タッパー:100円均一で十分
作り方
ラズベリーパイを準備
過去の投稿に従って、ラズベリーパイにOSをインストールして初期設定を行います。
【ラズベリーパイ】買ってからネットワーク内のPCにSSH接続するまでの設定まとめ | Makepresso
pygameをインストール
音楽再生用のライブラリpygameをインストールします。インストール方法及びその設定方法は下記サイトを参考にしました。
再生、停止、フェードアウト、ボリューム調整等ができるので、少しがんばればジュークボックスも作れてしまいます。
Pythonでmp3再生 - Programming Log
スピーカーの取り付け
ラズベリーパイ単体では音は出せないので、スピーカーを購入しました。
今回はタッパーに全て取り付けたかったので、Amazonでスピーカーを検索して可能な限り小さい物を選びました。(結局は少しはみ出てしまいましたが)
音量も家の中で使うには十分だし、音質も悪くなく、充電式で何回も使えるし、結果的に良い買い物ができました。おすすめです。
スマートフォン用リチウム式コンパクトスピーカ - ASP-SMP100Lシリーズ
音の素材を準備
本人が布施明ファンという事で、代表曲であるシクラメンのかほりと、声の2種類を用意しようと試みました。
結果的に、今回は声は見送り、音楽のみとしました。
なお、pygameはいくつかの形式の音が再生できますが、ここでは身近なmp3形式としています。
音楽
iTunesでシクラメンのかほりをダウンロードします。
その後、下記サイトに従ってiTunes上でmp3形式に変換しました。これでOK。
iTunesでMP3に変換【初心者にも分かるiTunesの使い方】
ボイス
布施明本人の音声があれば一番ベスト、、なのですが、コネも何もないのでそんなハードルの高い事はしません。
こんな時は、koebuに投稿するに尽きます! (過去に出場したハッカソンで初めて使って、便利だったのでずっとどこかで使いたいと暖めていました)
という事で、下記条件で物まねボイスを募集しました。
- 布施明風
- 台詞:hogeさん、何か忘れてませんか?
- リクエスト:優しく語りかけるように
しかし、2週間待った結果、誰も音声を投稿してくれていません。
やはり世代が違いすぎたのでしょうか?とりあえず今回は見送ることにしました。
音量調整
下記サイトに従い、音量を調整しました。このスピーカーだと、90%くらいで程よい音量になりました。
1 | sudo amixer cset numid=1 90% |
Linuxブログ : Raspberry Piを使ってみる – 音量の調整 -
RTCの取り付け
購入
今回はある時間に音を出す機能を持たせたいので、リアルタイムを把握する事は必須です。
しかし、ラズベリーパイはリアルタイムを把握するためのRTC機能を持っていません。
方法としては、ネットワークを使用するNTPを利用するか、RTCモジュールを外付けするかどちらかになると思います。
今回は、あまり必要性がないので、ネットワークは使用しない事に。
という事で、RTCモジュールを取り付けてそこからリアルタイムを取得する事にしました。
購入はAmazonで。¥1,300くらいでした。
DS3231 超高精度I²C内蔵RTC/TCXO/水晶 - マキシム
単価自体はRSオンラインとかの方が安いから、まとめ買いするならそっちの方がお得だと思います。
RTCへの時刻書き込み
基本的には、下記サイトにならって行いました。
I2C接続 DS3231使用RTCモジュール【メール便可】 - ビクトリーセブン・ネット通販
なお、このサイトには書かれていませんでしたが、下記行の後は以下の方法で書き込みを行いました。
1 | echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device |
この後、下記コマンドでネットワーク上から現在時刻を取得。
1 | sudo ntpd -gq |
その後、下記コマンドでRTCに設定した時刻を書き込みました。
1 | sudo hwclock -w |
最後に、念のためちゃんと書き込まれているか確認しましょう。
1 | date |
スイッチ部の取り付け
スイッチの準備
汎用性を持たせるために、下記複数のスイッチを取り付けました。スイッチ自体は秋葉原で購入。
- ON/OFFスイッチ:機能の有効/無効を選択
- ON/OFFスイッチ:音楽/ボイスモードを選択
- プッシュスイッチ:マニュアルモード(再生、停止をトグルで行う)
回路設計
・定数決定
GPIOではHigh/Lowレベルを検知できれば良いだけなので、電流は小さくて良いです。
ここでは手元にあった10kΩの抵抗を使用しました。(念のため注意点としては、スイッチには最小電流値という仕様があり、それ以上の電流を流す事が推奨されているので抵抗値は大きすぎてもいけません)
・回路図
・基板に実装
半田ごてでユニバーサル基板に実装します。
ユニバーサル基板はあくまでテスト用なので、今回は基板を使用。
・注意事項
スイッチは物理的な特性上、スイッチを押した瞬間にONとOFFが瞬間的に切り替わるわけではなく、ONとOFFを何回か繰り返しながら、ある時間後に落ち着きます。(オシロで見ると良く分かると思います。)
この現象をチャタリングと呼びます。
スイッチを使用する際は、必ずこのチャタリングという現象を頭に入れておかないとどこかで不具合が起きます。
対策としてはいくつかあります。
例えば、抵抗とコンデンサでローパスフィルタを作成してハード的にチャタリングをなくす方法、ある所定の時間状態が変わらなかった時に状態を確定するソフト的に対処する方法が等があります。
今回は回路をなるべく小さくしたかったので、ソフト的に対処を行いました。
ラズベリーパイにRTC、スイッチ、スピーカー、電源、回路を取り付け
下の写真のように、タッパーにドリルで穴を開け、RTC、スイッチ、電源、回路を取り付けます。
スイッチは外れないようにホットメルトで固定しました。本当はスピーカー、回路も固定しようとしたけど時間がなくて断念。
音を鳴らすプログラムの作成
pythonを使用しました。
プログラムの中身
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import pygame.time import pygame.mixer pygame.mixer.init() pygame.mixer.music.load("/home/pi/RPi.GPIO-0.4.1a/test/Shikuramen.mp3") GPIO.setmode(GPIO.BCM) GPIO.setup(21, GPIO.OUT) GPIO.setup(18, GPIO.IN) GPIO.setup(23, GPIO.IN) GPIO.setup(24, GPIO.IN) playing = False pause = False power_input1 = GPIO.input(23) time.sleep(0.1) power_input2 = GPIO.input(23) if power_input1 == power_input2: if power_input2 == True: print("now playing") pygame.mixer.music.play() time.sleep(275) pygame.mixer.music.stop() |
プログラムの簡単な説明
最初に、あらかじめ作成しておいたmp3ファイルをloadします。
power_input1, power_input2では、ソフトでチャタリング対策を行うためにあるタイミングと0.1秒後の状態が一致していれば、スイッチの状態を確定とします。
且つ、powerスイッチがONであれば音楽を再生します。
シクラメンのかほりの再生時間4分34秒のため、time.sleepは275秒を設定しました。
なお、GPIOを使用するための設定は下記サイトを参考にしました。
動作確認
下記コマンドで無事にシクラメンのかほりが再生されました!音質、音量もまずまず。
1 | sudo python /home/pi/RPi.GPIO-0.4.1a/test/drag.py |
cronの設定
上記で音楽の再生ができたので、後はある時間にこのコマンドを実行するようにcronを設定するだけ!
cronの設定なんてすぐ。。と思ってたけど少しだけつまづきました。
お決まりの下記コマンドでcronを呼び出し、次のように毎分実行するような設定にしてみました。
1 | crontab -e |
1 2 3 4 5 6 7 8 9 10 11 | </p> <ul> <li> <ul> <li> <ul> <li> <ul> <li> <ul> <li>sudo python /home/pi/RPi.GPIO-0.4.1a/hoge.py |
しかし、待てど暮らせど一行に実行されず。
cronではなくマニュアルで上記コマンドを打った時は、問題なく実行されるのですが。
cronのエラーは下記ファイルに吐き出せるという事で見てみると、予期せぬエラーが発生している事を発見しました。
1 | vim /var/log/sylog |
1 | Dec 18 22:40:03 raspberrypi /USR/SBIN/CRON[2390]: (CRON) info (No MTA installed, discarding output) |
下記ページのように、他の人も全く同じ現象が出ている。どうやらcronはpostfixのようなメーラーがインストールされていないと使えないらしい。
RaspberryPi - Raspberry Piでcronを使った時の話し - Qiita
ラズベリーパイにはデフォルトで入っていない為、下記の通りインストール。
1 | $ sudo apt-get install postfix |
ここでコンフィグ画面が表示される。今回は一番下の、local use onlyを選択しました。
ちなみに、今回は毎日6時、11時半、17時半に音楽が再生される設定にしました。
完成!
ついに完成!
道具集めから入れると、足掛けだいたい2週間くらいかかりました。
当の本人もびっくり且つ喜んでくれて、大満足でした。今も毎日使ってくれています。
補足
ラズベリーパイでの音楽再生方法
pygameの他に、mpg321というソフトもあるようです。試しにやったら、こちらでも再生できました。
詳細は下記サイト参照。