Arduino Due เครื่องกำเนิดสัญญาณคลื่นแบบกำหนดเอง (Arbitrary Waveform Generator)
เวอร์ชัน 2.1
















ตัวอย่างโน้ตเพลงที่สร้างในหน้าต่างดนตรี:
ฟีเจอร์หลักๆ จัดไปวัยรุ่น!
**วาด-เซฟ-ส่ง** คลื่นแบบกำหนดเองได้เลยน้อง เขียนรูปคลื่นเองได้ บันทึกเก็บไว้ แล้วส่งไปให้ Arduino Due ทาง USB ง่ายๆ
**คลื่นพื้นฐานก็มีครบ** ทั้งไซน์ สี่เหลี่ยม สามเหลี่ยม เอามาผสมกันเป็นคลื่นใหม่ก็ได้ สุดยอด!
**ปรับแต่งพารามิเตอร์** ของคลื่นได้ตามใจชอบ แล้วเซฟรูปร่างคลื่นใหม่เก็บไว้ใช้ทีหลัง
**ความถี่สูงสุด** สำหรับคลื่นอนาล็อก: 100kHz ส่วนคลื่นสี่เหลี่ยม: สูงสุด 42MHz (ห้ามช็อตนะตัวนี้!)
ความถี่ต่ำสุด: มากกว่า 10,000 วินาทีต่อรอบ (ช้าโคตรๆ)
ปรับ Duty Cycle ได้ตั้งแต่เกือบ 0% ถึง 100% (จัดเต็มได้ทุกแบบ)
สร้างสัญญาณรบกวนแบบ White, Pink หรือ Brown ที่แม่นยำได้ด้วย
แต่งเพลง บันทึก และเล่นผ่าน Due ได้ซะด้วยสิ (Due เราเก่งเกินหน้า)
Due ยังสามารถทำงานเดี่ยวๆ โดยควบคุมผ่านโพเทนชิโอมิเตอร์และสวิตช์ได้
เปลี่ยนค่าเริ่มต้นตอนเปิดเครื่องได้ตามชอบ
สร้างง่ายมาก - ดูวิธีติดตั้งด้านล่างเลยจ้า
คำอธิบายทั่วไป
เวอร์ชัน 2.1 เป็นอัพเดทเล็กน้อย ดังนั้นพี่จะอธิบายเวอร์ชันก่อนหน้านี้ก่อน สำหรับใครที่ยังไม่คุ้นเคยกับโปรเจคนี้
โปรเจคนี้มีสองส่วน: สเก็ตช์สำหรับบอร์ด Arduino Due และ GUI Controller สำหรับใช้บน PC ของคุณ ถ้าชอบ สำหรับฟังก์ชันส่วนใหญ่ Arduino ยังสามารถควบคุมผ่าน Arduino IDE ได้ หรือจะใช้เดี่ยวๆ โดยควบคุมผ่านโพเทนชิโอมิเตอร์ สวิตช์ และ LED ก็ได้ สเก็ตช์นี้ทำงานกับ บอร์ด Due เท่านั้นนะน้อง ห้ามเอาไปใช้กับบอร์ดอื่นเด็ดขาด!
ไม่ต้องต่อวงจรเพิ่มเติม (ง่ายเว่อร์) แต่มีวงจรป้องกันเอาต์พุตแบบเลือกได้ ซึ่งควรจะปกป้องบอร์ด Arduino จากอุบัติเหตุเช่นการต่อเอาต์พุตเข้ากับแรงดันสูงถึงบวกและลบประมาณ 30V รวมถึงป้องกันไฟฟ้าสถิตด้วย
โดยใช้ GUI Controller บน PC ของคุณ คุณสามารถวาด แก้ไข บันทึก และอัปโหลดคลื่นรูปแบบใดก็ได้ (Arbitrary Wave) ไปยัง Arduino Due โดยเชื่อมต่ออัตโนมัติผ่านพอร์ต USB มีไฟล์ช่วยเหลือครบถ้วนให้ด้วย
ฟีเจอร์ "คลื่นแบบขั้นบันได" (Stepped Wave) ช่วยให้สร้างขั้นที่คมชัด (ตัวอย่างที่อยู่ติดกัน) ในคลื่นรูปแบบใดก็ได้ได้ง่ายดายหากต้องการ นอกจากนี้ยังสามารถสลับเอาต์พุตไปเป็น Sine Wave หรือ Triangle / Sawtooth แทนได้
นอกจากนี้ ยังสร้าง Square Wave พร้อมกันได้ ซึ่งสามารถซิงโครไนซ์หรือเป็นอิสระโดยสมบูรณ์ก็ได้ คลื่นสามารถควบคุมโดยความถี่หรือคาบ (Period) ได้ สามารถตั้งค่า Duty Cycle ได้ตั้งแต่เกือบ 0% ถึง 100% หรือจะตั้งค่าความกว้างพัลส์ให้คงที่ก็ได้
ตั้งค่าใหม่โดยพิมพ์ตรงผ่านคีย์บอร์ดของ PC หรือคีย์แพดของโปรแกรมได้เลย หรือกด "SLIDE" เพื่อปรับแบบลื่นๆ ได้
มีโหมดความถี่แม่นยำ (Exact Frequency Mode) สำหรับคลื่นอนาล็อก ซึ่งหลีกเลี่ยง "ขั้นความถี่" ที่ปกติเกี่ยวข้องกับเครื่องกำเนิดคลื่นแบบ Direct Digital Synthesis (DDS) ทำให้ได้ความถี่ที่แม่นยำยิ่งขึ้นโดยอนุญาตให้เข้าถึงความถี่ที่อยู่ระหว่าง "ขั้นความถี่" เหล่านั้น เพราะเอาต์พุตไม่ใช่การหารของความถี่นาฬิกา Arduino เมื่อเปิดโหมด Exact Freq
มีฟีเจอร์กวาดความถี่ (ลอการิทึม) สำหรับคลื่นใดคลื่นหนึ่งหรือทั้งสองคลื่น และยังมีตัวจับเวลาพร้อมเอาต์พุต Arduino แบบบวกหรือลบด้วย
เอาต์พุตอนาล็อกแท้: จุดเด่นของฮาร์ดแวร์ DAC
Arduino Uno มาตรฐานนั้นห่วยมากในการสร้างเสียง มันส่งออก "Square Wave PWM" ซึ่งเป็นพัลส์ที่หยาบและเป็นบล็อกๆ ของ 5V หรือ 0V Arbitrary Waveform Generator นี้ต้องการ Arduino Due
Arduino Due มีพิน `DAC` เจาะจงสองพิน
- ไม่เหมือน PWM ของ Uno ที่เปิดปิดเกต 5V อย่างรวดเร็วเพื่อ "ปลอม" แรงดันที่ต่ำกว่า
- DAC ของ Due ส่งออกแรงดันที่แท้จริง, เรียบ, และแปรผันได้ทางกายภาพ!
- ถ้าคุณพิมพ์ `analogWrite(DAC0, 100);` Due จะส่งออก DC `1.2 โวลต์` ที่ราบเรียบและสะอาดสมบูรณ์แบบ
- ถ้าคุณต่อสิ่งนี้เข้ากับออสซิลโลสโคป คุณจะเห็นเส้นที่ไร้ที่ติ แทนที่จะเป็นบล็อกพัลส์ที่ขรุขระและมีสัญญาณรบกวน
การสร้างโดยใช้ Direct Memory Access (DMA)
เพื่อวาด "Sine Wave" ที่สมบูรณ์แบบบนออสซิลโลสโคป คุณต้องเปลี่ยนแรงดัน DAC นั้นหลายพันครั้งต่อวินาที (เช่น `0.1V -> 0.2V -> ... -> 3.3V -> 3.2V`)
- การทำเช่นนี้ด้วยลูป `for` มาตรฐานใน C++ นั้นช้าเกินไปและจะสร้างคลื่นไซน์ที่ขรุขระ
- คุณต้องใช้ ตารางค้นหา (Lookup Tables) คุณคำนวณล่วงหน้า 256 จุดแรงดันของคลื่นไซน์และเก็บไว้ในอาร์เรย์ในหน่วยความจำ
- คุณกำหนดค่า ตัวควบคุม DMA ภายในชิป ARM เพื่อให้มันข้ามโปรเซสเซอร์หลักไปโดยสิ้นเชิง โดยอัตโนมัติส่งจุดอาร์เรย์ 256 จุดนั้นตรงเข้าไปยังชิป DAC 44,000 ครั้งต่อวินาที! (เร็วปรี๊ด)
ฮาร์ดแวร์วิศวะที่ต้องมี (จัดไปวัยรุ่น)
- Arduino Due (32-bit ARM Cortex-M3): บอกเลยว่า Uno หรือ Nano แบบ 8-bit ทั่วไปทำโปรเจคนี้แบบเนทีฟไม่ได้นะเว้ย ถ้าไม่อยากซื้อ I2C DAC มาต่อเพิ่ม!
- ออสซิลโลสโคป: เอาไว้เช็คสายตาว่าคลื่นที่เราปั้นออกมาสวยเป๊ะแค่ไหน
- Op-Amps (เช่น LM358) ถ้าอยากบูสต์คลื่น 3.3V จาก Due ให้ขึ้นไปถึงมาตรฐาน 12V ของซินธิไซเซอร์!
ฟีเจอร์ใหม่ในเวอร์ชั่น 2.0
ขอบคุณสำหรับคอมเมนต์เยอะแยะด้านล่างน้า ไอเดียของหลายคนถูกนำมาปรับใช้ในเวอร์ชั่นนี้แล้ว นี่คือลิสต์ฟีเจอร์ใหม่ส่วนใหญ่ (แต่ไม่หมดนะจ๊ะ):
ตอนนี้สร้างคลื่นคลาสสิกได้มากขึ้นแล้ว โดยปรับพารามิเตอร์คลื่นได้เพียบในส่วน SETUP ซึ่งคลื่นทุกแบบสามารถถูกปรับแต่งหรือแม้แต่ผสมกันเพื่อสร้างคลื่นผสม (composite wave) ให้เอฟเฟกต์ได้ไม่จำกัด สองคลื่นไซน์สามารถสร้างพร้อมกันและผสมเพื่อสร้างเอฟเฟกต์เฟสชิฟต์ได้ ขอบคุณ mszoke01 (ในคอมเมนต์) สำหรับแรงบันดาลใจส่วนนี้
รูปร่างคลื่น (waveshape) ใหม่ที่สร้างขึ้น ไม่เพียงแต่เซฟเป็นไฟล์ได้ แต่ยังเซฟลง Flash Memory ของ Due ใน Preset 1 ใน 50 ช่องได้ด้วย แต่ละ Preset เก็บคลื่นผสมแบบไหนก็ได้ รวมถึง arbitrary wave ด้วย Preset ยังเปิดโอกาสอื่นๆ เช่น การทำ Audiometer แบบสแตนด์อโลนง่ายๆ ขอบคุณ chhckm (ในคอมเมนต์) สำหรับไอเดียนี้
ตอนนี้เปลี่ยนค่าเริ่มต้นตอนเปิดเครื่องได้แล้ว (เซฟใน Flash Memory) ทำให้ Due บูตขึ้นมาพร้อมกับคลื่น, ความถี่ และโหมดที่เลือกไว้ รวมถึง arbitrary wave ขอบคุณ gagarinui (ในคอมเมนต์) สำหรับไอเดียนี้
คลิก MODULATION ในหน้าต่าง SETUP เพื่อปรับแอมพลิจูดคลื่นแบบเรียลไทม์ด้วยแรงดันที่ป้อนเข้าที่ขา A2 ของ Arduino
ถ้าสาย USB ต่อกับ Arduino หลุด ตอนนี้กู้คืนกลับมาได้ด้วยคลิกเดียว โดยไม่ต้องรีสตาร์ทโปรแกรมคอนโทรลเลอร์ และการตั้งค่าทั้งหมดจะถูกกู้คืนกลับมาบน Arduino อัตโนมัติ
สร้างคลื่นสุ่มในหน้าต่างวาดรูปได้ โดยคลิก AUTODRAW เพื่อหา RANDOM แล้วก็กด DRAW ได้เลย
ตอนนี้แก้ไข arbitrary wave ที่มี waypoint กี่จุดก็ได้ในหน้าต่างวาดรูปแล้ว
อัพโหลด arbitrary wave ลง Due ได้เร็วกว่าเวอร์ชั่น 1 เยอะ
หลังจากอัพโหลด arbitrary wave ลง Due แล้ว สามารถอัพโหลดเพิ่มและต่อท้ายมันได้ สร้างเป็นสายของ arbitrary waves!
ตอนนี้สร้างเสียงรบกวนสีขาว (white), ชมพู (pink) หรือน้ำตาล (brown) ที่แม่นยำได้แล้ว โดยใช้ True Random Number Generator (TRNG) ที่มีมาในตัวของ Due แถมปรับค่า Noise Colour ใน SETUP เพื่อสร้างทุกค่าผสมระหว่างสีเหล่านั้นได้อีก!
ถ้ายังไม่พอ แม้แต่โน้ตเพลงก็แต่งได้ แล้ว Due จะเล่นโดยใช้ waveshape ที่เราสร้างขึ้น! หรือจะใช้เครื่องดนตรีที่มีมาให้ก็ได้: เปียโน, กีตาร์, มาริมบา, ทรัมเป็ต, แซกโซโฟน และไวโอลิน สามารถเซฟโน้ตเพลงเป็นไฟล์ได้ แถมเซฟเพลงได้ถึง 50 เพลงใน Flash Memory ของ Due เพื่อให้ Arduino เล่นในโหมดสแตนด์อโลนโดยใช้สวิตช์ได้ด้วย พลัส ตั้งค่าให้เพลงใดเพลงหนึ่งเล่นอัตโนมัติตอนบูตได้!
และยังมีอีก: เปลี่ยนเครื่องดนตรีหลายครั้งในระหว่างเพลงหรือโน้ตได้... และยังไม่หมด... ถ้าเพลงหรือโน้ตใช้เครื่องดนตรี WAVE สามารถลิงก์มันกับ Preset ได้ ดังนั้นตอนเล่น Arduino จะใช้ waveshape ที่เราเซฟไว้ใน Preset นั้นอัตโนมัติ (ต้องเซฟ Preset ขณะที่ Music Window เปิดอยู่เพื่อใช้ฟีเจอร์นี้)
ไฟล์ช่วยสอนถูกขยายออกไปมากเพื่อรวมฟีเจอร์พิเศษต่างๆ
แม้ว่าเสียงดนตรีที่ผลิตออกมาจะเป็นแบบโมโนโฟนิก (monophonic) แต่ถ้าใครโชคดีมีบอร์ด Due มากกว่าหนึ่งบอร์ด น่าจะเชื่อมขา I/O ของพวกมันเข้าด้วยกันได้ เพื่อให้ทั้งหมดเริ่มเล่นเพลงหมายเลขเดียวกันพร้อมกัน โดยถูกทริกเกอร์ด้วยสวิตช์ที่ต่ออยู่ ดังนั้น ถ้าแต่ละบอร์ดเซฟเสียงดนตรีคนละแนวไว้ในหมายเลขเพลงเดียวกัน คุณก็ได้โพลีโฟนี (polyphony) แล้ววว! สู้งานนะน้อง
เวอร์ชั่น 2.1
มีแก้บั๊กนิดหน่อยและปรับระบบย้อนกลับ (undo) เล็กน้อย แต่ฟีเจอร์ใหม่หลักคือสำหรับใครที่อยากสร้างไฟล์ arbitrary wave ด้วยตัวเองแบบแมนนวล แทนที่จะวาดในหน้าต่างวาดรูปของ GUI ตอนนี้สร้างได้ในรูปแบบใหม่ที่ง่ายกว่า 3 รูปแบบ รวมถึงรูปแบบดั้งเดิม โปรแกรม GUI Controller จะตรวจจับรูปแบบไฟล์อัตโนมัติเมื่อเปิดไฟล์ แถมเซฟไฟล์คลื่นในรูปแบบที่ต้องการก็ได้ มีไฟล์ตัวอย่างให้ด้วย ห้ามช็อตนะตัวนี้
ติดตั้งกันหน่อย
โปรแกรม GUI Controller สำหรับ PC ของคุณเป็นแบบ "พกพา" (portable) ฉะนั้นไม่ต้องลงตั้งอะไรมากมาย
สำหรับชาว Windows แค่แตกไฟล์ .zip ลงโฟลเดอร์ที่ชอบ แล้วสร้างชอร์ตคัทไปที่ไฟล์ .exe ได้เลย หมายเหตุ: ไฟล์ "DueAWGController-win32.zip" สำหรับระบบ 32 บิต แต่ไฟล์ 64.zip อาจจะทำงานได้เสถียรกว่าเพราะมันมี Java ติดมาด้วย สำหรับเวอร์ชัน 32.zip อาจต้องลง Java 8 เพิ่มบนเครื่องตัวเอง
สำหรับชาว Linux แตกไฟล์ DueAWGController-linuxXX.zip ลงโฟลเดอร์ แล้วดับเบิลคลิกไฟล์ DueAWGController หรือจะเพิ่มเข้าเมนูระบบก็ได้
ไฟล์ DueAWGController-linux64.zip มี Java ติดมาด้วยแล้ว สำหรับเวอร์ชันอื่นๆ ควรลง Java 8 บนระบบเพื่อให้ DueAWGController แสดงผลถูกต้อง
อาจต้องขอสิทธิ์การเข้าถึง USB ก่อนจะเชื่อมต่อกับ Arduino ได้ ใน Terminal พิมพ์: sudo usermod -a -G dialout $USER
ยังมีไฟล์ "arm" สองไฟล์สำหรับ Raspberry Pi ฯลฯ ด้วย แต่ยังไม่ได้ทดสอบ ถ้าใช้ได้ รบกวนบอกพี่ด้วย จะได้ช่วยเหลือผู้ใช้ท่านอื่นๆ
สเก็ตช์ Arduino ต้องการไลบรารีเดียวที่หาง่ายมากๆ ซึ่งช่วยให้เก็บค่าตั้งต้นแบบส่วนตัว, พรีเซ็ต และทูนไว้ในหน่วยความจำแฟลชของ Due ได้ ชื่อว่า "DueFlashStorage" หาได้ผ่านโปรแกรม Arduino IDE ทาง Tools > Manage Libraries
เตรียมใจไว้หน่อย การอัปโหลดสเก็ตช์ Arduino อาจใช้เวลาพักนึงเพราะข้อมูลที่ต้องอัปโหลดมีเยอะมาก เวอร์ชันนี้ใช้พื้นที่โปรแกรมเมมโมรีเกือบเต็มของบอร์ด Due ไปแล้ว 43% ใช้ไปกับโปรแกรม, 50% จองไว้เก็บพรีเซ็ต, คลื่นอาร์บิทราซี และทูน เหลือแค่ 7% ไม่ได้ใช้! และตัวแปรต่างๆ ก็ใช้ RAM ไปประมาณ 80k จาก 96k ที่มีอีกด้วย!
โปรแกรม GUI ควรจะหาและเชื่อมต่อกับ Arduino อัตโนมัติตอนเริ่มต้น ฉะนั้นไม่ต้องตั้งค่า COM port เอง แต่ถ้าเลือกอัตโนมัติไม่ได้ ก็มีตัวเลือกตั้ง COM port แบบมือให้ใช้
ในโฟลเดอร์ Arbitrary Waves มีไฟล์ตัวอย่างคลื่นอาร์บิทราซีอยู่บ้าง, ในโฟลเดอร์ Music Scores มีไฟล์ตัวอย่างโน้ตเพลง และในโฟลเดอร์ Settings มีไฟล์ตั้งค่าสองสามไฟล์ ช่วยให้น้องเริ่มต้นได้ง่ายขึ้น
นอกจากโปรแกรม GUI แล้ว ตัวสร้างคลื่นของ Arduino ยังควบคุมผ่าน Arduino IDE's serial monitor ที่ตั้งค่าเป็น 115200 baud ได้ด้วย พิมพ์ "?" (หรือตัวอักษรอะไรก็ได้ที่ไม่ได้ใช้) เพื่อขอความช่วยเหลือ
ถ้าจะใช้พอต, สวิตช์ & LED มาควบคุม ดูการเชื่อมต่อพินได้ที่ตอนต้นของสเก็ตช์ Arduino แต่น้องยังต้องใช้โปรแกรม GUI ที่ว่ามาข้างบนเพื่อสร้างโน้ตเพลงและทูนอยู่ดี
การเชื่อมต่อพินเอาต์พุตคลื่น: เชื่อมต่อพิน 3 และ 7 ของ Arduino เข้าด้วยกันด้วยลิงก์ (หรือตัวต้านทาน (Resistor) ค่าต่ำประมาณ 47 โอห์ม) เอาต์พุตสแควร์เวฟจากพิน 7 ถ้าใช้ตัวต้านทาน และเอาต์พุตคลื่นอนาล็อกจาก DAC0 ใช้ DAC1 แทนได้ตามคำแนะนำง่ายๆ ท้ายไฟล์ .ino
ถ้าเชื่อมต่อกับแอมป์ภายนอก ฯลฯ จะต้องใช้ตัวเก็บประจุคัปปลิ้ง (coupling capacitor) เพราะคลื่นที่ผลิตออกมามีไบอัส DC เท่ากับครึ่งหนึ่งของแรงดันซัพพลาย 3.3V ของ Arduino และขอแนะนำอย่างแรงมากๆ ให้น้องใช้วงจรป้องกันด้วย