หน้าแรก ดูโปรเจกต์ทั้งหมด
Expert

โปรเจกต์ อีกหนึ่ง Virtual Oscilloscope สำหรับ Arduino

เปลี่ยน Arduino ของคุณให้เป็น Virtual Oscilloscope พร้อม Sampling Rate ขนาด 4.8 kHz

โปรเจกต์ อีกหนึ่ง Virtual Oscilloscope สำหรับ Arduino

รายการอุปกรณ์และเครื่องมือ

1x Arduino UNO
-
1x Jumper wires (generic)
-

รายละเอียดและวิธีทำ

โปรเจกต์นี้ใช้ on-chip ADC เพื่อดักจับและแสดงผล signal waveform รองรับ trigger modes ที่หลากหลาย (รวมถึง external triggering) ช่วยให้ผู้ใช้สามารถเลือก analog input channel, reference voltage และควบคุม MCU pins ได้ แอปพลิเคชันบน PC ที่ใช้ในโปรเจกต์นี้อ้างอิงจาก open source platform Simple Device Model (ผู้พัฒนาคือตัวผมเอง) รองรับทั้ง Windows และ Linux โปรเจกต์นี้ผ่านการทดสอบบนบอร์ด Arduino Uno และอาจจะทำงานได้หรือไม่ได้บนบอร์ด Arduino อื่นๆ ที่ใช้สถาปัตยกรรม AVR

หมายเหตุ: ด้วย sampling frequency ที่ 4808 Hz โปรเจกต์นี้จึงไม่สามารถนำไปใช้งานแทน oscilloscope จริงๆ ได้

การเริ่มต้นใช้งาน

1. เชื่อมต่อ Arduino ของคุณเข้ากับคอมพิวเตอร์ด้วยสาย USB และอัปโหลด sketch นี้ โดยใช้ Arduino IDE ให้จดจำชื่อของ serial port ที่บอร์ดใช้งาน (เช่น COM3 บน Windows หรือ /dev/ttyACM0 บน Linux)

2. ดาวน์โหลดและติดตั้ง Simple Device Model framework

3. เปิดใช้งาน sdmconsole, กดปุ่ม Open plugin และเลือก UART demo เป็น plugin และเลือก Arduino Uno เป็น device

4. ในบริเวณมุมซ้ายบนของหน้าต่าง sdmconsole ให้คลิกขวาที่รายการ Arduino Uno แล้วเลือก Connect จากนั้นป้อนชื่อ serial port ที่จดไว้ก่อนหน้านี้

5. ขณะนี้ oscilloscope ควรจะทำงานบน analog channel A0 หากไม่มีอะไรเชื่อมต่ออยู่ คุณอาจจะเห็นสัญญาณรบกวน 50 Hz (หรือ 60 Hz ขึ้นอยู่กับพื้นที่ที่คุณอาศัยอยู่)

6. เชื่อมต่อ digital pin 3 เข้ากับ analog input A0 ด้วยสายไฟ ในบริเวณมุมขวาบน ให้ตั้งค่า Pin 3 mode เป็น PWM และตั้งค่า Pin3 PWM value เป็น 100 ดับเบิลคลิกที่บริเวณ viewport เพื่อ reset scale คุณควรจะเห็น PWM waveform รูปสี่เหลี่ยมปรากฏขึ้น:

7. หากคุณต้องการให้สัญญาณเรียบเนียนขึ้น ให้ต่อ RC circuit ระหว่าง output และ input โดยใช้ resistor ขนาดประมาณ 100 kOhm และ ceramic capacitor ขนาดประมาณ 1 uF

คุณสมบัติพื้นฐาน

ในแผงการตั้งค่ามุมขวาบน สามารถเลือก ADC input channel และ reference voltage ได้ นอกจากนี้ยังสามารถตั้งค่า temperature sensor ในตัวให้เป็น input channel ได้อีกด้วย โปรดทราบว่า temperature sensor นี้มีความแม่นยำไม่มากนัก

Packet size ใช้สำหรับกำหนดจำนวน sample ใน waveform ที่แสดงผล และยังมีผลต่อ refresh rate อีกด้วย สำหรับสัญญาณที่มีคาบเวลา (periodic signals) การตั้งค่า packet size ให้พอดีกับจำนวนคาบที่สมบูรณ์จะช่วยให้การแสดงผลดีขึ้น แม้จะไม่ได้ใช้ synchronization ก็ตาม

ส่วนของ Pin settings ช่วยให้คุณสามารถตั้งค่าสถานะของ pins 2-13 บน MCU ได้ สถานะที่เป็นไปได้คือ Input, Input with pullup, Force low และ Force high สำหรับ pins ที่รองรับ PWM (pulse-width modulation) ก็สามารถตั้งค่าให้อยู่ในโหมดนั้นได้เช่นกัน

โหมดการแสดงผล (Visualization)

นอกเหนือจากโหมด "oscilloscope" พื้นฐานแล้ว sdmconsole ยังสามารถแสดงผลข้อมูลในรูปแบบ bar chart, image (ที่ความสว่างของ pixel แทนค่า sample) หรือ binary chart (ที่ความสว่างของ pixel แทนค่า bit เดี่ยว) โดยสามารถเปลี่ยนโหมดการแสดงผลได้ที่เมนู Mode

คุณสามารถเลื่อนไปมาในบริเวณ viewport ได้โดยการลาก เปลี่ยน vertical scale ด้วย Ctrl+mouse wheel และเปลี่ยน horizontal scale ด้วย Ctrl+Shift+mouse wheel การดับเบิลคลิกในบริเวณ viewport จะเป็นการ reset scale ให้พอดีกับภาพทั้งหมด

การ Trigger

Sync mode ใช้สำหรับตั้งค่า trigger mode ได้แก่ Off, Rising edge หรือ Falling edge โดยปกติแล้ว oscilloscope จะถูก trigger ด้วยสัญญาณเดียวกับที่เลือกไว้เป็น analog input แต่ก็สามารถเลือก trigger ด้วย digital pin ได้เช่นกัน โดยเลือกที่รายการ Sync source

เมื่อใช้ analog input เป็น sync source ตัว oscilloscope จะถูก trigger เมื่อสัญญาณสูงกว่าหรือต่ำกว่า Sync level (ขึ้นอยู่กับ sync edge) โดยค่า Sync level จะถูกเพิกเฉยเมื่อใช้ digital pin เป็น sync source

Sync offset ใช้กำหนดจำนวน sample ก่อนการ trigger ที่จะถูกแสดงผล

ระบบ trigger นี้เป็นแบบพื้นฐานและทำงานได้ดีพอสมควรสำหรับเหตุการณ์เดี่ยว (single events) และสัญญาณความถี่ต่ำ สำหรับสัญญาณความถี่สูง การตั้งค่า packet size ที่เหมาะสมบางครั้งอาจให้ผลลัพธ์ที่ดีกว่า

เจาะลึกการทำงานภายใน

เพื่อให้ได้ sampling frequency ที่คงที่ สัญญาณจะถูกสุ่มตัวอย่างโดยการตั้งค่า ADC ให้อยู่ใน free running mode ซึ่งจะทำการแปลงสัญญาณอย่างต่อเนื่องและสร้าง interrupt เมื่อข้อมูลพร้อมใช้งาน เนื่องจากข้อจำกัดของ serial port throughput จึงมีการนำข้อมูลมาใช้เพียง 1 ใน 2 sample เท่านั้น วิธีการนี้ช่วยหลีกเลี่ยงอาการ jitter ที่อาจเกิดขึ้นหากการแปลงสัญญาณแต่ละครั้งถูกสั่งการโดย CPU

oscilloscope ถูกควบคุมโดยใช้ virtual address space: การเขียนค่าลงใน register address ที่กำหนดจะถูกตีความว่าเป็นคำสั่งหรือข้อมูลการตั้งค่า ตัวอย่างเช่น การเขียนค่า 3 ลงใน register address 0 จะเป็นการเลือก analog input channel A3

การตั้งค่า Serial port คือ: 115200 baud, 8 data bits, 1 stop bit, no parity, no flow control

communication protocol ใช้ frame สี่ประเภท:

Write register (PC -> Arduino):

01010000 ADDR[7:0] DATA[7:0]

Read register (PC -> Arduino):

01010001 ADDR[7:0]

Register data (Arduino -> PC):

1000 DATA[7:4] 0000 DATA[3:0]

Stream data (Arduino -> PC):

11 SOP DATA[9:5] 000 DATA[4:0]

(SOP คือ flag สำหรับ "start of frame")

ด้วย protocol นี้ แต่ละ sample จะใช้พื้นที่เพียง 2 bytes ในการส่งข้อมูล ในขณะที่ยังสามารถแยกแยะระหว่าง register และ stream data frames ได้

ในฝั่ง PC ตัว protocol ถูกเขียนขึ้นโดย uartdemo plugin ซึ่งช่วยให้ sdmconsole สามารถสื่อสารกับ oscilloscope ได้ โดย sources ของ plugin นี้จะมีมาให้พร้อมกับ SDM (ใน directory examples) ตัว plugin เขียนด้วยภาษา C++ และทำหน้าที่เขียนและอ่านค่า register รวมถึงอ่าน stream data จาก oscilloscope

วิธีที่ง่ายที่สุดในการขยายขีดความสามารถของ oscilloscope คือการแก้ไข virtual address space (นั่นคือฟังก์ชัน writeVirtualRegister และ readVirtualRegister) จากนั้นจึงเพิ่ม register ใหม่เข้าไปใน register map ซึ่งผู้ใช้สามารถแก้ไขได้อย่างอิสระ (แต่อย่าลืมบันทึกข้อมูล) หากต้องการเปลี่ยน communication protocol คุณจำเป็นต้องแก้ไขและ recompile uartdemo plugin sources ใหม่ด้วย

Code

🔒 ปลดล็อก Code

สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้

รหัสอ้างอิงโปรเจกต์: yet-another-virtual-oscilloscope-for-arduino-2b77fc
1499 บาท
PromptPay QR Code