Raspberry Pi Pico ทำซินธ์ได้ด้วย? โปรเจกต์ Pi Synth นี้น่าลองมาก

สำหรับคนที่หลงใหลในเสียงดนตรีอิเล็กทรอนิกส์ การสร้างเครื่องดนตรีเป็นของตัวเองถือเป็นความฝันอย่างหนึ่ง วันนี้เราจะพาไปดูโปรเจกต์ "Pi Synth" เครื่องเสียงสังเคราะห์แบบทำเอง (DIY) ที่สร้างขึ้นมาจากศูนย์!

โปรเจกต์นี้ใช้ Raspberry Pi Pico 2 เป็นสมองกลหลัก และใช้ชิป CD74HC4067 Multiplexer ในการรวมปุ่มกด 16 ปุ่มให้เป็นคีย์บอร์ด โดยในเวอร์ชันปัจจุบันนี้เป็นตัวต้นแบบ (Demo Board) เพื่อทดสอบลอจิกและโค้ดก่อนพัฒนาไปสู่เครื่องเล่นเต็มรูปแบบในอนาคตครับ

Pi Synth Overview

Step 1: ทำไมต้องใช้ชิป CD74HC4067?

บอร์ดไมโครคอนโทรลเลอร์ทั่วไปมักมีขา GPIO ไม่พอให้ต่อปุ่มกดเยอะๆ ชิป Multiplexer ตัวนี้จึงเข้ามาช่วยแก้ปัญหา โดยมันทำงานเหมือน "สวิตช์หมุนอิเล็กทรอนิกส์" สามารถอ่านค่าจากปุ่มได้ถึง 16 ปุ่ม โดยใช้ขาสัญญาณของบอร์ด PICO เพียงแค่ 5 ขาเท่านั้น (ขา S0-S3 และขา SIGNAL) ทำให้วงจรดูเป็นระเบียบและไม่ต้องเดินสายไฟเยอะ

CD74HC4067

Step 2: การทดสอบบนแผงวงจร (Breadboard Setup)

ก่อนลงแผ่นพิมพ์ลาย (PCB) เราเริ่มจากประกอบวงจรทดสอบบน Breadboard 3 แผ่นต่อกัน โดยต่อปุ่มทั้ง 16 ปุ่มลง GND แล้วโยงเข้าหาชิป Multiplexer จากนั้นใช้โมดูล PAM8403 Audio Amplifier ร่วมกับลำโพง 5W 8Ω เพื่อขยายสัญญาณเสียง PWM จากพิน GPIO21

คลิกเพื่อดูรูปและวิดีโอขั้นตอน Breadboard (View More)
Breadboard Setup 1
Breadboard Setup 2

Step 3: ซอร์สโค้ดเครื่องสังเคราะห์เสียง (C++)

โค้ดของเราออกแบบมาให้สามารถกดปุ่มแล้วมีเสียงโน้ตออกลำโพงได้ (ทำงานพร้อมกันได้ 4 ตัวโน้ต - 4 Voices) มีโหมด Distortion ทำให้เสียงแตกเหมือนกีตาร์ไฟฟ้า และโหมดตีกลอง (Drum) เล็กๆ น้อยๆ ใครอยากลองเล่น สามารถคัดลอกโค้ดด้านล่างไปใส่ Arduino IDE แล้วอัปโหลดเข้าบอร์ด PICO ได้เลยครับ

คลิกเพื่อดูและคัดลอกซอร์สโค้ด (View More)
#include <math.h>

// ================= MUX =================
#define S0 20
#define S1 19
#define S2 18
#define S3 17
#define SIG 16

// ================= AUDIO =================
#define AUDIO_PIN 21
#define SAMPLE_RATE 22050

// ================= LED & CONTROLS =================
#define LED_PIN 22
#define RIFF_BUTTON 8
#define VOICES 4

// NOTE TABLE (Frequencies for C, C#, D, etc.)
float noteTable[12] = {
  261.63, 277.18, 293.66, 311.13, 329.63, 349.23,
  369.99, 392.00, 415.30, 440.00, 466.16, 523.25
};
int keyMap[12] = {1, 3, 6, 0, 11, 8, 9, 7, 5, 4, 2, 0};

// VARIABLES
float phase[VOICES], subPhase[VOICES], freq[VOICES], env[VOICES];
bool voiceActive[VOICES];
float cutoff = 1200, lpState = 0;
int octave = 0;

float distortionAmount = 0;
bool distortionUp = true, distortionFadeOn = false;
unsigned long lastDistUpdate = 0;
#define DIST_FADE_INTERVAL 20
#define DIST_STEP 0.05

bool drumOn = false;
unsigned long lastStep = 0;
int stepMs = 500;
float kickEnv = 0, kickPhase = 0;

float riffNotes[] = {329.63, 329.63, 392.00, 329.63, 293.66, 261.63, 246.94, 220.00};
int riffLength = 8, riffStep = 0;
bool riffPlaying = false;
unsigned long riffTimer = 0;
int riffNoteDuration = 450;

unsigned long lastAudio = 0, lastScan = 0;
float ledLevel = 0;

void selectMux(uint8_t ch) {
  digitalWrite(S0, (ch & 1) ? HIGH : LOW);
  digitalWrite(S1, (ch & 2) ? HIGH : LOW);
  digitalWrite(S2, (ch & 4) ? HIGH : LOW);
  digitalWrite(S3, (ch & 8) ? HIGH : LOW);
  delayMicroseconds(5);
}

bool readButton(uint8_t ch) {
  selectMux(ch);
  return digitalRead(SIG) == LOW;
}

void handleDistortionFade() {
  if(!distortionFadeOn) return;
  unsigned long now = millis();
  if(now - lastDistUpdate < DIST_FADE_INTERVAL) return;
  lastDistUpdate = now;
  if(distortionUp) {
    distortionAmount += DIST_STEP;
    if(distortionAmount >= 1) { distortionAmount = 1; distortionUp = false; }
  } else {
    distortionAmount -= DIST_STEP;
    if(distortionAmount <= 0) { distortionAmount = 0; distortionUp = true; }
  }
}

void setup() {
  pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT);
  pinMode(SIG, INPUT_PULLUP);
  pinMode(AUDIO_PIN, OUTPUT); pinMode(LED_PIN, OUTPUT);
  pinMode(RIFF_BUTTON, INPUT_PULLUP);
  
  analogWriteResolution(10);
  analogWriteFreq(62500);

  for(int i=0; i 3000) {
    lastScan = now;
    bool pressed[12];
    for(int i=0; i<12; i++) pressed[i] = readButton(i);

    int v = 0;
    for(int i=0; i<12; i++) {
      if(pressed[i] && v < VOICES) {
        freq[v] = noteTable[keyMap[i]] * pow(2, octave);
        voiceActive[v] = true;
        v++;
      }
    }
    for(int i=v; i

Step 4 - 8: เปลี่ยนมาประกอบลงแผงวงจร (PCB) อย่างเป็นทางการ

เมื่อเทสต์โค้ดผ่านแล้ว ผู้สร้างได้อัปเกรดชิ้นส่วนโดยใช้โมเดล 3D ในการวางแผน (มีทั้งบอร์ด PICO, แผงวงจรขยายเสียง, สวิตช์บอร์ด และไฟวงแหวน LED จากโปรเจกต์เก่า) ก่อนจะสั่งพิมพ์ 3D Frame ฐานโปร่งใสเพื่อนำของทุกอย่างมายึดเข้าด้วยกัน

ชิ้นส่วนที่สำคัญคือ แผ่น Custom PCB Breadboard (ที่สั่งทำจาก NextPCB) แผ่นนี้ถูกออกแบบให้ทำงานเหมือนเบรดบอร์ดทั่วไป แต่มันมีพอร์ต USB-C พร้อมวงจรกันไฟย้อน (Reverse polarity protection) ติดมาให้เลย!

คลิกเพื่อดูรูปภาพ 3D Model และแผ่น PCB (View More)
3D Frame
PCB Breadboard
PCB Order
NextPCB DFM

Step 9 - 15: การบัดกรีและประกอบร่างขั้นสุดท้าย

กระบวนการบัดกรีใช้แผ่น PCB หลายส่วนมาเชื่อมกัน เริ่มตั้งแต่บัดกรีสวิตช์ปุ่มกด 12x12 มม. ลงบนแผงวงจร จากนั้นบัดกรีวงจร LED Ring ด้วยวิธีทา Solder paste แล้วนำไปวางบนเตาให้ความร้อน (Reflow Hot Plate) ที่อุณหภูมิ 200°C

เมื่อบอร์ดทุกส่วนพร้อม ก็จัดเรียงชิ้นส่วนลงบน 3D Frame ยึดลำโพงด้วยกาวร้อน ขันน็อต M2 ยึดแผงวงจรทั้งหมดให้เข้าที่ เดินสายไฟตามผังวงจร เป็นอันเสร็จสิ้นกระบวนการประกอบ!

คลิกเพื่อดูรูปภาพขั้นตอนประกอบและวงจร LED (View More)
LED Assembly 1
LED Assembly 2
LED Assembly 3
Switchboard 1
Switchboard 2
Mainboard Connection
Final Assembly 1

บทสรุป และ ก้าวต่อไปของโปรเจกต์

และนี่คือผลลัพธ์ของ Demo Board ที่ทำงานได้จริง สร้างเสียงได้จริง! สำหรับผู้สร้างอาจจะยังเล่นดนตรีไม่เก่งนัก แต่ถ้าไปอยู่ในมือของคนเล่นดนตรีเป็น เครื่องนี้สร้างเสียงที่เจ๋งสุดๆ ได้แน่นอน

What's Next? (ก้าวต่อไป): ในเวอร์ชันถัดไป ผู้สร้างวางแผนที่จะทำเคสแบบเต็มรูปแบบ ใส่หน้าจอแสดงผลขนาดใหญ่ ใช้ปุ่มกดแบบเงียบ (Silent Switch) ใส่ปุ่มปรับระดับเสียง (Potentiometer) และออกแบบแผงวงจรรวมทุกอย่างเบ็ดเสร็จลงในบอร์ด RP2040 แผ่นเดียวเลยครับ! รอติดตามชมกันได้เลย!

Pi Synth Final Result Concept Pi Synth Concept Drawing

คำเตือน: เนื้อหานี้เป็นการสรุปและเรียบเรียงจากบทความต้นฉบับภาษาอังกฤษ ข้อมูลฉบับภาษาไทยอาจมีความคลาดเคลื่อนบางประการจากการตีความหรือย่อเนื้อหา

อ้างอิงและเรียบเรียงโดย: Globalbyteshop Blog

แหล่งที่มาต้นฉบับ:
- Pi Synth Project by Arnov Sharma (Instructables)
- อ่านเพิ่มเติม: เอกสารประกอบโปรเจกต์ต้นฉบับ (PDF)

แท็ก


Blog posts

เข้าสู่ระบบ

ลืมรหัสผ่านใช่ไหม?

ยังไม่มีบัญชีใช่ไหม?
สร้างบัญชี