Armadillo640 のオーディオ再生方法について

西條と申します。

掲題の件について、当初はArmadillo840のように簡単にできるものと思っておりましたが、

Armadillo640のマニュアルには何も載っていないので質問いたします。

armadillo-640-multiplex-v1.0.0.pdf を見るとAudio インターフェースとしてSAI,SPDIF,MQS の 3種類が挙げられていますが

オーディオ出力をするのにどのような回路が必要でどのようなサンプルコードで動く等の情報がありましたらご教示ください。

オーディ出力内容は、音声ガイドまたは警告音、開始音等一般的なものを考えております。

一番簡単な方式でご教示いただけると助かります。

仲村と申します。

スミマセン、ご希望の回答ではないかもしれませんが、「簡単な解決」ということなので。

640ではまだやったことがないですが、x1とG3Lで当社が納めている製品で
USBのオーディオアダプタ
https://www.sanwa.co.jp/product/syohin.asp?code=MM-ADUSB
を使ってます。

これなら、
$ sudo apt-get install alsa-utils
$ sudo apt-get install mpg321

amixer コマンドでボリューム
mpg321 コマンドでmp3ファイルの再生
aplay コマンドでwavファイルの再生

こんなことをやってます。
民生品なので、壊れたら交換する、と割り切っています。

仲村様

ご連絡ありがとうございます。

Armadillo640で御社製品の動作が確認できるのであれば試してみたいかと思うのですが。。。

将来、量産品への適用を考えた場合、ほかの解決方法もあればありがたいところです。

> 仲村と申します。
>
> スミマセン、ご希望の回答ではないかもしれませんが、「簡単な解決」ということなので。
>
> 640ではまだやったことがないですが、x1とG3Lで当社が納めている製品で
> USBのオーディオアダプタ
> https://www.sanwa.co.jp/product/syohin.asp?code=MM-ADUSB
> を使ってます。
>
> これなら、
> $ sudo apt-get install alsa-utils
> $ sudo apt-get install mpg321
>
> amixer コマンドでボリューム
> mpg321 コマンドでmp3ファイルの再生
> aplay コマンドでwavファイルの再生
>
>
> こんなことをやってます。
> 民生品なので、壊れたら交換する、と割り切っています。
>

bambooと申します。横から失礼します。

私はオーディオ関係について知見が殆ど無いのですが、
良い機会でしたので勉強がてら調査をしてみました。
拙い内容で恐縮なのですが共有をさせていただきます。

> オーディ出力内容は、音声ガイドまたは警告音、開始音等一般的なものを考えております。

「音声ガイド」はWAVなどの音声ファイルの再生、
「警告音、開始音」はPCなどでお馴染みのビープ音と仮定して以下に記述させていただきます。

まず音声ファイルの再生ですが、既に仲村様が掲示されていますように
「ALSA」を使用するのがLinuxでは一般的だと思います。
音声再生アプリをC言語で実装するならalsa-lib[1]を使用するか、
aplayコマンドをsystem関数で呼び出せば実現はできそうです。

個人的にはPythonで実装してPyAudio[2]を使うのが簡単そうに思えました。
理由は日本語のサンプルが多く見つかったからです。

しかし、既にお調べになられている通りArmadillo-640にはArmadillo-840+拡張ボードと違い、
オーディオ再生に必要なハードウェアが一部ありません。
その為、Armadillo-640で開発を進める限り、この部分はどうしても追加で用意する必要があります。

私も「簡単」なのは仲村様が掲示されたUSB Audioだと思います。
この理由ですが、まず回路の設計が必要ありません。
USBサウンドカードとスピーカーを購入するだけで済みますのでお手軽です。

Linuxカーネル側は(バージョンが古くて恐縮なのですが) Linux/arm 4.14-at11 のカーネルコンフィグを参照すると
CONFIG_SOUND がデフォルトでは無効ですので、最低でも以下の有効化は必要だと思います。

Linux/arm 4.14-at11 Kernel Configuration
 
Device Drivers  ---> 
    [*] Sound card support  ---> 
        [*]   Advanced Linux Sound Architecture  ---> 
            [*]   USB sound devices  ---> 
                [*]   USB Audio/MIDI driver 

上記を有効化したカーネルでArmadillo-640を起動すれば、一般的なUSBサウンドカードは認識され動作するかと思います。

余談ですが、USB AudioはUSBという非常に一般的で、かつArmadillo-640に標準搭載されたインターフェースを使用する事が
最大のメリットだと私は考えます。

要するに、こなれているので致命的なバグに遭遇する機会が少ないこと、
万が一遭遇してもフォーラム等で再現環境の情報共有が容易であることにより、
開発がスムーズに進められる可能性が高いと思うからです。

私は残念ながら、まだ技術力に自信が無いのでオープンソースであるLinuxを利用する上では、
上記のメリットを大事にしたいです。

> 将来、量産品への適用を考えた場合、ほかの解決方法もあればありがたいところです。

USB Audio以外では「I2S」が選択肢に入ると思います。情報もS/PDIF,MQSに比べると豊富です。

「SAI」は見慣れないインターフェース名だったのですが、
参考資料[3]によるとi.MXにおける「I2S」と考えてもよさそうです。

ArmadilloではないLinux搭載製品でのサンプルで恐縮なのですが、
「I2S」の回路図が載ったサイトをいくつか紹介させていただきます。[4][5]

またカーネルコンフィグを参照するとSAI(I2S)を使用するには SND_SOC_FSL_SAI か SND_SOC_FSL_ESAI を
有効化する必要がありそうです。DTBも適宜変更が必要ですね。

あくまで私の開発スタイルなのですが、まずI2S接続のDACモジュール[6]などを準備し、
Armadillo-640にブレッドボード等で接続して、SAI(I2S)の動作確認を行っておきたいです。

理由はSAI(I2S)がArmadillo-640において標準では無効化された機能の為です。

Armadillo-640のオプション・関連製品には、現状サウンド関連の拡張ボードは無いように見受けられました。
そしてインターフェースの動作確認試験は(私の感覚では)とてもコストのかかる作業のはずなので、
Armadillo-640のような比較的最近発売されたボードでは、
「現状ではSAI(I2S)の動作確認実績があまりなかったとしても何の不思議も無い」
と仮定し作業を進めると思います。

また自作のハードウェアを繋げた構成で不具合が発生した場合、
最低でも自作のハードウェア側に問題が無いことを確認した上でないと、
問題の切り分けが広範囲にわたり、フォーラム等に投稿しても解決に至るまで、
多大な時間を消費してしまう可能性が高いです。

まとめますと、私ならフォーラム等でSAI(I2S)の「動作確認実績の確認」と並行して、
出来合いのモジュールでSAI(I2S)のインターフェース単体としての動作確認を行い、
問題なさそうなら量産用のDAC、アンプ、スピーカーの選定、回路設計に着手するかと思います。

というより私の知識が無さ過ぎてSAI(I2S)の動作確認を通して勉強した後でないと
部品選定、回路設計ができないだけなのですけどね…

USB Audio、SAI(I2S)以外ではBluetoothオーディオを使うのも個人的に面白そうだと思いました。
無線特有の問題はありますが、本体とスピーカーの完全分離が可能なのは、時に魅力ですね。

次に「警告音、開始音」ですが、私ならばコストは上がりますが、
「音声再生」とは別系統で再生環境を用意したいところです。

例えば電源投入時に即ビープ音を鳴らしたいと思っても、
ブートローダー側にSAI(I2S)経由で音を鳴らす改造を加えるのは、とても骨が折れそうに感じるためです。
ですがGPIOやPWMの制御ならば何とかできそうな気がします。

ビープ音は圧電スピーカーなどで再生する方法があるかと思います。[7]
回路も再生方法もシンプルですし、システムの動作確認にも使えますので開発の役にも立つでしょう。

> 一番簡単な方式でご教示いただけると助かります。

最後に、私が調査した限りなのですが「一番簡単」だと思えた方法をご紹介させていただきます。

インテグレーションサービス(パートナーによる開発支援サービス)
https://armadillo.atmark-techno.com/integration-partners

やはり可能なら専門家に依頼するのが一番簡単で確実で安心だと思います。

長々と記載してしまい失礼しました。
少しでも参考になりそうな情報がありましたら幸いです。

(以下は参考文献です。)

[1] ALSA project - the C library reference
https://www.alsa-project.org/alsa-doc/alsa-lib/examples.html

[2] PyAudio Documentation
https://people.csail.mit.edu/hubert/pyaudio/docs/

[3] Using Multi-Channel Feature of SAI
https://www.nxp.com/docs/en/application-note/AN12090.pdf

[4] ラズベリーパイでI2S出力
https://bluefish.orz.hm/sdoc/raspi_i2sout.html

[5] I2SによるAudio出力 - その6 [Raspberry Pi]
https://decafish.blog.so-net.ne.jp/2017-11-23

[6] MM-5102 取扱説明書
https://www.sunhayato.co.jp/dcms_media/other/MM-5102_Manual_SG14012.pdf

[7] PWMでブザーを鳴らそう
https://physical-computing-lab.net/raspberry-pi-b/4-1pwm%E3%81%A7%E3%83%96%E3%82%B6%E3%83%BC%E3%82%92%E9%B3%B4%E3%82%89%E3%81%9D%E3%81%86.html

bamboo様

西條です。

ご連絡ありがとうございます。

まずはUSB Audioにて、Armadillo840のように、できるかどうかから試してみたいと思います。

> bambooと申します。横から失礼します。
>
> 私はオーディオ関係について知見が殆ど無いのですが、
> 良い機会でしたので勉強がてら調査をしてみました。
> 拙い内容で恐縮なのですが共有をさせていただきます。
>
> > オーディ出力内容は、音声ガイドまたは警告音、開始音等一般的なものを考えております。
>
> 「音声ガイド」はWAVなどの音声ファイルの再生、
> 「警告音、開始音」はPCなどでお馴染みのビープ音と仮定して以下に記述させていただきます。
>
> まず音声ファイルの再生ですが、既に仲村様が掲示されていますように
> 「ALSA」を使用するのがLinuxでは一般的だと思います。
> 音声再生アプリをC言語で実装するならalsa-lib[1]を使用するか、
> aplayコマンドをsystem関数で呼び出せば実現はできそうです。
>
> 個人的にはPythonで実装してPyAudio[2]を使うのが簡単そうに思えました。
> 理由は日本語のサンプルが多く見つかったからです。
>
>
> しかし、既にお調べになられている通りArmadillo-640にはArmadillo-840+拡張ボードと違い、
> オーディオ再生に必要なハードウェアが一部ありません。
> その為、Armadillo-640で開発を進める限り、この部分はどうしても追加で用意する必要があります。
>
> 私も「簡単」なのは仲村様が掲示されたUSB Audioだと思います。
> この理由ですが、まず回路の設計が必要ありません。
> USBサウンドカードとスピーカーを購入するだけで済みますのでお手軽です。
>
> Linuxカーネル側は(バージョンが古くて恐縮なのですが) Linux/arm 4.14-at11 のカーネルコンフィグを参照すると
> CONFIG_SOUND がデフォルトでは無効ですので、最低でも以下の有効化は必要だと思います。
>

> Linux/arm 4.14-at11 Kernel Configuration
> 
> Device Drivers  ---> 
>     [*] Sound card support  ---> 
>         [*]   Advanced Linux Sound Architecture  ---> 
>             [*]   USB sound devices  ---> 
>                 [*]   USB Audio/MIDI driver 
> 

> 上記を有効化したカーネルでArmadillo-640を起動すれば、一般的なUSBサウンドカードは認識され動作するかと思います。
>
>
> 余談ですが、USB AudioはUSBという非常に一般的で、かつArmadillo-640に標準搭載されたインターフェースを使用する事が
> 最大のメリットだと私は考えます。
>
> 要するに、こなれているので致命的なバグに遭遇する機会が少ないこと、
> 万が一遭遇してもフォーラム等で再現環境の情報共有が容易であることにより、
> 開発がスムーズに進められる可能性が高いと思うからです。
>
> 私は残念ながら、まだ技術力に自信が無いのでオープンソースであるLinuxを利用する上では、
> 上記のメリットを大事にしたいです。
>
>
> > 将来、量産品への適用を考えた場合、ほかの解決方法もあればありがたいところです。
>
> USB Audio以外では「I2S」が選択肢に入ると思います。情報もS/PDIF,MQSに比べると豊富です。
>
> 「SAI」は見慣れないインターフェース名だったのですが、
> 参考資料[3]によるとi.MXにおける「I2S」と考えてもよさそうです。
>
> ArmadilloではないLinux搭載製品でのサンプルで恐縮なのですが、
> 「I2S」の回路図が載ったサイトをいくつか紹介させていただきます。[4][5]
>
> またカーネルコンフィグを参照するとSAI(I2S)を使用するには SND_SOC_FSL_SAI か SND_SOC_FSL_ESAI を
> 有効化する必要がありそうです。DTBも適宜変更が必要ですね。
>
>
> あくまで私の開発スタイルなのですが、まずI2S接続のDACモジュール[6]などを準備し、
> Armadillo-640にブレッドボード等で接続して、SAI(I2S)の動作確認を行っておきたいです。
>
> 理由はSAI(I2S)がArmadillo-640において標準では無効化された機能の為です。
>
> Armadillo-640のオプション・関連製品には、現状サウンド関連の拡張ボードは無いように見受けられました。
> そしてインターフェースの動作確認試験は(私の感覚では)とてもコストのかかる作業のはずなので、
> Armadillo-640のような比較的最近発売されたボードでは、
> 「現状ではSAI(I2S)の動作確認実績があまりなかったとしても何の不思議も無い」
> と仮定し作業を進めると思います。
>
> また自作のハードウェアを繋げた構成で不具合が発生した場合、
> 最低でも自作のハードウェア側に問題が無いことを確認した上でないと、
> 問題の切り分けが広範囲にわたり、フォーラム等に投稿しても解決に至るまで、
> 多大な時間を消費してしまう可能性が高いです。
>
> まとめますと、私ならフォーラム等でSAI(I2S)の「動作確認実績の確認」と並行して、
> 出来合いのモジュールでSAI(I2S)のインターフェース単体としての動作確認を行い、
> 問題なさそうなら量産用のDAC、アンプ、スピーカーの選定、回路設計に着手するかと思います。
>
> というより私の知識が無さ過ぎてSAI(I2S)の動作確認を通して勉強した後でないと
> 部品選定、回路設計ができないだけなのですけどね…
>
> USB Audio、SAI(I2S)以外ではBluetoothオーディオを使うのも個人的に面白そうだと思いました。
> 無線特有の問題はありますが、本体とスピーカーの完全分離が可能なのは、時に魅力ですね。
>
>
> 次に「警告音、開始音」ですが、私ならばコストは上がりますが、
> 「音声再生」とは別系統で再生環境を用意したいところです。
>
> 例えば電源投入時に即ビープ音を鳴らしたいと思っても、
> ブートローダー側にSAI(I2S)経由で音を鳴らす改造を加えるのは、とても骨が折れそうに感じるためです。
> ですがGPIOやPWMの制御ならば何とかできそうな気がします。
>
> ビープ音は圧電スピーカーなどで再生する方法があるかと思います。[7]
> 回路も再生方法もシンプルですし、システムの動作確認にも使えますので開発の役にも立つでしょう。
>
>
> > 一番簡単な方式でご教示いただけると助かります。
>
> 最後に、私が調査した限りなのですが「一番簡単」だと思えた方法をご紹介させていただきます。
>
> インテグレーションサービス(パートナーによる開発支援サービス)
> https://armadillo.atmark-techno.com/integration-partners
>
> やはり可能なら専門家に依頼するのが一番簡単で確実で安心だと思います。
>
> 長々と記載してしまい失礼しました。
> 少しでも参考になりそうな情報がありましたら幸いです。
>
>
> (以下は参考文献です。)
>
> [1] ALSA project - the C library reference
> https://www.alsa-project.org/alsa-doc/alsa-lib/examples.html
>
> [2] PyAudio Documentation
> https://people.csail.mit.edu/hubert/pyaudio/docs/
>
> [3] Using Multi-Channel Feature of SAI
> https://www.nxp.com/docs/en/application-note/AN12090.pdf
>
> [4] ラズベリーパイでI2S出力
> https://bluefish.orz.hm/sdoc/raspi_i2sout.html
>
> [5] I2SによるAudio出力 - その6 [Raspberry Pi]
> https://decafish.blog.so-net.ne.jp/2017-11-23
>
> [6] MM-5102 取扱説明書
> https://www.sunhayato.co.jp/dcms_media/other/MM-5102_Manual_SG14012.pdf
>
> [7] PWMでブザーを鳴らそう
> https://physical-computing-lab.net/raspberry-pi-b/4-1pwm%E3%81%A7%E3%83%96%E3%82%B6%E3%83%BC%E3%82%92%E9%B3%B4%E3%82%89%E3%81%9D%E3%81%86.html
>

> armadillo-640-multiplex-v1.0.0.pdf を見るとAudio インターフェースとしてSAI,SPDIF,MQS の 3種類が挙げられていますが
>
> オーディオ出力をするのにどのような回路が必要でどのようなサンプルコードで動く等の情報がありましたらご教示ください。

> 一番簡単な方式でご教示いただけると助かります。

今月末(5月30日予定)の製品アップデートで、Armadillo-640のLinuxカーネルに MQSの対応 が入ります。

MQSを利用するとDACなしでステレオスピーカーまたはヘッドフォンをアンプに接続できます。
USBオーディオと比べると、回路設計が必要な分難易度はあがりますが、DACが不要なため回路自体は単純になります。

使用方法については、今月の製品アップデートをお待ち下さい。