もりねずみーのやつ

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

Raspberry Pi 4でオーバークロック

前書き

Raspberry Pi Advent Carendar 2019 4日目のもりねずみーです。

最近病んでます。

はい。

今回は油冷はしません。期待していた方、ごめんなさい。

理由は、Raspberry Pi 3B+以降に相応しい(?)CPUクーラーが売っていたため、それを利用します。

f:id:aburos:20191204184646j:plain

準備

hanpenblog.com

オーバークロック

とりあえず2GHzにしました。

/boot/config.txtに

over_voltage=6
arm_freq=2000
gpu_freq=750

UnixBench

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

   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 directories for:
      * File I/O tests (named fs***) = /home/alarm/byte-unixbench/UnixBench/tmp
      * Results                      = /home/alarm/byte-unixbench/UnixBench/results
------------------------------------------------------------------------------

Use of uninitialized value in printf at ./Run line 1469.
Use of uninitialized value in printf at ./Run line 1470.
Use of uninitialized value in printf at ./Run line 1469.
Use of uninitialized value in printf at ./Run line 1470.
Use of uninitialized value in printf at ./Run line 1469.
Use of uninitialized value in printf at ./Run line 1470.
Use of uninitialized value in printf at ./Run line 1469.
Use of uninitialized value in printf at ./Run line 1470.
Use of uninitialized value in printf at ./Run line 1721.
Use of uninitialized value in printf at ./Run line 1722.
Use of uninitialized value in printf at ./Run line 1721.
Use of uninitialized value in printf at ./Run line 1722.
Use of uninitialized value in printf at ./Run line 1721.
Use of uninitialized value in printf at ./Run line 1722.
Use of uninitialized value in printf at ./Run line 1721.
Use of uninitialized value in printf at ./Run line 1722.

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: alarmpi: GNU/Linux
   OS: GNU/Linux -- 4.19.86-1-ARCH -- #1 SMP PREEMPT Sat Nov 30 18:54:34 UTC 2019
   Machine: armv7l (unknown)
   Language: en_US.utf8 (charmap="ANSI_X3.4-1968", collate="ANSI_X3.4-1968")
   CPU 0: ARMv7 Processor rev 3 (v7l) (0.0 bogomips)

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

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

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

   04:35:29 up 1 min,  1 user,  load average: 0.08, 0.04, 0.01; runlevel

------------------------------------------------------------------------
Benchmark Run: Tue Dec 03 2019 04:35:29 - 05:03:46
4 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       17017032.0 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     3312.5 MWIPS (9.9 s, 7 samples)
Execl Throughput                               1801.8 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        219383.1 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           71315.5 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks        508729.7 KBps  (30.0 s, 2 samples)
Pipe Throughput                              272437.6 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                  50547.6 lps   (10.0 s, 7 samples)
Process Creation                               2329.1 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   2112.5 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    740.3 lpm   (60.1 s, 2 samples)
System Call Overhead                         555988.0 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   17017032.0   1458.2
Double-Precision Whetstone                       55.0       3312.5    602.3
Execl Throughput                                 43.0       1801.8    419.0
File Copy 1024 bufsize 2000 maxblocks          3960.0     219383.1    554.0
File Copy 256 bufsize 500 maxblocks            1655.0      71315.5    430.9
File Copy 4096 bufsize 8000 maxblocks          5800.0     508729.7    877.1
Pipe Throughput                               12440.0     272437.6    219.0
Pipe-based Context Switching                   4000.0      50547.6    126.4
Process Creation                                126.0       2329.1    184.8
Shell Scripts (1 concurrent)                     42.4       2112.5    498.2
Shell Scripts (8 concurrent)                      6.0        740.3   1233.8
System Call Overhead                          15000.0     555988.0    370.7
                                                                   ========
System Benchmarks Index Score                                         460.0

------------------------------------------------------------------------
Benchmark Run: Tue Dec 03 2019 05:03:46 - 05:32:44
4 CPUs in system; running 4 parallel copies of tests

Dhrystone 2 using register variables       25806918.0 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                    10044.5 MWIPS (12.4 s, 7 samples)
Execl Throughput                               4739.7 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        492562.1 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          160814.3 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks        997212.8 KBps  (30.0 s, 2 samples)
Pipe Throughput                             1021635.2 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 295741.6 lps   (10.0 s, 7 samples)
Process Creation                               7433.5 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   5725.4 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    712.4 lpm   (60.1 s, 2 samples)
System Call Overhead                        2117343.6 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   25806918.0   2211.4
Double-Precision Whetstone                       55.0      10044.5   1826.3
Execl Throughput                                 43.0       4739.7   1102.2
File Copy 1024 bufsize 2000 maxblocks          3960.0     492562.1   1243.8
File Copy 256 bufsize 500 maxblocks            1655.0     160814.3    971.7
File Copy 4096 bufsize 8000 maxblocks          5800.0     997212.8   1719.3
Pipe Throughput                               12440.0    1021635.2    821.3
Pipe-based Context Switching                   4000.0     295741.6    739.4
Process Creation                                126.0       7433.5    590.0
Shell Scripts (1 concurrent)                     42.4       5725.4   1350.3
Shell Scripts (8 concurrent)                      6.0        712.4   1187.3
System Call Overhead                          15000.0    2117343.6   1411.6
                                                                   ========
System Benchmarks Index Score                                        1182.8

はい、スコアは1182.8でした。

どれぐらいの性能かというと、Amazon EC2のt2.microくらいです。

今はt3.microというもっと高性能なEC2インスタンスがあるので、またAWSに軍配が上がりましたね。

ただし、これは/boot/config.txtを編集しただけの状態であり、実は定格2.0GHz動作ではありません。

Raspberry Pi 3B+以降、まーいい加減どうにかしてほしい熱問題(サーマルスロットリング)による600MHzまでのCPUの動的クロックダウン機能が働いてしまう状態です。

これをどうにかするには、

# echo "performance" > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor

とコマンドを叩いて、ガバナーポリシーとやらを調整(固定化)する必要があります。

これについても詳細に書かれている記事があるので、そちらを参考に。

で、ガバナーポリシーをperformanceにして/opt/vc/bin/vcgencmd measure_clock armを確認してみると、

frequency(48)=2000478464

と表示されます。

この状態で、再度UnixBenchを実施してみたところ、

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

   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 ← ここで停止

となりました。(結果表示できず)

というか、UnixBenchのProcess Creationのフェーズで、止まってしまうのはUnixBenchが悪いのでは…?

Raspberry Pi 4自体はハングアップやカーネルパニックなどは起こしていないので…。

というかUnixBenchの最新版リリースってどこにあるの、もうUnixBenchやめない?

もう20回位試していますが、相変わらずProcess Creationで止まってしまっているので、結果がきちんと出るようになったら、ここに追記します。。。

熱問題について

Raspberry Pi 4を既に入手して、熱問題については相変わらずという記事を書いてらっしゃる方もいるようで、負荷をかけると、やはり78℃〜80℃でクロックダウンしてしまうようですが、今回使用したCPUクーラーは、56℃くらいまでで抑えることが出来ました。

Raspberry Pi 4をデスクトップ用途に使いたい方にとっては、あまりコンパクト性を求めないと思いますので、デカくても冷えればいいという方にはオススメです。

おわりに

オーバークロックに関して、事前に色々調べていて、海外の方が2.147GHzを達成していることを知っていましたが、冷却さえ出来れば2GHz超えは余裕かと思いきや、私が2.147GHzを設定するとブート時に停止してしまったので、2.0GHz付近が限界なのかなと思いました。

Raspberry Pi 4はCSIDSIが2レーンになった、HDMIがmicroHDMI端子になった、など、中々ニッチな方向に進んでいる感が拒めないですが、産業用途としてのプロトタイプあるいはプロダクトにもってこいの製品になっていっていると思います。

ただ、デスクトップ用途としては、UnixBenchのスコアの通りで、まだまだ厳しい、というか、ラズパイに性能を求めても次が出る頃には「うーん、こんなもんなのかなぁ」のいたちごっこになっているような気がします。

ここは(こんな小さなシングルボードコンピュータとしての)ラズパイでここまで出来るんだぜって割り切っていたほうが、良いかもしれませんね。

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に設定してくれ、

と。

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