Volumio2に秋月電子のI2CタイプOLEDを接続して曲名などを表示する方法(リベンジ)
先日、こちらで同じ事をしていたのですが、今回は、mpcを使わずにダイレクトにMPDから情報を取得するように変更しました。
見た目は、そんなに変わりません。
※ githubにupしました。こちらからどうぞ。
mpcはコマンドライン型のMPDクライアントソフトウェアです。
なぜかvolumio2の場合、mpcの応答が怪しく、情報を正しく取得できないなどの不具合がありました。
また、ダイレクトにMPDから情報をもらうことで、再生中の楽曲のビットレートやサンプリング周波数なども取得可能になります。 mpcより得られる情報が多いうのが最大のメリットだと思います。
これはメリットとして言えるかどうかは分かりませんが、mpdが動いている別のサーバーのIPアドレスを指定すると、そのmpdの状態も表示することもできます。
こちらの表示はサンプリング周波数とビット数です。
細かい不具合はまだ残っているかもしれませんが、とりあえずリリースします。
以下は、volumio2に入れる場合です。 Raspbian、MoodeAudioにも適応できます。
Host名 volumio.local
User名 volumio
Pass volumio
でsshログインします。
Raspbianの場合は下記
Host名 raspberrypi.local
User名 pi
Pass raspbperry
MoodeAudioの場合は下記
Host名 moode.local
User名 pi
Pass moodeaudio
python-smbus、kakasiをインストール
ピンク文字はコマンド入力です。コピペしてください。
sudo apt-get update
少々待ちます。
sudo apt-get install python-smbus kakasi
sudoのパスワードを求められたときは「volumio」と入力します。(volumio2の場合)
OLED表示用のスクリプトをインストール
wget https://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さん 情報ありがとうございます)
ファイルを保存するのは 「ctrl + o」(小文字のオー)
ファイルを閉じるのは 「ctrl + x」 です。
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 が記載されていることを確認します。
(なければ追記します。 )
起動時にスクリプトを自動で実行させる
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() です。
その他、色々と本職のプログラマからみるとスマートじゃない方法をやっているかもしれませんが、許してください。
にほんブログ村
ブログランキングに参加中です。 めざせ1位!
もしよろしければ「ぽちっと」お願いします。
« デジットにて、お取り扱いを開始しました。 | トップページ | 秋の夜長の Raspberry Pi 3 カーネル・セルフ・ビルド »
「Raspberry Pi」カテゴリの記事
- MotionEyeと余っているラズパイで監視カメラ(2024.11.21)
- 秋の夜長にはRaspberryPi5 RT-linux セルフビルド(2024.10.13)
- 秋の夜長にはRaspberryPi5 64bit版 Sabreberry32 ドライバコンパイル(2024.10.10)
- RaspberryPi 5 の公式OSは32bit版でも64bit?(2024.10.09)
- 秋の夜長にはRaspberry Pi5 64bit カーネル・セフル・ビルド (2024.10.07)
コメント
« デジットにて、お取り扱いを開始しました。 | トップページ | 秋の夜長の Raspberry Pi 3 カーネル・セルフ・ビルド »
moode audio 2.7に組み込ませて頂きました。
毎度、ありがとうございます。
サンプリング周波数とビット数が表示されて、こちらの表示の方が好みです。
うちでは systemctl でうまく動かなかった為、rc.local に
su -c /home/pi/oled_ctrl_s.py &
を追記して動かしてます。
投稿: 通りすがりのおじさん | 2016年9月18日 (日) 15時33分
通りすがりのおじさんさん
なるほど。 systemdが採用されても、rc.localも生きているんですね。
私もmoode R2.7で試してみようと思います。
投稿: たかじん | 2016年9月21日 (水) 19時40分
私も自作のdaemonが、systemdで上手くうごきませんでした。
Pidのファイルが読めないと言ってきます。
コマンドを手入力すると、ちゃんとうごくのですが…
セキュリティ権限の問題のようなんですが…
投稿: Yosyos | 2016年9月21日 (水) 20時56分
自作daemonがsystemdで動かない件、自己解決しました。
プログラムの最初で、SIGHUPを無視する設定を入れておかないと、いけないようです。
C言語だと、 signal(SIGHUP, SIG_IGN); です。
これがないと、親プロセスが正常に終わった時でも、SIGHUPが子プロセスに出されてしまい、終了してしまうようです。
投稿: yosyos | 2016年9月22日 (木) 12時25分
Yosyos さん
なるほど。 情報ありがとうございます。 SIGHUPですか。そんな仕組みがあるんですね。 pythonではどうするのか調べてみます。
しかし、Linuxの使い方の変貌ぶりは狂気すらかんじますね。 ネットで検索すると古い情報もヒットするので、調べるのが大変です。 書籍も1年前のものだと役に立たない。。。
投稿: たかじん | 2016年9月25日 (日) 09時08分
[Service]
...
Restart=always
のように"Restart=always"を追加するとプロセスが落ちた時に自動的にリスタートします。
投稿: SK | 2016年9月27日 (火) 12時35分
たかじんさん
Pythonスクリプトは、Type=simpleという事で、forkしない普通のプロセスなので、SIGHUP対応はいらないと思います。
投稿: Yosyos | 2016年9月27日 (火) 21時47分
SK さん
なるほど。 ありがとうございます。 自動リプートが、これ一発でできるのは、すごく簡単で良いですね。 知りませんでした。
Yosyos さん
moode R2.7で試してみましたが、I2C-OLEDは、上の方法(systemd)で問題なく起動できました。 おっしゃる通りSIGHUPは なしでOKなようです。
systemdは、まだまだ日本語の情報がすくなくて迷います。 でも、高速な起動が可能なので、もう少し使い方を学びたいです。
投稿: たかじん | 2016年10月 1日 (土) 00時05分
>RaspbianやMoode Audioへ登録するときは上記
>の /home/volumio/oled_ctrl_s.py を
>/home/pi/oled_ctrl_s.py に変更します。
に気づきませんでした・・・
修正して、うちも動きました。
投稿: 通りすがりのおじさん | 2016年10月29日 (土) 21時26分
通りすがりのおじさんさん
すみません。 その文章はmoodeで動作確認後に途中で追記しました。
投稿: たかじん | 2016年10月30日 (日) 17時53分
たかじんさん
この記事を参考にさせて頂き、volumioを楽しんでおります。初歩的な質問ですが、スクリプトを自動で実行させるには、どこに”sudo systemctl enable oled_ctrl” を記録したら良いか教えて頂けませんか? 直接 sudo systemctl start oled_ctrl を実行すると正常に動くことは確認しております。 宜しくお願いいたします。
ほてい
投稿: ほてい | 2016年12月15日 (木) 13時00分
たかじんさん
runeaudioに関する別の記事から、/etc/systemd/systemの中でsudo systemctl enable oled_ctrl を実行すればよいことがわかり現在めでたく正常に動いております。
ほてい
投稿: ほてい | 2016年12月16日 (金) 06時49分
ほていさん
解決したようで、良かったです。
sudo systemctl enable oled_ctrl は自動起動へ登録するコマンドです。
説明が足りていなくてすみません。
おそらく、カレントディレクトリがどこでも大丈夫なはずです。
投稿: たかじん | 2016年12月17日 (土) 09時17分
・MoOde audio 3.1でのOLEDの設定について
お尋ねします。
「/etc/modules に i2c-dev が記載されていること」と
あるのですが、どうしてもその記載が確認できません。
volumio2での設定では以下のように確認できるのですが
「i2c-dev
i2c-bcm2708」
※MoOde 2.7でも同様でした。
・volumio2で曲を再生するとき、曲の出だし部分が
ボリュウーム以上の大音量になってしまうのですが(私だけでしょうか?)
以上の2点について、お願いします。
投稿: fu103 | 2017年2月 5日 (日) 13時43分
fu103 さん
Moodeでは、I2Cを使うDACも動作しているので、標準でI2C通信できると思います。
音量に関しては、ノーマライズがONになっているのではないでしょうか?
投稿: たかじん | 2017年2月 6日 (月) 20時10分
fu103 さん
>「/etc/modules に i2c-dev が記載されていること」と
> あるのですが、どうしてもその記載が確認できません。
書かれていないのであれば、自分で追記してみてはいかがでしょうか。
投稿: 通りすがりのおじさん | 2017年2月 6日 (月) 22時46分
返信ありがとうございます。
たかじんさま
・「I2Cを使うDACも動作している」
音については、sabreberry32、プラスともに問題なく
動作しているのですが・・・
・通りすがりのおじさん
追記しようと試みましたが、
以下のようにエラーで、はじかれました。
[ Error writing /etc/modules: Permission denied ]
しばらく試行錯誤してみます。
これからも、お願いします
投稿: fu103 | 2017年2月 7日 (火) 16時53分
fu103 さん
>以下のようにエラーで、はじかれました。
>[ Error writing /etc/modules: Permission denied ]
sudo nano /etc/modules
で編集してみてはどうでしょう?
投稿: 通りすがりのおじさん | 2017年2月 7日 (火) 22時29分
fu103 さん
I2S-DACの設定にI2Cでコマンドを送ることができているのでI2C自体は開通できているという意味でした。説明が足りていなくてすみません。
通りすがりのおじさんさん
ありがとうございます。 その通りと思います。
Permission 関係のエラーは大抵、root権限(スーパーユーザ)で実行すると解決できますね。
補足すると、
sudo はスーパーユーザで実行するというおまじないです。 実行するとパスワードを求められることがあります。
Moode Audio の場合のパスワードは raspberry
Voulumioの場合は volumio です。
投稿: たかじん | 2017年2月 8日 (水) 08時07分
通りすがりのおじさん様
助言どおりに追記し、表示できました\(^o^)/!
助かりました(2度目ですネ)
ありがとうございます!
投稿: fu103 | 2017年2月 8日 (水) 08時54分
fu103 さん
お役に立てた様で、動いて良かったです。
OLEDの表示、綺麗でカッコイイですよね!
投稿: 通りすがりのおじさん | 2017年2月 8日 (水) 21時09分
fu103 さん
表示出来たようで良かったです。
「確認すること」って無意識のうち間接的表現になっていました。
直接的文章を追記させて頂きました。
「青信号を確認してから渡りましょう」的な思考でしたが、それ以外のときの対処法を明確に書いていなくて迷ってしますよね。 大変勉強になりました。
ちなみに/etc/modules や /boot/config.txt は、WEB-UIでDAC設定などを変えると上書きされて追記した文字が消える可能性があるので、その時はまたテキストエディタで追記してください。
通りすがりのおじさんさん
助かりました。 ありがとうございます。
投稿: たかじん | 2017年2月 9日 (木) 08時49分
たかじんさん
恐縮です~
>ちなみに/etc/modules や /boot/config.txt は、WEB-UIでDAC設定などを変えると上書きされて追記した文字が消える可能性があるので、その時はまたテキストエディタで追記してください。
私の所はlircがコレでよく吹っ飛びます・・・
投稿: 通りすがりのおじさん | 2017年2月 9日 (木) 21時08分
通りすがりのおじさん
> 私の所はlircがコレでよく吹っ飛びます・・
色々と設定を見てまわると、いつの間にか消えていますよね。
投稿: たかじん | 2017年2月15日 (水) 21時01分
volumio2利用してますが、NAS上の曲目名の文字化けが激しく困りました。ファルダー名まではちゃんと日本語になります。曲名がアウトです。原因と対処方法を教えてください。PI3を利用してます。
投稿: roy | 2017年2月18日 (土) 18時31分
roy さん
おそらくID3タグの種類の問題と思います。
http://d.hatena.ne.jp/naripp/20121106/1352183856
こんな感じで文字がバケないタグの種類に変換してみてはいかがでしょうか。
volumio自体というよりもvolumioが採用しているMPDに依存しています。
投稿: たかじん | 2017年2月19日 (日) 09時45分
うまくいきました。ありがうございます。
しかし、音楽ファイルのタグの保存と削除に異常に時間がかかります。
何か操作がおかしいのでしょうか。
投稿: roy | 2017年2月19日 (日) 17時10分
roy さん
タグの変更は、ファイルひとつひとつにデータを書いていますので、それなりに時間がかかります。
とは言っても、1曲あたり3~5秒程度と思いますが。。
投稿: たかじん | 2017年2月25日 (土) 11時56分
1曲あたりの時間を計測してみます。ありごとうございます。
投稿: roy | 2017年2月25日 (土) 12時10分
roy さん
タグの書換えは一度のみですので、多少時間がかかっても我慢するしかないですね。
投稿: たかじん | 2017年2月28日 (火) 23時18分
OLED表示はここが最新情報でしょうか。scriptどうもありがとうございます。
メインの環境はOLEDやらリモコンやらつけているのでついおっくうになってしまいますが、ようやくMoodeAudioを3.6に更新したので久々に表示の設定をしました。
/etc/modulesにi2c-devを追加、python-smbusとkakasiをinstallした後、oled_ctrl_s.pyをwgetしてMoodeのGUIから登録するだけでOKでした。しばらく使ってますが、不具合もなさそう。
2.5からアップデートしていなかったので、さすがに隔世の感があります。ご報告まで。
投稿: h.imagine | 2017年4月30日 (日) 04時31分
h.imagineさん
OLEDのスクリプトは、これが最新です。 動作報告、ありがとうございます。
moodeは安定して動作するので、特に不都合がなければ、無理にバージョンを上げることもないと思います。
おそらく3.1で殆どの人が満足するのではないでしょうか。 とは言っても3.1がダウンロードできなくなってしまったので、10ドルを払って3.6を使うことになりますね。
これだけのソフトウェアですから、10ドルでも安いとは思います。
投稿: たかじん | 2017年4月30日 (日) 09時58分
たかじんさん
Moode3.6に更新されたんですね。
irberry DACに、moode3.5を入れ、このOLEDスクリプトで動かしております。
リモコンのスクリプトを組み込んで、起動部分を
このsystemdの組み込み方を参考にし書き直して動きました。
また、下記は、もう要らないかなと思い、省きました。
// #/etc/apt/sources.list に下記の一行を追加します。
// deb http://archive.raspberrypi.org/debian/ wheezy main
irberryもMoode3.5で動いております。
投稿: toto | 2017年4月30日 (日) 11時41分
toto さん
スクリプトのsystemd登録、素晴らしいです。
確かにsourceslistへの追記はいらないですね。
Moodeは有料版で、起動時間が短くなったような気がしますね。
動作が軽ければPi 1でもストレスなく使えると思います。
投稿: たかじん | 2017年5月 2日 (火) 06時36分
はじめまして サイト拝見させて頂き 初心者ながらもようやく
OLEDにて表示出来ましたが kakasi not foutと OLEDに表示が出て sshでkakasiを確認しましたが 問題ないのですが
makeコマンドが受け付けません
ご意見有りましたら 宜しくお願いします
投稿: kazzboo | 2017年5月28日 (日) 09時44分
kazzboo さん
もうちど apt-get でkakasiをインストールしてみるとか。
apt-getでインストールするとmakeする必要はありません。
なんとなくですが、kakasiがある場所にpathが通っていないようにも見えますね。
投稿: たかじん | 2017年5月28日 (日) 12時36分
返信有難うございます
仕事の関係でなかなかトライできませんが
時間のある時にもう一度 やってみたいと思います
有難うございました^^
投稿: kazzboo | 2017年5月29日 (月) 09時52分
VOLUMIOを再インストールしたいのですが、秋月OLED用のファイルが見つからないのですが、どこか別の場所に移動したのでしょうか?
投稿: ほてい | 2017年9月 2日 (土) 16時08分
ほていさん
https://nw-electric.way-nifty.com/blog/files/oled_ctrl_s.py
ここにありますよ。 wgetできないとき、再起動するとgetできたりすることもあります。
それでだめなら、WinSCPでファイル転送するのもアリです。
投稿: たかじん | 2017年9月 2日 (土) 20時39分
たかじんさん
ご連絡ありがとうございます。
何度かwgetを行ったのですがうまくゆかなかったのでコメントを致しました。
再度トライしてみます。
投稿: ほてい | 2017年9月 3日 (日) 06時12分
たかじんさん
ただいまVOLUMIOの再インストールに成功いたしました。
ありがとうございました。
投稿: ほてい | 2017年9月 3日 (日) 06時47分
ほていさん
よかったです。 おそらくルーターとの相性で、gatewayがちゃんと設定されなかったりしてインターネット上に出て行けないことがあるのだと思います。
apt-get update でIgn が連発するときなども、これに相当すると思います。
投稿: たかじん | 2017年9月 3日 (日) 08時21分
プラグインドライバ化の予定はありますでしょうか?
投稿: | 2017年10月13日 (金) 18時19分
なるほど。 それは考えていませんでした。
やってみるのも良いかもしれませんね。
ただ、あのプラグインの仕組みが難解で、うまくいくかどうかは分かりません。
投稿: たかじん | 2017年10月13日 (金) 21時29分
Volumio Ver2.296 でもうまく動作しています。
秋月の16文字×2行のOLED SO1602を使っていますが,より表示桁数の多い20文字×2行のSO2002でも同じように表示できますが,表示桁数を変更したいときは,oled_ctrl_s.pyのどこを変更したら良いでしょうか? 16を20に書き換えて
if self.maxlen > sp + 20:
self.maxlen = sp + 20
とした場合,曲名は20桁でうまくスクロールしますが,その他の表示で16桁以上のところにゴミが出ます。
投稿: masa | 2017年11月 1日 (水) 13時16分
https://www.kickstarter.com/projects/nanomesher/nanosound-all-in-one-hifi-audio-board-for-raspberr
kickstarter日本版ができてますね。volumioを核にして色んな試みがでてきますね。やはり海外は元気いいなあ。
smpd版でこういうのどうですか。たかじんさんとパパリウスさんがタッグを組んで。kickstarterでやるなら、寄付しますよ。笑
投稿: takobozu | 2017年11月 1日 (水) 20時08分
masa さん
初期化のときに、スペースで埋めてしまうことでゴミ表示が消せると思います。
takobozu さん
kickstarterの日本語版ですか。 クラウドファンディングも参加しやすくなりましたね。
volumioとRaspberryPi+DACの組み合わせ、これが3年前ならウケたでしょうね。
すでに、誰もが簡単に作れるってのがネット検索でヒットするのでなにか特別な特徴がないと厳しいのではないかとも思います。
OLEDに日本語表示が出せるというのは良いですね。日本人が作ってる?
投稿: たかじん | 2017年11月 2日 (木) 08時30分
たかじんさん
なるほど、時代遅れなわけですね。笑
自分でやりたい人にとっては、何をいまさらという感じですか。
ご回答ありがとうございました。
投稿: takobozu | 2017年11月 2日 (木) 09時18分
たかじんさん
以前のスクリプトでは、stop中には、IPアドレスが表示されて便利でしたが、最新のでは、表示されてきません。
スクリプトを見ると、出そうな感じで書かれてあるのですが、初心者ゆえ、まだ原因をつきとめられておりません。
投稿: イワン | 2018年1月 2日 (火) 00時42分
イワンさん
新しいMoodeAudioで試してみたら、エラーでてました。
修正したものをUPしたので、もう一度スクリプトをダウンロードしてください。
よろしくお願いいたします。
投稿: たかじん | 2018年1月 2日 (火) 17時21分
たかじんさん
完璧です!
お忙しい、お正月の時間に対応していただき、本当にありがとうございます。
超初心者ゆえ、手順が間違っているかもしれませんか、このようにしました。
sudo rm oled_ctrl_s.py
wget https://nw-electric.way-nifty.com/blog/files/oled_ctrl_s.py
sudo reboot
これから、勉学のために、新旧でのファイルの違いを確認させていただきます。
投稿: イワン | 2018年1月 3日 (水) 04時44分
イワンさん
いえいえ、不具合報告ありがとうございました。 pythonライブラリが更新された為か、以前のスクリプトだと正しく取得できなくなっていたようです。
手順、大丈夫です。 古いスクリプトが残っていると別名保存になってしまうので、最初に削除するので正解です。
よろしくお願いします。
投稿: たかじん | 2018年1月 3日 (水) 16時59分
たかじん様
お世話になります。
先日はご丁寧なアドバイスいただきありがとうございました。
あれからOLEDを購入し、時間を見つけてこのページの記載を試してみました。
結果、
1..秋月 有機ELキャラクタディスプレイモジュール 16x2行 白色
で試したところ
うまく表示できました。
.けれども
2.スイッチサイエンス Adafruit PiOLED
で試すと画面は出るのですが、文字が崩れてまともに表示ができませんでした。
他の方のコメントから推測して
sudo nano /usr/bin/python2 /home/volumio/oled_ctrl_s.py
をいじればいいのかとコマンドを打ってみると
WINDOWSのコンソール画面の表示が文字化けして??
な状態です。。
LINUXを使い慣れている方々から見ると基礎中の基礎なのかもしれませんが、初級者の当方はなかなか苦労している次第です。
まだ道のりは遠そうです(苦笑)
投稿: たと | 2018年1月29日 (月) 00時07分
たとさん
そのOLEDはグラフィックタイプなのでフォントデータで文字を作ってドット単位でデータを送る必要があります。
ちょっとの改造でどうにかなるものではありません。
新規で作るしかないです。
投稿: たかじん | 2018年1月29日 (月) 22時07分
たかじん様
回答ありがとうございます。
グラフィックタイプとキャラクタタイプで違うんですね、、、
ポータブルで表示できるできるだけ小型のOLEDを探していたのですが、理解していませんでした。
キャラクタタイプで小型の物をさがしてみたいと思います。
投稿: たと | 2018年2月 1日 (木) 00時41分
たとさん
グラフィックタイプ用のプログラムを作るというのも面白いかもしれませんね。 そうすれば、日本語でも曲名を表示することが可能になると思いますし。
投稿: たかじん | 2018年2月 5日 (月) 22時29分
たとさん たかじんさん こんにちは
SSD1306チップのものは、I2Cのグラフィックタイプらしいですが
ライブラリーを使うことにより、表示できそうです。
http://www.mana-cat.com/entry/PiOLED
このチップを使った、OLEDは、スイッチサイエンスより販売されております。
「aitendo」には、SSD1306チップを搭載したOLEDがいろいろあります。
http://www.aitendo.com/product-list?keyword=OLED&Submit=検索
aitendoのものは、KITだと、細かい配線が大変そうなので、完成品を選んだ方が良いでしょうね。
投稿: toto | 2018年2月 6日 (火) 17時55分
toto さん
いいですね。これ。 情報ありがとうございます。
このOLEDに表示が出せると、かこいいです。
投稿: たかじん | 2018年2月10日 (土) 14時35分
色々な情報を頂いてします。ありがとうございます。
Volumio1.5で使っていたのですが、Volumio2からプラグインでSpotifyを再生ソースにできるのを知り、再度こちらのサイトを拝見し、Volumio2にしSpotifyのプラグインを入れ再生できました。
で、ローカルのファイルやNAS上のファイルを再生する場合は問題ないのですが、プラグイン管理から、Spotify plugin for Volumio2をインストールしSpotifyのPlaylistを再生すると、再生ソースの情報が表示されません。
(表示は、1行目:STOP 2行目:IPアドレスのまま)
何かが違うのだと思いますが、Spotifyがソースの場合は未対応ということなのでしょうか?
RaspberryPI2と、こちらで紹介されている秋月の有機ELキャラクタディスプレイモジュールを使用しています。
volumio 2.378です。
投稿: | 2018年3月21日 (水) 06時31分
こんにちは。
この記事の冒頭部に書いているとおり、MPDというソフトウェアから曲の情報を得ています。
つまり、MPD以外のソフトウェア、たとえばairpalyやmpg123、aplayで再生しても曲名は表示されません。 残念ながらSpotify connectもです。
よろしくお願いします。
投稿: たかじん | 2018年3月21日 (水) 09時28分
たかじん様
ご回答ありがとうございます。
そうでした、MPDから情報を取得するように変更しましたって、冒頭部に書いありましたね。早とちりしてしまいました。
お手数をおかけしてごめんなさい。
投稿: | 2018年3月24日 (土) 18時07分
たかじんさん、初めまして。
先日SB32+PRO DoPを購入し、Pi4に繋いで使用しております。
とても高精細で素晴らしい音を奏でてくれて、感動しております。
まだ電源は整備できておりませんが、最初にヘッドフォンで試聴したところ、音に気を奪われ、気付けば夜が明けておりました。
古い記事へのコメントと、以下不躾な質問をお許しください。
シャシーデザインの都合で、どうしても40文字2行のOLEDを使用したく、AL4002Aというモデルを取り寄せました。
https://www.lcd-modules.com.tw/upload/web/AL/AL4002A.pdf
I2Cに変換して繋ぎ、かすかな期待を元に当スクリプトを走らせましたが、まともには表示されませんでした。
文字化けしたものが表示され、カーソルが動いたり、映らなかったり、点滅したりと、何某か動きはあるのですが誤表示にもなかなか一貫性が見出せなかったもので、基板が合ってないのか、ピンアサインが間違っているのか等々、悩みましたが、こちら様
https://osoyoo.com/ja/2016/06/01/drive-i2c-lcd-screen-with-raspberry-pi/
のテストプログラムi2clcda.pyを走らせたところ、40文字幅で問題なく表示されました。
イニシャライズに失敗しているのでしょうか。
AL4002Aも、1行目端0x80、2行目端0XC0は変わらないようです。
問題の所在がどのあたりにあるのか、なかなか見当もつかずでおります。
どうにか解決の糸口を見つけたく、誠に身勝手ではございますが、ご助言頂けますと幸いです。
宜しくお願い致します。
投稿: こじまる | 2020年2月16日 (日) 23時44分
こじまるさん
SB32+PRO DoPのご購入、ありがとうございます。
https://www.lcd-modules.com.tw/upload/web/AL/AL4002A.pdf
こちらの情報では、外形とピンアサインくらいしか判らず、何とも言えません。
I2CをパラレルIOに変換したとのことで、その変換のほうも情報がなく、どこに問題があるのか不明です。
動作したというテストプログラムi2clcda.py のイニシャライズ部分をoled_ctrl_s.pyに移植してみてはいかがでしょうか?
イニシャライズ方法や、タイミングは、LCDの仕様によって若干の違いがあります。
投稿: たかじん | 2020年2月17日 (月) 21時14分
ご返答ありがとうございます。不十分な情報で申し訳ございません。
変換にはaitendoのこちらを使用しました。アドレスは0x27に設定されております。
http://www.aitendo.com/product/7404
MPDはVolumio2です。
マージを試みたいのですが、理解が乏しく、
特にself, init辺りの勝手が分からず、手をつけられておりません。
質問させて頂くのも筋違いと思いますので、大変恐縮ですが、
以下の手続きでstring表示が出来ております。
―――省略―――
# Define some device parameters
I2C_ADDR = 0x27
OLED_WIDTH = 40
# Define some device constants
OLED_CHR = 1 # Mode - Sending data
OLED_CMD = 0 # Mode - Sending command
OLED_LINE_1 = 0x80 # OLED RAM address for the 1st line
OLED_LINE_2 = 0xC0 # OLED RAM address for the 2nd line
ENABLE = 0x04 # Enable bit
# Timing constants
E_PULSE = 0.0005
E_DELAY = 0.0005
#Open I2C interface
bus = smbus.SMBus(1)
def OLED_init():
# Initialise display
OLED_byte(0x33,OLED_CMD) # 110011 Initialise
OLED_byte(0x32,OLED_CMD) # 110010 Initialise
OLED_byte(0x06,OLED_CMD) # 000110 Cursor move direction
OLED_byte(0x0C,OLED_CMD) # 001100 Display On,Cursor Off, Blink Off
OLED_byte(0x28,OLED_CMD) # 101000 Data length, number of lines, font size
OLED_byte(0x01,OLED_CMD) # 000001 Clear display
time.sleep(E_DELAY)
def OLED_byte(bits, mode):
―――省略―――
投稿: こじまる | 2020年2月18日 (火) 15時07分
Python学びます。
投稿: こじまる | 2020年2月18日 (火) 15時12分
こじまるさん
なるほど。aitendoですか。
ちらっと見たら、単純なI2C-8bitパラレル変換ICを使っているみたいですね。
I2CのOLEDやLCDにはない、8bitモード、4bitモードの起動シーケンスというのがパラレルI/FのLCDにはあります。その初期化の方法(タイミング)がAL4002Aの仕様には書いていません。
また、RW,CS,E端子の処理、2行表示、4行表示の設定も注意が必要かもしれません。
I2C-OLEDは、勝手にやってくれているので、いきなりディスプレイONから始められるのです。
投稿: たかじん | 2020年2月18日 (火) 23時35分
そうなんですね!だいぶ焦点が絞れてきました。
ありがとうございます。
投稿: こじまる | 2020年2月19日 (水) 01時02分
こじまるさん
http://219.117.208.26/~saka/ham/LCD2/
ここにパラレルI/Fの詳しい説明がありました。
HD44780という日立のLCD駆動ICのコンパチ品がよく使われています。初期化シーケンスの待ち時間がICによって若干違ったりします。
投稿: たかじん | 2020年2月22日 (土) 09時21分
たかじんさん
ご親切にありがとうございます!
その後、ks0066というチップがコントローラーのようでしたので、
以下データシートに行きつき、
https://www.lcd-module.de/eng/pdf/zubehoer/ks0066.pdf
たかじんさんの仰ってたタイミングの意味や、
コードの示す16進数が何にあたっているのか把握し、理解できてきたところでした。
CGRAM直接叩いて、キャラクタも作成できそうです…が、
Python自体をまだうまく書けず、実行に失敗しています。
上記i2clcda.pyベースの手続きでは、4bitで動作していました。
たかじんさんのコードでは、i2cというクラスの中で定義され、
最後のmainで一気に呼び出されており、
分からないながらにも、スマートだなぁとお見受けするのですが、
selfで参照させるように書き換えるにはまだ理解が不足しております。
雑な方法だと思いますが、クラスの外にi2clcda.pyイニシャライズ部を移植し、
string部分のみは、そちらのfunctionを読むように試みましたが、
それもまだ動作には至っておらずです。
投稿: こじまる | 2020年2月22日 (土) 15時52分
こじまるさん
2つの仕様書(パラレルI/F-LCDとI2C-OLED)を見比べながら、2つのソースコードを読み解くのは骨の折れる作業です。頑張ってください。
私の書いたoled_ctrl_s.py では、def init(self): という名称の関数にしているものの、I2C-OLEDでのイニシャライズは display On のコマンドひとつです。
self.bus.write_byte_data(self.addr, 0, 0x0c) # Display ON
の1行
ここが、パラレルI/FのLCD駆動ICとは根本的に異なる部分です。
パラレルI/Fは8bit接続と4bit接続で、おまじないコマンドを送りながら設定するイニシャライズ処理が必要ですね。更に4bit接続では、その後も2回づつ送る必要があるのが特徴です。
また、 try: except IOError: というのは、I2C通信エラーに対応するものですが、ちょっとコードを読みにくくしてしまいますね。
I2C通信にはエラー発生はつきものなので、Pythonが不用意に停止しないために必要になります。
投稿: たかじん | 2020年2月23日 (日) 00時32分
ありがとうございます。
>4bit接続では、その後も2回づつ送る
そうなのですね。今日教えて下さった先を読んで分かりました。
今後4,5日は作業時間がとれなさそうで、大変もどかしいのですが、
特にピン数を節約する必要もないので、まずは8bitで動作するよう書き換えることから試してみたいと思います。
self.bus.write_byte_data(self.addr, 0, 0x0c) の真ん中の0は、RS,R/Wが0という認識で大丈夫でしょうか?
投稿: こじまる | 2020年2月23日 (日) 02時26分
こじまるさん
変換ICが8bitしかないので、LCDのデータbit以外のポートRW、E、RS端子を駆動するので、おそらく4bit接続しかできないと思います。
> self.bus.write_byte_data(self.addr, 0, 0x0c) の真ん中の0は、RS,R/Wが0という認識で大丈夫でしょうか?
http://akizukidenshi.com/catalog/g/gP-08277/
こちらのデータシートをご覧ください。このOLEDでは、D/C#というビットがあって操作してます。 「0x00」ではコマンドで、「0X40」でデータです。 bit位置が中途半端ですが、RSと同等ですね。
self.bus.write_i2c_block_data(self.addr, 0x40, moji) というところで、連続して文字データを送ってます。
投稿: たかじん | 2020年2月25日 (火) 19時08分
たかじんさん
ありがとうございます!
お礼申し上げるのが遅くなりましたが、いくら8bitでイニシャライズしようにもうまく行かなかった理由が分かりました。
結局Pythonに詳しい友人の手を借りてですが、おかげさまで、表示に至りました。
まだ少々調整が必要ですが、嬉しいです。
ようやくシャシーの加工に移れそうです。ありがとうございます。
投稿: こじまる | 2020年3月 6日 (金) 12時44分
URLに現況画像入れました。
投稿: こじまる | 2020年3月 6日 (金) 12時45分
こじまる さん
写真ありがとうございます。 これ良いですね。 すごく見やすい。
どこで売っているのでしょうか?
投稿: たかじん | 2020年3月 7日 (土) 08時44分
こちら秋月のSO1602Aと同じSunlike製なのですが、確実に販売しているであろう代理店が見当たらず、ドイツのmidiphyというお店が補修部品で取り扱っているのを見つけたため、そちらから購入しました。
https://www.midiphy.com/en/shop/185/General-Parts-OLEDs/Displays
直送すると高いですが、ドイツ在住者介して普通郵便で送って貰うと1000円かからないくらいでした。
投稿: こじまる | 2020年3月 7日 (土) 20時23分
こじまるさん
購入先情報ありがとうございます。
難易度が高いですね。。。
秋月電子に部品リクエストでもしてみます。
投稿: たかじん | 2020年3月 7日 (土) 21時20分
こんにちは。
2ndロットのSB32+PRO DoP使って今日までトラブルも無く音楽を楽しませて頂いています。
musicplayerはmoodeです。
OLEDも付けて表示をしていますが、DSD128の音源を再生した際のビット表示と周波数表示が2bit/11289...と倍の値で表示しています。(PCM音源での表示は問題ないようです。)
当初はvolumio使ってましたがDSD表示は正しく表示されていたように思いますが、moodeはver5時代から使い始めましたが最初から2倍の値で表示していたと思います。
音楽聴く上においては何ら問題ありませんが、もしお気づきの点がありましたらご教授ください。
よろしくお願いします。
投稿: エムタク | 2020年7月 7日 (火) 15時59分
エムタクさん
ご利用ありがとうございます。DSD時のバグですね。
何かおかしかったことに気が付いていたのですが、しばらく放置しておりました。
https://github.com/Takazine/mpd_oled_ctrl/blob/master/oled_ctrl_s.py
ここのソースコードの193行目あたりからの数行が怪しいです。
時間がとれましたらデバッグしてみます。
よろしくお願いします。
投稿: たかじん | 2020年7月 8日 (水) 23時44分
エムタクさん
たかじんさん
こんにちは、FlatTwinです。
自分もSB32DoPおよびOLEDを使っていますが、OLEDだけでなく、コントロールソフトのBubbleUpnpでも2倍で表示されます。
取り急ぎご報告まで。
投稿: FlatTwin | 2020年7月 9日 (木) 07時32分
FlatTwin さん
なるほど。 ということは、MPDからの応答がそういう仕様に変ったのかMPD自体のバグかもしれませんね。
MPDクライアントソフトは、基本的にはMPDからの応答を表示しているに過ぎないですから。
投稿: たかじん | 2020年7月 9日 (木) 07時39分
たかじんさん
お手数をお掛けしてします。
よろしくお願いします。
投稿: エムタク | 2020年7月 9日 (木) 16時59分
たかじんさん
こんにちは、FlatTwinです。
MPDの仕様とたかじんさんのスクリプトの内容、調べてみました。
結果、以下のことが分かりました。
〇 MPDでDSD再生時のビットレートが2倍表示される件は、バグ対応の結果でした。
2019年9月、0.21.15リリース時に修正されています。
このバグ修正は、「再生時のビットレートが1チャンネル分の値になっている」バグに対応するものです。
2倍で表示されるのは、「2チャンネル(LとR)あるから」という理由です。
しかし、MPDのDSDプラグインでは、「サンプルレート」と「ビットレート」が切り分けられていないという根本的な問題があります。
このため、MPDが発信する情報は「ビットレート」だけとなり、「サンプルレート×チャンネル数」の値が表示されていたのです。
自分はMPDをセルフビルドしているので、該当部分をバグ修正前の状態の戻してビルドしたところ、こちらの意図したとおりに表示されるようになりました。
再生音にも問題ありません。
〇OLED表示スクリプトには、バグがありました。
たかじんさんも書かれているように、193行目と197行目のif文に誤りがあります。
(誤) if audio_val[1] == 'dsd':
(正) if audio_val[1] == '2':
DSDの場合、「audio_val[1]」の値は「2」となるようです。
※もしかしたらこの値もチャンネル数と関連しているかもしれませんが、そこまでは確認できていません。
ここを修正すると、意図した形式での表示になります。
ただし、MPDから取得できる値(ビットレート)は2倍(正しくはチャンネル数倍)であるため、値そのものは意図したとおりにはなりません。
自分はMPDを修正したので正しい(と自分で考える)表示になっています。
もしOLED表示だけの問題であれば、DSD時にはビットレートをチャンネル数で割った値を算出して表示させればよいと考えます。
以上、ご報告でした。
投稿: FlatTwin | 2020年7月19日 (日) 12時13分
FlatTwin さん
ありがとうございます。
スクリプトのバグとMPDの仕様変更とがあったのですね。
助かります。
私の方でもテストしてみようと思います。
投稿: たかじん | 2020年7月19日 (日) 21時05分
こんにちは。
moodeのDSDのビットレートとサンプリング周波数の表示の件ですが、moode Ver.7から正しく1bit/5.644MHzと表示されるようになりましたことご報告させて頂きます。
投稿: エムタク | 2020年12月20日 (日) 13時05分
エムタクさん
ありがとうございます。 どうやら、MPDのDSD周りは、しっかした方針が決められていないような気配を感じますね。
提供されるDSD音源も、PCMレコーディングものをDSD変換したものか、旧来のアナログテープからの起こしなおしばかりで、本来のDSDレコーディング->DSD配信(SACDリリース)というのがあまり見つかりません。
結局、ミキシングや音量調整、EQ、コンプリミッターなどの加工はPCMに頼らざるを得ないため、DSDデータは使い勝手が悪いという判断なのかもしれません。
PCMレコーディングだって良い録音沢山ありますし。。。
投稿: たかじん | 2020年12月23日 (水) 19時24分
初めまして、たかじんさん。
現在pi3+ +dac+volumio2をwi-fiで鳴らしおりますがこの記事にあるoledによる表示にチャレンジしています。sshTera Termで入り導入手順に従いコマンドを打ちますが次のコマンド
sudo nano /etc/systemd/system/oled_ctrl.service
のところで下記のエラーメッセージがでて通りません。
========================================================================
Volumio Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
volumio@volumio:~$ sudo nano /etc/systemd/system/oled_ctrl.service
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for volumio:
========================================================================
と表示されキーインプットが出来ず又、コマンドプロンプトvolumio@volumio:~$ が表示されずこの後のプログラムに進むことが出来ません。プログラムは全くの初心者です。何かご教示宜しくお願い致します。
投稿: k2 | 2020年12月27日 (日) 02時01分
k2さん
最後の1行 [sudo] password for volumio:
のところでパスワードを入れるのです。
volumio と入れてください。
投稿: たかじん | 2020年12月27日 (日) 20時46分
たかじんさん
早速の回答いただきありがとうございました。ご指示の通り
パスワードを入れたところ表示できました。
起動時に自動で実行させることもできました。Displayがある
ことによりaudio playerとしての魅力が増し満足しています。
このあとはケースに入れて楽しみます。ありがとうございました
投稿: k2 | 2020年12月27日 (日) 22時53分
k2 さん
動作したとのこと、良かったです。
曲名表示などがあれば、雰囲気がだいぶ違ってきますよね。
投稿: たかじん | 2020年12月30日 (水) 13時12分
約9年ぶりにIrberryを起動し、新しいSDカードにVolumio2.917をインストールして、見事に復活しました。この記事のおかげでOLED化にも成功しています。
起動に2分近くかかりますが、AirPlayでも鳴るので非常に便利です。
色々なファイルを置いていただき、ありがとうございました。
投稿: すずかけ | 2024年6月22日 (土) 23時27分
すずかけさん
IrBerry 懐かしいです。 ご愛用ありがとうございます。 ラズパイによる再生で感動したのを思い出しました。 Volumio2.9でも動くのですね。 素晴らしい。
そうそう、Airplay 便利ですよね。 Bluetoothより確実に音が良いです。
投稿: たかじん | 2024年6月24日 (月) 20時07分
すずかけさん
私もIrBerryDACを再登板させたいと考えているのですが、
OLED表示を生かせてそこそこの起動時間で使えるOSはないかなぁ?
と悩んでいます。
たかじんさん作のZMPDは軽量化しているようですが
OLED表示の言及が無いし・・・
ZMPDはSabreBerry+とZeroDACで動かしているので
IrBerryでは別のOSにしたい、です。
Volumio2.917って、上手く見つけられないのですが、
どのあたりを漁ればよろしいのでしょうか?
教えて君で恥ずかしいですが。
投稿: sawanoriichi | 2024年6月24日 (月) 21時39分
sawanoriichi さん
試したことはないのですが、ZMPDも基本的に同じ構成のLinuxですのでOLEDも使えると思います。
https://updates.volumio.org/pi/volumio/2.917/volumio-2.917-2021-10-06-pi.img.zip
この辺ですかね。
投稿: たかじん | 2024年6月26日 (水) 20時30分
たかじんさん
コメントありがとうございます。
ZMPDのOLED導入は、
はるか以前のVolumio2への導入手順で対応可能
と言う理解をいたしました。
こりゃ、今から夏休みの宿題が決まったような気がします。
でも、VFA-01とALX-03 のケース加工とBlueWindDAC組み立ても
渋滞中であります。(笑)
投稿: sawanoriichi | 2024年6月26日 (水) 20時53分
おっと、このコメントを付けた記事だった・・・・
投稿: sawanoriichi | 2024年6月26日 (水) 22時59分
sawanoriichi さん
基板の渋滞・・・ 長い夏休みになりそうですね。
投稿: たかじん | 2024年6月28日 (金) 08時15分