กลับไปหน้ารวมไฟล์
lets-build-an-sn76489-usb-midi-synth-with-arduino-nano-ce1343.md

โปรเจกต์นี้เข้าร่วมการประกวด "INSTRUMENT CONTEST" ถ้าชอบก็ช่วยโหวตหน่อยนะจ๊ะ

เคยอยากสร้างซินธิไซเซอร์ของตัวเอง ให้เสียงเหมือนเพลง 8-bit จากเกมยุค 80's บ้างไหม? จะได้เล่นเสียงโพลีโฟนิกแบบง่ายๆ ที่ฟังแล้วเหมือนเพลงประกอบเกม Sega Master System หรือ Megadrive เลยอะ

พี่ก็เคยคิดแบบนั้น เลยสั่งไอซี SN76489 มาจาก ebay กับบอร์ด USB MIDI Host มา แล้วก็ลองทำดู มันไม่ง่ายแบบเดินเล่นในสวนดอกหรอกน้อง แต่พี่สนุกทุกวินาทีเลย

ขั้นแรก พี่ต้องเรียนรู้วิธีต่อตรง (direct interface) กับ SN76489 เพื่อให้มันส่งเสียงออกมาก่อน มันมีจุดที่งงๆ อยู่บ้าง แต่ด้วยความช่วยเหลือจากบล็อก The Oddbloke Geek รวมถึงตัวอย่างอื่นๆ และ datasheet ของไอซีตัวนี้ พี่ก็สามารถเขียนไลบรารีพื้นฐานสำหรับ Arduino ขึ้นมาได้

ต่อมา พี่ต้องเรียนรู้วิธีเชื่อมต่อคีย์บอร์ด MIDI ผ่าน USB Host Shield อันนี้ไม่ยากเท่าไหร่ เพราะมีเอกสารอธิบายอยู่บ้าง และมีไลบรารีดีๆ พร้อมตัวอย่างให้ศึกษาอยู่แล้ว

พอเข้าใจวิธีควบคุมไอซีและวิธีเชื่อมต่อคีย์บอร์ด MIDI แล้ว สิ่งที่เหลือก็แค่เขียนโค้ดที่รวมทุกอย่างเข้าด้วยกัน เพื่อให้ใช้คีย์บอร์ดควบคุมเสียงจากไอซีได้

ระหว่างทำ พี่ก็ค้นพบว่าโน้ต MIDI ที่มีค่าเท่ากับหรือต่ำกว่า 0x2f นั้น ความถี่มันต่ำเกินไปจนเสียงเพี้ยน พี่เลยตัดสินใจใช้ช่วงนี้ (MIDI note 0x28 ถึง 0x2f) ในการส่งสัญญาณไปยังตัวสร้างเสียงรบกวน (noise generator) แทน ส่วนโน้ตที่ต่ำกว่า 0x28 ลงไป ก็จะปรับให้มีเสียงคล้ายเพลงแนวอาหรับ/ตะวันออกซะเลย

มองย้อนกลับไป มันทั้งสนุกและน่าสนใจมากเลยที่ได้สร้างขึ้นมา

พี่หวังว่าน้องจะสนุกและตื่นเต้นกับมันเหมือนพี่นะ และถ้าน้องลองทำขึ้นมาบ้าง ก็อย่าลืมแชร์รูปมาให้พี่ดูบ้างล่ะ

ถ้าชอบโปรเจกต์นี้ ก็ช่วยโหวตให้ด้านล่างหน่อย เพื่อช่วยให้มันชนะการประกวดนะจ๊ะ

ภาพรวมโปรเจกต์

Retro-Synth ตัวนี้คือสะพานเชื่อมระหว่างโลกของ USB-MIDI สมัยใหม่ กับฮาร์มอนิกส์ดิบๆ แบบ 8-bit จากยุค 80's โดยใช้ SN76489 PSG (Programmable Sound Generator) ซึ่งเป็นหัวใจของเครื่อง Sega Master System และ IBM PCjr โปรเจกต์นี้ทำให้เราสามารถเล่นเสียงโพลีโฟนิกจากคลื่นสี่เหลี่ยม (square-wave) แบบดั้งเดิมได้โดยตรงจากคอนโทรลเลอร์ MIDI ที่รองรับ USB มันเป็นการศึกษาเกี่ยวกับ การสื่อสารแบบบัสขนาน (parallel bus communication), โปรโตคอล USB host และ การกรองสัญญาณเสียงอนาล็อก (analog audio filtering) ไปในตัว

ลงลึกกันแบบช่างๆ

  • โครงสร้างของ SN76489:
    • เสียงหลายช่อง (Voice Polyphony): ไอซีตัวนี้มีเครื่องกำเนิดเสียงคลื่นสี่เหลี่ยมอิสระ 3 ช่อง และช่องเสียงไวท์นอยส์อีก 1 ช่อง ความถี่ของแต่ละโทนถูกกำหนดโดยรีจิสเตอร์ 10 บิต คำนวณจากสูตร: $f = f_{clock} / (32 \times n)$ โดยที่ $n$ คือค่าที่อยู่ในรีจิสเตอร์
    • ควบคุมความดัง (Attenuation Control): แต่ละช่องเสียงมีตัวลดทอน (attenuator) ที่ตั้งค่าได้ 4 บิต ให้ระดับควบคุมความดังได้ 15 ระดับ (ทีละ 2dB) ทำให้เราจับคู่ความดังจาก MIDI velocity ได้แบบไดนามิก
  • แปลงบัสขนานเป็นอนุกรมด้วย 74HC595:
    • ใช้พิน Arduino ให้คุ้ม: เพื่อสงวนพินของ Arduino Nano ไว้ให้ USB Host Shield (ที่ใช้บัส SPI) เราใช้ ชิฟต์เรจิสเตอร์ 74HC595 มาขับบัสข้อมูลขนาน 8 บิตของ SN76489 แทน Nano ส่งข้อมูลมาแบบอนุกรม แล้วชิฟต์เรจิสเตอร์ก็ล็อกข้อมูลนั้นไปยังพินข้อมูลขนาน (D0-D7) ของ PSG
  • เรื่องของ USB Host:
    • ตรรกะของ MAX3421E: ซินธ์นี้ใช้ USB Host Shield ที่ใช้ชิป MAX3421E เป็นตัวจัดการการจับมือ (handshaking) ซับซ้อนที่จำเป็นสำหรับการตรวจนับ (enumerate) อุปกรณ์ USB MIDI โดยแปลงแพ็กเก็ต USB HID ดิบๆ ให้กลายเป็นสตรีม Serial MIDI ที่ Arduino จัดการได้
    • ปรับแรงดัน: เนื่องจากคีย์บอร์ด MIDI มาตรฐานมักต้องการ VBUS แรงดัน 5V เต็มๆ แต่ลอจิกของ host shield ทำงานที่ 3.3V ฮาร์ดแวร์จึงถูกดัดแปลงเพื่อเชื่อมสายไฟ 5V โดยตรงไปยังพอร์ต USB ขณะที่ยังคงรักษาระดับลอจิก 3.3V ไว้สำหรับการสื่อสาร SPI

วิศวกรรมและการลงมือทำ

  • ความแม่นยำของสัญญาณนาฬิกาและการซิงค์:
    • มาสเตอร์คล็อก 4MHz: การตั้งเสียงของ PSG นั้นสัมพันธ์กับสัญญาณนาฬิกาขาเข้า โปรเจกต์นี้ใช้ คริสตัลออสซิลเลเตอร์ 4MHz โดยเฉพาะเพื่อให้มั่นใจในความเสถียรของระดับเสียง กำจัดปัญหาความถี่ลอยที่พบบ่อยในออสซิลเลเตอร์แบบ RC
  • การแมปสเกลขั้นสูง:
    • ซินธ์ไซส์เสียงย่อย (Microtonal Synthesis): นอกจากการตั้งเสียงมาตรฐาน 12-TET แล้ว เฟิร์มแวร์ที่เขียนเองยังรองรับ 24-EDO (Equal Division of the Octave) ด้วย ซึ่งทำให้สามารถเล่นสเกล "ตะวันออก" หรือ "อาหรับ" (quarter-tones) ได้ โดยการคำนวณออฟเซ็ตของรีจิสเตอร์ 10 บิตระหว่างโน้ต MIDI มาตรฐานอย่างแม่นยำ
  • เส้นทางสัญญาณเสียง:
    • คัปปลิงแบบ AC: สัญญาณเสียงจากขา 7 ของ SN76489 ถูกคัปปลิงผ่าน ตัวเก็บประจุ 10uF เพื่อกำจัดออฟเซ็ต DC ก่อนเข้าสู่เครื่องขยายเสียงภายนอก
    • ลดเสียงรบกวน: เรกูเลเตอร์ LM7805 ช่วยแยกสัญญาณรบกวนดิจิทัลจาก Arduino Nano ออกจากสัญญาณเสียงแอนะล็อกที่บอบบางของ PSG ทำให้มั่นใจได้ว่าสัญญาณจะคมชัด ไม่มีเสียงรบกวนมารบกวนตอนผลิตชิปจูน

ของที่ต้องจัดหา:

1 x performance board 1 x arduino nano 1 x USB mini shield 1 x SN76489 sound chip 1 x shift register 595 1 x crystal oscillator of 4MHz 1 x 5V voltage regulator 7805 1 x heat sink for the voltage regulator 3 x 10uF capacitors wires 1 x red LED for power 1 x 220 ohm resistor to limit the LED current flow 1 x power connector for 12v power supply 1 x on/off switch a suitable box (I built mine from an old drawer that was resting in my storage for years)

ขั้นตอนที่ 1: เตรียม USB Mini Host Shield ให้จ่ายไฟ 5V ให้กับอุปกรณ์ MIDI

เนื่องจาก USB mini host shield ตัวนี้ทำงานที่ 3.3V แต่คีย์บอร์ด MIDI ที่พี่ใช้ต้องการไฟ 5V เราจึงต้องปรับแรงดันขาออกของ shield ด้วยการตัดเส้นทางไฟ 3.3V ที่วิ่งไปยังขา Vcc ของพอร์ต USB ออก เพื่อที่เราจะได้ต่อไฟ 5V เข้าไปแทน

มีสอนไว้เพียบในเน็ตแหละน้อง ปรากฏว่ามันง่ายมากเลย:

แค่ตัดเส้นระหว่างตัวต้านทาน 2k2 กับเส้น Vcc (ดูรูปประกอบ) พี่ใช้ไขควงขูดเส้นนั้นออก แล้วทดสอบด้วยมิเตอร์ว่าเส้นขาดจริงๆ

ขั้นตอนที่ 2: ต่อ USB Mini Shield เข้ากับ Arduino Nano ของเรา

โชคดีที่มีข้อมูลเยอะมากเกี่ยวกับเรื่องนี้ พี่แค่เสิร์ช "Arduino Nano and mini USB host shield" ก็เจอเธรดนี้

มันอธิบายวิธีต่อ USB mini v2.0 shield ไว้ พี่ทำตามแล้วก็ไปทดสอบตัวอย่าง USB MIDI ต่อเลย

การเดินสาย:

Arduino Host shield

10--------------5

11--------------6

12--------------7

13--------------8

2----------------2

5V--------------1

3.3V------------9

GND-----------3

RST------------4

ในเธรดนั้นก็มีพูดถึงการตัดขา 3.3V ด้วย เพื่อให้พอร์ต USB ได้ไฟ 5V จาก VBUS

คำอธิบายและรูปภาพประกอบมาจากเธรดนั้นแหละ

อีกอย่างนึง บอร์ดนี้มีข้อความพิมพ์ผิดนิดนึง เล็กๆ งงได้ แต่น้องสามารถอ่านคอมเมนต์ของพี่ (tyrkelko) ในนั้นได้ ว่าพี่รู้ได้ยังไง

ขั้นตอนที่ 3: ลงชิปกันเถอะ! เพิ่ม SN76489 พร้อม Oscillator 4MHz และ Shift Register 595

ถึงเวลาลงชิปตัวสำคัญที่ทำให้เกิดเสียงเจ๋งๆ แล้ว!

พี่เคยเขียนไลบรารีสำหรับให้ Arduino คุยกับชิปตัวนี้ไว้แล้ว แค่ทำตามที่พี่บอกก็พอ

การต่อ 76489 และ 595 เป็นตามในรูปที่พี่แคปมาจากไฟล์ readme.txt ในไลบรารี

ขา Write Enable แอคทีฟต่ำ (NotWE) ของ 76489 ต่อกับขา 3 ของ Nano ซึ่งเปลี่ยนได้ในโค้ด:

#define PIN_NotWE 3

ส่วน 595 ต่อกับ Nano แบบนี้ ก็ปรับเปลี่ยนขาได้ในโค้ดเช่นกัน:

#define PIN_SER 7

#define PIN_LATCH 6

#define PIN_CLK 5

Oscillator ที่พี่ใช้เป็นคริสตัลออสซิลเลเตอร์ 4MHz แบบ 4 ขา

ตั้งค่าในโค้ดแบบนี้ น้องปรับค่าเป็นความถี่อื่นระหว่าง 500kHz ถึง 4MHz ก็ได้:

#define FREQUENCY 4000000.0

การต่อออสซิลเลเตอร์ ที่พี่ใช้:

ขา 1 - ไม่ต้องต่อ ขา 7 - ต่อกราวด์ (GND) ขา 8 - ต่อกับขา 14 ของ 76489 (ขา Clock OSC)

ขั้นตอนที่ 4: ลงโค้ดซะ - เพิ่มไลบรารี, คอมไพล์ และอัปโหลดโค้ด

ไลบรารีที่ใช้ในโปรเจกต์นี้ ต้องเพิ่มลงใน Arduino IDE แบบนี้นะ:

  1. เปิด Arduino IDE
  2. ดาวน์โหลดไลบรารีต่อไปนี้ไปไว้ในโฟลเดอร์ libraries ของ IDE (หวังว่าเดี๋ยวจะหาโหลดจากในเมนู "Manage Libraries..." ได้เร็วๆ นี้):
    • USB_Host_Shield_2.0
    • sn76489
  3. ใช้โค้ดจากโปรเจกต์นี้:
    • usb_midi_tone
  4. ดาวน์โหลดไฟล์ usb_midi_tone.ino, คอมไพล์และอัปโหลดลง Arduino Nano ของน้องได้เลย

จัดไปวัยรุ่น! สู้งานนะน้อง ห้ามช็อตนะตัวนี้

ขั้นตอนที่ 5: ต่อแอมป์กับลำโพง ต่อคีย์บอร์ด USB MIDI แล้วลองเล่นเลย!

ถึงเวลาลองของแล้วววว! ต้องเตรียมอะไรบ้างนะ?

  1. แอมป์กับลำโพงสักชุดนึง
  2. คีย์บอร์ด USB MIDI

วิธีต่อ: เอาขา audio out (ขา 7) ของ SN76489 ไปต่อเข้ากับช่อง audio in ของแอมป์นะ

ขั้นตอนทดสอบ:

  1. เปิดไฟแอมป์ก่อน
  2. ค่อยเปิดไฟให้ Arduino Nano
  3. ถ้าต่อถูกต้อง จะได้ยินเสียง "ปี๊บ" สั้นๆ ตอนเปิดเครื่อง (นั่นคือเสียงทดสอบตอนเปิดเครื่อง)

จากนั้นก็ต่อคีย์บอร์ด USB MIDI เข้าไป แล้วลองกดเล่นดู!

ถ้าทุกอย่างเวิร์ค: น้องจะสามารถเล่นโน้ตพร้อมกันได้ 3 เสียง (polyphony 3 voices) เล่นเสียง noise ได้ 8 แบบ และยังมีเสียง Quarter-tone ของ 24 EDO-Scale ให้ลองฟังอีกด้วย! จัดไปวัยรุ่น!

ถ้าไม่เวิร์ค: กลับไปไล่เช็คทีละขั้นตอนใหม่นะ ว่าต่อตรงไหนผิดหรือปล่าว ห้ามช็อตนะตัวนี้!

ถ้าน้องคิดว่ามันไม่เวิร์คเพราะขั้นตอนในบทความเขียนไม่เคลียร์ ก็บอกพี่มาได้ จะได้อัพเดทให้ชัดเจนขึ้น

ขั้นตอนที่ 6: ใส่ Voltage Regulator 5V, ตัวต่อไฟ 12V, สวิตช์เปิดปิด และไฟ LED

ขั้นตอนนี้คือการจัดระเบียบสายไฟและแหล่งจ่ายไฟให้เรียบร้อย หลังจากทดสอบแล้วว่าเครื่องมันร้องได้แล้ว

  1. เพิ่มวงจรเรกกูเลเตอร์ 5V: ใช้ IC LM7805 กับตัวเก็บประจุ (capacitor) 10uF สองตัว และ 0.1uF อีกหนึ่งตัว วงจรพื้นฐานแบบนี้มีสอนเต็มไปหมดในเน็ต ไปเสิร์ชดูได้เลยว่า "วงจร LM7805" เนี่ย มันต้องต่อยังไง
  2. เพิ่มตัวต่อไฟ 12V: ใช้จัมเปอร์หรือคอนเนคเตอร์สำหรับแหล่งจ่ายไฟ 12V โดยให้สาย Vcc ผ่านสวิตช์เปิด-ปิดด้วย
  3. เพิ่มไฟ LED แสดงสถานะ: ต่อ LED พร้อมกับตัวต้านทาน (Resistor) สำหรับจำกัดกระแส เพื่อให้ไฟติดเมื่อเราเปิดสวิตช์

ขั้นตอนที่ 7: เอาใส่เคส ทาสี แล้วก็เอาไปอวดเพื่อนได้เลย!

พอวงจรทดสอบเรียบร้อย แน่ใจว่าเสียงเพราะถูกใจแล้ว สิ่งที่เหลือก็มีแค่... สร้างเคสสุดเท่ ทาสีสวยๆ แล้วก็หยิบมาเล่นดนตรีได้เลย!

พี่หวังว่าน้องจะสนุกกับบทความนี้ และอาจจะได้ไอเดียไปสร้างซินธ์ของตัวเอง หรือไม่ก็มีแรงฮึดไปทำโปรเจคอื่นต่อนะ

มีคำถามอะไร คอมเมนต์ไว้ด้านล่างได้เลย! และถ้าน้องสร้างอะไรจากบทความนี้ขึ้นมาจริงๆ จะแชร์ผลงานในส่วน "I made this!" หรือในฟีดแบ็คก็ได้นะ พี่อยากเห็นมาก!

บทความนี้เข้าร่วมการประกวด "INSTRUMENT CONTEST" ด้วย ถ้าชอบก็ช่วยโหวตให้หน่อยนะคร้าบ!

สรุป

Retro-Synth ตัวนี้ไม่ใช่แค่ของเล่นแปลกใหม่ แต่มันเป็นเครื่องมืออเนกประสงค์สำหรับดนตรีทดลองเลยทีเดียว ซึ่งพิสูจน์ให้เห็นว่าเทคโนโลยีเก่าแก่ยังสามารถผสานเข้ากับเวิร์คโฟลว์แบบดิจิทัลในยุคปัจจุบันได้อย่างลงตัว


8-bit soul, modern control: Reviving the Sega sound through USB-MIDI intelligence.

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "Arduino IDE"
  - "USB Host Shield Library 2.0"
  - "SN76489 Arduino Library"
author: "tyrkelko"
category: "Audio & Sound"
components:
  - "1x Arduino Nano R3"
  - "1x Solder Wire, Lead Free"
  - "1x SN76489"
  - "3x Capacitor 10 µF"
  - "1x Soldering iron (generic)"
  - "1x DIY Prototype Paper PCB Universal Experiment Matrix Circuit Board 8.5x20cm TB"
  - "1x Shift Register- Serial to Parallel"
  - "1x Resistor 220 ohm"
  - "1x 3 mm LED: Red"
  - "1x Pushbutton Switch, Momentary"
  - "1x DC Power Connector, Straight"
  - "1x Mini USB Host Shield by DuinoFun"
  - "1x 4 MHz Crystal Oscillator DIP 14"
  - "1x Linear Regulator (7805)"
  - "1x Wire Stripper & Cutter, 18-10 AWG / 0.75-4mm² Capacity Wires"
description: "A professional 8-bit hardware synthesizer that interfaces a modern USB MIDI keyboard with the vintage Sega SN76489 sound chip for authentic polyphonic chiptune production."
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles:
  - "https://github.com/felis/USB_Host_Shield_2.0"
  - "https://github.com/felis/USB_Host_Shield_2.0"
  - "https://github.com/tyrkelko/sn76489"
  - "https://github.com/felis/USB_Host_Shield_2.0"
  - "https://github.com/tyrkelko/sn76489"
encryptedPayload: "U2FsdGVkX19CqjkPvVA1t9hCGeVlfmCPU9Is0pnu+h+KV0hsHpv4XeRtFTZcuxT4S4wQdHMnp6B31FE4xx4WAGtpUgeEpZzuFWIrZgrCNqA="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/lets-build-an-sn76489-usb-midi-synth-with-arduino-nano-ce1343_cover.jpg"
lang: "en"
likes: 4
passwordHash: "88d9f6ee493d0aed58383169e1456ab3cb3708fc20e6dc668e4d83819cf7d38d"
price: 2450
seoDescription: "Build a DIY USB MIDI Synth using Arduino Nano and the retro SN76489 sound chip from Sega Genesis."
tags:
  - "chiptune"
  - "midi-synth"
  - "sn76489"
  - "vintage-audio"
  - "usb-host-shield"
  - "digital-logic"
title: "มาปั้น SN76489 USB MIDI Synth ด้วย Arduino Nano กัน งานง่ายแต่หล่อ!"
tools:
  - "Soldering Iron"
  - "Lead-Free Solder"
  - "Oscilloscope (Optional for Signal Debugging)"
videoLinks:
  - "https://www.youtube.com/embed/mJoYUdJErU0"
views: 20412