- มันทำงานอย่างไร
- ส่วนประกอบที่จำเป็น
- แผนงาน
- รหัส Arduino Osclloscope
- สคริปต์ Python (พลอตเตอร์)
- รหัส Arduino
- Arduino Oscilloscope ในการดำเนินการ
ออสซิลโลสโคปเป็นหนึ่งในเครื่องมือที่สำคัญที่สุดที่คุณจะพบได้บนโต๊ะทำงานของวิศวกรอิเล็กทรอนิกส์หรือผู้ผลิต โดยหลักแล้วจะใช้สำหรับการดูรูปคลื่นและกำหนดระดับแรงดันความถี่เสียงและพารามิเตอร์อื่น ๆ ของสัญญาณที่ใช้กับอินพุตที่อาจเปลี่ยนแปลงเมื่อเวลาผ่านไป นอกจากนี้ยังใช้โดยนักพัฒนาซอฟต์แวร์แบบฝังสำหรับการดีบักโค้ดและช่างเทคนิคในการแก้ไขปัญหาอุปกรณ์อิเล็กทรอนิกส์ระหว่างการซ่อมแซม เหตุผลเหล่านี้ทำให้ออสซิลโลสโคปเป็นเครื่องมือที่จำเป็นสำหรับวิศวกรทุกคน ปัญหาเดียวคืออาจมีราคาแพงมากออสซิลโลสโคปที่ทำหน้าที่พื้นฐานที่สุดโดยมีความแม่นยำน้อยที่สุดอาจมีราคาแพงถึง 45 ถึง 100 เหรียญในขณะที่ขั้นสูงและมีประสิทธิภาพจะมีราคาสูงกว่า 150 เหรียญ วันนี้ผมจะมาสาธิตวิธีการใช้งานArduinoและซอฟต์แวร์ซึ่งจะได้รับการพัฒนาด้วย Python ภาษาโปรแกรมโปรดของฉันเพื่อสร้างออสซิลโลสโคป Arduino 4 ช่องราคาประหยัดที่สามารถทำงานที่มีการติดตั้งออสซิลโลสโคปราคาถูกบางตัวเช่นการแสดงรูปคลื่นและการกำหนดระดับแรงดันไฟฟ้า สำหรับสัญญาณ
มันทำงานอย่างไร
โครงการนี้มีสองส่วน
- ตัวแปลงข้อมูล
- พลอตเตอร์
โดยทั่วไปแล้วออสซิลโลสโคปเกี่ยวข้องกับการแสดงภาพของสัญญาณแอนะล็อกที่ใช้กับช่องสัญญาณอินพุต เพื่อให้บรรลุเป้าหมายนี้เราต้องแปลงสัญญาณจากอนาล็อกเป็นดิจิตอลก่อนจากนั้นจึงวางแผนข้อมูล สำหรับการแปลงเราจะใช้ประโยชน์จากADC (ตัวแปลงอนาล็อกเป็นดิจิตอล)บนไมโครคอนโทรลเลอร์ atmega328p ที่ Arduino ใช้เพื่อแปลงข้อมูลอนาล็อกที่อินพุตสัญญาณเป็นสัญญาณดิจิทัล หลังจากการแปลงค่าต่อครั้งจะถูกส่งผ่าน UART จาก Arduino ไปยังพีซีซึ่งซอฟต์แวร์พล็อตเตอร์ซึ่งจะพัฒนาโดยใช้ python จะแปลงกระแสข้อมูลขาเข้าเป็นรูปคลื่นโดยการพล็อตข้อมูลแต่ละครั้งตามเวลา
ส่วนประกอบที่จำเป็น
ต้องใช้ส่วนประกอบต่อไปนี้เพื่อสร้างโครงการนี้
- Arduino Uno (สามารถใช้บอร์ดอื่น ๆ ได้)
- เขียงหั่นขนม
- ตัวต้านทาน 10k (1)
- แอลดีอาร์ (1)
- สายจัมเปอร์
โปรแกรมที่จำเป็น
- Arduino IDE
- Python
- ไลบรารี Python: Pyserial, Matplotlib, Drawnow
แผนงาน
แผนผังสำหรับArduino Oscilloscopeนั้นง่ายมาก สิ่งที่เราต้องทำคือเชื่อมต่อสัญญาณที่จะตรวจสอบกับขาอนาล็อกที่ระบุของ Arduino อย่างไรก็ตามเราจะใช้ LDRในการตั้งค่าตัวแบ่งแรงดันไฟฟ้าอย่างง่ายเพื่อสร้างสัญญาณที่จะตรวจสอบเพื่อให้รูปคลื่นที่สร้างขึ้นจะอธิบายระดับแรงดันไฟฟ้าโดยพิจารณาจากความเข้มของแสงรอบ ๆ LDR
เชื่อมต่อส่วนประกอบตามที่แสดงในแผนผังด้านล่าง
หลังจากเชื่อมต่อแล้วการตั้งค่าควรเป็นไปตามภาพด้านล่าง
เมื่อเชื่อมต่อเสร็จแล้วเราสามารถเขียนโค้ดต่อไปได้
รหัส Arduino Osclloscope
เราจะเขียนโค้ดสำหรับแต่ละส่วนของทั้งสองส่วน สำหรับ Plotterดังที่กล่าวไว้ก่อนหน้านี้เราจะเขียนสคริปต์ python ที่รับข้อมูลจาก Arduino ผ่าน UART และ Plots ในขณะที่สำหรับตัวแปลงเราจะเขียนร่าง Arduino ที่รับข้อมูลจาก ADC และแปลงเป็น ระดับแรงดันไฟฟ้าที่ส่งไปยังพล็อตเตอร์
สคริปต์ Python (พลอตเตอร์)
เนื่องจากโค้ด python มีความซับซ้อนมากขึ้นเราจะเริ่มต้นด้วย
เราจะใช้ห้องสมุดสองสามแห่ง ได้แก่ Drawow, Matplotlib และ Pyserial ด้วยสคริปต์ python ตามที่กล่าวไว้ก่อนหน้านี้ Pyserial ช่วยให้เราสร้างสคริปต์ python ที่สามารถสื่อสารผ่านพอร์ตอนุกรม Matplotlib ช่วยให้เราสามารถสร้างพล็อตจากข้อมูลที่ได้รับผ่านพอร์ตอนุกรมและ Drawow เป็นวิธีการที่เราสามารถอัปเดตพล็อตตามเวลาจริง
มีหลายวิธีในการติดตั้งแพคเกจเหล่านี้บนเครื่องคอมพิวเตอร์ของคุณจะง่ายที่สุดในการเป็นทางpip สามารถติดตั้ง Pip ผ่านบรรทัดคำสั่งบนเครื่อง windows หรือ linux PIP บรรจุด้วย python3 ดังนั้นฉันจะแนะนำให้คุณติดตั้ง python3 และทำเครื่องหมายในช่องเกี่ยวกับการเพิ่ม python ในเส้นทาง หากคุณมีปัญหาในการติดตั้ง pip โปรดดูคำแนะนำจากเว็บไซต์ python อย่างเป็นทางการ
เมื่อติดตั้ง pipเราสามารถติดตั้งไลบรารีอื่น ๆ ที่เราต้องการได้แล้ว
เปิดพรอมต์คำสั่งสำหรับผู้ใช้ windows เทอร์มินัลสำหรับผู้ใช้ linux และป้อนข้อมูลต่อไปนี้
pip ติดตั้ง pyserial
เมื่อเสร็จแล้วให้ติดตั้ง matplotlib โดยใช้;
pip ติดตั้ง matplotlib
บางครั้ง Drawnow ถูกติดตั้งควบคู่ไปกับ matplotlib แต่เพื่อความแน่ใจให้รัน;
pip ติดตั้ง Drawow
เมื่อการติดตั้งเสร็จสมบูรณ์เราก็พร้อมที่จะเขียนสคริปต์ python
สคริปต์ python สำหรับโปรเจ็กต์นี้คล้ายกับที่ฉันเขียนสำหรับ Oscilloscope ที่ใช้ Raspberry Pi
เราเริ่มต้นด้วยการนำเข้าไลบรารีทั้งหมดที่จำเป็นสำหรับรหัส
เวลานำเข้า matplotlib.pyplot เป็น plt จากการนำเข้า Drawow * นำเข้า pyserial
ต่อไปเราจะสร้างและเริ่มต้นตัวแปรที่จะใช้ระหว่างโค้ด อาร์เรย์ Val จะใช้ในการจัดเก็บข้อมูลที่ได้รับจากพอร์ตอนุกรมและ CNT จะใช้ในการนับ ข้อมูลที่ตำแหน่ง 0 จะถูกลบหลังจากทุกๆ 50 ข้อมูลนับ สิ่งนี้ทำเพื่อให้ข้อมูลแสดงบนออสซิลโลสโคป
Val = cnt = 0
ต่อไปเราจะสร้างวัตถุพอร์ตอนุกรมซึ่ง Arduino จะสื่อสารกับสคริปต์ python ของเรา ตรวจสอบว่าพอร์ต com ที่ระบุด้านล่างเป็นพอร์ต com เดียวกับที่บอร์ด Arduino ของคุณสื่อสารกับ IDE อัตรารับส่งข้อมูล 115200 ที่ใช้ข้างต้นใช้เพื่อให้แน่ใจว่าการสื่อสารความเร็วสูงกับ Arduino เพื่อป้องกันข้อผิดพลาดต้องเปิดใช้งานพอร์ตอนุกรม Arduino เพื่อสื่อสารกับอัตราการส่งข้อมูลนี้
port = serial.Serial ('COM4', 115200, หมดเวลา = 0.5)
ต่อไปเราสร้างพล็อตแบบโต้ตอบโดยใช้;
plt.ion ()
เราจำเป็นต้องสร้างฟังก์ชันเพื่อสร้างพล็อตจากข้อมูลที่ได้รับสร้างขีด จำกัด บนและต่ำสุดที่เราคาดหวังซึ่งในกรณีนี้คือ 1023 ตามความละเอียดของ ADC ของ Arduino นอกจากนี้เรายังตั้งชื่อติดป้ายกำกับแต่ละแกนและเพิ่มคำอธิบายเพื่อให้ระบุพล็อตได้ง่าย
# สร้างฟังก์ชันรูป def makeFig (): plt.ylim (-1023,1023) plt.title ('Osciloscope') plt.grid (True) plt.ylabel ('ADC outputs') plt.plot (val, 'ro - ', label =' ช่อง 0 ') plt.legend (loc =' ขวาล่าง ')
เมื่อเสร็จแล้วเราก็พร้อมที่จะเขียน ลูป หลักที่รับข้อมูลจากพอร์ตอนุกรมเมื่อพร้อมใช้งานและลงจุด ในการซิงโครไนซ์กับ Arduino ข้อมูลการจับมือจะถูกส่งไปยัง Arduino โดยสคริปต์ pythonเพื่อระบุความพร้อมในการอ่านข้อมูล เมื่อ Arduino ได้รับข้อมูลการจับมือจะตอบกลับด้วยข้อมูลจาก ADC หากไม่มีการจับมือกันนี้เราจะไม่สามารถพล็อตข้อมูลแบบเรียลไทม์ได้
ในขณะที่ (True): port.write (b's ') #handshake กับ Arduino if (port.inWaiting ()): # ถ้า arduino ตอบกลับ ค่า = port.readline () # อ่าน พิมพ์ ตอบกลับ(ค่า) #print เพื่อให้เราสามารถ monitor it number = int (value) # แปลงข้อมูลที่ได้รับเป็นการ พิมพ์ จำนวนเต็ม('Channel 0: {0}'. format (number)) # Sleep เป็นเวลาครึ่งวินาที time.sleep (0.01) val.append (int (number)) drawow (makeFig) #update plot เพื่อสะท้อนการป้อนข้อมูลใหม่ plt.pause (.000001) cnt = cnt + 1 if (cnt> 50): val.pop (0) # เก็บพล็อตใหม่โดยการลบข้อมูลที่ตำแหน่ง 0
รหัสหลามที่สมบูรณ์แบบสำหรับสโคป Arduinoจะได้รับในตอนท้ายของบทความนี้ที่แสดงด้านล่าง
รหัส Arduino
รหัสที่สองคือร่าง Arduino เพื่อรับข้อมูลที่เป็นตัวแทนของสัญญาณจาก ADC จากนั้นรอรับสัญญาณการจับมือจากซอฟต์แวร์พล็อตเตอร์ ทันทีที่ได้รับสัญญาณการจับมือระบบจะส่งข้อมูลที่ได้มาไปยังซอฟต์แวร์พล็อตเตอร์ผ่าน UART
เราเริ่มต้นด้วยการประกาศพินของขาอนาล็อกของ Arduino ที่จะใช้สัญญาณ
int sensorpin = A0;
ต่อไปเราจะเริ่มต้นและเริ่มการสื่อสารแบบอนุกรมด้วยอัตราการส่งข้อมูล 115200
การตั้งค่าเป็นโมฆะ () { // เริ่มต้นการสื่อสารแบบอนุกรมที่ 115200 บิตต่อวินาทีเพื่อให้ตรงกับสคริปต์ python: Serial.begin (115200); }
สุดท้าย ฟังก์ชัน voidloop () ซึ่งจัดการการอ่านข้อมูลและส่งข้อมูลผ่านอนุกรมไปยังพล็อตเตอร์
void loop () { // อ่านอินพุตบนอะนาล็อกพิน 0: float sensorValue = analogRead (sensorpin); ข้อมูลไบต์ = Serial.read (); ถ้า (data == 's') { Serial.println (sensorValue); ล่าช้า (10); // หน่วงเวลาระหว่างการอ่านเพื่อความเสถียร } }
รหัสArduino Oscilloscope ที่สมบูรณ์มีให้ด้านล่างและในตอนท้ายของบทความนี้ที่แสดงด้านล่าง
int sensorpin = A0; การตั้งค่าเป็นโมฆะ () { // เริ่มต้นการสื่อสารแบบอนุกรมที่ 115200 บิตต่อวินาทีเพื่อให้ตรงกับสคริปต์ python: Serial.begin (115200); } void loop () { // อ่านอินพุตบนพินอะนาล็อก 0: ################################## ###################### เซ็นเซอร์ลอยค่า = analogRead (sensorpin); ข้อมูลไบต์ = Serial.read (); ถ้า (data == 's') { Serial.println (sensorValue); ล่าช้า (10); // หน่วงเวลาระหว่างการอ่านเพื่อความเสถียร } }
Arduino Oscilloscope ในการดำเนินการ
อัปโหลดรหัสไปที่การตั้งค่า Arduino และเรียกใช้สคริปต์ python คุณควรเห็นข้อมูลเริ่มสตรีมผ่านทางบรรทัดคำสั่ง python และพล็อตที่แปรผันตามความเข้มของแสงดังที่แสดงในภาพด้านล่าง
นี่คือวิธีที่ Arduino สามารถใช้เป็นออสซิลโลสโคปได้นอกจากนี้ยังสามารถทำได้โดยใช้ Raspberry pi ดูบทช่วยสอนที่สมบูรณ์เกี่ยวกับ Oscilloscope จาก Raspberry Pi