もりねずみーのやつ

インターネット上でしか生きられません

Raspberry Pi 3 B+でベンチマーク

結果

819.0 ※ただし1.4GHzを維持出来た場合

ラズパイ2などの結果は以下参照。

Raspberry Pi 2での油冷オーバークロック - もりねずみーのやつ

Raspberry PiでNode.js(ミニラックサーバ構築編)

ログ

[morinezumiiii@morinezumiiii-pi unixbench]$ ./Run
sh: 3dinfo: command not found

   #    #  #    #  #  #    #          #####   ######  #    #   ####   #    #
   #    #  ##   #  #   #  #           #    #  #       ##   #  #    #  #    #
   #    #  # #  #  #    ##            #####   #####   # #  #  #       ######
   #    #  #  # #  #    ##            #    #  #       #  # #  #       #    #
   #    #  #   ##  #   #  #           #    #  #       #   ##  #    #  #    #
    ####   #    #  #  #    #          #####   ######  #    #   ####   #    #

   Version 5.1.3                      Based on the Byte Magazine Unix Benchmark

   Multi-CPU version                  Version 5 revisions by Ian Smith,
                                      Sunnyvale, CA, USA
   January 13, 2011                   johantheghost at yahoo period com

Use of uninitialized value in printf at ./Run line 1379.
Use of uninitialized value in printf at ./Run line 1380.
Use of uninitialized value in printf at ./Run line 1379.
Use of uninitialized value in printf at ./Run line 1380.
Use of uninitialized value in printf at ./Run line 1379.
Use of uninitialized value in printf at ./Run line 1380.
Use of uninitialized value in printf at ./Run line 1379.
Use of uninitialized value in printf at ./Run line 1380.
Use of uninitialized value in printf at ./Run line 1589.
Use of uninitialized value in printf at ./Run line 1590.
Use of uninitialized value in printf at ./Run line 1589.
Use of uninitialized value in printf at ./Run line 1590.
Use of uninitialized value in printf at ./Run line 1589.
Use of uninitialized value in printf at ./Run line 1590.
Use of uninitialized value in printf at ./Run line 1589.
Use of uninitialized value in printf at ./Run line 1590.

1 x Dhrystone 2 using register variables  1 2 3 4 5 6 7 8 9 10

1 x Double-Precision Whetstone  1 2 3 4 5 6 7 8 9 10

1 x Execl Throughput  1 2 3

1 x File Copy 1024 bufsize 2000 maxblocks  1 2 3

1 x File Copy 256 bufsize 500 maxblocks  1 2 3

1 x File Copy 4096 bufsize 8000 maxblocks  1 2 3

1 x Pipe Throughput  1 2 3 4 5 6 7 8 9 10

1 x Pipe-based Context Switching  1 2 3 4 5 6 7 8 9 10

1 x Process Creation  1 2 3

1 x System Call Overhead  1 2 3 4 5 6 7 8 9 10

1 x Shell Scripts (1 concurrent)  1 2 3

1 x Shell Scripts (8 concurrent)  1 2 3

4 x Dhrystone 2 using register variables  1 2 3 4 5 6 7 8 9 10

4 x Double-Precision Whetstone  1 2 3 4 5 6 7 8 9 10

4 x Execl Throughput  1 2 3

4 x File Copy 1024 bufsize 2000 maxblocks  1 2 3

4 x File Copy 256 bufsize 500 maxblocks  1 2 3

4 x File Copy 4096 bufsize 8000 maxblocks  1 2 3

4 x Pipe Throughput  1 2 3 4 5 6 7 8 9 10

4 x Pipe-based Context Switching  1 2 3 4 5 6 7 8 9 10

4 x Process Creation  1 2 3

4 x System Call Overhead  1 2 3 4 5 6 7 8 9 10

4 x Shell Scripts (1 concurrent)  1 2 3

4 x Shell Scripts (8 concurrent)  1 2 3

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: morinezumiiii-pi: GNU/Linux
   OS: GNU/Linux -- 4.14.42-1-ARCH -- #1 SMP Tue May 22 00:34:20 UTC 2018
   Machine: armv7l (unknown)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: ARMv7 Processor rev 4 (v7l) (0.0 bogomips)

   CPU 1: ARMv7 Processor rev 4 (v7l) (0.0 bogomips)

   CPU 2: ARMv7 Processor rev 4 (v7l) (0.0 bogomips)

   CPU 3: ARMv7 Processor rev 4 (v7l) (0.0 bogomips)

   11:26:45 up  1:31,  1 user,  load average: 0.03, 0.07, 0.84; runlevel unknown

------------------------------------------------------------------------
Benchmark Run: Sat Jun 16 2018 11:26:45 - 11:54:59
4 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables        5710658.3 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     1148.6 MWIPS (9.9 s, 7 samples)
Execl Throughput                               1292.4 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        175847.5 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           59591.4 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks        383032.1 KBps  (30.0 s, 2 samples)
Pipe Throughput                              409518.3 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                  74782.5 lps   (10.0 s, 7 samples)
Process Creation                               2210.0 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                    882.9 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    329.4 lpm   (60.1 s, 2 samples)
System Call Overhead                         910125.1 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0    5710658.3    489.3
Double-Precision Whetstone                       55.0       1148.6    208.8
Execl Throughput                                 43.0       1292.4    300.6
File Copy 1024 bufsize 2000 maxblocks          3960.0     175847.5    444.1
File Copy 256 bufsize 500 maxblocks            1655.0      59591.4    360.1
File Copy 4096 bufsize 8000 maxblocks          5800.0     383032.1    660.4
Pipe Throughput                               12440.0     409518.3    329.2
Pipe-based Context Switching                   4000.0      74782.5    187.0
Process Creation                                126.0       2210.0    175.4
Shell Scripts (1 concurrent)                     42.4        882.9    208.2
Shell Scripts (8 concurrent)                      6.0        329.4    548.9
System Call Overhead                          15000.0     910125.1    606.8
                                                                   ========
System Benchmarks Index Score                                         340.5

------------------------------------------------------------------------
Benchmark Run: Sat Jun 16 2018 11:54:59 - 12:23:13
4 CPUs in system; running 4 parallel copies of tests

Dhrystone 2 using register variables       21401597.3 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     4504.5 MWIPS (9.9 s, 7 samples)
Execl Throughput                               2655.2 lps   (29.6 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        288190.0 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           89004.4 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks        604423.9 KBps  (30.0 s, 2 samples)
Pipe Throughput                             1493791.7 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 251058.2 lps   (10.0 s, 7 samples)
Process Creation                               6257.7 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   2266.6 lpm   (60.1 s, 2 samples)
Shell Scripts (8 concurrent)                    330.4 lpm   (60.6 s, 2 samples)
System Call Overhead                        3276786.7 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   21401597.3   1833.9
Double-Precision Whetstone                       55.0       4504.5    819.0
Execl Throughput                                 43.0       2655.2    617.5
File Copy 1024 bufsize 2000 maxblocks          3960.0     288190.0    727.8
File Copy 256 bufsize 500 maxblocks            1655.0      89004.4    537.8
File Copy 4096 bufsize 8000 maxblocks          5800.0     604423.9   1042.1
Pipe Throughput                               12440.0    1493791.7   1200.8
Pipe-based Context Switching                   4000.0     251058.2    627.6
Process Creation                                126.0       6257.7    496.6
Shell Scripts (1 concurrent)                     42.4       2266.6    534.6
Shell Scripts (8 concurrent)                      6.0        330.4    550.7
System Call Overhead                          15000.0    3276786.7   2184.5
                                                                   ========
System Benchmarks Index Score                                         819.0

所感

ダメ。

ラズパイ3で熱暴走の問題があったけど、3B+ではCPU温度70℃超えると、サーマルスロットリングが発生して600MHz~1.2GHzまでクロックダウンする。

config.txtで定格1.4GHzにしたら何度もハングアップした。

そもそも3からクロックアップしてあんなちっこいゴミみたいなヒートスプレッダでどうにかなるという考え方がどうかしてる。

そして、よくケースとかに付属してるヒートシンク、あれ1個ではサーマルスロットリングを回避できなかった。

今回、定格1.4Gz保ったままUnixBench完走出来たのは、別途ヒートシンクを何個か重ねて追加してサーマルスロットリングを回避出来たからであって、標準の状態では、よっぽど寒い場所でない限り、定格1.4GHz稼働は絶対に無理。

3B+の1.4GHzという表記は、IntelでいうところのTurboBoost時のクロック数の表記に近いものだと思ったほうが良い。

よって、個人的な所感としては、3B+は無印3をマシにした程度である、と思う。

となると無印3はゴミですね、今更買う価値無しです。

今回はちょっとガッカリだったので辛口となりました。

おわり。

続々 Raspberry Piでカーオーディオ(IQaudIO PiDAC+)

関連記事

Raspberry Piでカーオーディオ(IQaudIO PiDAC+) - もりねずみーのやつ

続 Raspberry Piでカーオーディオ(IQaudIO PiDAC+) - もりねずみーのやつ

一旦これで完成にしよう(半ば諦め)

一応、以下の機能を持ったラズパイを車に載せることが出来ました。

f:id:aburos:20180522184819j:plain

課題となっていたもの

Bluetoothオーディオ再生時のプチプチノイズ

原因は、ラズパイのUSBポートの給電出力が追いついていないため、Bluetoothアダプターが安定して電波の出力が出来なかった。

実際の所、ラズパイの電源LED(赤色)が不定期に点滅していた。

USBポートに挿さっているデバイスは以下の通り。

1 Bluetooth 4.0アダプター(Class 2) 2 USBカメラ 3 液晶ディスプレイのタッチパネル操作と給電 4 USBハブ→USBメモリ

まぁ、どうにかするとしたら3ですよね…。

というわけで、液晶ディスプレイに接続しているUSBケーブルをバラして、TxとRx線だけをラズパイにつないで、VccとGNDは前回作った分圧回路の出力から取るようにしました。

f:id:aburos:20180519004450j:plain

結果、ラズパイの電源LEDも点滅することは無くなり、Bluetoothオーディオ再生時も、プチプチノイズは無くなりました。

クソコードを改善する。

あとでやる。

bottleなど軽量なWebフレームワークに置き換える。

試しにbottleでもやってみたのですが、WebSocket使ったりなんてやってると、なんか今回のケースだとTornadoの方が合ってる(ノンブロッキングIOとか技術面じゃなくコードの見た目的に)気がしたので、やっぱりTornadoに戻しました。

他の課題

  • PiCameraやUSBカメラ+OpenCVのVideoWriterで録画しつつ画像をキャプチャしてそれをWebSocketでWebブラウザ側にリアルタイムに表示させたかったんだけど、あまりにも重い処理過ぎてラズパイのスペックでは見れたものじゃないので、根本的に何か別の方法に直す必要があるかも。(よって、今回はプレビュー機能は無しにした。録画出来ることのほうが大事だし)

  • 熱対策

morinezumiiii.hatenablog.com

を参照。

これが一番厄介そう。85℃以上でラズパイが停止しちゃうとなると、真夏でなくても車内で稼働させるの厳しそうな気がする。

場合によっては、動画ファイルのエンコード処理はラズパイで行わない様にすることになるかも。(せっかくOpenMax ILあるのにもったいない)

※冷却ファン案は、カーオーディオ的に無いかなっていうのと、車内温度が循環するまではあまり意味が無さそう?

終わりに

やればやるほどラズパイの味(課題)が出てくる。

ラズパイ美味しいよぉ…。おいしい…オィシィヨゥ…(ヽ´ω`)

世の中のカーオーディオメーカードラレコメーカーの技術と努力すごい。

終わらなかった

いざ車に取り付けてみたのですが、電源ノイズがひどいものだった。

オーディオ云々以前の問題。

これがCPUの鼓動なのかっていうくらい。もしくはノロイノゲエム。

しかも電源が安定しないせいかなんなのかわからんけどカメラモジュールやUSBカメラが認識したりしなかったり。

しかも液晶ディスプレイのバックライト輝度調整出来ないから夜運転するとかなり鬱陶しい。

これ、あれですね、完全に失敗作ですね。

取り付けたまま放置して、イチから出直しましょう…。

Raspberry Pi 3 Model Bの熱暴走

正直ハマった。

OpenMax ILを使ったffmpegエンコードを回しつつ無限ループさせるPythonプログラム動かしてたら、ラズパイがブルースクリーンになった。

f:id:aburos:20180521010709j:plain

結論

この方が書いた記事がとても参考になった。

qiita.com

が、室温25℃くらいでフル稼働数分でCPU温度が85℃超えてブルースクリーンになるなんて実用的ではないのでは…?

ということで、/boot/config.txtを編集してクロックダウンしました。

arm_freq = 1000
arm_freq_min = 600

経緯

ラズパイでカーオーディオ()を作り始めて、なぜかドライブレコーダー機能も付けようと頑張っていた所、ラズパイ3の音声出力からプチプチというノイズが乗るようになってきた。

その時、カメラから入力した映像をPythonOpenCVで処理させつつ、出力された動画ファイルをOpenMax ILを使ってffmpegを動かしていて、topを見るとPythonがCPUリソース100%台、ffmpegが200%~300%台使用していました。

そして、ラズパイでまさかのブルースクリーン

カーネルパニックでもなくWindowsのようなブルースクリーンと違って、グラボ死にました的なブルースクリーン

なんだこれ。

まず最初に疑ったのは、電源のUSBケーブルでした。

使用していたACアダプタが、「フル稼働検証済み」と謳って便利なスイッチ付きのやつで、そのUSBケーブルがやたら細いのが気になったので、試しにAmazonベーシックの太めのケーブルに交換してみた所、プチプチノイズは消えた。

が、再度ブルースクリーン

別でフル稼働させている方のラズパイ3は、この現象が出ない。 (ちなみにこっちはAC100V電源→12V安定化電源→シガーソケットシガーソケット型Quick Charge 3.0対応USBアダプタ)→ラズパイ3という構成)

じゃあ次はUSB電源を変えてみよう。

変わらず。

途方に暮れてブルースクリーンのまま放置しておいたら、HDMI出力信号が切れた。

でもラズパイの電源は入ったままっぽい。まるでPOSTエラー画面のような止まり方。

(勝手に再起動でもしてくれないかなと思いながら)またしばらく放置。

ケースに触れた時、妙に熱いことに気付いた。

別でフル稼働させている方は、自作(流用)の金属製ケース。

f:id:aburos:20180501011842j:plain

問題になっている方は「放熱?そんなの知らねーよw」と言わんばかりのおしゃれなプラスチックケース。

f:id:aburos:20180521132145j:plain

もしかして熱暴走…?

ブルースクリーンをよく見ると縦縞なノイズが乗っていて、確かにグラボが熱でやられた時の症状に似てる。

watch -n 1 vcgencmd measure_tempでCPU温度を監視。

f:id:aburos:20180521133138j:plain

いやっほう、85℃超えてるぜぃ!

てな感じで、結局プラスチック製のケースを外して動かしてみた所、80℃台うろうろしつつも、ブルースクリーンは逃れてるっぽい。

f:id:aburos:20180521132038j:plain

はい、熱暴走でした。

終わりに

先日、KSYさんからRaspberry Pi 3 Model B+が技適通ったとの発表がありました。

「Raspberry Pi 3 B+」のご案内 - Raspberry Pi Shop by KSY

こんな状態でクロック数が上がって本当に大丈夫なのかな…。

ていうかこんなんでラズパイカーオーディオ(仮)完成出来るのか…?

既に暖かい季節になってきて車内暑いんだけど真夏の車内耐えられるのか…???

以下引用

ラズパイ財団サイドからも、記事が上がりました。
"No, your Raspberry Pi 3 won't overheat in everyday use, says its creator"
「いいえ、通常使用ではラズベリーパイ3はオーバーヒートしない、創造者曰く」

http://www.zdnet.com/article/no-your-raspberry-pi-3-wont-overheat-in-everyday-use-says-its-creator/

いいえ、ラズベリーパイ3は85℃では停止しませんでした。

実際は87℃台まで上がっており、恐らく90℃で停止するのではないでしょうか。

上手く行けば焼きラズベリーパイが出来上がるでしょう。

ヘイ財団、(中指立てる)。

続 Raspberry Piでカーオーディオ(IQaudIO PiDAC+)

去年のラズパイAdvent Calender 2017でやりきれなくて、しばらく放置してましたが、GWという謎の9連休で続きをやりました。

http://morinezumiiii.hatenablog.com/entry/2017/12/23/235319

そのおかげか、9連休という休みがどこかに消えてしまいました。

車+ラズパイでやりたいことが色々増えてしまって、あれからだいぶ変わりました。

以前の記事を踏まえて、やったことを書いていきます。

参考にさせて頂いた記事が多すぎて書ききれないかもしれませんので、ご容赦願います。

関連記事

Raspberry Piでカーオーディオ(IQaudIO PiDAC+) - もりねずみーのやつ

続々 Raspberry Piでカーオーディオ(IQaudIO PiDAC+) - もりねずみーのやつ

機能

オーディオ

ドライブレコーダー

  • フロント・リア
  • フロントカメラはRaspberry Pi公式のカメラモジュールを使用
  • リアカメラはUSBカメラを使用
  • 常時録画
  • 液晶ディスプレイでカメラ映像を表示

環境情報センサ類

  • 気温・湿度・気圧情報を表示
  • バッテリー電圧とACC電圧を表示

材料

ハードウェア組み立て

  1. リサイクルショップで手に入れた2DINオーディオをエレメント化して2DIN筐体を手に入れる。
  2. 2DIN筐体にラズパイとユニバーサル基板を取り付けるためのネジ穴を空ける。
  3. 2DIN筐体にケーブル類を通すための穴を空ける。
  4. 車の電源情報を得るため、簡単な12V→5V分圧回路を作ってArduinoで常時電源とACC電源の電圧を取得するモジュール(A)を作る。
  5. モジュール(A)にBME280を接続
  6. モジュール(A)にRTCを接続
  7. モジュール(A)のI2C線をラズパイのI2Cピンに接続
  8. …。
  9. 残りをよしなに組み立てる。

ソフトウェア準備(OSセットアップとか、とかとか)

  • お手製ArchLinuxARMインストーラを使ってSDカードにArchLinux ARMを焼く。

https://github.com/morinezumiiii/ArchLinuxARM-installer-for-raspberrypi

  • /boot/config.txtを編集



  • デフォルトで存在するユーザー"alarm"でログイン
ssh alarm@192.168.xxx.xxx
$ su
→ デフォルトパスワードは"root"
# passwd
→ rootパスワードを変更
# useradd -m -g users -G wheel -s /bin/bash morinezumiiii
# gpasswd -a morinezumiiii audio
# gpasswd -a morinezumiiii lp
# passwd morinezumiiii
→ ユーザーmorinezumiiiiを作成
  • 必要なパッケージをダウンロード&インストール
alarm@ # pacman -Syu
alarm@ # pacman -S sudo
alarm@ $ visudo  <-- viではなくnanoが開く。超嘘つき。
alarm@ $ exit
  • ユーザーalarmを削除
ssh morinezumiiii@192.168.xxx.xxx
morinezumiiii@raspberry $ sudo userdel -r alarm

ハードウェアクロックと時刻の設定

PiDAC+

  • PiDAC+設定

alsamixerを見てみると、PiDAC+が認識されてる。しかもデフォルトで選択状態になっていて、そのままspeaker-test -c 2でRCA出力から音が出た。

ロータリーエンコーダーを使って音量調整したいので、 GitHubで公開されているIQaudIOのツールを落として動かしてみる。

この時、IQ_rotを動かそうとすると「wiringPiのライブラリがねーんだけど💢」って言われるので、wiringPiをインストールしておくこと。

$ sudo pacman -S python-wiringpi
$ git clone

と、色んな合間にロータリーエンコーダーとPiDAC+をつなぐためのハーネスを作っておいてつなぐ。

f:id:aburos:20171219211507j:plain

sudo ./IQ_rot &
alsamixer

f:id:aburos:20171223234155p:plain

何故かAnalogueチャンネルじゃなくDigitalチャンネルのボリュームが動く。(一応音量は調整はされる)

→ Analogueチャンネルは、-6db~0dbまでのプリアンプ的な役割っぽい。(アンプではないが)

alsa-equalプラグインを入れて10バンドイコライザー機能を追加

$ sudo pacman -S alsa-equal
$

f:id:aburos:20171223235720p:plain

音が出ることを確認。

$ speaker-test -c 2

PiDAC+のロータリーエンコーダのプログラムのSystemdユニットを作成

$ sudo nano /etc/systemd/system/pidac-rotenc.service
[Unit]
Description=IQaudIO PiDAC Rotary encoder application

[Service]
Type=simple
Restart=always
ExecStart=/usr/local/bin/IQ_rot

[Install]
WantedBy=multi-user.target
$ sudo systemctl daemon-reload
$ sudo systemctl enable pulseaudio.service
$ sudo systemctl enable pidac-rotenc.service

Pulse Audioの設定

サンプルレート、ビット深度の設定(アップサンプリング)

手元にある音楽ファイルが、最大でも24bit 96kHzのFLACファイルしか無いので、あまり恩恵は受けれないかもしれないけど、とりあえずPiDAC+に搭載されているPCM5211というDACは、32bit 384kHzまで再生出来るとのことなので、/etc/pulse/default.paを編集して、デフォルトサンプルレートとビット深度を設定する。

※PiDAC+公式のスペックを見ると、最大24bit 192kHzと載ってるんだけど、なんでPCM5211のデータシートと書いてあることが違うんだろう???

ラズパイをBluetoothレシーバー化

Arduinoでラズパイの電源管理

車のバッテリーからの電源は、大きく分けて2種類あり、バッテリーから常に供給される常時電源と、キーONとエンジン始動の間のアクセサリ電源(以降ACC電源)があります。アクセサリ電源は、名前の通り常時通電する必要がないもののための電源系統です。例えば、オーディオ類、シガーソケット電源、メーターパネルのバックライト、エアコンなどがあります。 ※最近の車はエンジンスタートボタンでスタータがセルを回して自動でエンジンがかかるので、エンジンON=ACC電源ONと言ってもしまっても良いかも?

で、Linuxが走るラズパイでは、アクセサリ電源でも問題無いのかというところですが、問題大アリでした。

Arduinoなどのマイコンボードでは、単一(或いは内包された複数)のプログラムが記憶領域に書き込まれ、電源が入るとそのプログラムが走り出し、電源を落とせば止まります。

Linuxも大雑把に言ってしまえば、前述と同じなのですが、Linuxは膨大な量のプログラムが動作し、様々なファイルの読み書きが発生しています。その状態で電源を落とせば、ファイル内容の破損が発生しますが、それを防ぐためにファイルシステムという機能が働いてくれます。

Windowsの場合、(Windows10ではあまり見かけなくなりましたが)予期しないシャットダウンを行うと、たまに青い画面でディスクのチェックが走り、しばらく待たされます。これが、ファイルシステムによる保護機能です。

それと同様に、Linuxにおけるファイルシステムも、(ファイルシステムに何を使っているか、どういう設定をしているかにもよりますが)予期せぬシャットダウンを行うと、次回電源ON時に、ファイルシステムによる保護機能が働き、しばらく待たされます。

待たされるだけで済むならいいのですが、場合によってはファイルシステムが復旧不可能に陥ったり、ファイルシステムそのものが破損してしまう可能性もゼロではありません。

今回の場合の「予期せぬシャットダウン」は、ACC電源OFFに相当します。

車のナビやオーディオ機器では、ACC電源OFFで電源ブチ切りしているように見えますが、実は設定情報(オーディオ設定や時刻設定など)の記憶などのために、常時電源にもつながっています。

ちなみに、最近のスズキの車で、エンジンOFF時にどういう動きをするか観察していたら、

  • エンジンストップ
    • メーターパネルが光ったまま
    • LCDにエコ走行したかのパーセンテージが表示される
    • ナビは電源切れたように見えるがバックライトは付いてるっぽい
  • しばらくしてからACC電源がOFFになるっぽい。

で、前置きが長くなりましたが、Linuxが走るラズパイがACC電源系統のみからの供給だと色々と支障をきたしてしまうので、常時電源につなぐ必要がありますが、Raspberry Pi 3は最大2.5Aの電流が流れ、USBからの給電は5Vなので、最大12.5Wの電力を消費します。

バッテリーあがりも心配ですし、何よりラズパイが燃えてたらなんか嫌ですよね。

なので、Arduinoが常時電源とACC電源の状態を監視し、ACC電源電圧が指定した下限値を下回ったら、ラズパイにシャットダウンをさせて、指定した時間後にArduinoRaspberry Piへの電源供給をリレーで切るようにします。(今回は2分にしました ※2分以内にACC電源ONしたらどうするのっていう課題は残りますが…。)

ラズパイに接続されたモジュールからI2Cで情報を取得する。

気温、湿度、気圧センサ(BME280)

i2cdetect -y 1でアドレスが割り当たっているか確認。

i2cデバイスのアドレスは0x68っぽい。

参考にした記事からサンプルソースコードを取得して動かしてみる。

  • 参考にした記事

バッテリー電源(常時電源、ACC電源)電圧情報をArduinoからI2Cで取得する。

i2cdetect -y 1でアドレスが割り当たっているか確認。

i2cデバイスのアドレスは、Arduinoのプログラムで設定した0x08。

本当はもっと色々な情報をJSONでやりとりしたかったのだけど、I2Cの仕様上1回の通信で32バイトまでという制限があるので、最大32バイトのJSON文字列をラズパイに送るように設定。

ラズパイはArduinoに対して0x08のアドレスにread_i2c_block_data()を叩くと、Arduino側のOnRequest()イベントで要求が来たことを受け取り、指定のメソッドを叩いてWire.write()でラズパイへ電圧情報を送る。

  • 参考にした記事

Linuxデスクトップ環境を設定する。

Linuxデスクトップ環境は、LXQtを選択しました。

  • 参考にした記事

USBメモリのマウント状態監視する。

電源ONで自動でドライブレコーダー機能の録画を行うようにしたいのだけど、Raspberry PimicroSDには書き込みたくないので、別途USBメモリに書き込みを行いたい。

なので、/mnt/usbdiskディレクトリを作成して、/dev/sd*にデバイスが存在したら自動で/mnt/usbdiskへマウントするようにして、マウントされていれば録画(自動開始)、マウントされていなければ録画しないようにしたい。

USBカメラで動画を録画しつつWebSocketで動画をWebブラウザに表示する。

使うものはOpenCV3です。

ImageWriterで録画しつつ、フレーム毎の画像をRedisに一時格納し、WebブラウザにWebSocketで画像を送った旨のメッセージを送って、Webブラウザ側がそのメッセージを受信したらRedisに格納された最新の画像ファイルを読み込み表示更新し続けるという処理の流れになります。

  • 参考にした記事

ラズパイ公式カメラで動画を録画しつつWebSocketで動画をWebブラウザに表示する。

USBカメラと違い、OpenCVから直接カメラデバイスからのイメージ取得が出来ないので、/opt/vc/bin/raspistillを経由して画像を取得(動画なら/opt/vc/bin/raspivid)する必要がある。ネイティブなのでこちらの方が速いかもなのですが、まずはPythonライブラリのを使って録画しつつフレーム毎の画像をRedisに格納するようにしてみます。以降の処理は、USBカメラの方でやったことと同じです。

  • 参考にした記事

WebブラウザからBluetooth操作を出来るようにする。

bluezとbluez-utilsをインストールしていれば、bluetoothctlというコマンドが使用できるようになります。 bluetoothctl単体で実行すると対話式コマンド入力でのBluetooth設定が可能ですが、bluetoothctl power onのように引数を渡すことで対話式でなくても操作することが出来ます。

  • 参考にした記事

これまでのまとめをWebアプリケーションとして動かす。

最初はWebアプリケーションとしてBottleで作っていましたが、参考にした記事がTornadoで書かれていたので、

問題点

  • Bluetooth経由でスマートフォンから音楽を再生していると、たまにブツっというノイズが起きる。
  • Bluetooth経由でスマートフォンから音楽を再生を開始すると、たまにブツっというノイズが起きる。
    • このブチノイズはアンプを通したスピーカーにはかなり悪影響なのではというレベル。
  • USBカメラを起動した際にラズパイの電源が落ちることがある。
    • Arduino側でACC電源電圧を監視しているが、瞬間的に11.2Vぐらいまで電圧降下が起きる。
      • 逆に車に搭載してエンジンを始動した場合、14V台まで上がる可能性があるので問題ないか要確認。
  • 何か改良したい時にわざわざ車から取り外す必要がある。
    • → もう1セット作るしか無い?

まとめ

作っているとどんどん欲しい機能が増えてくるので、今回はとりあえずこれで試作として完成とします。

ただ、Bluetooth経由で音楽を再生した場合のブツっというノイズは、カーオーディオ的にはNGだと思うので、今後も改善を加えていきたい。

とりあえず、世界初の「マウスもキーボードも使えてLinuxが好き放題触れる格安な高音質カーオーディオヘッドユニット」の完成です。

Androidだったら既にあった。

課題

  • Bluetoothのブチノイズをどうにかする。
  • クソコードを改善する。
  • Bottleとか軽量なWebフレームワークに置き換える。

終わりに

最近Android Thingsが正式リリースされたというニュースがありましたが、ラズパイはあくまでもDevelopment Platformという位置付けで、サポートされているデバイスもかなり少ないので、あまりリッチなことは出来無さそうです。一時期あったUbuntu PhoneのようにLinuxデスクトップが今後も発展していくことを期待します。

Raspberry Piのmax_usb_currentについて

以前、あっきぃ氏が記事を書いてくれていた。

akkiesoft.hatenablog.jp

内容としては、「最新のRaspberry Pi Firmwareで対応したからconfig.txtにmax_usb_current=1は不要になるよー」とのことだったが、どうも現行のArch Linux ARMではmax_usb_current=1を設定しないと消費電力の大きいUSBデバイスが使えなかったので、報告までに。

Raspberry Piでスリープっぽい動作を回避する方法

そもそも公式ドキュメントに書いてあった。

www.raspberrypi.org

コンソールなら/boot/cmdline.txtを編集、

デスクトップ環境ならxscreensaver入れてdisableに設定してくれ、

と。

確かに、画面は真っ暗になるけどバックライトが消えていないってことは、スリープじゃなくてスリープっぽいスクリーンセーバーなんだな。紛らわしい。

Raspberry Piでカーオーディオ(IQaudIO PiDAC+)

関連記事

続 Raspberry Piでカーオーディオ(IQaudIO PiDAC+) - もりねずみーのやつ

続々 Raspberry Piでカーオーディオ(IQaudIO PiDAC+) - もりねずみーのやつ

すみません…間に合いませんでした…。

RaspberryPi Advent Calendar 2017 23日目の記事です。

adventar.org

まだ作業途中なので、出来てる部分だけ公開して、年内目標に改めて更新します!

車でラズパイにやらせたいこと

オーディオ

  • Bluetoothオーディオレシーバー(自動接続)
    • ペアリング済みのデバイスを検索して自動接続
    • ボリューム調整は可変抵抗器で調整可能
  • 音量自動調整(カロッツェリアの上位モデルに付いている機能)
  • イコライザー調整 (alsa-equalですら10バンドいじれる)

バックカメラ

  • 田舎なので夜間バックで駐車する時真っ暗でほとんど見えないのです…。

ハードウェアは以下を使用

memo

http://www.iqaudio.com/downloads/IQaudIO.pdf https://blog.bnikka.com/raspberrypi/raspberrypibluetooth.html http://nw-electric.way-nifty.com/blog/2016/10/raspberrypi-169.html https://www.allied-telesis.co.jp/products/list/wireless/knowl.html http://www.soumu.go.jp/main_content/000152595.pdf bとgは屋外使用可能

やったこと

  • raspbian-liteをダウンロード&SDカードにイメージ焼き
  • SSHでログイン出来るように/boot/sshを作成
  • Elecrow 7inch ディスプレイを使うために/boot/config.txtに追記
  • IQaudIO PiDAC+を使うために/boot/config.txtを編集
  • とりあえずpiユーザでログインし、必要なユーザを作成しpiユーザを削除
ssh pi@192.168.xxx.xxx
pi@raspberry $ sudo useradd -m -g users -s /bin/bash morinezumiiii
pi@raspberry $ sudo gpasswd -a morinezumiiii audio
pi@raspberry $ sudo passwd morinezumiiii
pi@raspberry $ sudo passwd root

pi@raspberry $ visudo  <-- viではなくnanoが開く。超嘘つき。
pi@raspberry $ exit
ssh morinezumiiii@192.168.xxx.xxx
morinezumiiii@raspberry $ sudo userdel -r pi
  • パッケージを最新版にアップデートし、欲しいパッケージをインストール
$ sudo apt update
$ sudo apt dist-upgrade
$ sudo rpi-update
$ sudo reboot

$ sudo apt install git lightdm xserver-xorg raspberrypi-ui-mods
$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi
$ ./build
$ gpio -v
$ sudo raspi-config  <-- お好みで
  • 参考にしたもの

https://www.raspberrypi.org/documentation/raspbian/updating.md http://wiringpi.com/download-and-install/ https://www.raspberrypi.org/forums/viewtopic.php?f=63&t=166806

PiDAC+

  • PiDAC+設定

alsamixerを見てみると、PiDAC+が認識されてる。しかもデフォルトで選択状態になっていて、そのままspeaker-test -c 2でRCA出力から音が出た。

ただなぜか音量調整が0か100しか選べない。

謎だけど、とりあえずロータリーエンコーダーを使って音量調整したいので、 GitHubで公開されているIQaudIOのツールを落として動かしてみる。

この時、IQ_rotを動かそうとすると「wiringPiのライブラリがねーんだけど💢」って言われるので、wiringPiをインストールしておくこと。

$ cd
$ git clone https://github.com/iqaudio/tools.git
cd tools

と、色んな合間にロータリーエンコーダーとPiDAC+をつなぐためのハーネスを作っておいてつなぐ。

f:id:aburos:20171219211507j:plain

sudo ./IQ_rot &
alsamixer

で、ノブを動かしてみる…。

動くかな…?

f:id:aburos:20171223234155p:plain うおぉ、動いた!(画像じゃ伝わらない)

でも何故かAnalogueチャンネルじゃなくDigitalチャンネルのボリュームが動く。(一応音量は調整はされる)

更にalsa-equalプラグインを入れて10バンドイコライザー機能も追加! f:id:aburos:20171223235720p:plain

$ speaker-test -c 2

ちゃんと音も出て音量が上がったり下がったり調整出来てるようなので良しとする。

ラズパイをBluetoothレシーバー化

Setup Raspberry Pi 3 as bluetooth speaker https://raspberrypi.stackexchange.com/questions/47708/setup-raspberry-pi-3-as-bluetooth-speaker

素晴らしき先人の知恵をお借りしましょう。

変えたのは/usr/lib/udev/bluetoothのUSER="pi"を自分のユーザ名に変えただけです。

  1. Pair and Connect the audioの手順で、自分のスマホとペアリングする際に、ラズパイ側でyes/noを問われるので、yesと入力してからペアリングし、trust [スマホのデバイスアドレス]をして、毎回ペアリングキーを入力するのを省略できるようにします。

せっかくなので、

$ pulseaudio -D

している所を、Systemdユニット化して、自動起動するようにします。

$ sudo nano /etc/systemd/system/pulseaudio.service
[Unit]
Description=Pulse Audio

[Service]
Type=simple
Restart=always
ExecStart=/usr/bin/pulseaudio

[Install]
WantedBy=multi-user.target

更についでなので、PiDAC+のロータリーエンコーダのプログラムもSystemdユニットにしちゃいます。

$ sudo nano /etc/systemd/system/pidac-rotenc.service
[Unit]
Description=IQaudIO PiDAC Rotary encoder application

[Service]
Type=simple
Restart=always
ExecStart=/usr/local/bin/IQ_rot

[Install]
WantedBy=multi-user.target
$ sudo systemctl daemon-reload
$ sudo systemctl enable pulseaudio.service
$ sudo systemctl enable pidac-rotenc.service

とまぁ、こんな感じで進めてはいたのですが、記事を書きながらデスクトップ環境を整えようと思い、raspberrypi-ui-modsとlightdmを入れたら、上記の内容でBluetooth経由で音が出なくなりました…。

調べていると、RaspberryPi公式のブログで、Raspbian StretchでのBluetoothオーディオについて気になることが書いてあった。

https://www.raspberrypi.org/blog/raspbian-stretch/

「Pulse Audio使わないでしょ?bluez-alsa入れといたやで。」

オーマイガー…なんということでしょう…。

で、そんなこんなで普段Arch使いの僕がRaspbianにデビューしたらハマりまくったので、今日は間に合いませんでした。 年内完成を目標に、続けて行きたいと思いまうす。

以下車のオーディオ環境どうにかした時の作業風景

f:id:aburos:20170728172721j:plain f:id:aburos:20170930093609j:plain f:id:aburos:20170930093631j:plain

社内全部引っ剥がしてロードノイズを遮音したりドアに音が漏れないようにデッドニングしたり余計な反響をしないように吸音スポンジを入れたり…。

f:id:aburos:20170830211218j:plain f:id:aburos:20170830220227j:plain f:id:aburos:20170830212614j:plain

ついでに掃除もして綺麗になりました。車のカーペットの下は意外とダニがいっぱいいました…。