Select Your Language

免責事項

  • 本サイトの情報の利用、内容、サービスによって、利用者にいかなる損害、被害が生じても、著者は一切の責任を負いません。ユーザーご自身の責任においてご利用いただきますようお願いいたします。

    本サイトで頒布している基板およびキットは、技術者、またはそれに準ずる電気的知識をお持ちの電子工作ファンの方のためのものです。 一般のオーディオファンの方のためのものではありません。
    また、頒布基板およびキットは、いかなる条件でも動作を保証するものではございませんので、あらかじめご了承ください。

    電子工作では、火傷、感電、火災などの可能性があります。 十分に注意をして作業して下さい。

    営利目的のご使用は認めておりません。  記事の転載や、基板・キットの商用利用の方は、ご連絡ください。
    学生やサークルの学習目的でまとめてご購入する場合は特別なコースをご用意させていただきます。

« デジットにて、お取り扱いを開始しました。 | トップページ | 秋の夜長の Raspberry Pi 3 カーネル・セルフ・ビルド »

2016年9月14日 (水)

Volumio2に秋月電子のI2CタイプOLEDを接続して曲名などを表示する方法(リベンジ)

先日、こちらで同じ事をしていたのですが、今回は、mpcを使わずにダイレクトにMPDから情報を取得するように変更しました。 

見た目は、そんなに変わらないです。 

Oled_r2 

mpcはコマンドライン型のMPDクライアントソフトウェアです。 

なぜかvolumio2の場合、mpcの応答が怪しく、情報を正しく取得できないなどの不具合がありました。

また、ダイレクトにMPDから情報をもらうことで、再生中の楽曲のビットレートやサンプリング周波数なども取得可能になります。 mpcより得られる情報が多いうのが最大のメリットだと思います。 

 

これはメリットとして言えるかどうかは分かりませんが、mpdが動いている別のサーバーのIPアドレスを指定すると、そのmpdの状態も表示することもできます。 (上のバージョン表示はローカルのmpdから情報をもらっていますが) 

Oled_r3  

こちらの表示はサンプリング周波数とビット数です。 

細かい不具合はまだ残っているかもしれませんが、とりあえずリリースします。 

 

python-smbus、kakasiをインストール

sudo apt-get update

少々待ちます。 

sudo apt-get install python-smbus kakasi

sudoのパスワードを求められたときは「volumio」と入力します。

 

OLED表示用のスクリプトをインストール

wget http://nw-electric.way-nifty.com/blog/files/oled_ctrl_s.py

sudo chmod +x oled_ctrl_s.py

つづいて、systemdに登録します。 

 

sudo nano /etc/systemd/system/oled_ctrl.service

これで空のファイルができていますので、下記の呪文をコピー&ペーストします。

[Unit]
Description=i2c OLED ctrl service

[Service]

ExecStart=/usr/bin/python2 /home/volumio/oled_ctrl_s.py
Type=simple
Restart=always

[Install]

WantedBy=multi-user.target

 

Restart=always を入れると、もしプロセスが落ちても、自動で復帰するようになります。 (SKさん 情報ありがとうございます)

 

RaspbianやMoode Audioへ登録するときは上記の /home/volumio/oled_ctrl_s.py

/home/pi/oled_ctrl_s.py に変更します。  また、

/etc/modules   に  i2c-dev が記載されていること

/boot/config.txt   に  dtparam=i2c_arm=on  が記載されていることを確認します。  (なければ追記します。 )

 

 

起動時にスクリプトを自動で実行させる

systemdを使って起動時にスクリプトを自動で実行させるには

sudo systemctl enable oled_ctrl

とコマンドを打つだけでOKです。
自動起動の解除は、

sudo systemctl disable oled_ctrl     です。

 

今、実行したいときは下記のコマンドです。 

sudo systemctl start oled_ctrl

 

 

MPDから直接情報を得る方法は ソケット通信

私も始めて知ったのですが、実は、Pythonはソケット通信を簡単に行なうことができました。 

詳細な内容は直接スクリプトを見ていただくとして、ここではざっくりと重要なポイントだけ説明いたします。 

import socket

host = 'localhost'     # localhost
port = 6600            # mpd port
bufsize = 1024

というのが冒頭部にあります。 ソケット通信するために  import socket してます。

localhostは、自分自身のIPアドレスと思ってください。 

mpdはPort番号 6600 を標準で使っています。  mpd.confで指定しているので番号を変更することもできます。 

 

スクリプトの中ほどで

# Soket Communication
    def soket(self):
        self.soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.soc.connect((host, port))
        aaa = self.soc.recv(bufsize)

という部分でソケット通信を開始(接続)しています。 通信したら、とりあえずカラ読みしているのが self.soc.recv(bufsize) です。 mpdは、通信が開通したら、ちょこっと文字列を返してくるからです。 カラ読みで捨てています。 bufferサイズは適当です。 

 

接続した後、 

        self.soc.send('status\n')
        st = self.soc.recv(bufsize)

        self.soc.send('currentsong\n')
        song = self.soc.recv(bufsize)

という部分で、mpdから情報を取得しています。 statusコマンドでステータス。  currentsongコマンドで、曲名などを取得できます。 sendで送信して、recvで受信するのが基本です。

その他の部分は、文字列を抜き出してOLEDに送るように加工をしているだけです。 

 

ちょっと面白かった部分として、

    song_val = re.escape(song_val)

があります。 re.escape() は、特殊文字(制御)が含まれていたら直前に「\」を追加してくれます。 例えば、” や ’ 括弧 ()などの文字が曲名に含まれていると、kakasiに変換を頼むときの 

commands.getoutput(" 外部コマンド  ") でコマンドの一部として誤認識されて不具合を起こしてしまうからです。 

\を直前に追加することで特殊文字をエスケープ文字へと変換できます。 特殊文字すべて一気に片付けてくれるのが re.escape()  です。

 

その他、色々と本職のプログラマからみるとスマートじゃない方法をやっているかもしれませんが、許してください。 

 

 

 

 

にほんブログ村 PC家電ブログ PCオーディオへ にほんブログ村
ブログランキングに参加中です。 めざせ1位! 
もしよろしければ「ぽちっと」お願いします。 



« デジットにて、お取り扱いを開始しました。 | トップページ | 秋の夜長の Raspberry Pi 3 カーネル・セルフ・ビルド »

Raspberry Pi」カテゴリの記事

コメント

moode audio 2.7に組み込ませて頂きました。
毎度、ありがとうございます。
サンプリング周波数とビット数が表示されて、こちらの表示の方が好みです。

うちでは systemctl でうまく動かなかった為、rc.local に

su -c /home/pi/oled_ctrl_s.py &

を追記して動かしてます。

通りすがりのおじさんさん

なるほど。 systemdが採用されても、rc.localも生きているんですね。

私もmoode R2.7で試してみようと思います。 

私も自作のdaemonが、systemdで上手くうごきませんでした。
Pidのファイルが読めないと言ってきます。
コマンドを手入力すると、ちゃんとうごくのですが…
セキュリティ権限の問題のようなんですが…

自作daemonがsystemdで動かない件、自己解決しました。

プログラムの最初で、SIGHUPを無視する設定を入れておかないと、いけないようです。
 C言語だと、 signal(SIGHUP, SIG_IGN); です。

これがないと、親プロセスが正常に終わった時でも、SIGHUPが子プロセスに出されてしまい、終了してしまうようです。

Yosyos さん

なるほど。 情報ありがとうございます。 SIGHUPですか。そんな仕組みがあるんですね。 pythonではどうするのか調べてみます。 

しかし、Linuxの使い方の変貌ぶりは狂気すらかんじますね。 ネットで検索すると古い情報もヒットするので、調べるのが大変です。  書籍も1年前のものだと役に立たない。。。

[Service]
...
Restart=always

のように"Restart=always"を追加するとプロセスが落ちた時に自動的にリスタートします。

たかじんさん

Pythonスクリプトは、Type=simpleという事で、forkしない普通のプロセスなので、SIGHUP対応はいらないと思います。

SK さん

なるほど。 ありがとうございます。 自動リプートが、これ一発でできるのは、すごく簡単で良いですね。 知りませんでした。

Yosyos さん

moode R2.7で試してみましたが、I2C-OLEDは、上の方法(systemd)で問題なく起動できました。 おっしゃる通りSIGHUPは なしでOKなようです。
systemdは、まだまだ日本語の情報がすくなくて迷います。 でも、高速な起動が可能なので、もう少し使い方を学びたいです。 

>RaspbianやMoode Audioへ登録するときは上記
>の /home/volumio/oled_ctrl_s.py を
>/home/pi/oled_ctrl_s.py に変更します。

に気づきませんでした・・・
修正して、うちも動きました。

通りすがりのおじさんさん

すみません。 その文章はmoodeで動作確認後に途中で追記しました。 

たかじんさん
この記事を参考にさせて頂き、volumioを楽しんでおります。初歩的な質問ですが、スクリプトを自動で実行させるには、どこに”sudo systemctl enable oled_ctrl” を記録したら良いか教えて頂けませんか? 直接 sudo systemctl start oled_ctrl を実行すると正常に動くことは確認しております。 宜しくお願いいたします。

ほてい

たかじんさん
runeaudioに関する別の記事から、/etc/systemd/systemの中でsudo systemctl enable oled_ctrl を実行すればよいことがわかり現在めでたく正常に動いております。

ほてい

ほていさん

解決したようで、良かったです。 

sudo systemctl enable oled_ctrl は自動起動へ登録するコマンドです。
説明が足りていなくてすみません。 

おそらく、カレントディレクトリがどこでも大丈夫なはずです。

・MoOde audio 3.1でのOLEDの設定について
お尋ねします。
「/etc/modules に  i2c-dev が記載されていること」と
あるのですが、どうしてもその記載が確認できません。
volumio2での設定では以下のように確認できるのですが
「i2c-dev
i2c-bcm2708」
※MoOde 2.7でも同様でした。

・volumio2で曲を再生するとき、曲の出だし部分が
ボリュウーム以上の大音量になってしまうのですが(私だけでしょうか?) 
以上の2点について、お願いします。

fu103 さん

Moodeでは、I2Cを使うDACも動作しているので、標準でI2C通信できると思います。 

音量に関しては、ノーマライズがONになっているのではないでしょうか? 

fu103 さん

>「/etc/modules に  i2c-dev が記載されていること」と
> あるのですが、どうしてもその記載が確認できません。

書かれていないのであれば、自分で追記してみてはいかがでしょうか。

返信ありがとうございます。

たかじんさま
・「I2Cを使うDACも動作している」
音については、sabreberry32、プラスともに問題なく
動作しているのですが・・・

・通りすがりのおじさん 
追記しようと試みましたが、
以下のようにエラーで、はじかれました。
[ Error writing /etc/modules: Permission denied ]

しばらく試行錯誤してみます。
これからも、お願いします

fu103 さん

>以下のようにエラーで、はじかれました。
>[ Error writing /etc/modules: Permission denied ]

sudo nano /etc/modules
で編集してみてはどうでしょう?

fu103 さん

I2S-DACの設定にI2Cでコマンドを送ることができているのでI2C自体は開通できているという意味でした。説明が足りていなくてすみません。


通りすがりのおじさんさん

ありがとうございます。 その通りと思います。

Permission 関係のエラーは大抵、root権限(スーパーユーザ)で実行すると解決できますね。

補足すると、
sudo はスーパーユーザで実行するというおまじないです。 実行するとパスワードを求められることがあります。
Moode Audio の場合のパスワードは raspberry
Voulumioの場合は volumio です。

通りすがりのおじさん様

助言どおりに追記し、表示できました\(^o^)/!
助かりました(2度目ですネ)
ありがとうございます!

fu103 さん

お役に立てた様で、動いて良かったです。
OLEDの表示、綺麗でカッコイイですよね!

fu103 さん

表示出来たようで良かったです。


「確認すること」って無意識のうち間接的表現になっていました。
直接的文章を追記させて頂きました。

「青信号を確認してから渡りましょう」的な思考でしたが、それ以外のときの対処法を明確に書いていなくて迷ってしますよね。 大変勉強になりました。

ちなみに/etc/modules や /boot/config.txt は、WEB-UIでDAC設定などを変えると上書きされて追記した文字が消える可能性があるので、その時はまたテキストエディタで追記してください。

通りすがりのおじさんさん

助かりました。 ありがとうございます。

たかじんさん

恐縮です~

>ちなみに/etc/modules や /boot/config.txt は、WEB-UIでDAC設定などを変えると上書きされて追記した文字が消える可能性があるので、その時はまたテキストエディタで追記してください。

私の所はlircがコレでよく吹っ飛びます・・・

通りすがりのおじさん

> 私の所はlircがコレでよく吹っ飛びます・・

色々と設定を見てまわると、いつの間にか消えていますよね。

volumio2利用してますが、NAS上の曲目名の文字化けが激しく困りました。ファルダー名まではちゃんと日本語になります。曲名がアウトです。原因と対処方法を教えてください。PI3を利用してます。

roy さん

おそらくID3タグの種類の問題と思います。
http://d.hatena.ne.jp/naripp/20121106/1352183856

こんな感じで文字がバケないタグの種類に変換してみてはいかがでしょうか。
volumio自体というよりもvolumioが採用しているMPDに依存しています。 

うまくいきました。ありがうございます。
しかし、音楽ファイルのタグの保存と削除に異常に時間がかかります。
何か操作がおかしいのでしょうか。

roy さん

タグの変更は、ファイルひとつひとつにデータを書いていますので、それなりに時間がかかります。
とは言っても、1曲あたり3~5秒程度と思いますが。。

1曲あたりの時間を計測してみます。ありごとうございます。

roy さん

タグの書換えは一度のみですので、多少時間がかかっても我慢するしかないですね。 

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/587107/64203963

この記事へのトラックバック一覧です: Volumio2に秋月電子のI2CタイプOLEDを接続して曲名などを表示する方法(リベンジ):

« デジットにて、お取り扱いを開始しました。 | トップページ | 秋の夜長の Raspberry Pi 3 カーネル・セルフ・ビルド »

サイト内検索

Sponsors link

2017年4月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            

最近のトラックバック

無料ブログはココログ