I2S و ارسال صدا در FPV چیست؟ (مبتدی)
I2S (Inter-IC Sound) یک پروتکل دیجیتال برای انتقال صدا بین تراشهها است. ESP32 یک واحد I2S داخلی دارد که میتواند مستقیماً با میکروفونهای دیجیتال مثل INMP441 و آمپلیفایرهای دیجیتال مثل MAX98357 کار کند — بدون هیچ کدک آنالوگ اضافه.
در پروژه FPV ما، یک INMP441 روی پهپاد صدای محیط را ضبط میکند، ESP32 آن را به یک LoRa audio stream فشرده میکند (یا روی کانال صوتی VTX)، و در گیرنده MAX98357 صدا را پخش میکند. این به خلبان اجازه میدهد صدای موتور، باد، و هشدارهای بیپر را در عینک FPV بشنود.
محصولی که میسازید
سیستم صوتی FPV دوطرفه: میکروفون روی پهپاد + بلندگو در عینک.
- هزینه: ۳۰۰ تا ۶۰۰ هزار تومان
- تأخیر صوتی: ۵۰-۱۰۰ms (WiFi UDP)
- کیفیت: ۱۶kHz، ۱۶bit مونو
سیمبندی INMP441 به ESP32
INMP441 → ESP32
VDD → 3.3V
GND → GND
SD → GPIO 32 (I2S Data In)
SCK → GPIO 14 (I2S Clock)
WS → GPIO 15 (I2S Word Select)
L/R → GND (کانال چپ)
MAX98357 → ESP32 (در گیرنده)
VIN → 5V
GND → GND
DIN → GPIO 22 (I2S Data Out)
BCLK → GPIO 26 (I2S Clock)
LRC → GPIO 25 (I2S Word Select)
کد TX — ضبط و ارسال UDP
#include <driver/i2s.h>
#include <WiFi.h>
#include <WiFiUdp.h>
WiFiUDP udp;
const char* ssid="FPV-AP"; const char* pass="fpv12345";
const int UDPPORT=5005;
const char* rxIP="192.168.4.2";
void i2sInit() {
i2s_config_t cfg = {
.mode = (i2s_mode_t)(I2S_MODE_MASTER|I2S_MODE_RX),
.sample_rate = 16000,
.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT,
.channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
.communication_format = I2S_COMM_FORMAT_I2S,
.intr_alloc_flags = 0,
.dma_buf_count = 4, .dma_buf_len = 256
};
i2s_driver_install(I2S_NUM_0, &cfg, 0, NULL);
i2s_pin_config_t pins = {
.bck_io_num=14,.ws_io_num=15,.data_out_num=-1,.data_in_num=32
};
i2s_set_pin(I2S_NUM_0, &pins);
}
void setup() {
WiFi.begin(ssid, pass);
while(WiFi.status()!=WL_CONNECTED) delay(500);
udp.begin(UDPPORT);
i2sInit();
}
void loop() {
uint8_t samples[512]; size_t bytesRead;
i2s_read(I2S_NUM_0, samples, sizeof(samples), &bytesRead, portMAX_DELAY);
udp.beginPacket(rxIP, UDPPORT);
udp.write(samples, bytesRead);
udp.endPacket();
}
چکلیست تست
| تست | نتیجه |
|---|---|
| INMP441 داده I2S برمیگرداند؟ | i2s_read bytes > 0 |
| UDP packet در گیرنده دریافت میشود؟ | udp.parsePacket() > 0 |
| MAX98357 صدا پخش میکند؟ | بلندگو صدا میدهد |
| تأخیر قابل تشخیص نیست؟ | زیر ۱۰۰ms |