2023年9月10日日曜日

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

 前回、ESP32でI2S DACとI2Sマイクを試してみたのでESP32で無線LANトランシーバを作ってみることに。ESP-NowやWiFiのUDP通信を使ってトランシーバを作っている人がいたのでとりあえずこの方のプログラムをArduino環境でビルドして使ってみることに。ESP-Nowを使えばWiFi APがないところでも気軽につかえるし、WiFi STAモードでWiFiルータに接続すれば中継機やメッシュ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でダイレクト接続される。(WiFiルータなどのアクセスポイントは不要なので外とかで使いやすいかも。)

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

ESP32トランシーバー

ピンアサインはとりあえずこのプログラムのデフォルトを使用した。
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に繋いでデバッグしてるときはマイクはかなりノイズを拾ってる感じだった。プログラム書き換え後とりあえずモバイルバッテリに繋いで試してみたらだいぶ良くなったのでとりあえずはモバイルバッテリでテストした。(本家のマイク用ノイズ対策回路は入れていないため。)

バッテリを搭載してケースに入れたら結構使えるかも。通知音とか鳴らせるようにしたら面白そう。フラッシュ容量はまだ余裕がありそうだし。いまはWAVEデータそのまま送っているので、Codec2とかで圧縮して使用する帯域を減らしてやれば距離が離れても音声は聞きやすくなるかも。

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

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


0 件のコメント:

コメントを投稿