NanoPi-NEOとMPDとLCDとI2S-DACとTDA7297で音楽再生サーバ(完全体)

# 概要

[NanoPi-NEOとMPDとOLEDで音楽再生サーバ](http://qiita.com/blue-7/items/e58bcfa5ecf93cc8838b)の続編。

ソフトウェア側・ハードウェア側ともに大幅進化させ、

- LCD表示でカバーアート完全カラー化!!
- I2S-DAC 搭載で 192Hz 24bit 再生OK!! HighRes シール対応!
- 15w+15w の TDA7297 激安パワーアンプ搭載!! あとはスピーカ繋ぐだけ!

の完全体になった。今回下記写真のソフトおよびハードを作る。
(写真のスピーカScandyna MicropodSEは含まれません)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/187531/0a18da0a-7180-295d-a436-79224c031271.png)


# ソフトウェア側

## 概要

主な仕様

- 曲名、アーティスト名・アルバム名の表示。長い場合は自動スクロールします。
- 現在の再生位置の表示 (タイトルの下のアンダーバーです)
- Freq,BitDepth,Ch の表示
- アルバムジャケットイメージの表示（taglib使用)
- 物理ボタンで、「前の曲」、「再生・一時停止」、「次の曲」が操作可能
- 一時停止中は、現在日時を表示。(New!) ついでにCPU温度も表示
- 日本語でOK
- New! OLEDの他にLCDもサポート！
- New! マルチディスプレイサポート(笑)
- New! 完全C言語で１本化
- New! LCDは縦置き・横置きレイアウト両対応
- New! LCD,OLEDへの表示は更新部分のみ転送のため、(そこそこ)滑らかなスクロール

というわけで以下の集大成でもある。

- [音楽ファイル(mp3,m4a,flac,etc...)から、taglibでCoverArtを抽出する](http://qiita.com/blue-7/items/3c644e89e001818b0d8f)
- [freetype2 で文字列描画 (実践編)](http://qiita.com/blue-7/items/96b397cbee2975704323)
- [NanoPi-NEOと5種のLCDと2種のOLED](http://qiita.com/blue-7/items/9cc34c9ecc6b2eb5447c)
- [画像の誤差拡散による２値化 ～ガンマ値考慮Ver.+～](http://qiita.com/blue-7/items/1d4f5c5b70777d829721)
- [NanoPi-NEOでOpenCV CapしてOLED表示](NanoPi-NEOでOpenCV CapしてOLED表示)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/187531/b101a9aa-bda3-32e6-dd61-29d406540279.png)


## インストール手順

[NanoPi-NEOとMPDとOLEDで音楽再生サーバ](http://qiita.com/blue-7/items/e58bcfa5ecf93cc8838b)

の「4. OLED表示のセットアップ」の替わりに以下を実施。
まずはソースコードを取得

```bash:console
cd /root
git clone https://github.com/blue777/NanoPi-NEO
cd NanoPi-NEO
```

LCD関係を必要に応じ修正。
nano usr_displays.h

```C++:usr_displays.h
#include <vector>
#include "common/display_st7735_spi.h"
#include "common/display_ili9341_spi.h"
#include "common/display_ili9328_spi.h"
#include "common/display_ili9225_spi.h"
#include "common/display_ssd1306_i2c.h"

void	SetupDisplays( std::vector<DisplayIF*>& iDisplays )
{
//	iDisplays.push_back( new Display_SSD1306_i2c(180,0) );
//	iDisplays.push_back( new Display_SSD1306_i2c(180,2) );	// for SH1306

//	iDisplays.push_back( new Display_ILI9341_spi_TM24(270) );
//	iDisplays.push_back( new Display_ILI9341_spi_TM22(270) );
//	iDisplays.push_back( new Display_ILI9341_spi_TM22(0) );
	iDisplays.push_back( new Display_ILI9328_spi_TM22(270) );
//	iDisplays.push_back( new Display_ILI9225_spi(270) );
//	iDisplays.push_back( new Display_ST7735_spi(90) );
}
```

NanoHat OLEDを使う場合は、
`iDisplays.push_back( new Display_SSD1306_i2c(180,0) );`
を活性化し他は無効化。

各コンストラクタの第１引数は、LCDの回転角度。0,90,180,270のいずれか。OLEDは、0,180のみ。
レイアウトはQVGAで確認しているが、それ以外でも、それっぽく表示されるはずである。

マルチディスプレイするときは、複数登録したうえで各LCDのCSを適切に設定する必要がある。


編集したら、パッケージのインストールとコンパイル。

```bash:console
apt install libcv-dev libopencv-dev opencv-doc
apt install fonts-takao-pgothic
apt install libtag1-dev

g++ -O3 -std=c++11 mpd_gui.cpp -o mpd_gui.cpp.o -pthread `pkg-config --cflags opencv` `pkg-config --libs opencv` `freetype-config --cflags` `freetype-config --libs` `taglib-config --cflags` `taglib-config --libs`
```

あとは、自動起動するように構成
nano /etc/rc.local

```bash:/etc/rc.local
・
・
・
/root/NanoPi-NEO/mpd_gui.cpp.o &
```

## OS側の設定変更

npi-config を起動しOSの設定を変えます。
各種無効になっていたりするので、設定変更し有効化します。

・I2S DAC使う場合
Advanced Options --> I2S を選択し、有効にする

・SPI (LCD用) 使う場合
Advanced Options --> spi0 --> Enable --> spidev0.0 を選択


# ハードウェア側

## パーツリスト

写真の工作例の場合のパーツリスト。
NanoPi-NEO使っているがNEO 2でもOK.


<img width="640" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/187531/2fc27e41-61f2-e122-d148-cdbe6dbbfebb.png">


|No|パーツ名|値段|入手先|備考|
|:--|:--|--:|:--|:--|
|1|NanoPi-NEO(2)|＄7.99～14.99|[NanoPi-NEO](http://www.friendlyarm.com/index.php?route=product/product&product_id=132) or [NanoPi-NEO2](http://www.friendlyarm.com/index.php?route=product/product&path=69&product_id=180)|いずれか１つ|
|2|NanoPi Neo Heat Sink|$2.99|http://www.friendlyarm.com/index.php?route=product/product&path=82&product_id=134||
|3|ケース|108円|100円ショップ(Seria)|8cm四方くらいのもの|
|4|2.2inch LCD(ILI9328)|1750円|http://www.aitendo.com/product/10943|ILI9341系でもOK|
|4|I2S-DAC(PCM5102)|700円～1000円くらい|eBayで入手。[ES9023](http://www.ebay.com/itm/ES9023-24Bit-192KHZ-Decoding-Board-I2S-Input-DAC-Decoder-Module-For-DIY-Use-K3V9-/172451317939?epid=623192370&hash=item2826e648b3:g:dOEAAOSwo4pYV-LX)か[PCM5102](http://www.ebay.com/itm/PCM5102-DAC-Decoder-I2S-Player-Board-32Bit-384K-Beyond-ES9023-PCM1794-/142125650366?hash=item21175951be:g:b5sAAOSwLF1X48tC)のどちらか。[NanoHat Pcm5102a](http://www.friendlyarm.com/index.php?route=product/product&path=86&product_id=169)でも良いがケースの大きさと要相談。|I2S-DAC省略してNanoPi-NEOのLineOut出力でもOK|
|5|パワーアンプ(TDA7297)|290円|https://www.amazon.co.jp/gp/product/B010RYGL3I||
|6|配線材|105円|https://www.amazon.co.jp/gp/product/B01MTAD3GA|LCDやI2S-DACの接続に使う|
|7|DCジャック|120円|http://akizukidenshi.com/catalog/g/gC-06569/|内側から取り付けるタイプじゃないと工作が難しくなる|
|8|スピーカ端子(WBT-0735)|16590円|[yodobashi](http://www.yodobashi.com/product/100000001000045965/)とか|余っていたので付けた。昔はもっと安かった気がする。明らかなアンバランス。|
|9|その他配線材|||
|10|ネジ各種|||
|11|MicroSD|1000円くらい？|16GB以上推奨|
|12|電源アダプタ|650円|http://akizukidenshi.com/catalog/g/gM-01801/|USB→DC Plugで自作も可|

スピーカ端子は置いておくとして、約6000円程度でシステムが出来上がることになる。

## 配線概要

NanoPi-NEO(SPI関連) ⇒ LCD
NanoPi-NEO(I2C関連) ⇒ OLED (写真では付けていない)
NanoPi-NEO(I2S関連) ⇒ I2S DAC ⇒ TDA7297(パワーアンプ) ⇒ スピーカ端子
NanoPi-NEO(GPIO関連) ⇒ プッシュボタン (写真では付けていない)
電源(+5V) ⇒ NanoPi-NEO
電源(+5V) ⇒ I2S DAC
電源(+5V) ⇒ パワーアンプ

## パワーアンプ(TDA7297)

### 概要

290円で買える15w + 15w の激安アナログアンプである。

定格では　6～18[V]の電圧が必要となっているが、4[V]程度でも音は出る。
今回USBと同じ5[V]で使用するため、発熱量も少なくなる。

### とりあえず改造

ノーマルのままだと音そんなに良くないので、改造推奨である。
改造とは、「コンデンサ総とりかえ」である(笑

コンデンサの音が良い順にあげていくと、個人的評価はこんな感じに思える。
(是非聞き比べしてみてほしい)

|種類|コメント|
|:--|:--|
|フィルムコンデンサ(超高級品)|双信SEコンなど。聞いたこと無いですが分類上1位です|
|積層セラミックコンデンサ(C0G特性)|比較視聴したこと無いですが分類上2位です|
|積層セラミックコンデンサ(X7R特性)|癖は少なめ。|
|フィルムコンデンサ(一般系)|手軽に買える価格帯のクラス。癖あるのが多い。音作りには最適|
|電解コンデンサ|癖あったり音はまちまち。|
|セラミックコンデンサ(F特性)|使ってはイケナイ|

を踏まえて以下のコンデンサに換装した。

|役割|パーツ名|個数|入手先|
|:--|:--|:--|:--|
|入力 LowCut Filter|積セラ 4.7uF 25v (X7S)|2|指定部品 http://akizukidenshi.com/catalog/g/gP-09481/|
|電源デ力ップリング|積セラ 0.1uF 630v (X7R)|1|指定部品 http://akizukidenshi.com/catalog/g/gP-10149/|
|電源デ力ップリング|MUSE KZ 100uF～470uFくらい|1|基板に乗る範囲でhttp://akizukidenshi.com/catalog/g/gP-04609/ など|
|MUTE回路用|MUSE KZ 47uFくらい|1|容量足りない場合、ポップ音出る。http://akizukidenshi.com/catalog/g/gP-04614/ など|


![image.png](https://qiita-image-store.s3.amazonaws.com/0/187531/9ee835a7-565c-17bc-d530-8ab20f80bf47.png)


MUSE KZは音作りされた電解コンデンサなので多用し過ぎに注意。
MUSE FGやUTSJもまたしかり。

とりあえず、こんな感じで大化けし、誰も290円のアンプとは信じないレベルには達する。
(290円だと音が出るだけでありがたいレベル。で見てはいけない)

そして、基板のシルク印刷、SP出力の＋－が反転しているので注意。
詳細は仕様書参照.
http://www.st.com/ja/audio-ics/tda7297.html

## I2S DAC

### 概要

ES9023やPCM5102は、いずれもMCLKが無くても動くI2D-DACである。
それが重宝され、いろいろ使われている。
試聴上の解像度はES9023のほうが高め。

Spec:

||PCM5102|ES9023|
|:--|:--|:--|
|freq|384kHz|192kHz|
|bit|32bit|24bit|

### 配線

本家：
http://wiki.friendlyarm.com/wiki/index.php/NanoPi_NEO
http://wiki.friendlyarm.com/wiki/index.php/NanoPi_NEO2

|NanoPi-NEO2 Pin#|NanoPi-NEO2  Name|PCM5102|ES9023|
|:--|:--|:--|:--|
|1|VDD_5V|VCC|+5V|
|2|USB-DP1|-|-|
|3|USB-DM1|-|-|
|4|USB-DP2|-|-|
|5|USB-DM2|-|-|
|6|GPIOL11/IR-RX|-|-|
|7|SPDIF-OUT/GPIOA17|-|-|
|8|PCM0_SYNC/I2S0_LRC|LRCK|LRCK|
|9|PCM0_CLK/I2S0_BCK|BCK|SCK|
|10|PCM0_DOUT/I2S0_SDOUT|DATA|DATA|
|11|PCM0_DIN/I2S0_SDIN|-|-|
|12|GND|GND|GND|

※PCM5102,ES9023は、上記eBayで販売されている製品でのシルク印刷の端子名です。
※ES9023のMCLKは接続しなくてOK

## LCD

### 概要

[NanoPi-NEOと5種のLCDと2種のOLED](http://qiita.com/blue-7/items/9cc34c9ecc6b2eb5447c)にて、一番見やすかったLCDを採用。


SPI-LCDのマルチディスプレイ環境は、CSを適切なGPIOに割り当ててあげれば、表示可能です。
ただし、ILI9328ではCSが特殊(タイミング依存が強い)なため、SPIのみにおけるマルチディスプレイは対応不可です。
一番簡単なマルティディスプレイはOLEDとLCDの組み合わせになります。

LCD配線は[NanoPi-NEOと5種のLCDと2種のOLED](http://qiita.com/blue-7/items/9cc34c9ecc6b2eb5447c)を参照。

## ボタン

NanoHat OLEDの回路図を参考に、３ボタン配線すると、前の曲、再生/一時停止、次の曲が制御できるようになります。
NanoHat OLEDの場合は、そのままで３つのボタンが使えます。

[Schematic NanoHat OLED.pdf](http://wiki.friendlyarm.com/wiki/images/c/c3/SCHEMATIC_NanoHat_OLED-1703_v1.0.pdf)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/187531/06e21c51-718a-936b-8a1b-0813978d3431.png)

## ケース加工・配線・組み立て

- アクリルケースは、リュータの「小径丸のこ刃」で加工すると楽です。
- 今回は、スピーカ端子、NanoPi-NEO、LCD、I2S-DAC、TDA7297の順で組み付けましたが、最後はスペースが無くかなり苦戦します。特にスピーカ端子回りがキツくなると思います。 

# 工作例Part2

安定化電源と、NanoPi-NEO2、NanoHat-PCM5102a、LCDを組み合わせ、まとも(そう)なアルミケースに組み込んだ例。
もちろん、USB-DACの接続もOK.

![image.png](https://qiita-image-store.s3.amazonaws.com/0/187531/00a726f7-8c05-0bac-bf47-f31f894dfab3.png)

安定化電源は、LM350を使用。LM350の出力電圧調整に半固定抵抗を使ってはイケナイ。
100Ω+300Ωの固定抵抗の組み合わせでちょうど5.0[V]が出てくる。
三端子レビューレータ7805での+5V生成より、LM350での生成のほうが、音ははるかに良いように感じる。
なお、平滑コンデンサは、8200uF 16V を3本。合計150円@秋月である。

そして、この工作例においては、NanoPi-NEOが裏面CPUであることが幸いし、アルミケースへ直接放熱接続している。そのため、CPU温度も25～40度でとてもよく安定する。
良く考えた結果が裏面なのかは置いておくとして、こういった組み込み時においてNanoPi-NEO(2)は、非常に使いやすい素材である。(安いし、初期状態でピンヘッダハンダ付けされていないし)


# おわりに

## 応用例

音出る一体型のシステムになったので、いろいろできますね。

- USB-Camera と OpenCV顔認識組み合わせて不審者検出し、パトカーのサイレン音を鳴らす。救急車を鳴らしてはいけない。
- カッコウ時計。
- crontabと組み合わせて、目覚まし時計。
- ジェスチャーセンサ付けて、非接触側で次の曲/前の曲


## コメント

今回(組み込み一体システム)の製作に至った経緯は、TDA7297が思いのほが音良かったからです。
今回のパッケージでは、スペースとお金の都合上、NanoPi,DAC,PowerAmpともに共通電源としていますが、制限なければ完全独立電源化し、いろいろ弄ってみたい素材ではありました。
DACはチャージポンプで負電圧を生成していますが、トランスで負電圧生成したものを入れたらどうなるか？(壊れるかも知れませんがw)や、PowerAmpにもう少し電圧高めに入れたりとか、改造ライフを楽しむことができるかと思います。

ソフトウェア・ハードウェア共に弄りがいのあるものだと思いますので、是非遊んでみてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/187531/146800dc-6f40-ea94-d251-ff2d6c973385.png)