K10远程扩音器(对讲机)
最近用ESP做大模型终端很流行,我们有个小群一些人也一直在摸索。在实现大模型终端之前,准备先做对讲机。
今天这个教程就算半个对讲机吧。大家加个按钮控制,改成双向的应该就可以了。
声明:本教程代码由多个人使用多个大模型生成修改整合。
硬件:esp32一块,K10一块,麦克风模块INMP441一块,导线若干
编程环境:thonny,语言:micropython
固件:ESP32和ESP32S3标准固件(K10没用DF官方固件)
esp32接线图:
ESP32作为发射端,K10作为接收端(还不会用K10的麦克风)
发送端代码:
from machine import I2S, Pin
import network
import socket
import time
# Network Configuration
SSID = 'waoo2111280'
PASSWORD = 'waoo2111280'
SERVER_IP = '192.168.22.198'
SERVER_PORT = 12345
# I2S Configuration
SCK_PIN = 23# Serial clock output
WS_PIN = 22 # Word clock output
SD_PIN = 21 # Serial data output
# Audio Configuration
SAMPLE_RATE = 16000
SAMPLE_BITS = 16 # Changed to 16-bit for better compatibility
CHANNELS = 1 # Mono channel
BUFFER_LENGTH = 2048 # Increased buffer size for better performance
def connect_wifi():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('Connecting to WiFi...')
wlan.connect(SSID, PASSWORD)
while not wlan.isconnected():
time.sleep(1)
print('WiFi Connected')
print('IP Address:', wlan.ifconfig())
def init_audio():
audio_in = I2S(
0,
sck=Pin(SCK_PIN),
ws=Pin(WS_PIN),
sd=Pin(SD_PIN),
mode=I2S.RX,
bits=SAMPLE_BITS,
format=I2S.MONO, # Changed to mono for simplicity
rate=SAMPLE_RATE,
ibuf=BUFFER_LENGTH * 2 # Double buffer size
)
return audio_in
def main():
connect_wifi()
audio = init_audio()
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
audio_buf = bytearray(BUFFER_LENGTH)
print('Starting audio capture and transmission...')
try:
while True:
# Read audio data
num_read = audio.readinto(audio_buf)
if num_read > 0:
# Send data in smaller chunks to prevent packet loss
chunk_size = 1024
for i in range(0, num_read, chunk_size):
chunk = audio_buf
sock.sendto(chunk, (SERVER_IP, SERVER_PORT))
time.sleep_ms(1)
except Exception as e:
print('Error:', e)
finally:
audio.deinit()
sock.close()
if __name__ == '__main__':
main()
接收端代码:wifi_manager.py
"""WiFi connection management"""
import network
import time
def connect_wifi(ssid, password):
"""Connect to WiFi network"""
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('Connecting to WiFi...')
wlan.connect(ssid, password)
while not wlan.isconnected():
time.sleep(1)
print('Connected to WiFi')
print('IP:', wlan.ifconfig())
return wlan
audio_output.py"""Audio output handling using I2S and MAX98357A"""
from machine import I2S, Pin
class AudioOutput:
def __init__(self, bclk_pin, ws_pin, data_pin, sample_rate, bits):
"""Initialize I2S output for MAX98357A"""
self.audio_out = I2S(
1, # I2S ID (0 or 1)
sck=Pin(bclk_pin), # Bit clock
ws=Pin(ws_pin), # Word select
sd=Pin(data_pin), # Data
mode=I2S.TX, # Transmit mode
bits=bits, # Sample size
format=I2S.MONO, # Mono format
rate=sample_rate, # Sample rate
ibuf=10000 # Internal buffer size
)
def write(self, audio_data):
"""Write audio data to I2S DAC"""
self.audio_out.write(audio_data)
def deinit(self):
"""Clean up I2S resources"""
self.audio_out.deinit()
config.py
"""Configuration settings for the audio receiver"""
# Network settings
WIFI_SSID = 'waoo2111280'
WIFI_PASSWORD = 'waoo2111280'
UDP_PORT = 12345
'''
# I2S pins for MAX98357A
BCLK_PIN = 26# Bit clock
WS_PIN = 25 # Word select / Left-right clock
DATA_PIN = 22# Data pin
'''
# 初始化引脚定义
BCLK_PIN = 0 # 串行时钟输出
WS_PIN= 38# 字时钟
DATA_PIN= 45# 串行数据输出
# Audio settings
SAMPLE_RATE = 16000
BITS_PER_SAMPLE = 16
BUFFER_SIZE = 1024
main.py
"""Main program for ESP32 audio receiver"""
import socket
from config import *
from wifi_manager import connect_wifi
from audio_output import AudioOutput
def main():
# Connect to WiFi
connect_wifi(WIFI_SSID, WIFI_PASSWORD)
# Initialize audio output
audio = AudioOutput(
bclk_pin=BCLK_PIN,
ws_pin=WS_PIN,
data_pin=DATA_PIN,
sample_rate=SAMPLE_RATE,
bits=BITS_PER_SAMPLE
)
# Setup UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('0.0.0.0', UDP_PORT))
print(f'Listening on port {UDP_PORT}')
try:
while True:
try:
# Receive audio data
data, addr = sock.recvfrom(BUFFER_SIZE)
# Play audio through MAX98357A
audio.write(data)
except Exception as e:
print('Error:', e)
finally:
audio.deinit()
sock.close()
if __name__ == '__main__':
main()
修改wifi账号密码,把两端各自的代码上传到板子上,运行,先运行接收端,获得IP地址填入发送端代码。
视频
https://www.bilibili.com/video/BV15U6tYLEx1/
帅 非常好的项目,谢谢分享! https://mc.dfrobot.com.cn/thread-323697-1-1.html
页:
[1]