โปรเจกต์ เครื่องสร้าง Arbitrary Waveform Generator ด้วย Arduino Due
สร้าง Arbitrary Waves, Classic Waves, Noise หรือแม้แต่ Music และ Due จะทำการ Generate ให้คุณ
สร้าง Arbitrary Waves, Classic Waves, Noise หรือแม้แต่ Music และ Due จะทำการ Generate ให้คุณ
▶ กดเพื่อดูวิดีโอสาธิตโปรเจกต์
















ตัวอย่างโน้ตเพลงที่สร้างในหน้าต่าง Music:
สามารถวาด, บันทึก และส่งคลื่น Arbitrary ไปยัง Due ผ่าน USB ได้
สามารถสร้างคลื่นแบบมาตรฐานได้ และนำคลื่นทั้งหมดมาผสมกันได้
ปรับแต่งพารามิเตอร์ของคลื่นได้ และบันทึกรูปร่างคลื่นใหม่เก็บไว้ได้
ความถี่สูงสุดของคลื่น Analogue: 100kHz และความถี่สูงสุดของคลื่น Square: 42MHz
ความถี่ต่ำสุด: มากกว่า 10,000 วินาทีต่อหนึ่งรอบ (Cycle)
ปรับ Duty cycle ได้ตั้งแต่เกือบ 0% ถึง 100%
สามารถสร้างสัญญาณรบกวน (Noise) แบบ White, Pink หรือ Brown ที่มีความแม่นยำได้
สามารถแต่งเพลง, บันทึก และสั่งให้ Due เล่นเพลงได้
Due สามารถทำงานแบบ Stand-alone ได้ โดยควบคุมผ่าน Pots และ Switches
สามารถเปลี่ยนค่าเริ่มต้น (Default) ตอนเปิดเครื่องได้
สร้างได้ง่าย - ดูขั้นตอนการติดตั้ง (Installation) ด้านล่าง
Version 2.1 เป็นการอัปเดตย่อย ดังนั้นผมจะขออธิบายเวอร์ชันก่อนหน้าก่อนสำหรับใครที่ยังไม่คุ้นเคยกับโปรเจกต์นี้
โปรเจกต์นี้แบ่งเป็นสองส่วนคือ: Sketch สำหรับ Board Arduino Due และโปรแกรม Controller GUI สำหรับใช้งานบน PC หากคุณต้องการ คุณสามารถควบคุม Arduino ผ่าน Arduino IDE ได้เกือบทุกฟังก์ชัน หรือจะใช้งานแบบแยกเดี่ยวโดยควบคุมผ่าน Pots, Switches และ LEDs ก็ได้ โดย Sketch นี้ใช้งานได้กับ Board Due เท่านั้น
ไม่จำเป็นต้องมีวงจรเพิ่มเติม แต่มีการแนะนำวงจรป้องกัน Output เป็นทางเลือก ซึ่งจะช่วยปกป้อง Board Arduino จากการเผลอต่อ Output เข้ากับแรงดันไฟฟ้าที่สูงถึงบวกและลบ 30V รวมถึงป้องกันไฟฟ้าสถิต (Static) ด้วย
เมื่อใช้งาน Controller GUI บน PC คุณจะสามารถวาด, แก้ไข, บันทึก และอัปโหลดคลื่น Arbitrary ไปยัง Arduino Due ได้โดยอัตโนมัติผ่านพอร์ต USB ในชุดโปรแกรมมีไฟล์ Help ที่ครอบคลุมรวมอยู่ด้วย
ฟีเจอร์คลื่นแบบ "Stepped" ช่วยให้สร้างขั้นบันไดที่คมชัด (ตัวอย่างข้อมูลที่อยู่ติดกัน) ในคลื่น Arbitrary ได้ง่ายตามต้องการ นอกจากนี้ยังสามารถสลับ Output เป็นคลื่น Sinewave หรือ Triangle / Sawtooth แทนได้
นอกจากนี้ ยังมีการสร้างคลื่น Square ออกมาพร้อมกัน ซึ่งสามารถเลือกให้ Sync กันหรือแยกเป็นอิสระต่อกันก็ได้ สามารถควบคุมคลื่นผ่าน Frequency หรือ Period และตั้งค่า Duty cycle ได้ตั้งแต่เกือบ 0% ถึง 100% หรือจะตั้งค่าความกว้างพัลส์ (Pulse width) ให้คงที่ก็ได้
สามารถพิมพ์การตั้งค่าใหม่ได้โดยตรงผ่าน Keyboard ของ PC หรือ Keypad ของโปรแกรม หรือจะกด "SLIDE" เพื่อปรับแบบเลื่อนแถบก็ได้
มีโหมด Exact Frequency สำหรับคลื่น Analogue ซึ่งช่วยเลี่ยง "Frequency steps" ที่มักพบในเครื่องกำเนิดสัญญาณแบบ Direct Digital Synthesis (DDS) ทั่วไป ทำให้ได้ความถี่ที่แม่นยำยิ่งขึ้นโดยเข้าถึงความถี่ที่อยู่ระหว่าง "Frequency steps" เหล่านั้นได้ เพราะ Output ไม่ได้ถูกหารมาจากความถี่ Clock ของ Arduino เมื่อเปิดโหมด Exact Freq
มีฟีเจอร์ Sweep Frequency (แบบ Log) สำหรับคลื่นชนิดใดชนิดหนึ่งหรือทั้งคู่ และยังมี Timer สำหรับควบคุม Output ของ Arduino ทั้งแบบ Positive และ Negative
ขอบคุณสำหรับความคิดเห็นมากมายด้านล่าง ข้อเสนอแนะบางส่วนของคุณได้ถูกนำมาใส่ไว้ในเวอร์ชันใหม่นี้แล้ว นี่คือรายการคุณสมบัติใหม่ส่วนใหญ่ (แต่ไม่ใช่ทั้งหมด):
สามารถสร้างคลื่นมาตรฐานได้หลากหลายขึ้นโดยการปรับพารามิเตอร์ของคลื่นมากมายในเมนู SETUP ซึ่งคลื่นทั้งหมดสามารถนำมาดัดแปลงและผสมกันเพื่อสร้างคลื่น Composite ทำให้เกิดเอฟเฟกต์ที่ไม่จำกัด สามารถสร้างคลื่น Sine สองลูกพร้อมกันและผสมกันเพื่อสร้างเอฟเฟกต์ Phase shift และอื่นๆ ขอบคุณ mszoke01 (ในคอมเมนต์) สำหรับแรงบันดาลใจในส่วนนี้
รูปร่างคลื่นที่คุณสร้างขึ้นใหม่ไม่เพียงแต่บันทึกเป็นไฟล์ได้เท่านั้น แต่ยังสามารถบันทึกลงใน Flash memory ของ Due ได้ในรูปแบบ Presets จำนวน 50 ช่อง ซึ่งแต่ละช่องสามารถเก็บการผสมคลื่นและคลื่น Arbitrary ได้ Presets ยังช่วยให้ทำอย่างอื่นได้อีก เช่น การสร้างเครื่องตรวจการได้ยิน (Audiometer) แบบ Stand-alone ได้ง่ายๆ ขอบคุณ chhckm (ในคอมเมนต์) สำหรับไอเดียนี้
สามารถเปลี่ยนค่าเริ่มต้นตอนเปิดเครื่องได้ (บันทึกใน Flash memory) เพื่อให้ Due เริ่มต้นทำงานด้วยรูปร่างคลื่น, ความถี่ และโหมดที่คุณเลือก รวมถึงคลื่น Arbitrary ด้วย ขอบคุณ gagarinui (ในคอมเมนต์) สำหรับไอเดียนี้
เมื่อคลิก MODULATION ในหน้าต่าง SETUP แอมพลิจูดของคลื่นจะสามารถถูกควบคุม (Modulate) ได้แบบ Real-time ด้วยแรงดันไฟฟ้าที่จ่ายเข้า Pins A2 ของ Arduino
หากการเชื่อมต่อ USB กับ Arduino หลุด ตอนนี้สามารถกู้คืนได้ด้วยการคลิกเพียงครั้งเดียว โดยไม่ต้องเริ่มโปรแกรม Controller ใหม่ และการตั้งค่าทั้งหมดของคุณจะถูกกู้คืนบน Arduino โดยอัตโนมัติ
สามารถสร้างคลื่นแบบสุ่ม (Random) ในหน้าต่างวาดภาพได้โดยคลิก AUTODRAW เพื่อหาคำว่า RANDOM แล้วคลิก DRAW
คลื่น Arbitrary ที่มีจุด Waypoints จำนวนเท่าใดก็ได้ สามารถแก้ไขได้แล้วในหน้าต่างวาดภาพ
ตอนนี้การอัปโหลดคลื่น Arbitrary ไปยัง Due ทำได้เร็วกว่า Version 1 มาก
หลังจากอัปโหลดคลื่น Arbitrary ไปยัง Due แล้ว สามารถอัปโหลดเพิ่มและต่อท้ายเข้าไปได้อีก ทำให้สร้างชุดของคลื่น Arbitrary ต่อเนื่องกันได้!
สามารถสร้าง Noise แบบ White, Pink หรือ Brown ที่แม่นยำได้โดยใช้ True Random Number Generator (TRNG) ที่มีอยู่ใน Due และการปรับค่า Noise Colour ใน SETUP จะทำให้สร้าง Noise แบบผสมระหว่างสีต่างๆ ได้ด้วย!
ถ้ายังไม่พอ คุณยังสามารถแต่งโน้ตเพลงเพื่อให้ Due เล่นโดยใช้รูปร่างคลื่นที่คุณสร้างขึ้นเองได้! หรือจะใช้เครื่องดนตรีที่มีมาให้ก็ได้แก่: Piano, Guitar, Marimba, Trumpet, Saxophone และ Violin คุณสามารถบันทึกโน้ตเพลงเป็นไฟล์ และบันทึกเพลงได้สูงสุด 50 เพลงใน Flash memory ของ Due เพื่อให้ Arduino เล่นในโหมด Stand-alone โดยใช้ Switches ได้ นอกจากนี้ยังตั้งค่าให้เพลงใดเพลงหนึ่งเล่นอัตโนมัติเมื่อเปิดเครื่องได้ด้วย!
และยังมีอีก: คุณสามารถเปลี่ยนเครื่องดนตรีได้หลายครั้งในระหว่างเพลง... และที่สำคัญ... หากเพลงนั้นใช้เครื่องดนตรีแบบ WAVE คุณสามารถเชื่อมโยงมันเข้ากับ Preset เพื่อให้ Arduino ใช้รูปร่างคลื่นที่คุณบันทึกไว้ใน Preset นั้นโดยอัตโนมัติขณะเล่น (ต้องบันทึก Preset ขณะที่หน้าต่าง Music เปิดอยู่เพื่อเปิดใช้งานฟีเจอร์นี้)
ไฟล์ Help ได้ถูกขยายเนื้อหาให้ครอบคลุมคุณสมบัติที่เพิ่มเข้ามาเหล่านี้
แม้ว่าเพลงที่สร้างจะเป็นแบบ Monophonic (เสียงเดียว) แต่ถ้าใครมี Board Due มากกว่าหนึ่งบอร์ด ก็สามารถเชื่อมต่อ I/O pins เข้าด้วยกันเพื่อให้ทุกบอร์ดเริ่มเล่นเพลงหมายเลขเดียวกันพร้อมกันได้โดยใช้ Switches ตัวเดียวกัน ดังนั้นหากคุณบันทึกเสียงเครื่องดนตรีที่ต่างกันไว้ในหมายเลขเพลงเดียวกันของแต่ละบอร์ด คุณก็จะได้เสียงแบบ Polyphony (หลายเสียง) ครับ!
มีการแก้ไข Bug เล็กน้อยและการปรับเปลี่ยนระบบ Undo เล็กน้อย แต่คุณสมบัติใหม่ที่สำคัญคือสำหรับใครที่ต้องการสร้างไฟล์คลื่น Arbitrary ด้วยตัวเอง (Manual) แทนการวาดในหน้าต่าง GUI ตอนนี้สามารถสร้างได้ใน 3 รูปแบบใหม่ที่ง่ายขึ้นรวมถึงรูปแบบเดิม โปรแกรม GUI Controller จะตรวจหาฟอร์แมตโดยอัตโนมัติเมื่อเปิดไฟล์ และสามารถบันทึกไฟล์คลื่นในฟอร์แมตที่ต้องการได้ มีไฟล์ตัวอย่างรวมมาให้ด้วย
โปรแกรม GUI Controller สำหรับ PC เป็นแบบ "Portable" จึงไม่จำเป็นต้องติดตั้ง
สำหรับผู้ใช้ Windows เพียงแตกไฟล์ .zip ลงใน Folder ที่ต้องการและสร้าง Short-cut ของไฟล์ .exe ไว้ หมายเหตุ: ไฟล์ "DueAWGController-win32.zip" สำหรับระบบ 32 bit แต่ไฟล์ 64.zip อาจทำงานได้เสถียรกว่าเพราะมีการฝัง Java มาให้ในตัว คุณอาจต้องติดตั้ง Java 8 ในเครื่องสำหรับเวอร์ชัน 32.zip
สำหรับผู้ใช้ Linux ให้แตกไฟล์ DueAWGController-linuxXX.zip ลงใน Folder แล้วดับเบิลคลิกไฟล์ DueAWGController หรือเพิ่มเข้าไปในเมนูระบบ
ไฟล์ DueAWGController-linux64.zip มี Java ฝังมาให้แล้ว สำหรับเวอร์ชันอื่นคุณควรติดตั้ง Java 8 เพื่อให้ DueAWGController แสดงผลได้อย่างถูกต้อง
คุณอาจต้องขอสิทธิ์เข้าถึง USB ก่อนเชื่อมต่อ Arduino ใน Terminal ให้พิมพ์: sudo usermod -a -G dialout $USER
นอกจากนี้ยังมีไฟล์ "arm" สองไฟล์สำหรับ Raspberry Pi ฯลฯ แต่ยังไม่ได้ผ่านการทดสอบ รบกวนแจ้งให้ผมทราบด้วยหากใช้งานได้ เพื่อเป็นประโยชน์กับผู้ใช้คนอื่นๆ
Arduino sketch ต้องการ Library เพียงตัวเดียวที่หาได้ง่าย ซึ่งใช้สำหรับเก็บค่าเริ่มต้น, Presets และเพลงลงใน Flash memory ของ Due ชื่อว่า "DueFlashStorage" สามารถหาได้ผ่านโปรแกรม Arduino IDE โดยไปที่ Tools > Manage Libraries
การอัปโหลด Arduino sketch อาจใช้เวลาสักครู่เนื่องจากมีข้อมูลจำนวนมากที่ต้องส่ง ในเวอร์ชันนี้มีการใช้หน่วยความจำโปรแกรมเกือบทั้งหมดของ Due โดย 43% ถูกใช้โดยตัวโปรแกรม และ 50% ถูกจัดสรรไว้สำหรับเก็บ Presets, คลื่น Arbitrary และเพลง ทำให้เหลือพื้นที่ว่างเพียง 7% เท่านั้น! และหน่วยความจำ RAM ประมาณ 80k จากที่มี 96k ก็ถูกใช้โดย Variable ต่างๆ เช่นกัน!
โปรแกรม GUI ควรจะค้นหาและเชื่อมต่อกับ Arduino โดยอัตโนมัติเมื่อเริ่มทำงาน จึงไม่จำเป็นต้องตั้งค่า COM port อย่างไรก็ตาม หากการเลือกอัตโนมัติล้มเหลว คุณยังสามารถเลือก COM port เองได้
มีไฟล์ตัวอย่างคลื่น Arbitrary ใน Folder Arbitrary Waves, ไฟล์โน้ตเพลงตัวอย่างใน Folder Music Scores และไฟล์การตั้งค่าใน Folder Settings เพื่อช่วยให้คุณเริ่มต้นได้ง่ายขึ้น
นอกจากโปรแกรม GUI แล้ว เครื่องกำเนิดสัญญาณรูปคลื่น Arduino ยังสามารถควบคุมผ่าน Serial Monitor ของ Arduino IDE โดยตั้งค่าที่ 115200 Baud พิมพ์ “?” (หรือตัวอักษรใดก็ได้ที่ไม่ได้ใช้งาน) เพื่อดูวิธีใช้งาน
สำหรับการใช้ Pots, Switches และ LEDs ในการควบคุม ส่วนต้นของ Arduino sketch จะมีรายการการเชื่อมต่อ Pins บอกไว้ อย่างไรก็ตาม คุณยังคงต้องใช้โปรแกรม GUI ในการสร้างโน้ตเพลงและเพลงต่างๆ
การเชื่อมต่อ Pins สำหรับ Wave output: เชื่อมต่อ Pins 3 และ 7 ของ Arduino เข้าด้วยกันด้วยสายจัมเปอร์ (หรือ Resistor ค่าต่ำประมาณ 47 ohms) นำสัญญาณคลื่น Square ออกจาก Pin 7 หากใช้ Resistor และนำสัญญาณคลื่น Analogue ออกจาก DAC0 สามารถใช้ DAC1 แทนได้โดยทำตามคำแนะนำง่ายๆ ที่ส่วนท้ายสุดของไฟล์ .ino
หากเชื่อมต่อกับ Amplifier ภายนอก ฯลฯ คุณจำเป็นต้องใช้ Coupling capacitor เนื่องจากคลื่นที่สร้างขึ้นจะมี DC bias อยู่ที่ครึ่งหนึ่งของแรงดันไฟเลี้ยง Arduino (3.3V) นอกจากนี้ ขอแนะนำเป็นอย่างยิ่งให้คุณใช้วงจรป้องกัน เช่น วงจรที่แนะนำด้านล่าง มิฉะนั้นเพียงแค่ไฟฟ้าสถิตเพียงเล็กน้อยก็จะทำลาย Pins Output ของ Arduino ทันที เหตุการณ์นี้เกิดขึ้นบ่อยมาก ดังนั้นอย่าเสี่ยง! สำหรับการป้องกันไฟฟ้าสถิตของ Analogue output เพียงอย่างเดียว ใช้ชิ้นส่วนแค่สองชิ้นเท่านั้น (ดูด้านล่าง) วงจรควรเชื่อมต่อโดยตรงกับ Arduino ก่อนถึง Coupling capacitor
วงจรนี้สามารถตัดออกได้ทั้งหมด แต่หากใช้งาน มันจะช่วยปกป้อง Arduino จากการเผลอต่อ Output เข้ากับแรงดันไฟฟ้าที่สูงถึงอย่างน้อยบวกและลบ 30V โดยไม่ทำให้ Square wave rise and fall times เพิ่มขึ้นอย่างมีนัยสำคัญ Diodes ที่ใช้ต้องเป็นชนิดทนกระแสสูง D2 และ D3 (สำหรับคลื่น Square เท่านั้น) ต้องเป็น Fast recovery diodes หากใช้ความถี่สูงมาก - ผมพบว่า Schottky diodes นั้นช้าไปนิดหน่อย ส่วน Fuses (F1 และ F2) สามารถใช้เป็น Polyfuses ได้
หากใช้เฉพาะ Analogue output เพื่อต่อกับ Amplifier (เช่น สำหรับฟังเพลง) ใช้เพียง ZD1 และ R1 สำหรับป้องกันไฟฟ้าสถิต (ก่อนถึง Coupling capacitor) ZD1 สามารถใช้ชนิดทนกระแสต่ำและแรงดันไฟฟ้าที่สูงขึ้นได้หากจำเป็นแต่ห้ามต่ำกว่านี้ และให้ R1 มีค่าสูงขึ้นมาก (ประมาณ 1 – 5k) ใช้เพียงอุปกรณ์ที่ไม่ซับซ้อนแค่สองชิ้น ดังนั้นอย่าเสี่ยงทำ Arduino ของคุณพัง! (หมายเหตุ: การเพิ่ม Resistor ตัวที่สองอนุกรมกับ Coupling capacitor จะช่วยป้องกัน ZD1 ได้หากเป็นชนิดทนกระแสต่ำ)
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้