麦壳maikemaker 发表于 2024-12-29 14:31:39

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/

easy猿 发表于 2024-12-29 14:34:19

glwz007 发表于 2024-12-29 15:15:00

非常好的项目,谢谢分享!

PY学习笔记 发表于 2025-1-15 14:49:09

https://mc.dfrobot.com.cn/thread-323697-1-1.html
页: [1]
查看完整版本: K10远程扩音器(对讲机)