กลับไปหน้ารวมไฟล์
generating-waveforms-with-arduino-uno-304a18.md

การทดลองง่ายๆ แต่เจ๋งมาก: แค่ใช้ฟังก์ชันคณิตศาสตร์พื้นฐาน เราก็สามารถสร้างสัญญาณคลื่นต่างๆ เช่น คลื่นสี่เหลี่ยม (Square), เลื่อย (Saw) และไซน์ (Sine) ได้ แถมยังใส่ตัวกรองความถี่ต่ำ (Low Pass Filter) เข้าไปในคลื่นสี่เหลี่ยมได้ด้วย อย่างที่พี่สาธิตในคลิปนั่นแหละ แอปพลิเคชันแบบนี้เขาเรียกว่า Oscillator ที่ควบคุมด้วยตัวเลข (Numerically Controlled Oscillator หรือ NCO) ซึ่งเป็นพื้นฐานของชิปอย่าง AD9850 ในระบบ DDS นั่นเอง แน่นอนว่าถ้าจะเอาไปใช้จริงจัง คงต้องใช้ MCU ที่แรงกว่านี้หน่อย พี่ใช้ IDE ต่อกับ Arduino Uno ส่วนกราฟที่เห็นพล็อตมาจาก Serial Plotter ในตัว IDE นั่นเอง

Arduino Uno นี่เป็นสัตว์ดิจิทัลตัวเก่ง พินของมันรู้จักแค่ 5V (HIGH) กับ 0V (LOW) เท่านั้น มันไม่มี DAC (Digital-to-Analog Converter) แบบจริงจัง โปรเจกต์นี้เลยบังคับให้เราต้องดัดสถาปัตยกรรมฮาร์ดแวร์ให้เป็นตามใจสั่ง โดยใช้เครือข่ายตัวต้านทานแบบ R-2R (Resistor Ladder) ที่เราต่อเอง คู่กับการจัดการรีจิสเตอร์ C++ แบบดิบๆ เพื่อสร้างคลื่นเสียงไซน์ที่เนียนๆ ออกมาจากสัญญาณดิจิทัลล้วนๆ ผ่านการคำนวณทางคณิตศาสตร์

กับดักของการจัดการพอร์ตแบบเร็วสุดแรง

คุณใช้ digitalWrite() ธรรมดาๆ สร้างคลื่นเสียงความถี่สูงไม่ได้หรอก มันใช้เวลาถึง 50 รอบสัญญาณนาฬิกา (clock cycles) ในการทำงานหนึ่งครั้ง

  1. โค้ดสำหรับ R-2R Ladder: เราต้องสร้างเมทริกซ์ของตัวต้านทานจริงๆ คร่อมพินที่เหมือนกัน 8 พินพอดี (พิน 0 ถึง 7 หรือที่รู้จักกันในชื่อ PORTD) โดยการสั่งให้พินชุดหนึ่งทำงานพร้อมกันในรูปแบบไบนารี (เช่น 01101001) ตัวต้านทานจะรวมแรงดันไฟฟ้าจริงๆ เพื่อส่งออกแรงดันอนาล็อกที่เจาะจงออกมา!
  2. รีจิสเตอร์สำหรับส่งออก (Output Register): แทนที่จะใช้คำสั่ง digitalWrite ช้าๆ 8 ครั้ง โปรแกรมจะเขียนข้อมูลลงไปในเมทริกซ์หน่วยความจำของ CPU โดยตรงด้วยเลขฐานสอง! PORTD = 0b10000000; // คำสั่งนี้จะสั่งให้พิน 7 ทำงานทันทีภายในรอบสัญญาณนาฬิกาเดียวที่เร็วสุดขั้ว!

การปรับแต่งเมทริกซ์ไซน์ (PROGMEM)

การสร้างคลื่นไซน์ ต้องวาดเส้นโค้งที่ลื่นไหลออกมาจากไฟฟ้าจริงๆ

  • คุณต้องสร้างตารางค้นหา (#define TABLE_SIZE 256) ที่เก็บค่าพิกัดของวงกลมที่คำนวณไว้ล่วงหน้า แล้วแมปเข้ากับค่าส่งออกแรงดัน (0 ถึง 255)
const unsigned char sineTable[256] PROGMEM = { 128, 131, 134, 137, 140... }
  • ในฟังก์ชันหลัก loop() คุณจะใช้การขัดจังหวะจากตัวจับเวลา (timer interrupt) ที่ทำงานด้วยความถี่สูง
  • ทุกครั้งที่เกิดการขัดจังหวะ Arduino จะดึงค่าจำนวนเต็มตัวต่อไปจากตาราง PROGMEM และโยนมันออกไปที่ PORTD ทันที!
  • ถ้าคุณต่อออสซิลโลสโคปเข้ากับขาออกของ R-2R Ladder คุณจะเห็นเส้นโค้ง AC Sine Wave ที่ลื่นและบริสุทธิ์ทางคณิตศาสตร์ — สิ่งที่ Arduino Uno แบบดิจิทัลไม่ได้ถูกออกแบบมาให้ทำตั้งแต่แรก!

ชุดอุปกรณ์สำหรับซินธิไซเซอร์ไฟฟ้าระดับเทพ

  • Arduino Uno/Nano (ต้องเป็นสถาปัตยกรรม ATmega328P เท่านั้น ถึงจะจัดการรีจิสเตอร์ PORTD แบบนี้ได้!)
  • ตัวต้านทาน (Resistor) ที่มีความแม่นยำสูง อย่างน้อย 16 ตัว (ปกติจะเป็น 10k โอห์ม และ 20k โอห์ม) สำหรับสร้างอาร์เรย์ R-2R Ladder ที่แปลงสัญญาณดิจิทัลเป็นอนาล็อก
  • ออสซิลโลสโคป (จำเป็นมากๆ เพื่อพิสูจน์ด้วยตาว่าโค้ด C++ ของคุณสร้างเส้นโค้งทางคณิตศาสตร์ที่ถูกต้องจริงๆ)

นี่คือรูปภาพของคลื่นที่เราพล็อตไว้:

วิดีโอ:

สเก็ตช์ทำงานแล้ววว

การต่อสาย:

วิธีทำ:

ต่อ Arduino Uno เข้ากับ PC หรือ Notebook ด้วยสาย USB เลือกฟังก์ชันที่ต้องการพล็อต (SAW, SQR, FILTER หรือ SINE) อัพโหลดสเก็ตช์ลง Arduino Uno จากนั้นเข้าเมนู Tools แล้วเปิด Serial Plotter ขึ้นมา

จัดไปวัยรุ่น! สู้งานนะน้อง

  • Julio Cesar - JCR

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

apps:
  - "1x Arduino IDE"
author: "CesarSound"
category: "Science & Simulation"
components:
  - "1x Arduino UNO"
description: "Oscillatory engineering! Hack the native ATmega processor timer registers (bypassing slow digitalWrite) to synthesize flawless, mathematically precise Analog AC Sine, Triangle, and Square mathematical waves."
difficulty: "Advanced"
documentationLinks: []
downloadableFiles: []
encryptedPayload: "U2FsdGVkX18+YLmHYcudbIpMQIZJcCEifn0HnEFC4vzyNsPe7NIam7aIBgj/MIRXLLoebhynE7+in/IRSIdnYAjdRQ8zPirxGMbglAOalWQ="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/generating-waveforms-with-arduino-uno-304a18_cover.jpg"
lang: "en"
likes: 1
passwordHash: "12e472d8c91bb32a75c4c447dd19c50548956f81c1b50ebadc1b3dbd8ea90a45"
price: 1120
seoDescription: "Generate square, saw, and sine waveforms with Arduino Uno using mathematical functions and apply a low pass filter."
tags:
  - "waveform"
  - "arduino"
  - "generator"
  - "nco"
  - "oscillator"
title: "ปล่อยคลื่นเทพๆ ด้วย Arduino Uno งานง่ายแต่หล่อ!"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/emjenzSHcTM"
views: 15514