Select Your Language

免責事項

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

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

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

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

スポンサー

無料ブログはココログ

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

2016年9月14日 (水)

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

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

見た目は、そんなに変わりません。

 

※ githubにupしました。こちらからどうぞ。

I2C配線方法はこちら。

Oled_r2 

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

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

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

 

これはメリットとして言えるかどうかは分かりませんが、mpdが動いている別のサーバーのIPアドレスを指定すると、そのmpdの状態も表示することもできます。

Oled_r3

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

 

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

 

以下は、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  が記載されていることを確認します。

(なければ追記します。 )

 

 

 

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

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 さん

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

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さん

OLEDのスクリプトは、これが最新です。 動作報告、ありがとうございます。

moodeは安定して動作するので、特に不都合がなければ、無理にバージョンを上げることもないと思います。
おそらく3.1で殆どの人が満足するのではないでしょうか。 とは言っても3.1がダウンロードできなくなってしまったので、10ドルを払って3.6を使うことになりますね。
これだけのソフトウェアですから、10ドルでも安いとは思います。

たかじんさん
Moode3.6に更新されたんですね。
irberry DACに、moode3.5を入れ、このOLEDスクリプトで動かしております。
リモコンのスクリプトを組み込んで、起動部分を
このsystemdの組み込み方を参考にし書き直して動きました。
また、下記は、もう要らないかなと思い、省きました。
// #/etc/apt/sources.list に下記の一行を追加します。
// deb http://archive.raspberrypi.org/debian/ wheezy main
irberryもMoode3.5で動いております。

toto さん

スクリプトのsystemd登録、素晴らしいです。 
確かにsourceslistへの追記はいらないですね。
Moodeは有料版で、起動時間が短くなったような気がしますね。
動作が軽ければPi 1でもストレスなく使えると思います。

はじめまして サイト拝見させて頂き 初心者ながらもようやく
OLEDにて表示出来ましたが kakasi not foutと OLEDに表示が出て sshでkakasiを確認しましたが 問題ないのですが
makeコマンドが受け付けません
ご意見有りましたら 宜しくお願いします

kazzboo さん

もうちど apt-get でkakasiをインストールしてみるとか。

apt-getでインストールするとmakeする必要はありません。

なんとなくですが、kakasiがある場所にpathが通っていないようにも見えますね。

返信有難うございます
仕事の関係でなかなかトライできませんが
時間のある時にもう一度 やってみたいと思います

有難うございました^^

VOLUMIOを再インストールしたいのですが、秋月OLED用のファイルが見つからないのですが、どこか別の場所に移動したのでしょうか?

ほていさん

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

ここにありますよ。 wgetできないとき、再起動するとgetできたりすることもあります。
それでだめなら、WinSCPでファイル転送するのもアリです。

たかじんさん
ご連絡ありがとうございます。
何度かwgetを行ったのですがうまくゆかなかったのでコメントを致しました。
再度トライしてみます。

たかじんさん
ただいまVOLUMIOの再インストールに成功いたしました。
ありがとうございました。

ほていさん

よかったです。 おそらくルーターとの相性で、gatewayがちゃんと設定されなかったりしてインターネット上に出て行けないことがあるのだと思います。

apt-get update でIgn が連発するときなども、これに相当すると思います。

プラグインドライバ化の予定はありますでしょうか?

なるほど。 それは考えていませんでした。
やってみるのも良いかもしれませんね。 

ただ、あのプラグインの仕組みが難解で、うまくいくかどうかは分かりません。

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桁以上のところにゴミが出ます。

https://www.kickstarter.com/projects/nanomesher/nanosound-all-in-one-hifi-audio-board-for-raspberr

kickstarter日本版ができてますね。volumioを核にして色んな試みがでてきますね。やはり海外は元気いいなあ。
smpd版でこういうのどうですか。たかじんさんとパパリウスさんがタッグを組んで。kickstarterでやるなら、寄付しますよ。笑

masa さん

初期化のときに、スペースで埋めてしまうことでゴミ表示が消せると思います。

takobozu さん

kickstarterの日本語版ですか。 クラウドファンディングも参加しやすくなりましたね。 
volumioとRaspberryPi+DACの組み合わせ、これが3年前ならウケたでしょうね。
すでに、誰もが簡単に作れるってのがネット検索でヒットするのでなにか特別な特徴がないと厳しいのではないかとも思います。
OLEDに日本語表示が出せるというのは良いですね。日本人が作ってる?

たかじんさん

なるほど、時代遅れなわけですね。笑
自分でやりたい人にとっては、何をいまさらという感じですか。
ご回答ありがとうございました。

たかじんさん
 以前のスクリプトでは、stop中には、IPアドレスが表示されて便利でしたが、最新のでは、表示されてきません。
スクリプトを見ると、出そうな感じで書かれてあるのですが、初心者ゆえ、まだ原因をつきとめられておりません。

イワンさん

新しいMoodeAudioで試してみたら、エラーでてました。
修正したものをUPしたので、もう一度スクリプトをダウンロードしてください。

よろしくお願いいたします。

たかじんさん
 完璧です!
お忙しい、お正月の時間に対応していただき、本当にありがとうございます。

超初心者ゆえ、手順が間違っているかもしれませんか、このようにしました。
sudo rm oled_ctrl_s.py

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

sudo reboot

これから、勉学のために、新旧でのファイルの違いを確認させていただきます。

イワンさん

いえいえ、不具合報告ありがとうございました。 pythonライブラリが更新された為か、以前のスクリプトだと正しく取得できなくなっていたようです。

手順、大丈夫です。 古いスクリプトが残っていると別名保存になってしまうので、最初に削除するので正解です。

よろしくお願いします。

たかじん様

お世話になります。
先日はご丁寧なアドバイスいただきありがとうございました。

あれからOLEDを購入し、時間を見つけてこのページの記載を試してみました。

結果、
1..秋月 有機ELキャラクタディスプレイモジュール 16x2行 白色
で試したところ
うまく表示できました。

.けれども
2.スイッチサイエンス Adafruit PiOLED
で試すと画面は出るのですが、文字が崩れてまともに表示ができませんでした。

他の方のコメントから推測して
sudo nano /usr/bin/python2 /home/volumio/oled_ctrl_s.py
をいじればいいのかとコマンドを打ってみると
WINDOWSのコンソール画面の表示が文字化けして??
な状態です。。

LINUXを使い慣れている方々から見ると基礎中の基礎なのかもしれませんが、初級者の当方はなかなか苦労している次第です。

まだ道のりは遠そうです(苦笑)


たとさん

そのOLEDはグラフィックタイプなのでフォントデータで文字を作ってドット単位でデータを送る必要があります。
ちょっとの改造でどうにかなるものではありません。
新規で作るしかないです。

たかじん様

回答ありがとうございます。
グラフィックタイプとキャラクタタイプで違うんですね、、、

ポータブルで表示できるできるだけ小型のOLEDを探していたのですが、理解していませんでした。

キャラクタタイプで小型の物をさがしてみたいと思います。

たとさん

グラフィックタイプ用のプログラムを作るというのも面白いかもしれませんね。 そうすれば、日本語でも曲名を表示することが可能になると思いますし。

たとさん たかじんさん こんにちは

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 さん

いいですね。これ。 情報ありがとうございます。
このOLEDに表示が出せると、かこいいです。

色々な情報を頂いてします。ありがとうございます。
Volumio1.5で使っていたのですが、Volumio2からプラグインでSpotifyを再生ソースにできるのを知り、再度こちらのサイトを拝見し、Volumio2にしSpotifyのプラグインを入れ再生できました。
で、ローカルのファイルやNAS上のファイルを再生する場合は問題ないのですが、プラグイン管理から、Spotify plugin for Volumio2をインストールしSpotifyのPlaylistを再生すると、再生ソースの情報が表示されません。
(表示は、1行目:STOP 2行目:IPアドレスのまま)
何かが違うのだと思いますが、Spotifyがソースの場合は未対応ということなのでしょうか?

RaspberryPI2と、こちらで紹介されている秋月の有機ELキャラクタディスプレイモジュールを使用しています。
volumio 2.378です。

こんにちは。

この記事の冒頭部に書いているとおり、MPDというソフトウェアから曲の情報を得ています。

つまり、MPD以外のソフトウェア、たとえばairpalyやmpg123、aplayで再生しても曲名は表示されません。 残念ながらSpotify connectもです。

よろしくお願いします。

たかじん様

ご回答ありがとうございます。

そうでした、MPDから情報を取得するように変更しましたって、冒頭部に書いありましたね。早とちりしてしまいました。
お手数をおかけしてごめんなさい。

たかじんさん、初めまして。
先日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は変わらないようです。
問題の所在がどのあたりにあるのか、なかなか見当もつかずでおります。
どうにか解決の糸口を見つけたく、誠に身勝手ではございますが、ご助言頂けますと幸いです。
宜しくお願い致します。

こじまるさん

SB32+PRO DoPのご購入、ありがとうございます。

https://www.lcd-modules.com.tw/upload/web/AL/AL4002A.pdf
こちらの情報では、外形とピンアサインくらいしか判らず、何とも言えません。
I2CをパラレルIOに変換したとのことで、その変換のほうも情報がなく、どこに問題があるのか不明です。

動作したというテストプログラムi2clcda.py のイニシャライズ部分をoled_ctrl_s.pyに移植してみてはいかがでしょうか?

イニシャライズ方法や、タイミングは、LCDの仕様によって若干の違いがあります。

ご返答ありがとうございます。不十分な情報で申し訳ございません。
変換には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):
―――省略―――

Python学びます。

こじまるさん

なるほど。aitendoですか。

ちらっと見たら、単純なI2C-8bitパラレル変換ICを使っているみたいですね。

I2CのOLEDやLCDにはない、8bitモード、4bitモードの起動シーケンスというのがパラレルI/FのLCDにはあります。その初期化の方法(タイミング)がAL4002Aの仕様には書いていません。

また、RW,CS,E端子の処理、2行表示、4行表示の設定も注意が必要かもしれません。

I2C-OLEDは、勝手にやってくれているので、いきなりディスプレイONから始められるのです。

そうなんですね!だいぶ焦点が絞れてきました。
ありがとうございます。

こじまるさん

http://219.117.208.26/~saka/ham/LCD2/
ここにパラレルI/Fの詳しい説明がありました。

HD44780という日立のLCD駆動ICのコンパチ品がよく使われています。初期化シーケンスの待ち時間がICによって若干違ったりします。

たかじんさん

ご親切にありがとうございます!
その後、ks0066というチップがコントローラーのようでしたので、
以下データシートに行きつき、
https://www.lcd-module.de/eng/pdf/zubehoer/ks0066.pdf
たかじんさんの仰ってたタイミングの意味や、
コードの示す16進数が何にあたっているのか把握し、理解できてきたところでした。
CGRAM直接叩いて、キャラクタも作成できそうです…が、
Python自体をまだうまく書けず、実行に失敗しています。

上記i2clcda.pyベースの手続きでは、4bitで動作していました。
たかじんさんのコードでは、i2cというクラスの中で定義され、
最後のmainで一気に呼び出されており、
分からないながらにも、スマートだなぁとお見受けするのですが、
selfで参照させるように書き換えるにはまだ理解が不足しております。
雑な方法だと思いますが、クラスの外にi2clcda.pyイニシャライズ部を移植し、
string部分のみは、そちらのfunctionを読むように試みましたが、
それもまだ動作には至っておらずです。

こじまるさん

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が不用意に停止しないために必要になります。

ありがとうございます。
>4bit接続では、その後も2回づつ送る
そうなのですね。今日教えて下さった先を読んで分かりました。
今後4,5日は作業時間がとれなさそうで、大変もどかしいのですが、
特にピン数を節約する必要もないので、まずは8bitで動作するよう書き換えることから試してみたいと思います。
self.bus.write_byte_data(self.addr, 0, 0x0c) の真ん中の0は、RS,R/Wが0という認識で大丈夫でしょうか?

こじまるさん

変換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) というところで、連続して文字データを送ってます。

たかじんさん

ありがとうございます!
お礼申し上げるのが遅くなりましたが、いくら8bitでイニシャライズしようにもうまく行かなかった理由が分かりました。
結局Pythonに詳しい友人の手を借りてですが、おかげさまで、表示に至りました。
まだ少々調整が必要ですが、嬉しいです。
ようやくシャシーの加工に移れそうです。ありがとうございます。

URLに現況画像入れました。

こじまる さん

写真ありがとうございます。 これ良いですね。 すごく見やすい。
どこで売っているのでしょうか?

こちら秋月のSO1602Aと同じSunlike製なのですが、確実に販売しているであろう代理店が見当たらず、ドイツのmidiphyというお店が補修部品で取り扱っているのを見つけたため、そちらから購入しました。
https://www.midiphy.com/en/shop/185/General-Parts-OLEDs/Displays

直送すると高いですが、ドイツ在住者介して普通郵便で送って貰うと1000円かからないくらいでした。

こじまるさん

購入先情報ありがとうございます。
難易度が高いですね。。。

秋月電子に部品リクエストでもしてみます。

こんにちは。
2ndロットのSB32+PRO DoP使って今日までトラブルも無く音楽を楽しませて頂いています。
musicplayerはmoodeです。

OLEDも付けて表示をしていますが、DSD128の音源を再生した際のビット表示と周波数表示が2bit/11289...と倍の値で表示しています。(PCM音源での表示は問題ないようです。)

当初はvolumio使ってましたがDSD表示は正しく表示されていたように思いますが、moodeはver5時代から使い始めましたが最初から2倍の値で表示していたと思います。
音楽聴く上においては何ら問題ありませんが、もしお気づきの点がありましたらご教授ください。
よろしくお願いします。

エムタクさん

ご利用ありがとうございます。DSD時のバグですね。
何かおかしかったことに気が付いていたのですが、しばらく放置しておりました。
https://github.com/Takazine/mpd_oled_ctrl/blob/master/oled_ctrl_s.py

ここのソースコードの193行目あたりからの数行が怪しいです。

時間がとれましたらデバッグしてみます。
よろしくお願いします。

エムタクさん
たかじんさん

こんにちは、FlatTwinです。
自分もSB32DoPおよびOLEDを使っていますが、OLEDだけでなく、コントロールソフトのBubbleUpnpでも2倍で表示されます。
取り急ぎご報告まで。

FlatTwin さん

なるほど。 ということは、MPDからの応答がそういう仕様に変ったのかMPD自体のバグかもしれませんね。

MPDクライアントソフトは、基本的にはMPDからの応答を表示しているに過ぎないですから。

たかじんさん

お手数をお掛けしてします。
よろしくお願いします。

たかじんさん

こんにちは、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 さん

ありがとうございます。
スクリプトのバグとMPDの仕様変更とがあったのですね。
助かります。

私の方でもテストしてみようと思います。

コメントを書く

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

トラックバック

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

サイト内検索

Sponsors link

2020年8月
            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 31