ESP-EYE マイク を bluetooth で、PC につなげて聞きたい。
最終的には、esp-idf の サンプルを流用した、 "5.3 esp-idf サンプルの hfp_hf が使えるみたい。" でなんとかさまになったが、
以下は、それまでの苦労の物語じゃ。
マイクロフォンを、Bluetooth で通信するには、HS(Head Set) profile を使うみたい。
HFP(Hands-Free Profile) などでもできるみたいだが、HS がシンプルなので、こちらを使うことにした。
最初、A2DP Source でもできそうなので、試していたが、結局うまく行かなかった。
esp32 で、hsp-hr を検索したら、
@atomic14/esp32-hsp-hf が出てきたので、早速試してみた。
それと同時に、Ubuntu Mate 24.04 上で、VScode で、ESP-IDF拡張機能 が使えるそうなので、それの勉強を兼ねて試してみた。
また、 esp-idf v5.5 が最新なので、こちらも使うことにした。
1. 最初に、VScode で、ESP-IDF 拡張機能を使えるようにする。
下記ページを参照させて頂いた。ありがとう!!
VSCodeのESP-IDF拡張機能「Espressif IDF」を使ってみる
注) ESP-IDF のバージョンは、最新の v5.5 を、github からダウンロードさせてもらった。
ESP-IDFプロジェクトの構成とCMakeの仕組みを徹底解説!(VSCode+ESP-IDF拡張機能
2. 本題の、esp32-hsp-hf を試してみる。
@atomic14/esp32-hsp-hf
README.md をみたら、
@bluekitchen/btstack も必要らしい。
手順としては、先に、上記、github ブランチをダウンロードして、
btstack/port/esp32 の integrate_btstack.py を実行すると、esp-idf/components/btstack へ必要ファイルがコピーされるみたい。
早速ためしてみる。
$ cd ~/local/git-download
$ git clone https://github.com/bluekitchen/btstack.git
$ cd btstack/port/esp32
ここで、esp-idf をインストールしたパスが必要。
1. の作業の中で、パスが、 ~/esp/v5.5/esp-idf だと思うので、
$ export IDF_PATH=/home/your-id/esp/v5.5/esp-idf
$ ./integrate_btstack.py
こで、必要ファイルが、/home/your-id/esp/v5.5/esp-idf/components/btstack へコピーされる。
また、 btstack/port/esp32/example に、さんぷるがコピーされる。
時間があれば、このサンプルを試してみても良いかも。
注) 最近、 BTstack v1.7 から btstack の使い方が変わったみたい。詳しくは、btstack/port/esp32 を見ないといかん。
components を esp-idf にコピーするのをやめて、ローカル上に components をおいて、idf.py でビルドするパターンに変わったみたい。
BTSTACK_ROOT を定義しないといけないみたい。
$ export BTSTACK_ROOT=/path-to/btstack
$ idf.py build
前バージョンの、integrate_btstack.py , create_examples.py , delete_examples.py があれば同じようにつかえそうだ!!
git pull を取り消して、古いバージョンを、しばらく使うことにした。
$ git reflog
$ git reset --hard HEAD@{1}
2.1 本体のダウンロード。
どこでもOKだが、おんちゃんは、
$ cd ~/Documents/esp-idf
$ git clone https://github.com/atomic14/esp32-hsp-hf.git
あとは、 code を起動して、~/Documents/esp-idf/esp32-hsp-hf フォルダーを開けば、OK
ただし、結構 esp-idf のバージョンが古いので、/drivers/i2s.h は、旨く動かなかった。
esp-idf v5.5 は、driver/i2s_std.h でないといけない。
サンプルが、あるので、それを参考に、従来の i2s.h から変更する。
i2s_std_example_main.c
結局、i2s の read を別スレッドにして、動かすことにした。
なんとか、プログラムが出来上がったが、
PC 上で、ESP-EYE のマイクに話した声を聞きたいのでどうすればよいか、いろいろ考えた挙句、
python で、bluetooth MIC の入力を read して、PC の出力 デバイスに write すれば、ESP-EYE のマイクの音が聞けた。
やれやれじゃ。だが、音はあんまり良くはない!!残念。
後日、github にでもあげるぞね!!
@tosa-no-onchan/esp32-hsp-hf
3. PC のスピーカーで、音を確認する。
PC: Ubuntu Mate 24.04
Bluetooth ドングル買ってきて、USB に挿す。
1) PCで、ペアリングと接続
メニュー>コントロールセンター>Bluetooth マネージャ
一覧のなかから、下記をペアリングして、接続する。
HFP HF Demo AC.....
2) 入力デバイスを、bluetooth の HFP HF Demo にする。
コントロールセンター>サウンド
"入力" タグを表示
サウンドの入力デバイス: HFP HF Demo AC.....
にすれば、OK
この、メニューを閉じると、通信が切れるので、開いたままにする。
3) python で、入力 Stream を、PC の 出力デバイスにリダイレクトする。
$ python mic2Speaker.py
これで、PC の出力デバイスから、音が出ると思う。
ESP-EYE のマイクに、話してみる。
ガサガサ と シャー の2種類のノイズでるみたい。
ガサガサ は、使っていると出なくなる。
シャー のノイズは、仕方がないみたい。
ガサガサは、I2S の Read が間に合っていない状態みたいな気がする。
一応、I2S Read は、別スレッドにして、Queue 渡しにしているが、
基本的に、ESP-EYE の I2S Mic の転送性能が悪いのかも知れない。
以前の、 i2s.h では、バッファリングを指定できていたきがするが、 i2s_std.h には、
該当箇所がわからないままじゃ。
3.1 i2s_std.h のバッファ指定。
i2s_usb_example_main.c
に、バッファを指定している箇所があった。
自分の方にポーティングして試してみた。
改善はないが、ノイズの質が変わったみたい。
ただし、音に少し透明感が加わったかも?
3.2 音の改善。
どうやら、ES8311 等をあいだにかましたほうがよいみたい。
ESP-EYE はやめて、普通の ESP32 に ES8311、ES7210 をつないで、MIc、Speaker につなげた方がよいみたい。
ES8311 サンプルプログラムが、下記にある。
i2s_es8311
![]() |
M5STACK Atomic Echo Base マイクロフォン/スピーカーが搭載され、M5 Atomシリーズ専用に設計された音声認識ベース 新品価格 |

おんちゃんは、M5Stamp Pico Mate を持っているので、使えるのだろうか?
一応、スペックシート等を見ると、I2S は使えるみたい。だが、ピンアサインがわからない。
esp32-pico datasheet が下記にあったが、
esp32-pico_series_datasheet_en.pdf
4.2.5 I2S Interface
Pin Assignment
The pins for the I2S Controller can be chosen from any GPIOs via the GPIO Matrix. For more information about the pin assignment, see ESP32 Series Datasheet > Section Peripheral Pin
Configurations and ESP32 Technical Reference Manual > Chapter IO_MUX and GPIO Matrix.
M5Stamp Pico Mate のピンを自由に選んでつかえるようだが、
I2C を使わなければ、それのピンが使えるのだろうか!!
2.4 Pin Compatibility Between ESP32-PICO Variants
2 Pins
Table 7: Pin Compatibility Between ESP32-PICO Variants
が、参考になるのかも。
4. Android で試してみる。
Android の通信の Bluetooth で、 HFP HF Demo をペアリングして、接続する。
後は、google の検索窓のマイク をタップして、音声入力まちにする。
ESP-EYE のマイクで、話してみる。
多分、Android で、認識できると思う。
5. BLE(Blue Truetooth Low Energy) での音声通信について。
Google AI で調べたら、次世代の「LE Audio」とそのコーデック「LC3」でできるとのこと。
音楽だと、複数クライアントで、聞けるみたい。
音声だと、双方向の通信ができるみたい。
ただし、LE Audio は、Bluetooth Ver 5.2 か 5.3 あたりみたいじゃ。
おんちゃんも、今日、調べて、初めて知ったぞね。
ESP32 だと、最新の esp-idf v5.5 では、BLE ver 5.0 みたいなので、今は、試せない!!
残念。
Raspi でも、外付け、Intel AX210 chipset をつかってやっとみたい。
Bluetooth LE Audio with Intel AX210 chipset
このページをみていると、
$ lsusb
で、bluetooth USB デバイスをチェックしているだけなので、普通に Ubuntu PC で、bluetooth ドングルを使う方法のような気がする。
ならば、Amazon で、 "bluetooth 5.2 アダプター" を検索すると一杯でてくるが、これを単純に、Raspi か、Raspi Zero
に挿せば使えるのではないのかな....?
問題は、ドライバーがあるかどうかか。
しかし、これだと、Server 側としての利用に限定されるのか?
おんちゃんがほしいのは、MIC をつけた、BLE V5.2 LC Audio をつけたデバイスじゃが?
Raspi だと、デバイス側にならないのかも。
Amazon で、 "bluetooth子機 5.2 アダプター" だとどうなんだろう。
これって、単純に、PC と Android を Bluetooth でペアリング&接続すればよいだけか?
Ubuntu Mate 24.04 with Bluetooth USB ドングル と、 Galaxy と bluetooth でつなげてみる。
Bluetooth USB ドングル は、親機、子機などと意識して買っていない。
1) 最初に、PC のBluetoth が見えるようにする。
コントロールセンター>Bluetooth アダプター
◎常に表示
2) Android の方で、PC との接続をする。
設定>接続>Bluetooth
多分接続可能デバイスに、PC の名前が出ているので、
それを、ペアリング and 接続 すれば、OK
PC の方でも、ポップアップの確認が出てきたら、接続許可を応答する。
HF、HS のプロファイルで接続できたと思う。
後は、これを使うアプリの問題か。
親子関係はどうなの?
音楽での、Android and Windows PC の接続例が、webで検索できる。
設定をすると、Andorid で音楽を再生すると、PC 側で聞けるみたい。
なんとなく、PC が聞く(Sink)側 で Androidが親(Source) みたい。
逆もありなのか?
BLE の BL Audio の音声だと、両方向みたいだが。
どうも、話が複雑になっていかん。
Bluetooth Classic と、 Bluetooth v5.2 以降と音楽と音声をそれぞれ別々に論じるべきか。
おんちゃんのAndroid は、GalaxyA21 で、かなり古い機種みたい。
Bluetooth Ver 5.0 で、一応 BLE の初期は入っているみたい。
A23、A24、A25 辺りだと、LE Audio が使えるみたい。残念!!
5.1 ESP32での、 LE Audio サポートについて。
下記のページだと、ESP32 H4 では、LE Audio をサポートしているみたい。
だが、H4 では、Wi-Fi をサポートしていないみたい。おんちゃんは、Wi-Fi は、必要ないので、問題ないが!!
Support LE Audio on ESP32-C6 (IDFGH-11105) #12277
ESP32 H4 とは、なんじゃ?
news/ESP32-H4
ここには、Bluetooth 5.4 (LE)、LE Audio が記載されている。
ESP-IDFを使ってみる ESP32-H4開発ボード
ESP32 C6 と言うのもあるみたい。
動作クロックを抑えた、低消費版みたい。
こちらだと、Bluetooth Ver 5.3 みたい。ただし、esp-idf のバージョンによって、LE Audio が入っているバージョンがあるのだろうか?
肝心の LE Audio 非対応か?。
esp32c6/api-guides/ble/get-started/ble-introduction.html
VSCode の ESP-IDF 拡張機能のなかで、
下のアイコン Open ESP-IDF Terminal をクリックして、
$ idf.py set target --help
Usage: idf.py set-target [OPTIONS] {esp32|esp32s2|esp32c3|esp32s3|esp32c2|esp32c6|esp32h2|esp32p4|linux|esp32c5|esp32c61|esp32h21|esp32h4}
esp32c6、esp32h4 どちらもでてきた。
$ idf.py --version
ESP-IDF v5.5-dirty
だが、肝心の examples のなかには、esp-idf/examples/bluetooth/bluedroid/ble_50
しかない。サンプルがなければ、おんちゃんには、難しいか。
ここで、一度、話を整理すると。
ESP32 H4 だと、Bluetooth V5.3で、Hard は、LE Audio に対応しているみたい。
最新の esp-idf Ver5.5 にも、 esp43h4 が入っている。
だが、肝心の サンプルに LE Audio らしきものが無い。
だれか、LE Audio のサンプルを公開してくれない?
下記ソースの中に、それらしいものがあるが、なんだろうか?
btstack のさんぷるみたいだが?
embedded-systems / pico-sdk / lib / btstack / example
le_audio_demo_util_source.c 、le_audio_demo_util_sink.c
ESP32 の port の中だと、下記がある。これは、ESP32 H4 で走らせれば、よいのか?
btstack/port/esp32/example/le_streamer_client
5.2 nRF5340 と言うのがあるみたい。
nRF5340 MDBT53-1Mモジュール(チップアンテナ
評価ボードもある。
nRF5340 MDBT53-1M用評価ボード [MDBT53-DB-40]
4,158円 但し、売り切れ。
nRF5340 と MDBT53-1Mモジュール(チップアンテナ)が合体した構成で使うみたい?
アンテナが無いと使えないか。
スイッチサイエンス MDBT53-1M搭載 nRF5340開発ボード
4,180円
nRF5340 Audio applications
nRF5340 とはなんじゃろうか?プログラミングできるみたいじゃが?
google で、"nRF5340 how to program" 検索したら、google AI が、プログラミングできるそうな。
nRF5340 development kit via SWD と言うのもあるみたい。
SWD は書き込みの部分だけみたい。肝心なのは、 IDE 開発 tool じゃ。
下記ページか、
nRF Connect SDK(NCS)で動かすNordic nRF5340モジュール開発キットの使い方①開発環境のセットアップ編
この中でも、VSCode を使っているみたい。後で気が付いた。ゴッホ!!
またまた、google で、"VSCode nRF5340 開発" 検索すると、AI様のお告げだと、
出来るそうじゃ。
VSCode で、nRF Connect for VS Code 拡張機能 をインストールすればできるそうな。
これは、どこまで、プログラミングできるのだろうか?
nRF5340 は、bluetooth Ver 5.2 LE Audio 対応みたいだが、I2s デバイスを接続して、Speaker や、マイクが使えるのだろうか?
nRF5340 で、I2s は見たようなきがするが。
これが出来るのであれば、ESP32 H4 は、もう必要ないのかも。
しかし、nRF5340 のプログラムが完了したら、評価ボードでは無くて、自分で実機向けのボードを作らないといかんのか?
5.2.1 VSCode に 拡張機能の [nRF Connect For VS Code] を入れてみる。
注) [nRF Connect For VS Code Extention Pack] では無いみたい。
Install 途中で、VSCode が止まったまま。
別途、nRF Connect for Desktop をインストールする。
nrfconnect-5.2.0-x86_64.AppImage をダウンロードして、
$ chmod 755 nrfconnect-5.2.0-x86_64.AppImage
$ ./nrfconnect-5.2.0-x86_64.AppImage
[13624:0907/151440.299025:FATAL:setuid_sandbox_host.cc(163)] The SUID sandbox helper binary was found, but is not configured correctly. Rather than run without sandboxing I'm aborting now. You need to make sure that /tmp/.mount_nrfconJAYI9u/chrome-sandbox is owned by root and has mode 4755.
Trace/breakpoint trap (コアダンプ)
で、コアダンプして終了。
$ TMPDIR="${HOME}/.cache/nrfconnect-5.2.0-x86_64.AppImage"; ./nrfconnect-5.2.0-x86_64.AppImage --no-sandbox
で、起動できた。
注) 起動する前に、実際のデバイスを接続したほうが良いみたい。
しかし使い方がわからん。
Toolchan Manager をとりあえずインストールして、
Toolchan Manager open をクリックして、nRF Connect SDK X.X. をインストールする。
nRF Connect for VS Code
から、Download
こちらもダウンロードする。
nRF Command Line Tools
$ sudo dpkg -i --force-overwrite nrf-command-line-tools_10.24.2_amd64.deb
5.3 esp-idf サンプルの hfp_hf が使えるみたい。
HF(Hand Free) Profile だが、電話帳へのアクセスを、PC 、 Android 側で拒否して、Audio 入力 だけ有効にすれば、Mic 入力に使えるみたい。
このサンプルに、I2s_std の入力部分を追加すれば、できそうじゃ。
This demo sends back the audio data back to the HFP AG device, so you can hear your own voice when you link this demo with your HFP-AG device.
と書いてあるから、期待したが、hf_gateway から届いた、音を、そのまま、gateway へ返す処理が入っているだけだった。
基本、これは、Speaker Sink プログラムでした。
ちょっと、試したが、サンプルの処理では、うまくいかなかった。
下の、hfp_ag に、source 側の送信処理が入っているので、それを流用して、やっと、Microphone Source 処理ができた。
後は、i2s_std で、マイク入力処理を組み込めば、できそうじゃ。
やれやれ、ここまでくるのに、何日もかかった。by nishi 2025.9.13
github に公開しました。
@tosa-no-onchan/hfp_hf_my
音質は、繊細な設定で、なんとか聞ける状態になった。ただし、ESP-EYE の起動の具合によっては、設定が崩れて、ノイズが多くなる。
通常は、しばらくおいておくと、安定する。ただ、安定しない場合もある。
安定を望むなら、ES8311 等を I2S につなげて、外部 Codec を使った仕様にすべきじゃと思う。
Pico Mate 辺りだとつなげそうじゃ。 ESP32-S3 だと、Bluetooth classic が無いので、NG みたい。
しかし、esp-idf の bluedroid は、オーバーヘッドが大きすぎではないのか?
あまり、実用では使えなさそうな気がする。
5.4 esp-idf サンプルの hfp_ag が、送信側みたい。
6. 参照。
1) ESP32 の一覧がある。
ESP32シリーズまとめ
2) HFP Client API と言うのがあった。
HFP Client API