Raspberry Pi Zero moOde audio 630(PulseAudio)

ローカル内にアンプ、スピーカーのあるマシンをpulseaudioサーバーにしておくと便利です。
moOde audioには通常アンプ、スピーカーを接続することになると思いますがHiFi再生を主眼とするmoOde audioではpulseaudioの導入は考慮されていません。mpdもpulseaudio経由の再生は不可です。
当サイトのmoode playerは通常通りダイレクトに再生、mpd以外はpulseaudio経由で再生しています。

pulseaudioは設定次第でいろいろな動作が可能ですが下記は当サイトの設定、実行例です。
Raspberry Pi ZeroにはmoOde audioをインストール、正常に再生しているものとします。

設定の過程では100%で出力します。
動作が確認できるまではアンプのボリュームを充分絞っておくか電源を切っておくようにします。

pulseaudioサーバー

前回Xを導入したmoode audioにpulseaudioをインストール

# apt install pulseaudio pavucontrol

デフォルトの入力ソース、出力ソースを設定 PulseAudio/サンプル

$ pulseaudio --start

$ pacmd list-sources | grep -e 'index:' -e device.string -e 'name:'
  * index: 0
        name: <alsa_output.platform-soc_sound.stereo-fallback.monitor>
                device.string = "0"
$ pacmd list-sinks | grep -e 'name:' -e 'index:'
  * index: 0
        name: <alsa_output.platform-soc_sound.stereo-fallback>

値はPi1B(ES9023DAC),Pi Zero(TDA1543DAC)とも同じnameを出力しています。

/etc/pulse/default.paの末尾に自ネットワーク帯と上記の得られたname値を追記

load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/24 auth-anonymous=1
set-default-source alsa_output.platform-soc_sound.stereo-fallback.monitor
set-default-sink alsa_output.platform-soc_sound.stereo-fallback

一応再起動してpulseaudioをスタート

$ pulseaudio --start
$ alsamixer


カードはPulseAudioになります。
出力は100%になっているので充分音量を下げます。
pavucontrolを起動して音量を下げてもOK

ここでLan内にpulseaudioをインストールしてあるマシンで~/.config/pulse/client.confにmoode audioのIPを記載することで音声を飛ばすことができます。
~/.config/pulse/client.conf

autospawn = no
daemon-binary = /bin/true
default-server = 192.168.0.113

# 補足
pulseaudioサーバーでpulseaudio –startします。
pulseaudioをインストールしているクライアントでpulseaudio –startすると~/.config/pulseが作成されます。
pulseaudio –killして上記のclient.confを作成(以降クライアントはpulseaudio –startは特に必要ない)
pulseaudio対応のプレーヤー(mpv,mplayerなど)で再生すると音声はpulseaudioサーバーに送ります。
mpv,mplayerはサーバー側でpulseaudioがstartしていない且つクライアントにアンプ、スピーカーが接続してあればクライアント側で再生します。

pulseaudioのスタート

moode audioのMPDはダイレクトに再生する必要があります。
上記の通りpulseaudioサーバーにすることは比較的簡単なのですが誰かがログインしてpulseaudioをスタート及びストップする必要があります。(基本root権限ではpulseaudioをスタートすることはできない)
当サイトでは使い勝手の良いwww-dataからpulseaudioを制御しています。
skyblue css

# cd /var/www
# wget https://github.com/Stanko/skyblue/archive/gh-pages.zip
# unzip gh-pages.zip
# mv skyblue-gh-pages html
# rm gh-pages.zip

www-data
sudersに追加(末尾に追記)

# visudo
www-data ALL=(ALL) NOPASSWD: ALL

pulseaudioがcookieを作成できるようwww-dataにホームディレクトリを作成
(パスワードは設定していないのでログインは不可)
ホームディレクトリはmoodeのバージョンアップを考慮して/var/www/html/以下に作成

# gpasswd -a www-data audio
ユーザ www-data をグループ audio に追加
# systemctl stop nginx php7.3-fpm
# mkdir -p /var/www/html/www-data
# chown -R www-data:www-data /var/www/html/www-data
# usermod -s /bin/bash www-data -d /var/www/html/www-data
# systemctl start nginx php7.3-fpm

pulseaudio –startしてcookieを確認
Xからpulseaudio –startするとエラー(authorized — error)が出るので.Xauthorityをコピー
(エラーがあってもスタート、実行は可)

# cp /home/pi/.Xauthority /var/www/html/www-data
# chown www-data:www-data /var/www/html/www-data/.Xauthority

# sudo -u www-data pulseaudio --start
# ls -la /var/www/html/www-data/.config/pulse
---
-rw------- 1 www-data www-data   256 11#  25 15:23 cookie

ユーザーが変わるとやはり100%で出力するので音量を下げておきます。

# sudo -u www-data alsamixer

pulse.php

/var/www/html/pulse.phpを作成してPi3からアクセス

surf_340x100 http://moode/html/pulse.php


surfブラウザは340×100でコンパイルして起動しています。
参考 pulse.php
作成するのはpulse.phpとkillall.sh
/var/www/html以下に置きます。

/var/www/html/killall.sh

#!/bin/sh
sudo killall -q mplayer
sudo killall -q mpv
sudo killall -q ffplay
mpc stop > /dev/null 2>&1
# chmod 755 /var/www/html/killall.sh

追記 client.conf

音量コントロールなど1本化するため内部からwww-dataが起動したpulseaudioに接続するようにします。この設定をすることでuser piはpulseaudioを起動することができなくなります。
user piがコマンドラインから実行する場合は必ずwww-dataからpulseaudioをスタートしておきます。
mixerを持っていないDACは100%で出力します。(設定後はコマンドラインから実行しない)
/home/pi/.config/pulse/client.conf

autospawn = no
daemon-binary = /bin/true
default-server = 127.0.0.1


ボリューム値は$ pactl list sinksから取得しています。
I2S接続の汎用ドライバーならこのまま取得できると思っています。


パッケージからsurfをインストールして自身のweb serverに接続
外部からは問題なく接続できますが内部のsurfブラウザの起動は多少時間が掛かってしまいます。
radikoの再生は開始までやはり少し時間が掛かりますが再生自体は特に問題無いようです。


外部から接続するmoode playerは問題ないですね。
MPD(simul.py)も起動してしまえば軽快に動作します。

simul.pyのタイトル(ラベル)を利用してON AIR情報を再生時自動表示するようにしました。
moode playerとsimul.pyそしてradikoの連携もうまくいっています。
プログラムについてはまた次回で!

Raspberry Pi 4 ヒートシンクの取り付け

Raspberry Pi 4を購入、到着したので急遽いろいろ試しています。

Pi4の発熱問題は新ファームでだいぶ改善されているようですがやはり最低限の放熱対策は必要なのでPi3と同様の方法でヒートシンクを取り付けてみました。


Pi4はokdo製
ベースのアクリル板は割れたオルガンの蓋から切り出しました。
タイプCケーブルは100均(セリア)で用意
残念ながらHDMI-VGA変換アダプタは全くダメでした。(HDMIモニタがない(^▽^;)

FAN


ファンは古いIBM240系のディスプレイ、キーボード無しのマシンが何台かあって取り外しています。
取り外した後は順次ゴミ箱行きですね。


CPUに当たる部分のアルミ板は壊れたカーオーディオの放熱板から切り出し。(3mm厚)


ファンが載る部分で背の高い部品はオーディオジャック、USB側にスペーサー(3.8mmを3.3mm位にヤスリで削って)を接着します。
CPUに絶縁シートを貼って、前のコネクタとファンの間にわずかな隙間があるとCPUに密着しています。
当サイトのPiはGPIOに下駄を履かせています。丁度リレー1個入るスペースがあります。
GPIO側のピンソケットはリレーが支えるので1mm程度浮かして取り付けます。


USB端子とファンをホットボンドで接着


6mm厚のアルミ片があったのでUSB端子と高さを合わせてホットボンドで接着


USB端子に少し強力な両面テープを貼ってカーステの残りの放熱板で抑えます。


前後方向はUSB端子とリレーが少し掛かっているのですがファン側の高さ方向は抑え箇所が無いため重みだけで抑えています。ポータブル用途には向きませんが固定(ディスクトップ)で使う分には問題ないと思っています。

FANコントロール


通常時はリレーOFF(3.3V)で常時駆動、指定した温度に達するとON(5V)に切り替えます。
ファンの音は3.3V駆動では全く気にならないレベル

WiringPi

WiringPiはV2.52に更新しないとボードナンバーが違うよみたいなことを言われます。
http://wiringpi.com/wiringpi-updated-to-2-52-for-the-raspberry-pi-4b/

cd / tmp
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i lightingpi-latest.deb

cpu_temp.py

cpu_temp.pyを走らせます。
リレーのON-OFF(HIGH-LOW)だけなのでGPIOの制御はsubprocessで実行しています。
設定は# default settingのON-OFF温度、チェックタイムを変更します。
gpioピンは13(BCM22)を使っています。(任意)
最初のループで起動時1分HIGHで駆動しています。
実運用は/etc/rc.localからの起動を想定しています。

#!/usr/bin/python3

import subprocess
import time

# default setting
ON_T =  50
OFF_T = 45
TIME =  60
subprocess.run("gpio -1 mode 13 out", shell=True)

CPU_T =  0
T =      0
count =  0

while True:
    subprocess.run("gpio -1 write 13 1", shell=True)
    count += 1
    if count >= 60:
        subprocess.run("gpio -1 write 13 0", shell=True) 
        break
    time.sleep(1)

while True:
    command = ("expr `cat /sys/class/thermal/thermal_zone0/temp` / 1000")
    CPU_T = (subprocess.Popen(command, stdout=subprocess.PIPE, shell=True).communicate()[0]).decode('utf-8')
    CPU_T = CPU_T.strip()

    if int(CPU_T) >= ON_T and T == 0: 
        subprocess.run("gpio -1 write 13 1", shell=True)
        T = 1
        print("FAN HIGH 5V LED ON")

    if int(CPU_T) <= OFF_T and T == 1:
        subprocess.run("gpio -1 write 13 0", shell=True)
        T = 0
        print("FAN LOW 3.3V LED OFF")

    print(CPU_T)

    # cpu frequency
    command = ("cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq")
    CPU_F = (subprocess.Popen(command, stdout=subprocess.PIPE, shell=True).communicate()[0]).decode('utf-8')
    CPU_F = CPU_F.strip()
    print(CPU_F)

    # TIME = 60
    time.sleep(TIME)

テスト

os 2019-09-26-raspbian-buster.img
tightvnc + dwm

UnixBenchを実行します。

$ git clone https://github.com/kdlucas/byte-unixbench
$ cd byte-unixbench/UnixBench
$ ./Run


スタート 42.8℃ 室温 22℃
60秒ごとに取得しています。温度はexprで少数低下切り捨て
温度、クロックはダイナミックに変化します。値は実行時その瞬間の値になりますが大まかな流れは掴めると思います。


1 x Pipe-based Context Switching あたりで50℃に達してHIGH(5V)に切り替わります。


4 x Dhrystone 2 using register 4coreになると10℃位アップしてきます。


終了後5分位で設定値の45℃に落ちてLOW(3.3V)
Score
1コア 324.1
4コア 870.0
Scoreは電源アダプタも影響するようで、モニタLED(赤LED)が点いたり消えたりする場合は電源容量が足りないようです。

ファン容量が小さいので気休め程度ですがファームウェアの改善と相まって通常の使い方では取り敢えず問題のないレベルと思っています。
Pi4もまだまだ開発途上のようなのでいろいろ確認しながらもう少し様子を見ようと思います。

Raspberry Pi Zero moOde audio 630(vnc server)

前回のWiFiを無効にしたZero(w)は無駄になるので素のZeroと選手交代しました。

今回はvncserverを導入してX環境を構築してみたいと思います。
moOde audioにはデスクトップ環境はありませんがXorgはインストールされています。(動いてはいませんが)使いたいときは好きなウインドウマネージャーを入れて勝手にしろよということだと思います。

Zero + moOde audioのX環境は少し重くなるかもしれませんが今回もtightvnc + dwmの組み合わせで構築してみたいと思います。

初期設定

sshでログインしてraspi-config実行

$ ssh pi@moode or ip address
$ sudo raspi-config


4 Localisation OptionsからLocaleとTimezone
7 Advanced OptionsからA1 Expand Filesystem Ensures
を実行してreboot

再ログイン、update upgradeはしばらくかかります。
(kernel更新あり)

# apt update && apt upgrade

X環境

tightvnc

# apt install tightvncserver autocutsel

ユーザー権限でvncserverを起動してパスワードだけ設定しておきます。

$ vncserver

~/.vnc/xstartup

#!/bin/csh
xmodmap -e "keysym Meta_L = Super_L"
xmodmap -e "keysym Meta_R = Super_R"
xrdb $HOME/.Xresources
xsetroot -solid black
autocutsel -fork
xbindkeys &
cd && xterm -e ranger &
uim-xim &
uim-toolbar-gtk &
dwm &

~/.vncrc

$geometry     = "918x545";
$depth        = 24;
$desktopName  = "moOde audio";

/etc/init.d/vncboot

# chmod 755 /etc/init.d/vncboot
# systemctl enable vncboot

ウインドウマネージャーdwm
コンパイル
参考 当サイト(現在)のconfig.hの変更箇所

static const char *fonts[]          = { "monospace:size=11.5" };
static const char dmenufont[]       = "monospace:size=11.5";
static const char col_cyan[]        = "#06793C";  /* green */
static const float mfact     = 0.58; /* factor of master area size [0.05..0.95] */
static const int resizehints = 0;    /* 1 means respect size hints in tiled resizals */
#define MODKEY Mod4Mask
{ MODKEY,                       XK_u,      incnmaster,     {.i = -1 } },
{ MODKEY,                       XK_q,      killclient,     {0} },

MODKEYはwinkey
縦分割、横分割はMODKEY + iとMODKEY + u
アプリケーションの終了はMODKEY + q

日本語環境
最近はセットアップに必要なファイルはディレクトリzzzに纏めておきそれをカードのルートディレクトリにコピーしています。使い終わったら片付けるかセキュリティー上支障が無ければそのままでもいいと思います。
65-fonts-*も/zzz/font_setに入れておきます。65-fonts-*はこのへん
/zzz/font_set/font_set.sh

#!/bin/sh
sudo apt install -y fonts-ipafont fonts-ricty-diminished
sudo apt install -y uim uim-anthy uim-xim uim-gtk2.0
sudo cp /zzz/font_set/65* /etc/fonts/conf.avail
cd /etc/fonts/conf.d
sudo ln -s ../conf.avail/65-fonts-ipa-mincho.conf
sudo ln -s ../conf.avail/65-fonts-ipa-pgothic.conf
sudo ln -s ../conf.avail/65-fonts-monospace.conf

実行

# sh /zzz/font_set/font_set.sh

moOde audioのbash環境ではuim設定をうまく読み込んでくれないようです。
tcshをインストール~/.cshrcに設定してxstartupスクリプトは#!/bin/cshにしています。

# apt install tcsh
~/.cshrc
setenv  LANG   ja_JP.UTF-8
setenv  XMODIFIERS @im=uim
setenv  GTK_IM_MODULE uim
setenv  QT_IM_MODULE uim

ファイルマネージャーranger その他

# apt install ranger highlight xbindkeys suckless-tools python3-tk ncmpcpp

rangerの画像表示はbusterになってからうまく表示できなくなりました。
dwmのデフォルトメニューdmenuは少し使いにくいですね。xbindkeysとdmenuを利用したdmenu_mainでこれまで作成したpython menuを利用しやすくなります。

再起動する前に~/.vnc/passwdをコピー、クライアント(Pi3)の~/.vncに適当なファイル名(moode)で保存します。(パスワードが同じなら他のマシンで作成したpasswdをそのまま利用できます)
再起動したらPi3のtigervncviewerからmoodeへアクセス(名前解決できている)
ホスト名はmoodezに変更しています。

$ vncviewer -passwd /home/pi/.vnc/moode moodez:1


rangerなどの設定ファイルはほかのマシンからコピーしています。

Simul Radio

moOde playerはmpd mpcを利用しています。Xを起動したのでpython3-tkをインストールすることで作成したsimul.pyを動かすことができます。

mpdの設定はmoode audioの設定をそのまま利用します。
シングルコアのZeroはpythonなどの起動には多少時間がかかりますが起動後はほとんどストレス無く動作が可能です。
pythonプログラムやラジオ局リストはコピーして同じように配置します。(若干の修正が必要)


moOde playerはPi3のsurfブラウザからアクセス
simulラジオを再生するとmoOde playerに反映されます。
moode audioのmpdで再生することはmoOde playerで再生していることになります。
再生開始時の音量はsimul.pyでは独自に設定しているのでmoOde playerの表示とズレがあります。
ncmpcppはリアルタイムに取得します。moOde playerで音量を変更した時表示した値が適用されます。


ncmpcppにはmusic sourceなどmpdの基本情報は全て反映されています。(数字キーの1〜8)
simulラジオの音質はmoode audioの独自にbuildしたmpdでダイレクトに再生することでpulseaudioを経由するよりずいぶん良くなっていると思います。
(ラジオ局の機材、運用次第)


mpdはcpu使用率も少なく安定しています。


当サイトのmoode audioは音声関係の中心になります。
pulseaudioの導入は多少クセがありますがまた次回で。

Raspberry Pi Zero(w) moOde audio 630 (TDA1543)

現在はPCM5102などの枯れたデバイスはかなり安く購入することができますが3年くらい前に購入していたTDA1543(5pcs2$)を放置していたのでこの機会に組んでみました。

TDA1543は設計の旧いDACですがシンプルな回路で動作するという特徴があります。
いざ組み上げてZero(w)で音を出してみると盛大なノイズが出てしまいました。

別電源で供給したりGND廻りを変更したりしたのですが大幅な改善はありませんでしたが調べていくとどうやらWiFiが関係していることがわかってきました。(市販のカードはおそらく対策されているものと思いますが買ったことは無いので未確認)

WiFiインストールしたのですがmoOde audioにノイズが有っては意味が無くなってしまうので有線接続に切り替えてテストを続行することにします。

TDA1543 DACの作成

参考にした回路はこちら
https://aroundwaves.wordpress.com/2015/01/23/malinowy-dac-dla-i2s-na-tda1543-lub-1541-cz-3/

基本の回路構成は参考サイトと同じにしています。

LEDはGPIOを利用してOSが立ち上がった頃点灯します。

/etc/rc.local
exit 0 の前に追記 sleep xx は適当に

gpio -1 mode 15 out && sleep 35 && gpio -1 write 15 1


カップリングコンデンサはジャンク基板から抜いたタンタルコンを取り付け


以前作成したUSBハブ基板を間に履かせて物理的に距離をおくとノイズはかなり低減しますが時折ポツッとノイズが入ってきます。


ELECOM LD-USB/T
クラシックなイーサネットアダプタですがlsusbはLD-USB/TXとあるので100Mbpsで通信していると思います。
欠点は消費電流が少し大きい(0.3A位)
マイクロUSBを直付しています。

WiFiを無効にしてeth0を有効にします。
/boot/config.txt コメントを外します。

dtoverlay=pi3-disable-wifi
dtoverlay=pi3-disable-bt

/etc/dhcpcd.conf wlan0をコメント

#interface wlan0

moOde audioの設定


I2S audio deviceはGeneric 1 hifiberry-dacを使いました。
/boot/config.txtにdtoverlay=hifiberry-dacが追記されます。
再起動で有効
ドライバー有効後の最初の再生時のみ結構大きなボツ音が出ます。


Music Sourcesはorangepi3にあります。
Album cover thumbnail cacheもUPDATEしておきます。


アルバムアートは少し時間をおくと出揃います。


当サイトのPi1B(ES9023)と比べても特に遜色なく思っていた以上によく鳴ってくれます。


ノイズは聴感上無くなりました。DACの電源投入時ポップノイズはでますがreboot時などは問題ありません。
但し再生開始時にプチノイズが出ることがありますがここでも言っていますね。
中華部品などは10個単位で購入するものも多いので単純にコスト比較はできませんが手持ちの使った部品を計算すると130円位になっていると思います。
まだまだ遊べそうなDACですね。

Raspberry Pi Zero(w) moOde audio 630

今回はRaspberry Pi Zero(w)にmoOde audio 6.3.0をインストールしていろいろ実験をしてみたいと思います。

Raspberry Pi Zero(w)にはwifiが搭載されています。ヘッドレスでインストールするには通常内臓のwifiを利用することになると思います。(イーサネットアダプターがあればもっと簡単)
今回は内臓wifiを利用してインストールしてみたいと思います。

カードの作成


moOde audioのホームページからダウンロード、展開してddします。

カードを作成したらセットして起動


デフォルトのmoode audioではzero(w)の内臓wifiはAP modeとして起動します。
作業マシン(Pi3)のネットワークはdhcpにしています。
LXPanelのwifiをクリックするとMoodeが見えてきます。
Moodeを選択してKeyにmoodeaudioを入力、OKでmoodeaudioに接続
Pi3には172.24.1.xxxのアドレスが割り当てられます。
# 元のAPに戻るにはKey画面で空のままOK


スマホからも同様にアクセスできます。


ブラウザから172.24.1.1にアクセス


moode menuからnetworkを選択


Wireless(WiFi)
固定IP(STATIC)を設定
SCANするとSSIDが選択できます。
APのパスワードを入力、その他IPアドレスなど設定


設定したら上部のSAVEをクリック
以降AP moodeは解除されます。


再起動
設定したアドレスにアクセス

設定した値は以下のファイルに書き込まれているはずです。
設定順によってはpskが空のままになっている場合があります。
pingを打っても応答がない場合は直接カードを編集します。(要root)

/etc/dhcpcd.conf

interface wlan0
static ip_address=192.168.0.33/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1

/etc/wpa_supplicant/wpa_supplicant.conf

network={
ssid="xxxxx-xxxxx-xx"
scan_ssid=1
psk="xxxxxxxxxxxxx"
}

反則技ですがAP moodeを使わないで設定することもできます。(6.3.0で確認)
カードを作成したら起動する前に上記のファイルを編集しておきます。
またカードの/etc/rc.localの以下をコメントにしておきます。

#/var/www/command/worker.php > /dev/null 2>&1

起動したら記述したアドレスでアクセス、再度WiFiをブラウザから設定し直します。
SAVEすると正常終了しないかもしれません。
別ターミナルからログイン/etc/rc.localのコメントを外してreboot

$ ssh pi@192.168.0.33
password:moodeaudio
$ sudo nano /etc/rc.local
$ sudo reboot

間違いが無ければ上記同様に設定が完了しているはずです。

次回はZero(w)にDACを乗っけていきます。

Top