balenaOSを用いて簡単にラズパイBluetoothレシーバを構築する

**2020-01-28 動作確認・オプションについて追記**
# はじめに
ラズパイを用いてBluetoothレシーバを作りたいと思った。検索すると大体bluezを用いてBluetoothレシーバにする例があったため最初bluezで構築した。しかし、遅延やら停止、コーデックのエンコードエラーが多発したためbluezのBluetoothレシーバはやめた。色々と調べているうち、balenaプロジェクト公式で「昔のHi-fiオーディオを今時レシーバにさせない？」みたいな記事があったため構築してみようとやってみた。
以下そのサイト
>**Turn your old speakers or Hi-Fi into Bluetooth, Airplay and Spotify receivers with a Raspberry Pi and this step-by-step guide**
https://www.balena.io/blog/turn-your-old-speakers-or-hi-fi-into-bluetooth-receivers-using-only-a-raspberry-pi/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/7391aebe-0919-1038-3a22-d3bb22a9b91a.png)

どうやらこの通りだとBluetoothだけでなくAirplay、Spotify Connect が使えるようになるらしい。
ある意味すごい。今じゃ当たり前だが。。
やってみる。

## 準備したもの
- Raspberry Pi 3B
- microSD 64GB (FAT32フォーマット済み)
- 3.5mmプラグステレオスピーカー
- 電源 (5V,3A)

ラズパイに関してはRaspberry Pi 3A+/3B/3B+/4B/Zero W (Wi-Fi,Bluetoothが使えるモデル)で動作する。
セットアップPC環境はWindows 10 Home 
## balena Cloud の初期操作
**アカウントの作成**
https://dashboard.balena-cloud.com/signup?utm_source=efp&utm_campaign=balena-sound にてアカウントを作成。Github,GoogleのアカウントでもOK
**アプリケーションの作成**
サインインするとアプリケーション作成が出る。自分がわかりやすいものでよい。
**ラズパイに焼くbalenaOSの準備**
ダッシュボードから`[ +Add Device ]`、 `select device type` は自分のラズパイを選ぶ。`select balenaos version`は最新のもの"(recommended)"を選ぶのではなく"v2.38.0+rev1"を選ぶとよい。(recommendedのまま焼いたら起動しなかった) `select edition` は "Development"、`network connection` は"Ethernet+Wi-Fi"を選びSSID,Password を入力。そしてダウンロード。

##balenaOSを焼く・起動
**焼く**
FlashツールであるbalenaEtcherをインストールする。
https://www.balena.io/etcher/
起動するとこのような画面が出る。Select image はダウンロードしたbalenaOS を選択。Select drive で焼きたいSDカードを選び、Flashする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/fb7df5a1-a11c-6a4c-c223-feca4dc0c9e9.png)
Flash Completeと出たら完了。一度イジェクトしてまたPCに差し込む。
**カスタマイズ**
調べるとgpuメモリを多く設定したほうがいいとあった。念の為設定する。ここを参考にした。
>　“balenaOSをRaspberry Pi3にインストールする方法 – Qiita”
  https://qiita.com/ikemura23/items/deedeb2a55ca1f6d0ec5

今回音声メインなためこの設定は不要かもしれない。
Windowsでもrasin-bootからconfig.txtをメモ帳編集でよい。
※ネットワークに関して
　固定（静的）IPだとbalenaOSには繋がらない(DashBoadに表示されない)ため、DHCPが無難である。
　固定の場合はルータの設定でDHCP有効化しておくと良い。

設定が完了したところでラズパイにSDカードを差して起動。
##balenaOSの起動
**起動**
ラズパイにSDカードを挿入して電源を投入。
　ここで起動状態を確かめたいという方はhdmiでモニター等につなげるとコンソール画面が見れると思う。
　→ 画面に大きく`balenaOS`、その下に`Booted - Check your balena dashboard.`と出ていれば正常。
**balena Cloud上でのデバイスの確認**
balena Cloudのダッシュボードを確認すると起動したデバイスがリストに出ているかと思う。
ページより
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/1d95530b-9b6b-d420-83df-47128f590a38.png)

もし出ていない場合はネットワークに繋がっていない、もしくはラズパイのエラーかと思われる。
（OS作成時に`network connection` はEthernet+Wi-Fi を選んでいなくWi-Fiに繋がらない、DHCP設定等）
公式のトラブルシューティング：https://www.balena.io/docs/faq/troubleshooting/troubleshooting/
##balena CLIのインストール
balenaプロジェクトのGithubからインストーラをダウンロードしインストール
https://github.com/balena-io/balena-cli/releases
その後コマンドプロンプトかPowerShellを管理者で起動する。
`balena login` と入力 `Web authorization (recommended)`を選択
ブラウザが立ち上がるのでサインインしボタンを押せば認証完了
## コードをデプロイ
Githubからコードをzipで任意の場所にダウンロード
https://github.com/balena-io-projects/balena-sound
ダウンロードしたzipを解凍、コマンドプロンプトかPowerShellを管理者で起動

```
cd [解凍したディレクトリ]  ~\balena-sound-master
balena push [自分のアプリケーション名]
```
正常にデプロイされていれば以下のユニコーンが出る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/1ded1084-f35e-082e-4763-2326409e5dbb.png)

そしてbalena Cloudのダッシュボードを見ると`Updating`となる。`Updating`終了後自動的に`Running` になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543063/bc8fc72c-15b0-c1b1-d841-05970e41e7bb.png)
Serviceとして `airplay` `bluetooth-audio` `spotify` が動く。これで一度rebootし機能するか確認する。
スピーカーをつなげる。
##動作確認
**Bluetooth** 
スマホ・プレイヤー・PC等をペアリングする。デバイス名として "balena Sound ~ "と出るので選択しペア。音源を再生できればOK
ペアするとピンポーンと音がなる。
**注：Android端末によっては接続しても接続していない状態(「nullと接続しています」)が設定画面に表示されるが正常である。これでまた接続しなおすと再生できなくなるため注意**
**Airplay**
iPhone・iPod・iPad等のAppleデバイスで利用可能。またiTunesでも可。~~Bluetoothオン~~(しなくても大丈夫だった）AirplayでBluetoothと同じデバイス名が出ればOK
**Spotify Connect**
**注：Spotify Premiumに入っていないと使えない**
Wi-Fiで繋がる。SpotifyアプリでスピーカーとPCのボタンを選択しBluetoothと同じデバイス名が出ればOK

##デバイス名の変更(オプション)
balena Sound ~はダサいなと思ったらデバイス名を変更できる。
balena Cloudダッシュボード上の Environment variablesを選択
`[+Add variable]`からNameに`BLUETOOTH_DEVICE_NAME` Valueに任意のデバイス名を入力
　これでrebootすればデバイス名が設定した名前に変わる。
## ※その他のオプション
ページの記載だとDAC HATを用いて音質アップできるらしい。
今回はやらないが、DACを使いたいという方は参考にしてほしい。
また、HDMIでも音声出力はできるので、HDMI対応アンプを持っていれば音質アップできるだろう。
詳細のオプションについてはGithubに書いてある。(ボリュームの固定、PINコードの設定等)
https://github.com/balenalabs/balena-sound#set-output-volumes
##良かった点
・raspbianでbluezインストールするよりはコマンドを打たなくてよいため楽。ほぼguiでOK　すぐに構築できる。
・balena Cloudの使い方が分かった。とても簡単。gitだと設定がクソ面倒くさいためすぐbalena CLIが使えるのはホント楽。
・bluezでレシーバ化したのとは全然違う。ほぼ遅延しないし止まらない。またペアが楽にできる。
・Airplayで動画等の音声を飛ばせるため良い。少々遅延があるが
##悪かった点（躓いた点）
・balenaOS作成時にnetwork connection をEthernet only トグルのままで最初OSを作成してしまった。
　 → ネットに繋がらない。Bluetoothも使えない。
・balena CLI と Git で最初コードを適用したが変数エラーが出た。
　 → ドキュメントにも記述してあるが、Windows上だとこの組み合わせはエラーするらしい。そのため先程のようにzip解凍→`balena push`すればきちんと動く。
##まとめ
bluetoothレシーバ化はラズパイだとbluezしか方法が無いのかな？と思っていたが、balena Cloudを用いても簡単にしかも遅延、ノイズ等無しで再生できることが分かった。まだ初期段階であるためもしかしたら今後再生できなくなってしまうといったトラブルがあるかもしれない。あくまでもラズパイbluetoothレシーバ化の一つの手段としておく。
また、balena Cloudを用いてYoutubeのサイネージが構築できるらしいので今後やってみたいと思っている。
##リンク
[balena - Home](https://www.balena.io/)
[balenaOS - Getting Started](https://www.balena.io/os/docs/raspberrypi3/getting-started/)