안녕하세요, 모두! 이번에는 소형 신디사이저-드럼 머신을 Raspberry Pi Pico 2로 제작하는 방법을 소개하겠습니다. 이 프로젝트는 Teenage Engineering의 Pocket Operator를 참고하여, 이동 중에도 음악을 제작할 수 있는 작고 휴대 가능한 장치를 목표로 하고 있습니다.
프로젝트 소개
이번 프로젝트는 맞춤형 5x5 매트릭스 키보드와 PAM8403 오디오 앰프를 사용하는 Raspberry Pi Pico 2 신디사이저입니다. Raspberry Pi Pico 2의 GPIO에 연결된 25개의 버튼을 통해 음악을 제작할 수 있습니다. 오디오 증폭기를 사용하여 출력 사운드를 향상시키고, 최소한의 부품으로 프로토타입 PCB를 사용하여 제작되었습니다.
준비물
이 프로젝트를 위해 필요한 부품은 다음과 같습니다:
- 맞춤형 매트릭스 PCB
- 푸시 버튼
- 라즈베리 파이 Pico 2
- 점퍼 와이어
- PAM8403 오디오 앰프
- 5W 스피커
- 프로토타입 PCB
제작 과정
1. 회로 구성
먼저, Raspberry Pi Pico 2를 맞춤형 매트릭스 PCB와 연결합니다. 5x5 그리드의 각 버튼은 Pico의 GPIO 핀에 연결되어야 합니다. 프로토타입 PCB를 사용하여 연결을 쉽게 할 수 있습니다.
2. 오디오 앰프 연결
다음으로, PAM8403 오디오 앰프를 Raspberry Pi Pico 2에 연결합니다. 오디오 앰프는 5W 스피커를 구동하여 더 강력한 사운드를 출력할 수 있도록 도와줍니다.
3. 펌웨어 작성 및 업로드
마지막으로, 맞춤형 스케치를 작성하여 Pico에 플래시합니다. 이 스케치는 버튼 입력을 받아서 신디사이저 사운드를 생성하고, 오디오 앰프를 통해 출력하는 역할을 합니다.
# 간단한 예제 코드 (Python)
from machine import Pin, PWM
# 버튼 설정
buttons = [[Pin(x, Pin.IN) for x in row] for row in [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25]]]
# 오디오 출력 설정
audio_out = PWM(Pin(28))
while True:
for row in buttons:
for button in row:
if button.value() == 1:
# 사운드 생성 코드
audio_out.freq(440) # 예시: 440Hz 사운드 출력
audio_out.duty_u16(32768)
else:
audio_out.duty_u16(0)
1단계: Teenage Engineering의 포켓 오퍼레이터
이 프로젝트에 대한 영감은 십대 엔지니어링이 만든 Pocket Operator 장치 시리즈에서 비롯되었습니다. 2024년 초에 데뷔한 바이럴 Rabbit R1 장치의 제작자로 인식할 수 있습니다.
Pocket Operators는 Teenage Engineering에서 만든 작고 휴대성이 뛰어난 음악 장치입니다. 저렴하고 스튜디오 품질의 사운드를 제공하도록 설계되어 이동 중에 음악을 만드는 데 적합합니다. 각 모델에는 드럼 머신, 신디사이저, 시퀀서 및 내장 마이크와 같은 다양한 기능이 함께 제공됩니다.
인기 있는 제품으로는 PO-12 Rhythm, 16사운드 드럼 머신 및 신디사이저가 있습니다. PO-14, PO16 및 PO-28 로봇은 다른 모델 중에서 로봇 공학과 관련된 전자 음악을 생성하도록 설계된 라이브 신디사이저입니다.
포켓 오퍼레이터는 단독으로 사용하거나 결합하여 3.5mm 오디오 코드로 "포켓 밴드"를 형성할 수 있습니다. 그들은 또한 다른 음악 장비와 호환됩니다.
온보드 배터리 팩이 함께 제공되어 주머니에 쏙 들어가고 휴대가 간편합니다.
2단계: 라즈베리 파이 PICO 2 설정
자체 버전을 만들기 위해 프로세서 집약적인 프로젝트에 이상적인 새로운 RP2350 RISC-V CPU와 함께 이전에 사용 가능한 PICO 1의 향상된 버전인 새로운 Raspberry Pi PICO 2를 선택했습니다.
입력의 경우 이전에 만든 5x5 버튼 매트릭스 보드를 사용하며, 이는 5개의 행과 5개의 열로 구성된 버튼이 있는 간단한 행 및 열 프레임워크가 있는 25개 버튼 매트릭스 보드입니다. 버튼을 누르면 행과 열 사이의 회로가 완성되고 PICO 2가 이를 감지합니다.
https://www.instructables.com/Custom-5x5-Keypad/
또한 오디오 출력의 경우 스피커를 PICO GPIO에 직접 연결할 수 있으며 문제 없이 스피커를 출력하지만 소리가 덜 크고 거의 들리지 않으므로 PICO에 연결하여 출력 사운드를 증폭하는 데 사용할 수 있는 오디오 증폭기를 사용해야 합니다. 이를 위해 5V 전원이 필요하고 5W 스피커를 쉽게 구동할 수 있는 PAM8403 기반 오디오 증폭기를 사용합니다.
이 세 가지 주요 구성 요소를 사용하여 이 프로젝트의 배선 프로세스를 시작합니다.
3단계: Seeed Fusion 서비스
이 프로젝트에서는 이전에 구축한 5x5 매트릭스 보드 프로젝트 중 하나를 사용하고 있습니다. PCB Gerber Data는 Seeed Fusion의 웹 사이트에 업로드되었으며 검은 색 실크 스크린이있는 흰색 솔더 마스크에 대한 주문이 이루어졌습니다.
4단계: 키보드 조립 과정
- 조립 공정은 매트릭스 PCB의 해당 패드에 있는 25개의 스위치를 모두 배치하는 것으로 시작됩니다. 여기서는 6x6 압정 버튼을 사용하고 있으며, 풋프린트에 배치할 때 일부 버튼의 핀이 구부러지므로 모든 버튼이 패드에 올바르게 추가되었는지 확인해야 합니다.
- 다음으로, 납땜 인두로 보드 바닥면의 모든 스위치 패드를 납땜합니다.
- 그런 다음 CON10 수 헤더 핀을 제자리에 놓고 보드 상단에서 패드를 납땜합니다.
이제 매트릭스 보드가 조립되었습니다.
5단계: 배선
배선 측면에서 매트릭스 키보드(C1-C5)의 열 핀을 GPIO6, GPIO7, GPIO8, GPIO9 및 GPIO10에 연결했습니다. R1에서 R5까지 행 핀은 GPIO16, GPIO17, GPIO18, GPIO19 및 GPIO20을 통해 연결됩니다.
스피커 출력 핀은 GPIO21이며 오디오 앰프의 L 입력에 연결됩니다. 오디오 증폭기의 5V 핀은 PICO의 VBUS에 연결되고 GND는 GND에 연결됩니다. 스피커는 오디오 앰프의 왼쪽 출력에 연결되어 있습니다.
6단계: 코드
우리가 사용한 코드는 다음과 같습니다.
#include <Wire.h>
// Define keypad pins
const int rows = 5;
const int cols = 5;
const int rowPins[rows] = {16, 17, 18, 19, 20}; // Updated row pins
const int colPins[cols] = {6, 7, 8, 9, 10}; // Updated col pins
// Define frequencies for buttons
const int frequencies[5][3] = {
{110, 123, 146}, // Row 1
{164, 196, 220}, // Row 2
{246, 294, 330}, // Row 3
{349, 392, 440}, // Row 4
{494, 523, 587} // Row 5 (last button will be for record)
};
// Pin for speaker
const int speakerPin = 21;
// Recording variables
bool isRecording = false;
unsigned long sequence[100];
int sequenceIndex = 0;
// Button coordinates
const int recordRow = 4;
const int recordCol = 2; // Last button in Row 5
const int delayRow = 4;
const int delayCol = 1; // Second to last button in Row 5
void setup() {
Serial.begin(115200);
// Initialize row pins as inputs
for (int i = 0; i < rows; i++) {
pinMode(rowPins[i], INPUT_PULLUP);
}
// Initialize column pins as outputs
for (int i = 0; i < cols; i++) {
pinMode(colPins[i], OUTPUT);
digitalWrite(colPins[i], HIGH);
}
// Initialize speaker pin as output
pinMode(speakerPin, OUTPUT);
Serial.println("Setup complete.");
}
void playSound(int freq) {
tone(speakerPin, freq, 200); // Play sound on pin 21 for 200ms
Serial.print("Playing sound at frequency: ");
Serial.println(freq);
}
void playSequence() {
for (int i = 0; i < sequenceIndex; i++) {
playSound(sequence[i]);
if (digitalRead(rowPins[delayRow]) == LOW && digitalRead(colPins[delayCol]) == LOW) {
delay(750); // Add delay if delay button is pressed (adjust as needed)
} else {
delay(250); // Default delay between notes in the sequence
}
}
}
void loop() {
for (int i = 0; i < cols; i++) {
digitalWrite(colPins[i], LOW); // Activate column i
for (int j = 0; j < rows; j++) {
if (digitalRead(rowPins[j]) == LOW) { // Button press detected
if (i == recordCol && j == recordRow) { // Check if it's the record button
if (isRecording) {
isRecording = false;
Serial.println("Recording stopped. Playing sequence...");
tone(speakerPin, 880, 500); // Play tone to signal recording stop
delay(500); // Delay to avoid multiple triggers
playSequence(); // Play recorded sequence
} else {
isRecording = true;
sequenceIndex = 0;
Serial.println("Recording started...");
tone(speakerPin, 440, 500); // Play tone to signal recording start
delay(500); // Delay to avoid multiple triggers
}
} else if (!(i == delayCol && j == delayRow)) { // First 10 buttons for tones, excluding delay button
playSound(frequencies[j][i]);
if (isRecording) {
sequence[sequenceIndex] = frequencies[j][i];
sequenceIndex++;
Serial.print("Recording note: ");
Serial.println(frequencies[j][i]);
}
}
delay(200); // Debounce delay
}
}
digitalWrite(colPins[i], HIGH); // Deactivate column i
}
}
이 테스트 스케치는 5x5 매트릭스 키보드를 사용하여 베이스 톤을 생성하고, 시퀀스를 녹음하고, 재생 중 시간 지연을 추가합니다.
이 코드는 각 열을 반복하여 LOW로 설정하여 활성화한 다음 각 행에서 버튼 누름을 확인합니다. 버튼 누름이 감지되면 행과 열 위치에 따라 버튼을 식별합니다.
녹음 버튼('recordRow' 및 'recordCol'에 위치)을 누르면 녹음 모드가 전환됩니다. 녹음 모드가 활성화된 경우 버튼을 누를 때마다 해당 주파수가 시퀀스 어레이에 저장되고 녹음 버튼을 다시 누르면 녹음이 중지되고 녹음된 시퀀스가 재생됩니다.
7 단계 : 결과
이 작은 빌드는 Mighty Raspberry Pi PICO 2와 고유한 5x5 버튼 매트릭스 덕분에 음악을 녹음하고 재생할 수 있는 작동하는 Sequencer-Synth로 이어졌습니다.
아무 버튼이나 누르면 신호음이 생성됩니다. 녹음 버튼을 누르면 녹음 모드가 활성화됩니다. 녹음 모드가 활성화된 경우 버튼을 누를 때마다 해당 주파수가 시퀀스 어레이에 저장되고 녹음 버튼을 다시 누르면 녹음이 중지되고 녹음된 시퀀스가 다시 재생됩니다.
이 장치가 얼마나 잘 작동하는지 확인할 수 있도록 약간의 YouTube 단편이 추가되었습니다.
몇 가지 개선 사항이 있습니다. 이것은 프로토타이핑 보드에 조립된 이전 프로젝트의 예비 부품으로 만든 테스트 장치일 뿐입니다. 다음 반복에는 더 나은 폼팩터와 추가 버튼이 있을 것이며, 버튼을 누르는 동안 사운드 문제를 발견했기 때문에 조용한 버튼이 있을 수 있습니다. 또한 어떤 톤을 눌렀는지, 어떤 톤이 녹음되고 있는지 보여주는 OLED 패널과 몇 가지 다른 기능도 포함됩니다.
결론
이제 여러분은 Raspberry Pi Pico 2를 사용한 맞춤형 신디사이저 제작 방법을 알게 되셨습니다. 이 프로젝트는 작은 공간에서 음악을 제작할 수 있는 재미있고 교육적인 방법입니다. 여러분의 창의력을 발휘하여 다양한 사운드를 만들어보세요!
이 프로젝트가 음악 제작에 도움이 되길 바랍니다! 궁금한 점이 있으면 언제든지 문의해주세요. 즐거운 음악 제작 시간 보내세요! 🎶✨
'라즈베리파이' 카테고리의 다른 글
라즈베리 파이 피코 매트릭스 프로젝트 (0) | 2024.11.25 |
---|---|
박수 소리인식 LED제어 (0) | 2023.12.27 |
마이크로컨트롤러를 이용한 디지털 포토 프레임 제작 (1) | 2023.12.22 |
Solar PC All-in-one Raspberry Pi (태양광 발전을 위한 라즈베리파이 기반 올인원 PC 만들기) (0) | 2023.11.15 |
Raspberry Pi Pico – Micropython 시작하기 (라즈베리 파이 피코) (0) | 2023.11.14 |