산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

아두이노와 XBee, DAC, 오디오 앰프로 만드는 고급 워키토키

부품 및 소모품

부품 수량 비고
Goldilocks Analogue 보드 1 프로토타입. ATmega1284p + MCP4822 DAC + 헤드폰 앰프 + SPI 메모리 + SD 카드 내장. 없으면 아두이노 우노 + 별도 모듈로 구성 가능
MAX9744 (헤드폰 앰프) 1 Goldilocks에 내장 시 별도 불필요
MAX9814 (마이크 증폭기) 1 자동 게인 제어(AGC) 내장
MCP4921 DAC 1 Goldilocks는 MCP4822(듀얼) 사용. 단일 채널이면 MCP4921 대체 가능
아두이노 우노 (Arduino UNO) 1 Goldilocks 대체용
아두이노 무선 쉴드 (XBee용) 1 XBee 모듈 장착용
XBee Pro S2B 모듈 2 페어링용 2개 필요 (코디네이터 1, 라우터 1)

프로젝트 소개

AVR ATmega1284p MCU 기반의 고급 아두이노 클론인 Goldilocks Analogue를 제작 중입니다. 12비트 DAC(MCP4822), 헤드폰 앰프, 2개 SPI 메모리(SRAM, EEPROM), SD 카드 슬롯을 내장했습니다. 아두이노 플랫폼에 통합 DAC가 없어 아날로그 출력 응용 사례가 드문데, 워키토키는 디지털과 아날로그를 결합한 실용적인 프로젝트입니다.

아두이노와 XBee, DAC, 오디오 앰프로 만드는 고급 워키토키
Goldilocks Analogue - 프로토타입 3

실제 워키토키 기능은 몇 줄의 코드지만, 그 기반에는 아날로그 입력(샘플링), SPI 버스를 통한 MCP4822 DAC 아날로그 출력, 샘플 타이밍 루틴, XBee 디지털 라디오 플랫폼이 있습니다. 레이어별로 살펴보겠습니다.

XBee 라디오

XBee Pro S2B 모듈을 포인트투포인트 모드로 사용. 한 쪽은 코디네이터(Coordinator), 다른 쪽은 라우터(Router)로 설정. 설정 가이드는 인터넷에 많습니다.

최대 문자 간 대기 시간으로 패킷 전송 설정 시 패킷이 가득 찰 때만 전송(84바이트)되어 무선 처리량 최대화. 원시 처리량 250kbps지만 실제 사용자 데이터율은 약 32kbps로 제한. 이는 샘플링 레이트와 음성 품질에 영향을 줍니다.

8비트 샘플 기준 약 3kHz 샘플링이 압축 없이 전송 가능한 한계. 압축은 차기 프로젝트로 미룹니다.

XBee는 AT 모드(투명 시리얼 파이프)로 설정해 두 기기 간 단순 연결. 와이어로 먼저 테스트 후 무선으로 전환 가능.

아두이노와 XBee, DAC, 오디오 앰프로 만드는 고급 워키토키
로직 분석기 추적: Rx(보라)=수신 패킷, Tx(파랑)=송신 샘플

수신 패킷은 링 버퍼에 저장 후 일정한 속도로 재생. 링 버퍼 255바이트 허용 (XBee 패킷 84바이트이므로 충분). 송신 샘플은 매 샘플 주기마다 Tx 라인으로 전송 (버퍼링 후 전송). XBee는 최대 0xFF 심볼 주기까지 버퍼링 후 패킷 전송.

샘플링 레이트

전송 링크의 비트 예산 계산: 8비트 × 3,000Hz = 24kbps 전송 필요. 이는 잘 작동함. 4kHz는 이론적 최대치에 가까워 불안정.

아두이노와 XBee, DAC, 오디오 앰프로 만드는 고급 워키토키
3kHz 샘플링 시 로직 분석기 파형

Rx 라인에서 0x7E, 0x7C로 시작하는 패킷 도착 확인. 마이크 앰프와 DAC 출력은 0x7F(8비트) 또는 0x7FFF(16비트) 중심으로 바이어스됨. 신호 레벨이 매우 낮게 캡처/전송됨.

샘플 처리

샘플링 인터럽트 처리 시간 측정용 "핑" 신호(노란색 트레이스). 인터럽트 처리 시간이 전체 샘플 주기(333μs)에 비해 매우 짧음. 데이터 압축 구현 여력 있음.

아두이노와 XBee, DAC, 오디오 앰프로 만드는 고급 워키토키
인터럽트 처리 시간 측정 (노란색 펄스)

샘플링 인터럽트 내 두 주요 작업:

  1. DAC에 샘플 출력으로 오디오 재생
  2. ADC 읽기로 오디오 샘플 캡처 후 USART 버퍼로 전송

이 모든 작업은 타이머 인터럽트에서 호출되는 audioCodec_dsp 함수에서 수행.

타이머 설정: AVR 8비트 Timer0로 정기 샘플 인터벌 생성. MCU 주파수(FCPU)가 표준 오디오 주파수의 2진수 배수이면 8비트 타이머 + 64 프리스케일러로 정확한 샘플링 레이트 생성 가능. 44.1kHz 같은 홀수 주파수는 16비트 Timer1 필요.

ATmega1284p ADC는 프리런 모드, 192kHz로 스케일다운 (8비트 샘플 기준 최대 획득 속도 근접하지만 스펙 내). 인터럽트 소요 시간 약 14μs로 333μs 주기 대비 매우 짧음. 나머지 시간으로 UI나 추가 오디오 처리 가능.

SPI 트랜잭션 (DAC 출력)

아두이노와 XBee, DAC, 오디오 앰프로 만드는 고급 워키토키
MCP4822 DAC로 출력하는 SPI 트랜잭션 상세

Goldilocks Analogue 프로토타입 2는 표준 SPI 버스 사용. 이후 프로토타입은 ATmega1284p의 USART1 마스터 SPI 모드 사용으로 이중 버퍼링으로 SPI 가속, 일반 SPI 버스는 SD 카드나 SPI 메모리 동시 접근용으로 확보. 워키토키 애플리케이션은 오디오 저장이 필요 없어 구형 프로토타입과 일반 SPI 버스로도 충분.

마무리

기존 도구 몇 개와 몇 줄 코드로 디지털 암호화 워키토키를 빠르게 제작 가능. 이해할 수 있는 수준의 음성 통신 가능 (고음질은 아님). CB 무전기 트럭 기사들이 가족 대화를 엿들을 일은 없겠죠.

이 프로젝트는 MAX9814 마이크 입력을 Goldilocks Analogue에 추가하는 테스트였습니다. 프로토타입 4에서 마이크 증폭 회로를 추가해 워키토키, 보이스 체인저, 보컬 제어 음악 신디사이저 등 오디오 입력 필요한 애플리케이션 지원 예정.

아두이노와 XBee, DAC, 오디오 앰프로 만드는 고급 워키토키
XBee와 마이크 앰프를 장착한 두 개의 Goldilocks Analogue 프로토타입

ATmega1284p를 표준 20MHz가 아닌 24.576MHz로 오버클럭 운용. 이 주파수는 48kHz부터 4kHz(심지어 1.5kHz)까지 정확한 오디오 샘플 재생 가능. 샘플 주기당 추가 MCU 클록 사이클이 음악 신디사이징에 큰 도움.

코드는 SourceForge AVR freeRTOS 저장소에. Shuyang(SeeedStudio)님의 OPL이 훌륭해 많은 부품과 PCB 조달에 도움 받았습니다.

코드

오디오 코덱 DSP 함수 (메인 처리 루틴)

void audioCodec_dsp(uint16_t *ch_A, uint16_t *ch_B) {
  int16_t xn;
  uint8_t cn;
  
  /*----- 오디오 수신 (Rx) -----*/
  // 링 버퍼에서 다음 문자 가져오기
  if (ringBuffer_IsEmpty((ringBuffer_t*)&(xSerialPort.xRxedChars))) {
    cn = 0x80 ^ 0x55; // A-Law 무음 신호 출력
  } else if (ringBuffer_GetCount(&(xSerialPort.xRxedChars)) > (portSERIAL_BUFFER_RX >> 1)) {
    // 버퍼가 절반 이상 차면 두 개 팝하여 따라잡기 (첫 번째 버림)
    cn = ringBuffer_Pop((ringBuffer_t*)&(xSerialPort.xRxedChars));
    cn = ringBuffer_Pop((ringBuffer_t*)&(xSerialPort.xRxedChars));
  } else {
    cn = ringBuffer_Pop((ringBuffer_t*)&(xSerialPort.xRxedChars));
  }
  
  alaw_expand1(&cn, &xn); // A-Law 압축 해제
  *ch_A = *ch_B = (uint16_t)(xn + 0x7fff); // 양수 값으로 변환, A/B 채널 동일 출력
  
  /*----- 오디오 송신 (Tx) -----*/
  AudioCodec_ADC(&mod7_value.u16); // 샘플은 10비트 좌측 정렬
  xn = mod7_value.u16 - 0x7fe0;    // 샘플을 0 중심으로 이동 (10비트 범위의 절반 빼기)
  IIRFilter(&tx_filter, &xn);      // 송신 샘플 필터링
  alaw_compress1(&xn, &cn);        // A-Law 압축
  xSerialPutChar(&xSerialPort, cn); // 샘플 전송
}

타이머 0 인터럽트 서비스 루틴 (ISR)

ISR(TIMER0_COMPA_vect) __attribute__ ((hot, flatten));
ISR(TIMER0_COMPA_vect) {
#if defined(DEBUG_PING)
  PORTD |= _BV(PORTD7); // 디버깅용 핑 시작 (노란색 트레이스)
#endif
  
  // MCP4822 데이터 전송 루틴 (지터 최소화를 위해 최우선 수행)
  DAC_out(ch_A_ptr, ch_B_ptr);
  
  // 오디오 처리 루틴 - 입력 처리, 다음 샘플 출력 준비
  if (audioHandler != NULL) audioHandler(ch_A_ptr, ch_B_ptr);
  
#if defined(DEBUG_PING)
  PORTD &= ~_BV(PORTD7); // 디버깅용 핑 종료
#endif
}

DAC 출력 함수 (MCP4822 SPI 통신)

void DAC_out(const uint16_t *ch_A, const uint16_t *ch_B) {
  DAC_command_t write;
  
  // 채널 A 처리
  if (ch_A != NULL) {
    write.value.u16 = (*ch_A) >> 4; // 16비트 → 12비트 (상위 12비트 사용)
    write.value.u8[1] |= CH_A_OUT;
  } else {
    write.value.u8[1] = CH_A_OFF;
  }
  
  SPI_PORT_SS_DAC &= ~SPI_BIT_SS_DAC; // SS Low - DAC 선택
  SPDR = write.value.u8[1];           // 상위 바이트 전송 시작
  while (!(SPSR & _BV(SPIF)));        // 전송 완료 대기
  SPDR = write.value.u8[0];           // 하위 바이트 전송
  
  // 채널 B 처리 (채널 A 전송 중 병렬 처리)
  if (ch_B != NULL) {
    write.value.u16 = (*ch_B) >> 4;
    write.value.u8[1] |= CH_B_OUT;
  } else {
    write.value.u8[1] = CH_B_OFF;
  }
  
  while (!(SPSR & _BV(SPIF)));        // 채널 A 완료 대기
  SPI_PORT_SS_DAC |= SPI_BIT_SS_DAC;  // SS High - 채널 A 래치
  
  SPI_PORT_SS_DAC &= ~SPI_BIT_SS_DAC; // SS Low - 채널 B 선택
  SPDR = write.value.u8[1];           // 채널 B 상위 바이트
  while (!(SPSR & _BV(SPIF)));
  SPDR = write.value.u8[0];           // 채널 B 하위 바이트
  while (!(SPSR & _BV(SPIF)));
  SPI_PORT_SS_DAC |= SPI_BIT_SS_DAC;  // SS High - 채널 B 래치
}

소스 코드 저장소

AVR freeRTOS (SourceForge): https://sourceforge.net/projects/avrfreertos/

DAC.h와 아날로그 테스트 파일 포함. 링크된 GitHub 저장소는 사용하지 마시고 SourceForge에서 최신 코드 받으세요.

회로도

아두이노와 XBee, DAC, 오디오 앰프로 만드는 고급 워키토키
Fritzing 회로도 (MCP4725 I2C DAC로 그려짐 - 실제는 MCP4822 SPI DAC). XBee 보드는 Rx/Tx 선을 무선으로 대체. 충분한 데이터율의 무선 세트면 무엇이든 동작 가능.

DAC 출력 및 헤드폰 앰프 회로도. 마이크 입력 앰프는 프로토타입 4에서 추가 예정.

제조공정

  1. 대량 스위스 머시닝 핵심 고려사항
  2. CNC 프로토타이핑 가이드: 정밀도, 속도, 비용 효율적 생산
  3. 전문 샤프트 제조: 정밀 공정 & 맞춤형 솔루션
  4. 스테인리스 스틸 패시베이션: 내식성 및 성능 향상
  5. 단일 GPIO 핀으로 라즈베리 파이에서 아날로그 센서 측정하기
  6. MCP3008 ADC로 라즈베리 파이에서 아날로그 센서 읽기
  7. DAC 기반 커스텀 PCB로 고정밀 파형 생성하기
  8. 윈도우 10 IoT, 라즈베리파이, XBee 수분 센서로 만드는 스마트 관개 컨트롤러
  9. 아날로그 측정이 플랜트 성과를 이끄는 이유
  10. 신호 회로용 고급 차폐 케이블: 실무 연결 기술 (2부)