วิธีการทำงานแบบขนาน (Threads) ในโปรแกรม Arduino

สารบัญ:

วิธีการทำงานแบบขนาน (Threads) ในโปรแกรม Arduino
วิธีการทำงานแบบขนาน (Threads) ในโปรแกรม Arduino

วีดีโอ: วิธีการทำงานแบบขนาน (Threads) ในโปรแกรม Arduino

วีดีโอ: วิธีการทำงานแบบขนาน (Threads) ในโปรแกรม Arduino
วีดีโอ: How to run 57 hard real-time threads on an Arduino Uno 2024, อาจ
Anonim

ในเทคโนโลยีไมโครโปรเซสเซอร์ งานที่ทำงานพร้อมกันเรียกว่าเธรด สะดวกมากเพราะมักจำเป็นต้องดำเนินการหลายอย่างพร้อมกัน เป็นไปได้ไหมที่จะทำให้ไมโครคอนโทรลเลอร์ Arduino ทำงานหลายอย่างพร้อมกัน เหมือนตัวประมวลผลจริง มาดูกัน.

สตรีมแบบขนานในโปรแกรม Arduino
สตรีมแบบขนานในโปรแกรม Arduino

มันจำเป็น

  • - Arduino;
  • - 1 LED;
  • - ออดเซอร์ 1 ตัว

คำแนะนำ

ขั้นตอนที่ 1

โดยทั่วไป Arduino ไม่รองรับการขนานที่แท้จริงหรือมัลติเธรด

แต่คุณสามารถบอกให้ไมโครคอนโทรลเลอร์ตรวจสอบว่าถึงเวลาแล้วหรือยังที่จะทำงานเบื้องหลังเพิ่มเติมในการทำซ้ำของวงจร "loop ()" แต่ละครั้ง ในกรณีนี้ดูเหมือนว่าผู้ใช้จะดำเนินการหลายอย่างพร้อมกัน

ตัวอย่างเช่น ให้ไฟ LED กะพริบที่ความถี่ที่กำหนดและปล่อยเสียงที่ขึ้นและลงเหมือนไซเรนจากตัวปล่อยแบบเพียโซอิเล็กทริก

เราได้เชื่อมต่อทั้ง LED และ piezo emitter กับ Arduino มากกว่าหนึ่งครั้ง มาประกอบวงจรกันตามรูปเลยครับ หากคุณกำลังเชื่อมต่อ LED กับพินดิจิตอลอื่นที่ไม่ใช่ "13" อย่าลืมมีตัวต้านทานจำกัดกระแสที่ประมาณ 220 โอห์ม

แผนภาพการเดินสายไฟสำหรับออดและ LED ไปยัง Arduino
แผนภาพการเดินสายไฟสำหรับออดและ LED ไปยัง Arduino

ขั้นตอนที่ 2

มาเขียนสเก็ตช์แบบนี้และอัปโหลดไปยัง Arduino

หลังจากโหลดบอร์ดแล้ว คุณจะเห็นว่าภาพสเก็ตช์ไม่ได้ทำงานตรงตามที่เราต้องการ: จนกว่าไซเรนจะทำงานเต็มที่ ไฟ LED จะไม่กะพริบ และเราต้องการให้ไฟ LED กะพริบระหว่างที่เสียงไซเรนดังขึ้น ปัญหาที่นี่คืออะไร?

ความจริงก็คือปัญหานี้ไม่สามารถแก้ไขได้ตามปกติ งานจะดำเนินการโดยไมโครคอนโทรลเลอร์ตามลำดับอย่างเคร่งครัด โอเปอเรเตอร์ "delay ()" ทำให้การทำงานของโปรแกรมล่าช้าตามระยะเวลาที่กำหนด และจนกว่าจะหมดเวลานี้ คำสั่งโปรแกรมต่อไปนี้จะไม่ทำงาน ด้วยเหตุนี้ เราจึงไม่สามารถกำหนดระยะเวลาดำเนินการที่แตกต่างกันสำหรับแต่ละงานใน "loop ()" ของโปรแกรมได้

ดังนั้นคุณต้องจำลองการทำงานหลายอย่างพร้อมกัน

Beeper และการควบคุม LED ในซีรีส์
Beeper และการควบคุม LED ในซีรีส์

ขั้นตอนที่ 3

ตัวเลือกที่ Arduino จะทำงานแบบขนานเทียมนั้นแนะนำโดยนักพัฒนา Arduino ในบทความ

สาระสำคัญของวิธีการคือการวนซ้ำ "loop ()" แต่ละครั้ง เราจะตรวจสอบว่าถึงเวลาที่จะต้องกะพริบไฟ LED (เพื่อทำงานเบื้องหลัง) หรือไม่ และถ้าเป็นเช่นนั้น เราก็สลับสถานะของ LED นี่เป็นการเลี่ยงผ่านตัวดำเนินการ "delay ()"

ข้อเสียที่สำคัญของวิธีนี้คือต้องดำเนินการส่วนรหัสด้านหน้าชุดควบคุม LED เร็วกว่าช่วงเวลาที่กะพริบของ LED "ledInterval" มิฉะนั้น การกะพริบจะเกิดขึ้นน้อยกว่าที่จำเป็น และเราจะไม่ได้รับผลกระทบจากการทำงานแบบคู่ขนาน โดยเฉพาะอย่างยิ่ง ในภาพร่างของเรา ระยะเวลาของการเปลี่ยนแปลงเสียงไซเรนคือ 200 + 200 + 200 + 200 = 800 มิลลิวินาที และเราตั้งช่วงเวลาการกะพริบของ LED เป็น 200 มิลลิวินาที แต่ไฟ LED จะกะพริบเป็นระยะเวลา 800 มิลลิวินาที ซึ่งแตกต่างจากที่เราตั้งไว้ 4 เท่า โดยทั่วไป หากใช้โอเปอเรเตอร์ "delay ()" ในโค้ด การจำลองคู่ขนานเทียมจะเป็นเรื่องยาก ดังนั้นจึงแนะนำให้หลีกเลี่ยง

ในกรณีนี้ หน่วยควบคุมเสียงไซเรนจะต้องตรวจสอบด้วยว่าถึงเวลาหรือไม่ และไม่ควรใช้ "การหน่วงเวลา ()" แต่สิ่งนี้จะเพิ่มจำนวนโค้ดและทำให้ความสามารถในการอ่านของโปรแกรมแย่ลง

ไฟ LED กะพริบโดยไม่ชักช้า () ตัวดำเนินการ
ไฟ LED กะพริบโดยไม่ชักช้า () ตัวดำเนินการ

ขั้นตอนที่ 4

เพื่อแก้ปัญหานี้ เราจะใช้ไลบรารี ArduinoThread ที่ยอดเยี่ยม ซึ่งช่วยให้คุณสามารถสร้างกระบวนการขนานเทียมได้อย่างง่ายดาย มันทำงานในลักษณะเดียวกัน แต่ช่วยให้คุณไม่ต้องเขียนโค้ดเพื่อตรวจสอบเวลา ไม่ว่าคุณจะต้องดำเนินการงานในลูปนี้หรือไม่ก็ตาม ซึ่งจะช่วยลดจำนวนโค้ดและปรับปรุงความสามารถในการอ่านแบบร่าง มาดูการทำงานของห้องสมุดกัน

ก่อนอื่น ดาวน์โหลดไฟล์เก็บถาวรของไลบรารีจากเว็บไซต์ทางการ https://github.com/ivansedel/ArduinoThread/archive/master.zip และแตกไฟล์ลงในไดเร็กทอรี "ไลบรารี" ของ Arduino IDE จากนั้นเปลี่ยนชื่อโฟลเดอร์ "ArduinoThread-master" เป็น "ArduinoThread"

การติดตั้งไลบรารี ArduinoThread
การติดตั้งไลบรารี ArduinoThread

ขั้นตอนที่ 5

แผนภาพการเชื่อมต่อจะยังคงเหมือนเดิม เฉพาะรหัสโปรแกรมเท่านั้นที่จะเปลี่ยน ตอนนี้มันจะเหมือนกับในแถบด้านข้าง

ในโปรแกรม เราสร้างสตรีมสองสตรีม โดยแต่ละสตรีมมีการทำงานของตัวเอง: สตรีมหนึ่งกะพริบพร้อมไฟ LED และสตรีมที่สองควบคุมเสียงไซเรน ในการวนซ้ำแต่ละครั้ง สำหรับแต่ละเธรด เราจะตรวจสอบว่าถึงเวลาสำหรับการดำเนินการแล้วหรือยัง หากมาถึง จะมีการเปิดใช้เพื่อดำเนินการโดยใช้วิธี "run ()" สิ่งสำคัญคืออย่าใช้ตัวดำเนินการ "delay ()"

คำอธิบายโดยละเอียดเพิ่มเติมมีอยู่ในรหัส

มาโหลดโค้ดลงในหน่วยความจำ Arduino กันเถอะ ตอนนี้ทุกอย่างทำงานได้ตามที่ควรจะเป็น!

แนะนำ: