読者です 読者をやめる 読者になる 読者になる

😃 mattintosh note 📝

Hello Raspberry Pi!

Raspberry Piに冷却用ファンを装備する

Raspberry Pi

mpv で動画を再生していると 1280x720 60fps の動画がカクカクする。クロック不足かとも思ったがスムーズに再生できるタイミングもある。

オーバークロックしても効果がないので適当なモニタリング用シェルを作って watch で観察してみたのが前の記事。

mattintosh.hatenablog.com

どうも 1280x720 60fps の動画を再生していると、どんどん温度が上昇してデフォルトの上限温度である85度以上にならないようにクロックが落とされていた。ヒートシンクを付けた程度ではどうにもならない。

以前、Maker Faire で買った KSY さんのアルミケースサンプルにファンが付けられたなぁとネットを探してみると 5V の小型ファンというのはあまり種類が無いようで、しかも値段がアホみたいに高い。

のだが、秋月だけべらぼうに安い。5V 25mm 100円。

akizukidenshi.com

他にも同じ製品を取り扱っている店を見つけたがそれでも100円は無い。なんなんだこの値段は…。

とりあえずこれは買うとして、他にも違うサイズのものが欲しい。 これまた調べてみると東京ラジオデパートにファンを取り扱っているお店があった。 他の店では見たことが無いくらいたくさんの種類のファンが置かれていて、5V の種類も豊富。(30mm〜だったかも) 値段は400〜600円くらい。安い部類じゃないだろうか。とりあえず 30mm と 60mm を購入。

で、秋月の 25mm の方は固定方法がうまく思いつかなかったのでとりあえず 60mm を直載せしてみた。

GPIO の 5V ピンから電源を直接接続。「こんなに風量必要ないよ!」っていうくらいよく回って冷える。

ただ、24時間回しっぱなしだと消費電量増えるしゴミも溜まるのでトランジスタを使ってコントロールすることにした。回転数を落とすためにベース抵抗をちょっと高めにしているので冷却具合はイマイチかもしれない。

60度を超えたら空冷開始するようにしてみた #RaspberryPi #RPi

Makoto Yoshidaさん(@mattintosh4)が投稿した動画 -

使ったトランジスタは定番中の定番、東芝の 2SC1815GR。既に製造が終了しているらしいが、秋月にはたくさんあった。

Raspberry Pi を買ってからというもの、Linux サーバとしてしか使ってなかったけど GPIO を使って電子工作というのもなかなかおもしろい。GPIO はシェルからも簡単に操作することができる。

数日後、また秋葉原をブラブラしていたら千石でファン付きのケースが売られていた。900円台だった気がする。 お店での見た目は結構ボロボロに見えるのだが保護フィルムが貼ってあるだけなので剥がせばとても綺麗。 ただちょっと組み立てが面倒かも。

しばらくこれで稼働してたんだけど、このファンがかなりうるさい。よく見たらサイズが 30mm だったのでこの前ラジオデパートで買ったファンと交換したら消費電力も下がってとても快適になった。(もともとケースについているファンが 0.19A で結構大食い) X-FAN 30mm のものに交換したんだけど長尾製作所のサイトを見ると受注生産品っぽい。

さて、1号機はケース交換したけど2号機がまだ残ってる。 また同じケースを買うのも面白みが無いので家にあったリーマーで穴をあけることにした。

リーマーでゴリゴリすること数分。 買ったはいいけどほとんど使ってなかったから穴が大きくなると正円にならないなんて知らなかった。質の問題? なんか微妙な八角形のようになったのでリューターでゴリゴリ…。(紙やすりがなかった…)

フェルトで磨いて出来上がり。ネジ穴は手に入りやすい 3mm。(右は未加工のもの)

Raspberry Piのケースに25mmファン用の穴を開けた #RaspberryPi #RPi

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

で、秋月のファンは M3 のネジで無理矢理固定しようとするとファンが歪むっぽいので M2.6 15mm のネジを西川さんで購入(ファンの厚みが 10mm、ケースの蓋が約 2mm)。プラネジにしようと思ったけどナットの方が品切れてたので見た目重視で六角穴付きネジ。なんかもうちょっと格好良い名前だった気が…。

Raspberry Pi case DIY. #raspberrypi #rs

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

ファンの底とヒートシンクとの距離が 5mm くらいになるのでちょうど良い位置。 こっちは検証用で使うときしか使わないのでとりあえず 5V 直結。秋月のファンもそれほどうるさくないし。 ファンのコネクタはいま QI コネクタを使っているけど、RS のケースは QI コネクタを使うと蓋が閉めづらくなるのでピンソケットの足にハンダ付けしてコネクタを作る予定。あぁ、QI コネクタにケース付けないで熱収縮チューブでもいいのか。

電子工作ネタはまた今度。

mpvで動画を再生すると出だしでコマ落ちが発生する問題

Arch Linux Linux mpv YouTube

先日、Raspberry Pi 3 にファンを付けて温度上昇によるクロックダウンを予防することができたのだけど、動画を再生しようとすると開始からしばらくの間、遅延が発生する。

バッファサイズの調整してみたりしたが改善せず。

コンソールを見ているとキャッシュが溜まりきると改善することからキャッシュの方に原因がありそうだ。

ちなみに mpv にはキャッシュに関するオプションだけでもこれだけある。

$ mpv --list-options | grep cache
 --cache                          Choices: no auto yes (or an integer) (32 to 2147483647) (default: auto)
 --cache-backbuffer               Integer (0 to 2147483647) (default: 75000)
 --cache-default                  Choices: no (or an integer) (32 to 2147483647) (default: 75000)
 --cache-file                     String (default: ) [file]
 --cache-file-size                Integer (0 to 2147483647) (default: 1048576)
 --cache-initial                  Integer (0 to 2147483647) (default: 0)
 --cache-pause                    Flag (default: yes)
 --cache-secs                     Double (0 to any) (default: 10.000000)
 --cache-seek-min                 Integer (0 to 2147483647) (default: 500)
 --icc-cache-dir                  String (default: )

う〜ん、まさかなぁと思って --cache=no にしたら遅延しなくなった…orz

Raspberry Pi の貧弱なストレージではキャッシュが逆に悪影響を及ぼすようだ。--cache-file=TMP とすることでキャッシュの場所を tmpfs にもできるけど Raspberry Pi のメモリはそれほど高速でもないのでこれもダメだった。

Samba サーバにしている Raspberry Pi 2 からデータを引っ張っているのでキャッシュは無くても別にいいか…。

~/.config/mpv/mpv.conf でキャッシュを無効にするようにしておく。youtube-dl プラグインによる YouTube の再生のときに遅延が発生するかもしれないが mpv の引数に --cache=auto を与えればこの設定は上書きできるのでそれほど手間にはならない。

cache=no

mpv playerでYouTubeのミックスリストを再生する

Linux mpv

YouTube を観ている際によく出てくるこの「YouTube ミックスリスト 曲やアーティストに基づく、ノンストップの再生リスト」。

f:id:mattintosh4:20161105234040p:plain

これ以外にもユーザが任意に作成した YouTube のプレイリストもある。これらは URL を持っているのだが、これを mpv に渡しても1曲目しか再生されない。

$ mpv 'https://www.youtube.com/watch?v=2OltRY1ccxs&list=RD2OltRY1ccxs'

youtube-dl がパースできる URL に問題があるのかわからないが、URL の watch を playlist に書き換えて現在再生している動画のパスを抜けばいいようだ。

https://www.youtube.com/watch?v=2OltRY1ccxs&list=RD2OltRY1ccxs
↓
https://www.youtube.com/playlist?list=RD2OltRY1ccxs
$ mpv 'https://www.youtube.com/playlist?list=RD2OltRY1ccxs'

(Youtube ミックスリスト系には list= のあとに RD がつくみたいだが、これは無くてもよい。ブラウザ上で試してみると RD が付いているとプレイヤーの近くに再生リストが表示される仕組みらしい)

このプレイリストに対しても --shuffle オプションは有効。m3u ファイルに書いておけば複数のプレイリストを更に合成できる。

Raspberry Piの温度とかクロックをモニタリングする

Raspberry Pi Arch Linux ARM

Raspberry Pi 3 にヒートシンクを付けた。千石電商で170円だった。

RPi3にヒートシンク着けた✧٩(◦`꒳´◦)۶✧ #RaspberryPi #RPi

Makoto Yoshidaさん(@mattintosh4)が投稿した写真 -

実は Raspberry Pi 2 の頃のケースだとコアの位置が違うのと、小さい方のコアの部分に穴が空いてないのでヒートシンクの装着ができないのだった。

オーバークロックとかの状態を見たかったので vcgencmd から色々引っ張り出すものを書いてみた。

#!/bin/sh
PATH=/opt/vc/bin:$PATH

echo "CLOCK"
for f in arm core h264
do
    printf '%-8s: %sHz\n' $f $(vcgencmd measure_clock $f | cut -d= -f2 | numfmt --to=si)
done
echo ""
echo "VOLTAGE"
for f in core sdram_{c,i,p}
do
    printf '%-8s: %s\n' $f $(vcgencmd measure_volts $f | cut -d= -f2)
done
echo ""
printf '%-8s: %s\n' temp $(vcgencmd measure_temp | cut -d= -f2)
$ watch ./hwinfo.sh
Every 2.0s: ./hwinfo.sh                                                                                              alarmpi: Mon Oct 31 21:59:04 2016

CLOCK
arm     : 1.3GHz
core    : 500MHz
h264    : 500MHz

VOLTAGE
core    : 1.3940V
sdram_c : 1.2000V
sdram_i : 1.2000V
sdram_p : 1.2250V

temp    : 72.0'C

measure_clock は色々な値が引っ張れるようだけど数字で呼び出すと何を指しているのかよくわからないのが欠点。

$ for f in {0..50}; do /opt/vc/bin/vcgencmd measure_clock $f; done | grep -v =0
frequency(1)=500000000
frequency(9)=163683000
frequency(22)=48000000
frequency(26)=4800000
frequency(28)=500000000
frequency(29)=74250000
frequency(42)=500000000
frequency(45)=1195000000
frequency(47)=249959000
frequency(50)=1920000

gpu_freq で設定すると core_freq とか h264_freq も全部変動するんだな。

mpv と youtube-dl 使って 60fps FullHD 動画再生するとヒートシンクつけてても85℃近くになって arm_freq がどんどん下がる…。やはりファンを付けるべきか。

とりあえずこれだけ知っておけばなんとかなるRaspberry Piのオーディオ設定

Raspberry Pi ALSA PulseAudio Arch Linux ARM Linux

いつからだか忘れたけど Arch Linux ARM では /boot/config.txt に gpu_mem=64 以外何も書かれなくなった。(RPi2 と RPi3 で設定が異なるからだろうか)

んで、音楽を再生しても音が鳴らないことがしばしば。いい加減この辺の設定ちゃんと調べないとなと思ったので調べた。

/boot/config.txt に dtparam=audio=on が無いとそもそも音が鳴らない

サウンドカードを調べる方法は色々あるけど、わかりやすいのは aplay -l。

$ aplay -l
aplay: device_list:268: no soundcards found...

サウンドカードが無いと言われます。

aplay -L も見てみます。

$ aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
pulse
    PulseAudio Sound Server
default
    Default ALSA Output (currently PulseAudio Sound Server)

PulseAudio はあるので PULSE_SERVER 環境変数を使えば他のマシンで音を鳴らすことはできます。が、コレジャナイ。

さて、では dtparam=audio=on って何さ?っていうのは /opt/vc/bin/dtparam で調べることができる。

/opt/vc/bin/dtparam -h audio
audio                   Set to "on" to enable the onboard ALSA audio
                        interface (default "off")

「on にするとオンボードの ALSA オーディオインターフェイスが有効になるよ!」

つまり dtparam=audio=on を設定しない限り、Raspberry Pi の HDMI やイヤホンジャックから音は鳴らないわけですね。

これを /boot/config.txt に書いて再起動します。

再び aplay -l を見てみると ALSA が使えるようになっているのがわかります。

$ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
$ aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
pulse
    PulseAudio Sound Server
default
    Default ALSA Output (currently PulseAudio Sound Server)
sysdefault:CARD=ALSA
    bcm2835 ALSA, bcm2835 ALSA
    Default Audio Device

この辺の設定は /etc/asound.conf に書いてある。

amixer cset numid=3 って何さ?

「音が鳴らない時にはこれを試してごらんよ!」と、よく言われる amixer cset numid=3 1 とか amixer cset numid=3 2 というコマンド。

これ、単体でみるとよくわからんのだが、amixer で色々試してみるとわかる。

$ amixer controls
numid=4,iface=MIXER,name='Master Playback Switch'
numid=3,iface=MIXER,name='Master Playback Volume'
numid=2,iface=MIXER,name='Capture Switch'
numid=1,iface=MIXER,name='Capture Volume'

ふむ。numid=3 というのは Master Playback Volume らしい。

ん?なんか違わね?

実は PulseAudio を入れている場合、amixer では PulseAudio のコントロールが出てきてしまう。例えば PulseAudio を使っていない root の場合だと、

$ sudo amixer controls
numid=3,iface=MIXER,name='PCM Playback Route'
numid=2,iface=MIXER,name='PCM Playback Switch'
numid=1,iface=MIXER,name='PCM Playback Volume'
numid=5,iface=PCM,name='IEC958 Playback Con Mask'
numid=4,iface=PCM,name='IEC958 Playback Default'

となり、numid=3 は PCM Playback Route となる。つまり、よく見かける cset numid=3 というのはこの PCM Playback Route のことを指している。

PulseAudio がインストールされており、なおかつ一般ユーザーで amixer cset numid=3 1 とかやると単にボリュームが変わる可能性が高い。ちなみ Switch 系はミュート切り替え用。

では一般ユーザーが PCM Playback Route を操作するにはどうするのか?

それはカードを正しく指定してあげるだけ。

$ amixer -c ALSA controls
numid=3,iface=MIXER,name='PCM Playback Route'
numid=2,iface=MIXER,name='PCM Playback Switch'
numid=1,iface=MIXER,name='PCM Playback Volume'
numid=5,iface=PCM,name='IEC958 Playback Con Mask'
numid=4,iface=PCM,name='IEC958 Playback Default'

さらに amixer contents を見てみる。

$ amixer -c ALSA contents
numid=3,iface=MIXER,name='PCM Playback Route'
  ; type=INTEGER,access=rw------,values=1,min=0,max=2,step=0
  : values=1
numid=2,iface=MIXER,name='PCM Playback Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
numid=1,iface=MIXER,name='PCM Playback Volume'
  ; type=INTEGER,access=rw---R--,values=1,min=-10239,max=400,step=0
  : values=399
  | dBscale-min=-102.39dB,step=0.01dB,mute=1
numid=5,iface=PCM,name='IEC958 Playback Con Mask'
  ; type=IEC958,access=r-------,values=1
  : values=[AES0=0x02 AES1=0x00 AES2=0x00 AES3=0x00]
numid=4,iface=PCM,name='IEC958 Playback Default'
  ; type=IEC958,access=rw------,values=1
  : values=[AES0=0x00 AES1=0x00 AES2=0x00 AES3=0x00]

numid=3 は values=1 になっているため、アナログオーディオが有効になっている状態。これを HDMI に切り替えるには、

$ amixer -c ALSA cset numid=3 2

とすればよい。

ボリュームやスイッチの操作は以下のように行うことができる。ボリュームに負の値を指定する場合はオプションとして誤認されないよう -- を付ける必要がある。

$ amixer --card ALSA cset numid=1 -- -10239 # Mute
$ amixer --card ALSA cset numid=1 400       # Max
$ amixer --card ALSA cset numid=1 mute      # Mute
$ amixer --card ALSA cset numid=1 100%      # Max
$ amixer --card ALSA cset numid=2 0         # Off (Mute)
$ amixer --card ALSA cset numid=2 1         # On

PulseAudio の場合はボリュームの指定方法が少し異なる。

$ amixer contents
numid=4,iface=MIXER,name='Master Playback Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
numid=3,iface=MIXER,name='Master Playback Volume'
  ; type=INTEGER,access=rw------,values=2,min=0,max=65536,step=1
  : values=65536,65536
numid=2,iface=MIXER,name='Capture Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
numid=1,iface=MIXER,name='Capture Volume'
  ; type=INTEGER,access=rw------,values=2,min=0,max=65536,step=1
  : values=65536,65536
$ amixer cset numid=3 0       # Mute
$ amixer cset numid=3 65536   # Max
$ amixer cset numid=3 65536,0 # Left max, Right mute

PulseAudio の場合は pactl set-sink-volume 0 50% などでもボリューム変更ができる。(alsamixer を使った方が楽)

この辺を覚えておけば Raspberry Pi で音が鳴らない問題はだいたい解決できるはず。