본문 바로가기

카테고리 없음

ESP32 오디오 트랜시버 보드 1부

반응형

 

ESP32 오디오 트랜시버 보드(1부): SD 카드 WAV 파일 플레이어 데모 

 

ESP32 컨트롤러는 수천 개의 IoT, 스마트 홈 및 기타 원격 제어 프로젝트에 사용되는 매우 유사한 솔루션입니다. ESP32는 디지털 오디오 신호를 입출력하는 데 사용할 수 있는 우수한 I2S 인터페이스도 갖추고 있습니다. I2S DAC, I2S ADC, SD 카드와 함께 사용하면 다양한 오디오 프로젝트를 구현할 수 있습니다. 이 프로젝트에서는 이 모든 기능과 오디오 데이터 송수신을 위한 nRF24 트랜시버를 납땜이 용이한 PCB에 통합했습니다. 이 시리즈의 첫 번째 부분에서는 블록 다이어그램, 회로, 데모 소프트웨어를 소개합니다.

 

ESP32의 선택

 

인기 있는 ESP32 컨트롤러 는 저렴하고 빠르며, Arduino IDE 등을 통해 프로그래밍하기 쉽습니다. Wi-Fi 기능을 탑재하여 수천 개의 IoT, 스마트 홈 및 기타 원격 제어 프로젝트에 사용되고 있으며, 이러한 종류의 Elektor 프로젝트는 셀 수 없이 많습니다. ESP32 컨트롤러에는 오디오 스트림을 디지털 방식으로 입출력할 수 있는 우수한 I2S 인터페이스도 내장되어 있습니다. (아래 "I2S 인터페이스" 섹션을 참조하세요.) 오디오 재생을 위해서는 ESP32에서 I2S 데이터를 받아 아날로그 신호로 변환하는 I2S DAC가 추가로 필요합니다. 반대로 오디오 샘플링을 위해서는 I2S 인터페이스가 있는 오디오 ADC가 필요합니다. 이 프로젝트에서는 ESP32-S3 기반 개발 모듈과 I2S ADC/DAC 브레이크아웃 보드를 캐리어 PCB에 연결했습니다. 또한 Nordic nRF24 무선 모듈을 연결하여 디지털(오디오) 데이터를 송수신하는 옵션도 추가했습니다. SD 카드, 여러 개의 확장 커넥터, 다양한 전원 공급 옵션이 오디오 트랜시버 프로젝트를 완성합니다.

 

오디오 트랜시버 보드 프로젝트

 

I2S 인터페이스

 

디지털 오디오 데이터를 전송하기 위한 I2S 인터페이스와 프로토콜(I 2 C 와는 아무 상관 없음 )은 인터넷[9]에 잘 설명되어 있으므로 기본 사항에 대해 너무 많은 문장을 낭비할 필요가 없습니다. 오디오 데이터는 한 와이어에서 비트 단위로 전송되고 다른 와이어는 이 전송을 위한 비트 클록으로 사용됩니다. 또 다른 와이어는 왼쪽 오디오 채널의 데이터와 오른쪽 오디오 채널의 데이터를 분리하는 데 사용됩니다. 따라서 마이크로컨트롤러와 I2S DAC 또는 ADC 사이에 최소 3개의 와이어가 필요합니다(이러한 칩에 전원을 공급하는 VCC와 GND 외에도).

 

마이크로컨트롤러와 DAC 또는 ADC가 동기적으로 클록킹되도록 하기 위해 "마스터 클록"이라는 또 다른 연결이 예상됩니다. 인터넷의 많은 소스와 제 경험에 따르면 ESP32를 사용할 때 ESP32는 클록 마스터 역할을 하고 DAC 또는 ADC는 슬레이브 역할을 해야 하며 그 반대는 안 됩니다. 따라서 이 프로젝트에서 사용하는 I2S2 Pmod 모듈(DAC와 ADC를 호스팅)은 올바른 위치에 점퍼 연결을 통해 슬레이브로 구성되어야 합니다.

 

사용 사례

 

이 오디오 트랜시버 보드는 주로 오디오 애플리케이션 전용이지만, 다른 신호와 데이터의 샘플링/출력/저장/송신/수신에도 사용할 수 있습니다. 몇 가지 사용 사례를 소개하며, 향후 게시글에서 이러한 사례 중 일부를 구현해 보겠습니다.

 

  • SD 카드에서 파일을 재생하는 오디오 플레이어(아래 데모 소프트웨어 참조)
  • 오디오 레코더
  • 오디오 프로세서(오디오 샘플링, 데이터 처리, 출력)
  • Wi-Fi 또는 ESP-NOW를 통한 오디오 무선 송신기/수신기
  • Nordic nRF24를 통한 오디오 무선 송수신기
  • 데이터로거: SPI/I 2 C 를 통해 연결된 센서 , 데이터는 SD 카드에 저장됩니다.
  • 무선 센서 노드: Wi-Fi 또는 nRF24를 통해 센서 값 전송
  • LF 신호 생성 또는 측정

 

 

 

주요 블록

 

그림 1 에서 ESP32 오디오 트랜시버의 블록과 커넥터를 볼 수 있습니다 .

 

ESP32-S3-DevKit-C

 

오디오 트랜시버 프로젝트의 핵심은 44 핀이 있는 ESP32-S3-DevKit-C 보드입니다 . 이 보드는 PCB 중앙에 꽂힙니다. 기본적으로 DevKit-C 보드는 ESP32-S3-WROOM 모듈(2코어 ESP32-S3 프로세서 포함), 제조사 친화적인 DIL 확장 커넥터, 프로그래밍 및 전원 공급을 위한 두 개의 USB 커넥터를 통합합니다( 그림 2 참조 ). 시중에는 핀 호환 S3 DevKit-C 변형이 여러 가지 있습니다. 일부는 인쇄된 PCB 안테나가 있는 WROOM 모듈을 호스팅하고, 일부는 외부 안테나용 커넥터가 있는 WROOM 모듈을 호스팅합니다. 후자를 사용하면 금속 하우징에 캐리어 보드와 DevKit을 함께 넣고 ESP32의 Wi-Fi 기능을 계속 사용할 수 있습니다.

 

 

그림 2: DevKit-C 보드는 ESP32-S3-WROOM SoC 와 프로그래밍 및 전원 공급을 위한 두 개의 USB 커넥터를 통합합니다. 왼쪽은 PCB 안테나와 1인치 너비의 버전이고, 오른쪽은 Elektor Store에서 구매한 0.9인치 너비의 버전 이며 외부 Wi-Fi 안테나용 커넥터가 있습니다.

 

폭이 0.9인치와 1인치인 S3-DevKit-C 변형이 있으므로, 추가 핀 헤더를 사용하여 두 가지 모두에 적합한 캐리어 보드를 만들었습니다. 0.9인치 폭의 ESP32-S3-DevKit을 사용하는 경우, 외부 핀 헤더(J3)를 확장 커넥터로도 사용할 수 있습니다.

 

PCB 안테나가 있는 S3-DevKit-C는 약 €8에 구입할 수 있으며, 쉽게 연결하고 교체할 수 있습니다. 납땜해야 하는 것은 헤더 두 줄뿐입니다. 그러나 저희는 이미 S3-WROOM 모듈을 직접 납땜하여 공간을 절약하고 비용을 더욱 절감할 수 있는 두 번째 버전의 PCB를 고려하고 있습니다.

 

I2S DAC/ADC

 

시중에는 오디오 샘플링 및 재생을 위한 I2S 브레이크아웃 보드가 많이 있습니다. 결국 저희는 Cirrus CS4344 DAC(최대 192kHz/24비트)와 Cirrus CS5343 ADC(최대 96kHz/24비트)를 탑재한 Digilent I2S2 Pmod 모듈을 선택했으며, 두 모듈 모두 스테레오 오디오 잭에 연결했습니다( 그림 3 ). 기본적으로 두 개의 브레이크아웃 보드가 있습니다. 1. 2x6 커넥터에는 두 개의 독립적인 I2S 인터페이스가 있는데, 하나는 출력용이고 다른 하나는 오디오 입력용입니다(I2S 인터페이스 텍스트 상자 참조). 전원 공급 장치의 VCC 및 GND 핀도 두 개입니다. 이 2x6 커넥터가 수평으로 배치된 것은 다소 특이하지만, 이는 Digilent의 Pmod 커넥터 사양에 따른 것입니다. 이 모듈을 PCB에 연결하려면 비스듬한 2x6 리셉터블을 납땜해야 합니다.

 

 

그림 3: Digilent I2S2 Pmod 모듈은 Cirrus CS4344 DAC 와 Cirrus CS5343 ADC를 호스팅하고 있으며, 둘 다 스테레오 오디오 잭에 연결되어 있습니다.

 

I2S2 Pmod 모듈은 지금까지 구입할 수 있는 가장 저렴한 I2S BoB는 아니지만 오디오 품질이 매우 우수하고 ESP32를 I2S 마스터로 사용하면 훌륭하게 작동합니다. 오디오 재생이나 샘플링을 시작하기 전에 구성이 필요하지 않습니다.

 

저희 보드에서 2x6 Pmod 커넥터는 GPIO35~GPIO40, GPIO47 및 GPIO48로 라우팅됩니다. 물론 다른 Pmod 모듈(전류 센서, 오디오 증폭기 등)을 여기에 연결하거나 일반적인 2.54mm 피치의 2x6 커넥터가 있는 작은 확장 보드를 직접 만드는 데 아무런 방해가 없습니다.

 

nRF24 트랜시버

 

ESP32의 Wi-Fi 및 ESP-NOW 기능 외에도 세 번째 옵션을 제공하고자 했는데, 특히 연속 오디오 스트림을 송수신할 때 지연 시간이 매우 짧습니다. Nordic의 nRF24 트랜시버 모듈용 독점 무선 프로토콜은 매우 빠릅니다. 1ms 이내에 송신기에서 수신기로 패킷을 보낼 수 있습니다. nRF24 칩은 많은 IoT 프로젝트에서도 사용되는데, 이 칩을 통합한 브레이크아웃 보드가 상당히 저렴하고, 게다가 좋은 (Arduino) 라이브러리도 있기 때문입니다. 특히 nRF24, 안테나 증폭기, 안테나 커넥터를 통합한 모듈은 가격 대비 가치가 있습니다. 저희 경험에 따르면 건물 내부의 도달 범위는 Wi-Fi보다 더 좋습니다. 한 가지 장점은 칩이 자체 1MHz 폭의 채널을 전송하고, 항상 트래픽이 많은 Wi-Fi 채널이 아니라는 것입니다. 약간의 단점은 최대 페이로드 크기가 32바이트이고 실제 애플리케이션의 최대 데이터 속도가 공칭 데이터 속도인 2Mbit/s보다 훨씬 낮다는 것입니다. 다음 기사에서 이 부분에 대해 다시 설명하겠습니다.

 

nRF24는 SPI 인터페이스와 두 개의 디지털 회선(칩 활성화 및 인터럽트)을 통해 액세스합니다. 2x4 커넥터에 대한 일종의 표준이 있으므로 원하는 nRF24 모듈을 사용할 수 있습니다. SMA 안테나 커넥터와 안테나 증폭기가 내장된 Ebyte 의 E01-ML01DP5를 사용하는 것이 좋습니다 ( 그림 4 ). 당사 캐리어 PCB는 이 모듈용으로 준비되었으며, 안테나 커넥터는 플라스틱 또는 금속 하우징에 완벽하게 맞도록 보드 가장자리에 위치합니다.

 

 

그림 4: Ebyte의 nRF24 모듈에는 트랜시버 칩 외에도 SMA 안테나 커넥터와 안테나 증폭기가 통합되어 있습니다.

 

보드의 2x4 커넥터는 ESP32의 SPI 인터페이스에 연결되므로 센서와 같은 다른 SPI 모듈을 여기에 연결하는 데 아무런 문제가 없습니다.SD

 

카드 소켓

 

이 보드에는 로깅된 데이터, 구성 파일 또는 오디오 콘텐츠를 위한 편리한 로컬 저장소를 제공하는 microSD 카드 소켓이 포함되어 있습니다.SPI 인터페이스(MOSI, MISO, SCK 및 추가 CS 라인)를 통해 ESP32-S3에 연결되므로 널리 지원되는 Arduino SD 또는 SdFat 라이브러리와 함께 쉽게 사용할 수 있습니다.소켓은 보드 상단에 장착되며 쉽게 접근할 수 있도록 배치되어 있습니다.디커플링 커패시터는 쓰기 작업 중 안정성을 위해 전원 핀 근처에 배치됩니다.SD 카드는 nRF24 모듈과 같은 다른 주변 장치와 SPI 버스를 공유하므로 충돌을 방지하려면 소프트웨어에서 적절한 칩 선택 처리가 필수적입니다.

 

확장 커넥터

 

보드에는 ESP32-S3에서 사용하지 않는 GPIO를 노출하는 여러 개의 확장 커넥터(J7~J10)가 있어 추가 센서나 다른 모듈을 쉽게 연결할 수 있습니다. 이러한 커넥터는 일반적인 용도에 적합하지만 디스플레이(예: I²C를 통한 OLED), 푸시 버튼, LED 또는 IR 수신기와 같은 사용자 인터페이스 요소에도 이상적입니다. 각 커넥터에는 배선을 단순화하기 위한 전원 및 접지 핀이 포함되어 있습니다.

 

전원 공급 옵션

 

보드는 표준 DC 배럴 잭이나 5.08mm 피치 나사 단자를 사용하여 전원을 공급할 수 있어 설정에 따라 유연성을 제공합니다. TLV76733 선형 레귤레이터는 입력 전압(최대 16V)을 3.3V로 낮추어 ESP32-S3 및 연결된 주변 장치에 전원을 공급합니다. 이 LDO는 최대 1A를 공급할 수 있으며 우수한 정밀도(±1%), 낮은 정지 전류, 열 차단 및 전류 제한과 같은 보호 기능을 제공합니다. 높은 PSRR(1kHz에서 70dB)은 노이즈가 많은 입력에서도 시스템을 안정적으로 유지하는 데 도움이 되며, 낮은 드롭아웃 전압은 입력 전압이 3.3V에 가까워지더라도 효율적인 작동을 보장합니다.

 

보드에 전원을 공급하는 또 다른 방법은 S3-DeKit-C 모듈의 USB 커넥터 중 하나를 사용하는 것입니다. 배럴 잭을 통해 보드에 전원을 공급하는 동시에 USB를 통해 PC에 연결하여 직렬 데이터를 주고받을 수도 있습니다.

 

Circuit

 

연결할 모듈을 이미 제시했으므로 회로도는 이해하기 쉽습니다. 회로도( 그림 5 )는 ESP32-S3-DevKit-C 개발 보드를 중심으로 한 마이크로컨트롤러 기반 오디오 트랜시버 시스템을 개략적으로 보여줍니다. 전원은 커넥터 J1의 12V 입력을 통해 공급되며, 이 입력은 저전압 강하 레귤레이터(IC1)를 통해 3.3V까지 조절됩니다. 이 조절된 3.3V 라인은 ESP32-S3 보드와 회로의 다른 모든 저전압 구성 요소에 전원을 공급하며, 여러 개의 디커플링 커패시터(C1~C4)는 노이즈 억제 및 안정성을 제공합니다. ESP32-S3는 주 처리 장치 역할을 하며 GPIO를 통해 다양한 주변 장치에 연결됩니다.

 

 

 

그림 5: 개략도( PDF를 클릭하세요 )는 ESP32-S3-DevKit-C 개발 보드를 중심으로 한 MCU 기반 시스템을 간략하게 설명합니다.

 

 

무선 통신은 nRF24L01 모듈(MOD1)을 사용하여 구현되며, 이 모듈은 MISO, MOSI, SCK, CSN, CE, IRQ 등의 SPI 라인을 통해 ESP32와 인터페이스합니다. 이러한 연결은 100Ω 저항(R1~R3)과 전력 안정화를 위한 바이패스 커패시터(C6)로 보호됩니다. 저장을 위해 이 설계에는 표준 SDIO/SPI 라인을 통해 연결된 MSD-11-A microSD 소켓(J4)과 카드 감지 및 쓰기 방지 기능을 위한 추가 라인이 포함됩니다.

 

이 시스템은 여러 개의 GPIO 헤더(J7~J10)를 통해 주변 장치 확장을 지원하며, 각 헤더는 외부 디스플레이 모듈, 버튼 또는 장치에 전원, 접지 및 신호 라인을 제공합니다. I2C 인터페이스 는 Grove(J6) 및 Qwiic 호환(J5) 커넥터를 통해 제공되어 디지털 센서 및 모듈을 간편하게 통합할 수 있습니다. 또한, Digilent 호환 주변 장치 모듈에 대한 인터페이스를 제공하는 Pmod 커넥터(MOD2)가 포함되어 있습니다.

 

PCB

 

PCB 레이아웃은 ESP32-S3-DevKitC를 중심으로 구성됩니다( 그림 6 참조 ). 전원 잭, 나사 단자, Qwiic 커넥터, SD 카드 슬롯을 포함한 커넥터는 PCB 상단에 배치됩니다. Pmod 커넥터는 다양한 Pmod 모듈과 호환되도록 보드 하단에 위치합니다. nRF24 모듈은 오른쪽 가장자리에 배치되고, 4개의 커넥터(J7~J10)는 외부 모듈에 대한 추가 GPIO 액세스를 제공하기 위해 오른쪽 가운데 부분에 배치됩니다. I²C 트랙 은 짧고 좁아 일반적인 통신 속도에 적합하며, 전원 트레이스는 전류 분배를 처리하기 위해 더 넓고 접지면은 보드의 대부분을 덮습니다.

 

그림 6: PCB 레이아웃은 ESP32-S3-DevKitC를 중심으로 구성됩니다.

 

하우징

 

오디오 트랜시버 프로젝트의 PCB는 슬라이딩 뚜껑이 있는 100 × 97 × 40mm 알루미늄 인클로저에 맞습니다 .인클로저 레일에 직접 장착되며 뚜껑을 통해 필요할 때 내부에 쉽게 접근할 수 있습니다.금속 인클로저는 기계적 보호 및 차폐에 유용하지만 Wi-Fi 및 Bluetooth와 같은 고주파 신호도 차단합니다.금속은 패러데이 케이지 역할을 하므로 ESP32 DevKit의 PCB 안테나 버전과 무선 통신이 작동하지 않습니다.개구부를 제공하지 않는 한 말입니다.이러한 이유로 ESP32-S3 안테나 영역은 보드의 하단 가장자리에 배치되어 신호 접근을 위해 인클로저에 작은 컷아웃을 만들 수 있습니다.안테나 커넥터가 있는 ESP32-S3-DevKit(예: Elektor 매장에서 판매하는 제품)을 사용하는 경우 금속 하우징의 전면 또는 후면 플레이트에 외부 안테나를 장착할 수 있습니다.

 

nRF24 모듈의 SMA 커넥터는 안테나를 외부에 장착하기 위해 전면판에 구멍을 뚫을 수 있도록 배치되어 있습니다( 그림 7 참조 ).

 

 

그림 7: nRF24 모듈의 SMA 커넥터는 안테나를 외부에 장착하기 위해 전면판에 구멍을 뚫을 수 있도록 배치되어 있습니다 . 이렇게 하면 모듈을 금속 하우징 내부에 넣어도 사용할 수 있습니다.

 

 

데모 소프트웨어

 

앞서 말했듯이 다음 에디션에서는 몇 가지 응용 프로그램과 추가 개발 사항을 소개합니다.예를 들어, 2025년 9월에 출시될 Elektor 의 "무선" 에디션에서는 오디오를 송수신하는 소프트웨어를 선보일 예정입니다.하지만 오디오 트랜시버 보드에 대한 이 기사를 첫 번째 데모 소프트웨어 없이 끝내고 싶지는 않았습니다.

 

데모 소프트웨어는 간단한 WAV 오디오 파일 플레이어입니다.오디오 트랜시버 보드 의 랩 페이지에서 다운로드할 수 있습니다 .시작 시 ESP32는 SD 카드에 저장된 파일(하위 디렉토리 없음)을 읽고 모든 WAV 파일 이름을 작은 목록에 넣습니다.그런 다음 해당 목록에서 첫 번째 오디오 파일을 재생합니다.ESP32의 GPIO7(J8)에 연결된 버튼을 누르면 현재 트랙이 중지되고 다음 트랙이 켜집니다. 그림 8은 버튼이 있는 프로토타입을 보여줍니다.프로토타입의 경우 PCB의 SD 카드 소켓을 사용하지 않았습니다. 대신, ESP32에 SPI를 통해 연결되는 초소형 SD 카드 모듈입니다. SPI 신호 커넥터로는 2x4 "nRF24 소켓"을 사용했습니다.

 

 

 

그림 8: 다음 곡으로 넘어가는 버튼이 있는 WAV 플레이어 프로토타입. 이 프로토타입에는 PCB의 SD 카드 소켓 대신, SPI를 통해 ESP32에 연결되는 초소형 SD 카드 모듈을 사용했습니다.

 

ESP32를 USB를 통해 PC에 연결하면 터미널 프로그램에서 명령을 전송할 수 있습니다. "b"는 다음 트랙으로, "a"는 이전 트랙으로 이동합니다. 참고로, 저희 소프트웨어는 아직 MP3 트랙을 재생할 수 없으므로, 좋아하는 MP3 노래를 WAV 파일로 변환하는 무료 변환기를 사용할 수 있습니다. 데모

 

코드는 모듈식입니다. 아마도 가장 흥미로운 소프트웨어 모듈은 Stream_I2S.h 일 것입니다. 이 모듈은 음악 바이트를 I2S 인터페이스에 쓰는 기능을 담당합니다. (아래 "ESP32 I2S API" 섹션을 참조하세요.) 저희는 의도적으로 Phil Schatzmann 의 Arduino Audio Tools와 같은 강력한 대형 오디오 라이브러리를 사용하지 않았습니다 . 이러한 라이브러리는 다양한 하드웨어 플랫폼에서 유연하게 사용할 수 있고, 다양한 기능을 제공하며, 관련 문서도 잘 정리되어 있습니다. 하지만 이 라이브러리는 사용자에게 원시 음악 데이터를 일부 숨기기 때문에, 오디오 신호를 나타내는 바이트를 다루는 것이 얼마나 쉬운지 보여드리고 싶었습니다.

 

간단한 Stream_I2S 라이브러리 외에도 SD 카드 접근을 위한 Arduino 표준 라이브러리를 기반으로 하는 작은 라이브러리 SDCardFiles.h 가 있습니다. 아주 작은 Button.h 라이브러리는 버튼 누름을 처리합니다.

 

메인 프로그램에서 가장 중요한 루프는 다음과 같습니다.

 

uint8_t bBuffer[128];

...

while (SDCardFiles_DataLeftToRead())

{

      SDCardFiles_ReadInBuffer(bBuffer, 128);

      I2S_WriteFromBuffer(bBuffer, 128);

...

}

 

 

먼저 SD 카드에서 128바이트를 읽습니다. 그런 다음 이 128바이트를 ESP32의 I2S 인터페이스에 씁니다. 그 후에는 버튼이 눌렸는지 또는 직렬 인터페이스를 통해 문자가 수신되었는지 확인할 충분한 시간이 있습니다.

 

이 소프트웨어는 오디오 데이터 작업이 얼마나 쉬운지 보여주는 예시일 뿐입니다. 물론 실제 플레이어는 디스플레이와 로터리 인코더와 같은 더 나은 입력 요소를 갖춰야 합니다.

 

 

 

에스프레시프 I2S API

 

ESP32-S3에는 두 개의 I2S 주변 장치 블록이 있으며, 이를 사용하여 동시에 오디오를 출력하고 입력할 수 있습니다. PCB에서 두 인터페이스에 8개의 연결을 사용했습니다(2x VCC 및 GND 제외). 일반적으로 I2S 라인에 대해 ESP32의 GPIO를 유연하게 선택할 수 있습니다.

 

I2S를 통해 데이터를 출력하고 입력하기 위해 DMA 컨트롤러가 사용되므로 데이터가 전송되거나 수신될 때 프로세서 코어는 다른 작업에 사용할 수 있습니다. 물론 DMA 버퍼가 필요합니다. Espressif에서 제공하는 ESP32 I2S API를 사용하면 버퍼 수(최소 2개)와 각 버퍼의 음악 샘플 수를 선택할 수 있습니다. 다음 기사 중 하나에서 이에 대해 자세히 설명합니다.

 

I2S 인터페이스를 제어하는 ​​API도 물론 개발 대상입니다. 우리의 목적에는 최신 버전의 API보다 이해하기가 약간 더 쉬운 레거시 버전[10]이 더 적합합니다. 많은 우수한 Arduino 오디오 라이브러리는 애플리케이션 프로그래머에게 API 명령을 숨기는데, 대부분의 경우 일부 래퍼 함수(예: [8])를 사용합니다. 이러한 오디오 라이브러리는 매우 강력하고 유연하지만, I2S API의 작동 방식을 아는 것이 좋을 것이라고 생각했습니다. 편리한 사용을 위해 ESP32 I2S 드라이버를 시작하는 모든 명령을 하나의 함수(자체 래퍼 함수)로 그룹화했습니다. 오디오 재생을 위해 드라이버를 시작하는 코드는 다음과 같으며, Stream_I2S.h 파일에서 확인할 수 있습니다 .

 

// these pin definitions are located in BoardPin.h

#define I2S_MCK_OUT 36

#define I2S_WS_OUT  35  

#define I2S_SCK_OUT 48

#define I2S_SD_OUT  47

 

#define I2S_PORT   I2S_NUM_0

 

uint8_t audiochannelcount = 1;
uint16_t samplerate = 32000;
uint8_t samplebuffer_count = 4;
uint8_t samplebuffer_length = 32;

 

void I2S_Start()
{   
  i2s_channel_fmt_t audiochannelformat =  I2S_CHANNEL_FMT_ONLY_LEFT;  
 

  if (audiochannelcount == 2)
  {
    audiochannelformat = I2S_CHANNEL_FMT_RIGHT_LEFT;
  }

  
  i2s_comm_format_t communicationformat =  i2s_comm_format_t(I2S_COMM_FORMAT_I2S |                                                                                   I2S_COMM_FORMAT_I2S_MSB);  

 

  i2s_config_t i2s_config_out = {
    .mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_TX),
    .sample_rate = samplerate,
    .bits_per_sample = i2s_bits_per_sample_t(16),
    .channel_format = audiochannelformat,
    .communication_format = communicationformat,
    .intr_alloc_flags = 0,
    .dma_buf_count = samplebuffer_count,
    .dma_buf_len = samplebuffer_length,
    .use_apll = true,
    .tx_desc_auto_clear = true, // silence on underflow
    .fixed_mclk = samplerate * 256
  };
 

  i2s_driver_install(I2S_PORT, &i2s_config_out, 0, NULL);
 
  const i2s_pin_config_t pin_config_out = {
    .mck_io_num = I2S_MCK_OUT,
    .bck_io_num = I2S_SCK_OUT,
    .ws_io_num = I2S_WS_OUT,
    .data_out_num = I2S_SD_OUT,
    .data_in_num = -1
  };

  
  i2s_set_pin(I2S_PORT, &pin_config_out);
  i2s_start(I2S_PORT);
}

 

 

지금은 모든 것을 자세히 이해할 필요는 없지만, 예를 들어 I2S 인터페이스에 사용되는 샘플 레이트나 GPIO 핀을 변경하는 것이 어렵지 않다는 것을 알 수 있습니다.

 

다음은 I2S 인터페이스를 통해 DAC로 128바이트의 데이터를 전송하는 API 드라이버 명령어입니다:

 

(I2S_PORT, &wBuffer, 128, &bytesWritten, portMAX_DELAY); 

 

이를 통해 128바이트의 오디오 데이터를 DAC로 전송하게 되며, 해당 데이터는 wBuffer에 위치해야 합니다. SD 카드의 오디오 데이터, 생성된 사인파 또는 사각파 오디오 신호 또는 기타 소스로 wBuffer를 채울 수 있습니다. wBuffer는 단순한 바이트 배열(uint8_t wBuffer[128];) 또는 16비트 폭의 음악 샘플 배열로 설정할 수 있으며, 이 경우 부호 있는 정수(int16_t wBuffer[64];)를 사용해야 합니다. i2s_write 함수는 두 종류의 버퍼 모두와 작동하지만, 함수의 세 번째 매개변수에 명시된 대로 총 바이트 수는 128바이트여야 합니다.

 

다섯 번째 매개변수로 portMAX_DELAY를 지정한 i2s_write는 DMA 버퍼에 공간이 생길 때까지 블로킹 상태로 유지된다는 점이 매우 편리 합니다. 버퍼를 다시 채운 후 함수가 반환되고, 프로세서 없이도 데이터가 출력되는 동안 다른 작업을 수행할 수 있습니다. 버퍼가 비기 전에 다음 데이터 패킷으로 i2s_write를 다시 호출할 때까지 너무 많은 시간을 낭비하지 않도록 주의해야 합니다. 이렇게 하면 데이터를 연속적으로 출력하는 것이 매우 간편해집니다! 반대로 ADC를 통해 데이터를 샘플링하는 경우에는 사용하기 편리한 i2s_read 함수가 있습니다.

 

esp_err_t 결과 = i2s_read(I2S_PORT, &rBuffer, 128, &bytesIn, portMAX_DELAY);

 

이 기능은 다음 기사에서 사용하겠습니다.

 

앞으로의 전망

 

오디오 트랜시버 보드 프로젝트에 대한 이 시리즈의 다음 부분에서는 무선으로 오디오 데이터를 송수신하는 방법을 살펴보겠습니다. 먼저, 무선 수신기의 프로토타입을 보여주는 그림 7을 참조하세요. 기대해 주세요!

 

Editor's Note: This article (250384-01) appears in the Elektor Circuit Special 2025.



기사 출처는 링크를 참고

 

 

반응형

캐어랩 고객 지원

취업, 창업의 막막함, 외주 관리, 제품 부재!

당신의 고민은 무엇입니까? 현실과 동떨어진 교육, 실패만 반복하는 외주 계약, 아이디어는 있지만 구현할 기술이 없는 막막함.

우리는 알고 있습니다. 문제의 원인은 '명확한 학습, 실전 경험과 신뢰할 수 있는 기술력의 부재'에서 시작됩니다.

이제 고민을 멈추고, 캐어랩을 만나세요!

코딩(펌웨어), 전자부품과 디지털 회로설계, PCB 설계 제작, 고객(시장/수출) 발굴과 마케팅 전략으로 당신을 지원합니다.

제품 설계의 고수는 성공이 만든 게 아니라 실패가 만듭니다. 아이디어를 양산 가능한 제품으로!

귀사의 제품을 만드세요. 교육과 개발 실적으로 신뢰할 수 있는 파트너를 확보하세요.

지난 30년 여정, 캐어랩이 얻은 모든 것을 함께 나누고 싶습니다.

카카오 채널 추가하기

카톡 채팅방에서 무엇이든 물어보세요

당신의 성공을 위해 캐어랩과 함께 하세요.

캐어랩 온라인 채널 바로가기

캐어랩