اینترکام LoRa و I2S/DAC یعنی چه؟ (برای مبتدی)
یک اینترکام یک سیستم ارتباط صوتی دوطرفه است. در اینترکامهای رادیویی معمول (واکیتاکی) صدا به صورت آنالوگ FM ارسال میشود. اما LoRa یک رادیو دیجیتال است — برای ارسال صدا باید آن را به داده دیجیتال تبدیل کنیم.
I2S (Inter-IC Sound) یک پروتکل صوتی دیجیتال است. میکروفون I2S (مثل INMP441) صدا را مستقیماً به اعداد دیجیتال تبدیل میکند. DAC (Digital-to-Analog Converter) در سمت گیرنده این اعداد را دوباره به صدا تبدیل میکند. ESP32 هم یک DAC آنالوگ داخلی ۸ بیتی دارد که برای این پروژه کافی است.
کیفیت صدا در ۸kHz Sample Rate قابل فهم است (مثل صدای تلفن). LoRa با Bandwidth 250kHz میتواند این جریان داده را تا ۱+ کیلومتر حمل کند.
محصولی که میسازید
یک اینترکام دوطرفه بیسیم بدون اینترنت، برد تا ۱ کیلومتر.
- زمان ساخت: ۴ تا ۶ ساعت
- هزینه: ۱ تا ۱.۵ میلیون تومان
- کیفیت صدا: ۸kHz — قابل فهم کامل
قطعات لازم (BOM)
| قطعه | تعداد |
|---|---|
| TTGO LoRa32 (ESP32 + LoRa) | ۲ عدد |
| میکروفون I2S INMP441 | ۲ عدد |
| اسپیکر ۸Ω 0.5W | ۲ عدد |
| آمپلیفایر PAM8403 Mini | ۲ عدد |
| دکمه PTT | ۲ عدد |
کد ESP32 — فرستنده (ضبط و ارسال)
#include <SPI.h>
#include <LoRa.h>
#include <driver/i2s.h>
#define SAMPLE_RATE 8000
#define I2S_NUM I2S_NUM_0
#define I2S_WS 25
#define I2S_SCK 26
#define I2S_SD 22
#define PTT_PIN 0
const i2s_config_t i2s_cfg = {
.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_RX),
.sample_rate = SAMPLE_RATE,
.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 = 64
};
void setup() {
pinMode(PTT_PIN, INPUT_PULLUP);
i2s_driver_install(I2S_NUM, &i2s_cfg, 0, NULL);
i2s_set_pin(I2S_NUM, &(i2s_pin_config_t){I2S_SCK, I2S_WS, -1, I2S_SD});
LoRa.begin(433E6);
LoRa.setSpreadingFactor(7);
LoRa.setSignalBandwidth(250E3);
}
void loop() {
if (digitalRead(PTT_PIN) == LOW) {
int16_t samples[32]; size_t bytesRead;
i2s_read(I2S_NUM, samples, sizeof(samples), &bytesRead, portMAX_DELAY);
// تبدیل ۱۶ بیت به ۸ بیت برای فشردهسازی
uint8_t compressed[16];
for(int i=0;i<16;i++) compressed[i]=(samples[i]>>8)+128;
LoRa.beginPacket();
LoRa.write(compressed, 16);
LoRa.endPacket(true); // async
}
}
چکلیست تست
| تست | نتیجه |
|---|---|
| میکروفون I2S در Serial Plotter سیگنال دارد؟ | بله — موج صدا دیده میشود |
| DAC اسپیکر در همان اتاق صدا میدهد؟ | بله — قابل فهم |
| در فاصله ۲۰۰ متر صدا واضح است؟ | بله |
| تأخیر کمتر از ۲ ثانیه است؟ | بله — ~۵۰۰ms |