ESP32 esp-idfの最近のブログ記事

ESP-EYE Simple HTTPD Server with MIC / MIC stream server

ESP-EYE Simple HTTPD Server with MIC / MIC stream server

ESP-EYE オンボードマイクの音はどんなのか知りたくて、
ブラウザーから聴けるようにしてみました。

概要は、オンボードMIC 入力信号を I2S で取り込んで、WAV フォーマットに変換して、
本、Simple Server にアクセスした、ブラウザーへ、'audio/wav' httpデータとして送ります。

WAVデータ
16bit Mono 16k sampling

開発環境
Windows 10
esp-idf.py v4.0  Getting Started Guide for ESP-IDF v4.0
python3.7
MSYS2: make のみ利用
Git: Windows版とMSYS2 版を適宜に使用

あったら便利なツール
eclipse C/C++ 2020-06
(open java 64bit : OpenJDK11U-jdk_x64_windows_hotspot_11.0.8_10)
idf-eclipse-plugin : https://github.com/espressif/idf-eclipse-plugin

HTTP サーバーのベースは、esp-idf のサンプルプログラムの、
https://github.com/espressif/esp-idf/tree/master/examples/protocols/http_server/simple
です。

上記プログラムをベースに MIC 入力部分、WAVデータへの変換、を加えて行きます。

Browser Based ESP32-EYE Spectrum Analyzer の試し。

Browser Based ESP32-EYE Spectrum Analyzer と言うのが公開されていたので、
試してみました。

上記ページに記載されているように、ソース(.ino) を github からダウンロードして、Arduino の
ライブラリマネージャで、2つライブラリをダウンロードしたら、簡単にビルドできました。

開発環境
Winddows10
Arduino IDE
ボード: ESP-EYE

但し、実行させてみると、スペクトグラムの表示が、うんともすんとも動きません。

ESP-EYE の esp-idf で、tensorflow lite microcontrollers  examples/person_deetection を試してみました。

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro/examples/person_detection

今回は、Build 、 Run の時のトラブルとその対処方を纏めてみました。
手順は、ESP-EYE tensorflow lite microcontrollers examples/micro_speech とほとんど同じです。

開発環境
Windows 10
esp-idf.py v4.0  Getting Started Guide for ESP-IDF v4.0
python3.7
MSYS2: make のみ利用
Git: Windows版とMSYS2 版を適宜に使用

あったら便利なツール
eclipse C/C++ 2020-06
(open java 64bit : OpenJDK11U-jdk_x64_windows_hotspot_11.0.8_10)
idf-eclipse-plugin : https://github.com/espressif/idf-eclipse-plugin

前提、
esp-idf v4.x 、 python3.7、 MSYS2 、Git はインストール済とします。

要領は、、ESP-EYE tensorflow lite microcontrollers examples/micro_speech とほとんど同じです。

1. tensorflow の clone も同じです。

ESP-EYE ESP-WHO detection_with_web(cat face detection)

ESP-EYE  ESP-WHO detection_with_web(cat face detection) を試してみました。

esp-who のサンプルプログラム
detection_with_web を試してみました。

開発環境
Windows 10
esp-idf.py v4.0  Getting Started Guide for ESP-IDF v4.0
python3.7
MSYS2: make のみ利用
Git: Windows版とMSYS2 版を適宜に使用

あったら便利なツール
eclipse C/C++ 2020-06
(open java 64bit : OpenJDK11U-jdk_x64_windows_hotspot_11.0.8_10)
idf-eclipse-plugin : https://github.com/espressif/idf-eclipse-plugin

前提、
esp-idf v4.x 、 python3.7、 MSYS2 、Git はインストール済とします。

要領は、esp-who ページの流れに従って行います。

ESP-EYE tensorflow lite microcontrollers examples/micro_speech

ESP-EYE の esp-idf で、tensorflow lite microcontrollers  examples/micro_speech を試してみました。

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro/examples/micro_speech

今回は、Build 、 Run の時のトラブルとその対処方を纏めてみました。

開発環境
Windows 10
esp-idf.py v4.0  Getting Started Guide for ESP-IDF v4.0
python3.7
MSYS2: make のみ利用
Git: Windows版とMSYS2 版を適宜に使用

あったら便利なツール
eclipse C/C++ 2020-06
(open java 64bit : OpenJDK11U-jdk_x64_windows_hotspot_11.0.8_10)
idf-eclipse-plugin : https://github.com/espressif/idf-eclipse-plugin

前提、
esp-idf v4.x 、 python3.7、 MSYS2 、Git はインストール済とします。

要領は、上記ページの Deploy to ESP32 の流れに従って行います。

1. tensorflow の clone
clone 先は、 E:\local\tensorflow とします。

MSYS2 ターミナルで、
$ cd /e/local
$ git clone https://github.com/tensorflow/tensorflow.git
$ cd tensorflow

ESP32 esp-idf I2s Master clock out put

ESP32 esp-idf I2s マスターモードで、MCLK(I2S master clock) の出力について、
何とか出来たので書いてみました。

 esp32_datasheet_en.pdf の記述では、マスタークロックを出力できると記載があります。
4.1.12 I²S Interface
 ..
 When one or both of the I²S interfaces are configured in the master mode, the master clock can be output to the external DAC/CODEC.

また、別のページには、
The MCLK (I2S master clock) output can be put out through a CLK_OUT pin only.
とあるので、下記シンボルがそれみたいです。

soc/io_mux_reg.h
CLK_OUT1 - 3

ESP32 esp-idf Serial Over Bluetooth サンプルプログラム #3 です。

前回は、プログラムを一応作って、Windows10 にそれぞれ、ESP32 の UART0 のターミナル、Bluetooth の SPP Serial のターミナル、
UART2 の USB TTL-Serial のターミナルの3個を使って、SPP Serial -> UART2 USB TTL-Seial、
SPP Serial <- UART2 USB TTL-Seial へのテキスト文字の転送迄できました。

今回は、実際の運用を想定して、Window10 で、C,C++ でSerial 通信が出来るプログラムを
作って、そのプログラムで、Bluetooth COMポートへアクセスして、多くのデータの送信、受信が
RS232Cに繋がったデバイス (これも、Window10 で、C,C++ でSerial 通信が出来るプログラム) と
問題なく出来る事を確認できれば、完了ぞね。と行きたい所ですが、

TeraTerm に、ファイルの転送機能があったので、SPP Serial の TeraTerm から、テキストファイルを開いて転送してみました。

ESP32 esp-idf Serial Over Bluetooth サンプルプログラム #2 です。

前回は、bt_spp_acceptor をベースにして、Windows10 Bluetoooth でペアリグして、
Windows10 側の シリアル・ターミナル で、Bluetoooth COMポートをオープンして、
シリアル・ターミナル からのキー入力にたいして Echo Back 出来る迄出来ました。

今回は、ESP32 の UART2 部分になります。
esp-idf のサンプルでは、uart_echo と uart_events がありますが、
今回は、uart_events を使って、ドライバーをUART2対応にします。
プログラムとしては、下記になります。

uart_events_example_main.c

ESP32 esp-idf Serial Over Bluetooth サンプルプログラム

ESP32 Serial Over Bluetooth サンプルプログラムと言えば、
インターネットで検索すると、ESP32 Arduino 版の簡単なライブラリーが、紹介されていますが、

https://github.com/espressif/arduino-esp32/tree/master/libraries/BluetoothSerial
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;

これでは、余りに簡単すぎるので、オンちゃんは敢えて、esp-idf にこだわってみました。

ESP32 esp-idf  Serial Over Bluetooth は、Bluetooth Classic の SPP プロファイルを使うみたいです。

サンプルは、https://github.com/espressif/esp-idf のサンプルプログラムにありました。
esp-idf / examples / bluetooth / bluedroid / classic_bt / bt_spp_acceptor/

ESP32 esp-idf bluetooth a2dp_sink への aptx decode 実装の考察 の続き、 #8 です。

i2s_write が間に合っていないと言う事が判ったので、
i2s_write() が最速になるように、i2s_config の設定を色々試して、下記の様に変更しました。
app_main()::main.c

APTX の1フレームのデコード済データ長は、 2,688 バイト みたいなので、
同じ値にしたかったのですが、I2S DMA の最大は、1024バイトのようなので、
.dma_buf_len = 672 にしました。
.dma_buf_count は、目一杯にしたかったのですが、取り敢えず、.dma_buf_count = 20 です。

ESP32 esp-idf bluetooth a2dp_sink への aptx decode 実装の考察 の続き、 #7 です。

なんとか、APTXのデコード部分を、2つのタスクを起動して、負荷の分散を行わせる事ができました。
これで、先般の、 "Pkt dropped" の表示がでなくなりました。

概要は、btc_a2dp_sink_data_ready()::btc_a2dp_sink.c が元々ありますが、
ここから、従来は、btc_a2dp_sink_handle_inc_media_Aptx(int8_t id,tBT_SBC_HDR *p_msg)::btc_a2dp_sink.c
(注: これは、 APTX 用に、btc_a2dp_sink_handle_inc_media(int8_t id,tBT_SBC_HDR *p_msg)::btc_a2dp_sink.c を改造したもの)
を直接コールしていた流れを、
別タスクを2つを起動させて置いて、そこから、上記関数をコールさせるようにしました。
これで、受信した音楽フレームを交互に振り分けて、APTXのデコード処理以降を分散させます。

なほ、上記2つのタスクは、それぞれ、別コアでの起動にします。

さて、音の方は言うと、音楽として判るようにはなりましたが、
まだまだ、まともには聴ける音ではありません。

常に、ビーンビーンと、かそれに近い雑音が出ていて、たまに、ピチピチ(チッピング音)が出ています。
まだまだ、プログラムとして問題があるようです。

ESP32 esp-idf bluetooth a2dp_sink への aptx decode 実装の考察 の続き、 #6 です。

ESP32 esp-idf bluetooth a2dp_sink への aptx decode 実装の考察 の続き、 #5 で説明した、プログラムの修正以外にも、結構な変更があったのですが、一応それらを、全て行って、
https://github.com/pali/libopenaptx のデコードのプログラムを組み込んで、試してみました。

結論から言えば、残念ながら、上記の、 libopenaptx のプログラムでは、おんちゃんの場合は、
まともな音は出ませんでした。

一応、Windows10+Bluetoothドングルで、 APTX でのフレーム受信までは出来るようになりました。

上記、 libopenaptx のプログラムでAPTX audio データをデコードして、I2S で音出ししてみると、
殆どノイズでうるさくて、まともに音楽は出てきません。

Windows10 の IE で YouTube を開いて、音楽を聴くと、 Bluetooth でペアリングした、ESP32 に繋げた I2S DAC ( https://www.switch-science.com/catalog/3572/ ) のヘッドホーンからは、それらしい音は出てきますが、ノイズの方が大きくて、まともには聴けません。

残念!!

ESP32 esp-idf bluetooth a2dp_sink への aptx decode 実装の考察 の続き、 #5 です。

その後、あちこち、DEBUG表示を行って、調べてみました。
AVDTP(AUDIO/VIDEO DISTRIBUTION TRANPORT PROTOCOL SPECIFICATION) や、GAP(Generic Audio/Video Distribution Profile) 上の、
Idle -> Cofigured -> Open に至る部分が、下記のようです。

ESP32 esp-idf bluetooth a2dp_sink への aptx decode 実装の考察 の続き、 #4 です。

A2DP aptx,aptx-hd のプロフィールのスペックは、 インターネットで探してみましたが、
結局見つかりませんでした。

注) その後、https://docs.microsoft.com/ja-jp/windows-hardware/drivers/bluetooth/bluetooth-profile-drivers-overview を見ていたら、 Details of the Bluetooth protocol are available on the Bluetooth website. があったので、見てみると、https://www.bluetooth.com/ja-jp/specifications/profiles-overview に A2DP の仕様書をみつけました。
Version1.3 から、Non-A2DP codecs (Vendor-Specific A2DP codecs) が加わったみたいです。 

しかし、Andoroid Developer の Fluoride Bluetooth stack に、A2DP の SBC,APTX,APTX-HD,LDAC
のプロファイル処理のサンプルがあったので、参考にしてみます。
Fluoride Bluetooth stack は、Andoriod Ver. 6 あたりから、Bluedroid に代わって採用されたBluetooth スタックとの事です。

ESP32 esp-idf bluetooth a2dp_sink への aptx decode 実装の考察 の続き、 #3 です。

まだ、Bluetooth の a2dp aptx のソース側のハードが揃わないので、取り敢えず、現状の アンドロイド Version 5 でのログを集めてみました。
手順は、先に ESP32 a2dp_sink (SBC版) を立ち上げておきます。

次に、Andoriod スマホ を起動させた時のログ

ESP32 esp-idf bluetooth a2dp_sink への aptx decode 実装の考察 の続き、 #2 です。

それでは、SBC データのデコード場所は、と言うと、
どうやら、 esp-idf/components/bt/bludroid/external/sbc/decoder/src/decoder-sbc.c の
OI_CODEC_SBC_DecodeFrame() ようです。
注) これ以降は、esp-idf/components/bt は, bt と表記します。

bt/bludroid/external/sbc/decoder/src/decoder-sbc.c

esp-idf examples の bluetooth/a2sp_sink へ aptx decode を組み込めるか、ソースを追って考察してみました。

先ず、i2s_write() を実行している所はと言うと、bt_app_av.c の bt_app_a2d_data_cb() の中で、
i2s_write() をコールしているようです。

bt_app_av.c

ESP32 esp-idf eclipse CentOS7 build error

CentOS7 で、esp-idf プロジェクトを eclipseでビルドしようとすると、エラーになりました。

esp-idf の eclipse (CentOS7) へのインストールは、下記手順で行いました。
https://docs.espressif.com/projects/esp-idf/en/latest/get-started/eclipse-setup.html

試しに、esp/esp-idf/examples/bluetooth/a2dp_sink を
eclipse にインポートしてビルドすると下記エラーになります。
なんで、またエラーになるの? と言う気持ちですが、

aptx-encode aptx-decode のプログラムサンプル

aptx-decode のプログラムサンプルを探していましたが、
libopenaptx が公開れていました。

https://github.com/pali/libopenaptx

aptx,aptx-hd の Encode は公開されているようですが、Decode のほうは、
どうやら、LDAC と同じく 非公開で、研究のための使用に限定されるような記述も何処かで、見かけたので注意が必要ですが。

This is Open Source implementation of Audio Processing Technology codec (aptX)
derived from ffmpeg 4.0 project and licensed under LGPLv2.1+.
ともあるので、どちらが正しいのかわかりません。

仕方がないので、おんちゃんは勉強のつもりでダウンロードして、CentOS7 Eclipseでビルドしてみました。

ESP32 esp-idf Bluetooth I2s Audio Examples

ESP32 esp-idf の examples の中に、Bluetooth のA2DP(Advanced Audio Distribution Profile:高度オーディオ配信プロファイル) を
使ったサンプルがあるので、それを試してみました。

 esp-idf>examples>bluetooth>a2dp_sink
上記、意味合いは、a2dp の受信側 の意味のよう。

概要は、上記リンク先のページに説明がありますが、
Bluetooth のデバイスとして、オーディオストリームを受信して、外付けの I2sコーデック (PCM5102等) か、内臓のDACに出力するとの事です。

其処の所の設定は、make menuconfig で出来ました。
例により、下記手順で、 
1. esp-idf/examples/bluetoooth/a2dp_sink  のディレクトリーを、自分の作業ディレクトリーへコピー
2. MSYS2 MinGW 32-bit ターミナルを起動して、上記の自分の作業ディレクトリーへ移動
$make menuconfig
   Serial flasher config --> Default serial poort = COMX に変更
   A2DP Examples Configuration --> ここで、外付け I2s,内臓 DACの指定、ピンの指定をする。
   exit
$make -j4
$make flash

3. スマホのBlutooth で接続して、音楽を流す。

後は、Eclipse にインポートして、プログラムを勉強します。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちESP32 esp-idfカテゴリに属しているものが含まれています。

前のカテゴリはCoral EdgeTPUです。

次のカテゴリはGPSです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

カテゴリ

ウェブページ

サイトナビ