2023年9月10日日曜日

ESP32でトランシーバを作ってみた。

 前回、ESP32でI2S DACとI2Sマイクを試してみたのでESP32で無線LANトランシーバを作ってみることに。ESP-NowやWiFiのUDP通信を使ってトランシーバを作っている人がいたのでとりあえずこの方のプログラムをArduino環境でビルドして使ってみることに。ESP-Nowを使えばWiFi APがないところでも気軽につかえるし、WiFi STAモードに切り替えればWiFi環境内ならどこでも通話できる。

esp32-walkie-talkie

原理とか動作デモとかもGithubのYoutubeリンクを見るとわかり安く説明されていた。I2Sマイクのノイズ対策とかも。

このソフトウェアはPlatformIOで作られているようだったんだけど、Arduino IDEでもビルドできそうな気がしたので試しにやってみた。

まずは上のリンクからソースコード一式をZIPでまるっとダウンロード。

Arduino IDEで新しいプロジェクトを作成して(今回はesp32-walkie-talkie.inoにした)、最初に生成されるsetup()やloop()を消してまっさらにする。
srcフォルダ内のmain.cppの中身をテキストエディタで開いてそこにコピペする。そしたら一旦inoファイルを保存してArduino IDEを閉じる。

Arduino環境だとinoファイルと同じ名前のフォルダが作成されてその中にesp32-walkie-talkie.inoが入ってると思うんだけど、そこにsrcフォルダ内のmain.cpp以外のファイル4つをコピーする。

あとはlibフォルダの中の各ライブラリ(5種類)の中のsrcフォルダの中身だけ(cppファイルとhファイルだけ)を全部inoファイルと同じフォルダにコピー。同じフォルダに30個以上のファイルができてちょっと見にくくなるんだけどこの状態でArduino IDEからinoファイルを開くと他のファイルを認識してタブが増えているはず。

あとはconfig.hタブを開いて<< YOUR_SSID >>とか書いてあるところを直してやればビルドできるはず。(SSIDとパスワードは""で囲んで記入する)
ESP-Nowを使う場合もこの部分を直しておかないと変な文字<<>>が入っているせいでビルドできないのでここに適当な文字を""で囲んで入れておくと良いかも。そして
#define USE_ESP_NOW
のところのコメントアウトを外すとESP-Nowでダイレクト接続される。(AP不要)

ちなみに今回はArduino IDE 2.1.1にESP32-Arduino-Core 2.0.6の組み合わせでビルド成功した。

ピンアサインはとりあえずこのプログラムのデフォルトを使用した。
INMP441のほうは
GND→GND
VDD→3.3V
SD→21
SCK→18
WS→19
L/R→3.3V(スケッチにはGNDに繋げば良さそうに書いてあったんだけどGNDだと鳴らなかったのでHIGHに)

MAX98357Aモジュールの方は
Vin→5V
GND→GND
SD→22
GAIN→何も繋がない(ゲインはデフォルト設定)
DIN→5
BCLK→18
LRC→19

こんな感じでI2Sの一部のピンはマイクとDACで共用である。

あと送信ボタン(プレスボタン)は23番Pinと3.3Vの間にタクトスイッチなどのプッシュボタンを接続。23がHighになると音声をもう片方に送信。Lowになると受信。

あとはこれを二台用意して送信ボタンを押したほうの音声がもう片方から再生される。

音声は結構きれい。SAMPLE_RATEは変えられるようになってるので距離が遠くなってデータレートが落ちそうな場合は下げてみると途切れずに送れるようになるかも。遅延も一旦バッファしている割には少ない感じ。

PCのUSBに繋いでデバッグしてるときはマイクはかなりノイズを拾ってる感じだった。プログラム書き換え後とりあえずモバイルバッテリに繋いで試してみたらだいぶ良くなったのでとりあえずはモバイルバッテリでテストした。(本家のマイク用ノイズ対策回路は入れていないため。)

バッテリを搭載してケースに入れたら結構使えるかも。通知音とか鳴らせるようにしたら面白そう。フラッシュ容量はまだ余裕がありそうだし。

スピーカーはジャンクノートPCのスピーカーを使ったけど秋月の小さいスピーカーとかDACとスピーカーが一体になっているM5StickC PLUS Speaker 2 HATとかを使ってもいいかも。音質は大きい方が良いのかもしれないけど…

ちなみにこのスケッチ、RISC-VのESP32-C3でも使用できた。ピン配は変更する必要があるけど、I2S DACとI2Sマイクを使用する設定であればESP32-C3でも普通に使える。ESP-NowでESP32とESP32-C3間で通話もできた。バッテリ駆動で作るならESP32-C3のほうが電池持ち良さそうだし。


2023年9月2日土曜日

ESP32でI2S接続のマイクを使ってみた

 前回はESP32に外付けDACをつけてみたけど、今回はI2S接続のマイクを試してみた。

使用したのはINMP441を搭載したモジュール。Aliexpressで180円だった。ESP32にI2Sで接続して音声データを取得できる。

IC自体はこっち面についているんだけど、音声取り込み口は反対側に空いてる基板の穴から取り込むみたい。

このマイクモジュールとしてはこっち側は表面ということに。中央の穴がマイクの穴。

早速ESP32に接続して試してみた。

ライブラリを使用せずにファイルシステムにPCMデータを保存したりするサンプルが多いんだけど、そのままPCで聞けるとテストが楽で良いなぁとおもって探していたら便利なライブラリを発見。

arduino-audio-tools

このライブラリは音声関係のエンコーダやデコーダも入っていて、サンプルにI2Sのマイクから取り出したWAVEデータをブラウザでストリーミングできるサンプルも入っていた。

このサンプルはstreams-i2s-webserver_wav.inoのWiFi接続用SSIDとパスワードを変更するだけで、あとは解説ページでも同じくINMP441で解説されているので図のように接続するだけ。書き込み終わったらシリアルコンソールに出たIPアドレスに接続するとブラウザにストリーミングの画面が出るので再生ボタンを押すだけ。

結構プツプツとノイズが入るんだけどこれは電源ラインなのかなぁ?ちなみにファイルシステムに録音するサンプルも試してみたけどそちらは結構いい感じだった。調べてみるとINMP441はこのサンプルのように16Bitで使うとノイズが目立つとかで、ファイルシステムに録音するサンプルでは32bitで取ってきて処理を入れているようだった。
ストリーミングでもそんな事ができるのかもう少し検証してみるかな…