본문 바로가기

아두이노우노 R4

아두이노 우노 R4 DAC 제어 꿀팁

반응형

 

아두이노 우노 R4 DAC 제어 꿀팁 

 

아두이노 UNO R4 WiFi 디지털-아날로그 컨버터(DAC)

UNO R4 WiFi 보드의 DAC를 사용하여 파형을 생성하고 피에조로 출력하는 방법을 알아보세요.

아두이노 UNO R4 WiFi에는 디지털 신호를 아날로그 신호로 변환하는 데 사용되는 DAC(디지털-아날로그 컨버터)가 내장되어 있습니다. 이 기능은 수많은 재미있는 오디오 프로젝트를 만드는 데 사용할 수 있지만, 예를 들어 저렴한 함수 생성기와 같은 전문 실험실 장비로도 사용할 수 있습니다.

 

목표

 

이 문서에서는 다음을 학습합니다:

 

  • UNO R4 WiFi에 탑재된 DAC 기능에 대해 알아봅니다
  • PWM과 DAC 기술의 차이점
  • 파형(사인)을 생성하는 방법
  • 이 파형을 피에조 스피커에서 출력하는 방법.

 

필요한 하드웨어 및 소프트웨어 - 튜토리얼을 따라 하려면 다음 하드웨어가 필요합니다:

 

  • 아두이노 UNO R4 WiFi
  • 피에조 부저
  • 전위차계
  • 점퍼 와이어

 

회로

 

이 튜토리얼에 필요한 회로는 아래 다이어그램에서 확인할 수 있습니다:

 

UNO R4에 연결된 피에조 버저

 

 

아날로그 출력과 PWM 비교

 

아날로그 출력이 필요한 많은 사용 사례에서 정품 아날로그 출력 대신 PWM(펄스 폭 변조)을 사용하면 본질적으로 동일한 결과를 얻을 수 있습니다. 디지털 출력 핀은 완전히 켜지거나(HIGH) 완전히 꺼질 수 있지만, 정확한 타이밍으로 매우 빠르게 켜고 끌 수 있어 평균 전압을 제어하고 아날로그 출력을 에뮬레이트할 수 있습니다. 이 방법을 PWM이라고 합니다.

 

예를 들어 LED를 디밍할 때 PWM 지원 디지털 핀을 아날로그 출력 핀으로 자유롭게 사용할 수 있으며, DAC 출력을 사용할 때와 동일하게 LED가 어두워집니다.

 

그러나 항상 그런 것은 아니며, 많은 용도에서 원하는 결과를 얻으려면 정품 아날로그 출력을 사용해야 합니다. 이러한 경우 중 하나는 오디오 용도로, PWM 출력은 정품 아날로그 출력과 동일한 음질을 제공하지 못하며 애초에 작동하려면 약간의 조작이 필요합니다.

 

코드

 

이 튜토리얼의 코드는 메인 스케치와 미리 생성된 톱니파형이 포함된 헤더 파일의 두 부분으로 나뉩니다.

 

이 스케치에서는 사인 파형을 미리 생성했습니다. 스케치를 시작할 때 또는 스케치 도중에 동적으로 생성할 수도 있지만, 그렇게 하면 성능은 향상되지 않고 효율성이 떨어집니다. 따라서 이 방법을 사용하는 것이 가장 좋습니다.

 

파형은 배열에 샘플로 저장되며, 스케치를 반복할 때마다 DAC의 출력 값을 배열의 다음 값으로 업데이트합니다.

 

새 스케치를 열고 다음 코드를 창에 붙여넣습니다.

 

깃허브의 코드 소스

 

/*
  사인파 미리 생성된 톱니 파형을 생성합니다.
*/

#include "analogWave.h" // 아날로그 파형 생성을 위한 라이브러리 포함

analogWave wave(DAC);   // DAC 핀을 사용하여 analogWave 클래스의 인스턴스를 생성합니다.

int freq = 10;  // 헤르츠 단위로 변경합니다.

void setup() {
  Serial.begin(115200);  // 115200의 전송 속도로 시리얼 통신을 초기화합니다.
  wave.sine(freq);       // 초기 주파수로 사인파를 생성합니다.
}

void loop() {
  // 핀 A5에서 아날로그 값을 읽고 주파수 범위에 매핑합니다.
  freq = map(analogRead(A5), 0, 1024, 0, 10000);

  // 업데이트된 주파수를 시리얼 모니터에 출력합니다.
  Serial.println("Frequency is now " + String(freq) + " hz");

  wave.freq(freq);  // 파형 발생기의 주파수를 업데이트된 값으로 설정합니다.
  delay(1000);      // 1초간 딜레이 후 반복
}

 

테스트하기

 

코드를 보드에 업로드하면 DAC에서 사인파 진동을 생성하기 시작할 것이며, 주파수에 따라 피에조 버저 또는 스피커에서 소리를 생성하는 데 사용할 수 있습니다. 오실로스코프가 있는 경우 프로브를 DAC 출력에 연결하여 파동이 어떻게 보이는지 살펴보는 것도 흥미로운 연습이 될 수 있습니다.

 

이제 전위차계를 비틀어보고 소리가 어떻게 변하는지 들어보세요.

 

아날로그 웨이브 유형

 

위의 스케치는 사인파라고 알려진 파형을 생성합니다. 전압을 시간에 대해 플롯하면 선이 사인 함수처럼 보이기 때문에 사인파라고 부릅니다.

 

사인파와는 확연히 다른 유형의 사운드를 생성하는 다른 유형의 아날로그 파가 있습니다. 이 스케치에서 사용하는 라이브러리를 사용하면 톱니 모양과 사각형 파도 만들 수 있습니다. 이러한 유형의 파동은 전압을 시간에 대해 플롯했을 때의 모양에서 이름을 얻었습니다.

 

파형 유형을 변경하여 소리의 느낌이 어떻게 달라지는지 들어보세요.

 

스케치에서 18번째 줄 "wave.sine(freq);"을 다음 중 하나로 대체하여 파형을 변경합니다.

 

wave.square(freq);

 

또는

 

wave.saw(freq);

 

이제 설정이 제대로 작동한다는 것을 알았으니 다양한 예제를 통해 더 많은 실험을 해보고 UNO R4의 DAC를 사용하여 사운드와 멜로디를 생성하는 방법을 알아볼 수 있습니다.

 

참고: 이 설정에서는 피에조 버저를 사용하고 있기 때문에 소리가 매우 희미하다는 것을 알 수 있습니다. 이 문제를 해결하려면 4옴 또는 8옴 스피커와 앰프가 필요합니다. 온라인에서 쉽게 사용할 수 있는 브레이크아웃 앰프 모듈을 많이 찾을 수 있습니다. 

 

Frere Jacques 프레르 자크

 

예를 들어 이 곡은 프레르 자크의 멜로디를 연주합니다:

 

코드 소스 Github

 

/*

DAC 멜로디 플레이어 
미디 음표 값에서 일련의 톤을 생성합니다. 미디 노트 값에서 일련의 톤을 생성합니다. 멜로디는 "Frere Jacques"입니다. 

* 오디오 앰프(테스트에 사용된 LM386) 입력+ A0에 연결됨 
* 오디오 앰프 입력-접지에 연결 
* 앰프 출력+에 연결된 4-8옴 스피커  
* 핀 A5에 연결된 전위차계 
*/

#include "analogWave.h"
analogWave wave(DAC);

#define NOTE_A4 69         // 중간 A의 미디 노트 값
#define FREQ_A4 440        // 중간 A의 주파수

// 토닉 또는 곡의 조표의 첫 번째 음표
int tonic = 65;
// 멜로디 시퀀스. 음표 값은 토닉에 상대적입니다:
int melody[] = {1, 3, 5, 1,
                1, 3, 5, 1,
                5, 6, 8, 5, 6, 8,
                8, 10, 8, 6, 5, 1,
                8, 10, 8, 6, 5, 1,
                1, -4, 1,
                1, -4, 1
               };
// 리듬 시퀀스. 값은 1/음표입니다(예: 4 = 1/4음표):
int rhythm[] = {4, 4, 4, 4,
                4, 4, 4, 4,
                4, 4, 2,
                4, 4, 2,
                8, 8, 8, 8, 4, 4,
                8, 8, 8, 8, 4, 4,
                4, 4, 2,
                4, 4, 2
               };
// 멜로디의 어떤 음을 연주할지:
int noteCounter = 0;

int bpm = 120;  // 분당 비트수
// 비트의 지속 시간(ms)
float beatDuration = 60.0 / bpm * 1000;

void setup() {
// 사인파 발생기를 시작합니다:
  wave.sine(10);
}

void loop() {
  // 현재 음표는 배열의 요소입니다:
  int currentNote = melody[noteCounter] + tonic;
  // 멜로디에서 음을 재생합니다:
  // 미디 음표를 주파수로 변환합니다:
  float frequency =  FREQ_A4 * pow(2, ((currentNote - NOTE_A4) / 12.0));

  // 여기 있는 모든 음표는 16번째 음표입니다
  // 박자의 1/4이므로:
  float noteDuration = beatDuration * (4.0 / rhythm[noteCounter]);
  // 음표를 켭니다:
  wave.freq(frequency);
  // tone(speakerPin, frequency, noteDuration * 0.85);
  // 적절한 시간 동안 계속 켜둡니다:
  delay(noteDuration * 0.85);
  wave.stop();
  delay(noteDuration * 0.15);
  // 음을 끕니다:
  // noTone(speakerPin);
  // 루프를 통해 다음 번에 음표 번호를 증가시킵니다:
  noteCounter++;
  // 모듈로를 사용하여 음표를 0 - 32 범위로 유지합니다:
  noteCounter = noteCounter % 32;

}

 

 

 

미디 피아노 노트

 

이 스케치는 전위차계 입력을 피아노의 건반을 나타내는 88개의 MIDI 음표로 변환하는 단계로 세분화합니다.

 

깃허브의 코드 소스

 

/*
  전위차계에 반응하여 톤을 재생합니다. 
  공식 https://newt.phys.unsw.edu.au/jw/notes.html 및 https://en.wikipedia.org/wiki/MIDI_tuning_standard: 
  
  미디 프로토콜은 동일한 음계의 음을 다음과 같이 나눕니다. 
  128개의 가능한 음표 값으로 나눕니다. 가운데 A는 미디 음표 값 69입니다. 
  여기에는 8 미디 음표 번호(0-127)를 피치로 변환하는 공식이 있습니다. 
  이 스케치 9는 이를 피아노의 88개 건반인 21~108 음표로 줄입니다: 
  
  주파수 = 440 * ((노트 번호 - 69) / 12.0)^2 
  
  아래 코드에서 이것이 적용된 것을 볼 수 있습니다. 
  
  회로:
  
  * 오디오 앰프(테스트에 사용된 LM386) 입력+ A0에 연결됨 
  * 오디오 앰프 입력- 접지에 연결 
  * 앰프 출력+에 연결된 4-8옴 스피커 19 
  * 핀 A5에 연결된 전위차계 
  
*/

// AnalogWave 라이브러리를 포함합니다: 
#include "analogWave.h"
analogWave wave(DAC);

// 중간 A는 기준 주파수입니다. 
// 등조 스케일입니다. 주파수와 음표 값을 설정합니다:
#define NOTE_A4 69         // 중간 A의 미디 음표 값
#define FREQ_A4 440        // 중간 A의 주파수

const int speakerPin = A0;   // 스피커의 핀 번호
void setup() {
  Serial.begin(9600);
  wave.sine(10);
}
void loop() {
  // 센서 판독값을 21 - 108 범위로 변환합니다.
  // 88키 키보드의 미디 음표 범위입니다.
  // (A0에서 C8까지):
  int sensorReading = analogRead(A5);
  int noteValue = map(sensorReading, 0, 1023, 21, 108);
  // 그런 다음 주파수로 변환합니다:
  float frequency =  FREQ_A4 * pow(2, ((noteValue - NOTE_A4) / 12.0));
  int freq = int(frequency);
  // 스피커를 켭니다:
  wave.freq(freq);
  Serial.print("note value: "+ String(noteValue) + " freq: ");
  Serial.println(freq);
  delay(500);
}

 

결론

 

이 튜토리얼을 통해 아두이노 UNO R4 보드에서 DAC를 실험하고 이를 사용하여 먼저 사인파를 생성한 다음 다양한 예제를 테스트하여 아날로그 출력의 가능성을 탐색해 보았습니다. 

 

 

 

반응형

더욱 좋은 정보를 제공하겠습니다.~ ^^