Arduino хөтөлбөрт параллель даалгавруудыг хэрхэн яаж хийх вэ?

Агуулгын хүснэгт:

Arduino хөтөлбөрт параллель даалгавруудыг хэрхэн яаж хийх вэ?
Arduino хөтөлбөрт параллель даалгавруудыг хэрхэн яаж хийх вэ?

Видео: Arduino хөтөлбөрт параллель даалгавруудыг хэрхэн яаж хийх вэ?

Видео: Arduino хөтөлбөрт параллель даалгавруудыг хэрхэн яаж хийх вэ?
Видео: Arduino дээр олон ажлыг хэрхэн хийх вэ | Эхлэгчдэд | millis() функц 2024, May
Anonim

Микропроцессор технологид зэрэгцэн орших ажлуудыг Thread гэж нэрлэдэг. Энэ нь маш тохиромжтой, учир нь хэд хэдэн үйлдлийг нэгэн зэрэг хийх шаардлагатай байдаг. Arduino микроконтроллерыг жинхэнэ процессор шиг хэд хэдэн ажлыг нэг дор гүйцэтгэх боломжтой юу? Харцгаая.

Arduino програм дахь зэрэгцээ урсгалууд
Arduino програм дахь зэрэгцээ урсгалууд

Энэ нь зайлшгүй шаардлагатай

  • - Ардуино;
  • - 1 LED;
  • - 1 пьезо дуугаралт.

Зааварчилгаа

1-р алхам

Ерөнхийдөө Arduino нь жинхэнэ параллелизац эсвэл олон урсгалтай байхыг дэмждэггүй.

Гэхдээ та микроконтроллерт "loop ()" циклийн давталт бүрт нэмэлт, суурь даалгавар гүйцэтгэх цаг болсон эсэхийг шалгахыг хэлж болно. Энэ тохиолдолд хэрэглэгчид хэд хэдэн ажлыг нэгэн зэрэг гүйцэтгэж байгаа мэт санагдах болно.

Жишээлбэл, өгөгдсөн давтамж дээр LED-г анивчиж, зэрэгцээ, пьезоэлектрик ялгаруулагчаас гарч буй дуут дохио шиг өгсөж унах дуу чимээ гаргацгаая.

Бид LED ба пьезо ялгаруулагчийг Arduino-д нэг бус удаа холбосон. Зурагт үзүүлсэн шиг хэлхээг угсарцгаая. Хэрэв та LED-ийг "13" -ээс бусад дижитал зүүтэй холбож байгаа бол одоогийн хязгаарлах эсэргүүцэл нь 220 ом байх ёстой гэдгийг санаарай.

Arduino руу дуут дохио болон LED холболтын схем
Arduino руу дуут дохио болон LED холболтын схем

Алхам 2

Энэ мэт эскизээ бичээд Ардуино руу оруулъя.

Самбарыг ачаалсны дараа ноорог яг бидний хүссэнээр хийгдээгүй байгааг харж болно: дуут дохио бүрэн ажиллаж дуустал LED нь анивчихгүй бөгөөд дуут дохио дуугарч байх үед диод анивчихмаар байна. Энд ямар асуудал байна вэ?

Үнэн хэрэгтээ энэ асуудлыг ердийн аргаар шийдвэрлэх боломжгүй юм. Даалгавруудыг микроконтроллер хатуу дарааллаар гүйцэтгэдэг. "Delay ()" оператор програмын гүйцэтгэлийг тодорхой хугацаанд хойшлуулдаг бөгөөд энэ хугацаа дуустал дараах програмын командууд биелэхгүй. Ийм учраас бид програмын "цикл ()" дэх ажил бүрийн хувьд өөр өөр гүйцэтгэлийн хугацааг тохируулж чадахгүй.

Тиймээс та олон даалгаврыг ямар нэгэн байдлаар дууриах хэрэгтэй.

Дуут дохио ба LED удирдлагыг цувралаар
Дуут дохио ба LED удирдлагыг цувралаар

Алхам 3

Arduino нь хуурамч параллель даалгавруудыг гүйцэтгэх сонголтыг Arduino хөгжүүлэгчид https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay нийтлэлд санал болгож байна.

Аргын мөн чанар нь "давталт ()" давталт давтах бүрт бид LED-г анивчих цаг болсон эсэхийг (арын даалгаврыг гүйцэтгэхийн тулд) шалгаж байгаа явдал юм. Хэрэв тийм бол бид LED төлөвийг эргүүлнэ. Энэ бол "delay ()" операторыг тойрч гарах нэг хэлбэр юм.

Энэ аргын мэдэгдэхүйц сул тал бол LED хяналтын нэгжийн урд байрлах кодын хэсгийг "ledInterval" LED-ийн анивчих хугацааны интервалаас илүү хурдан гүйцэтгэх ёстой юм. Үгүй бол анивчих нь шаардлагатай хэмжээнээс бага давтамжтай байх бөгөөд бид даалгаврыг зэрэгцүүлэн гүйцэтгэх үр нөлөөг авч чадахгүй. Тодруулбал, манай ноорог дээр дуут дохионы өөрчлөлтийн үргэлжлэх хугацаа 200 + 200 + 200 + 200 = 800 мсек бөгөөд бид LED анивчих интервалыг 200 мсек болгосон. Гэхдээ LED нь бидний тохируулснаас 4 дахин өөр 800 мсек хугацаатай анивчих болно. Ерөнхийдөө кодонд "delay ()" оператор ашиглагддаг бол хуурамч параллелизмыг дуурайх нь хэцүү тул үүнээс зайлсхийхийг зөвлөж байна.

Энэ тохиолдолд дуут дохио хянах нэгж цаг хугацаа ирсэн эсэхийг шалгаад "delay ()" -ийг ашиглахгүй байх шаардлагатай болно. Гэхдээ энэ нь кодын хэмжээг нэмэгдүүлж, програмын унших чадварыг доройтуулах болно.

LED цаг алдалгүй анивчих (оператор)
LED цаг алдалгүй анивчих (оператор)

Алхам 4

Энэ асуудлыг шийдэхийн тулд бид хуурамч паралель процессуудыг хялбархан үүсгэх боломжийг олгодог гайхамшигтай ArduinoThread номын санг ашиглах болно. Энэ нь ижил төстэй байдлаар ажилладаг боловч цагийг шалгахын тулд код бичихгүй байх боломжийг танд олгоно. Энэ даалгаврыг гүйцэтгэх шаардлагатай эсэхээс үл хамаарна. Энэ нь кодын хэмжээг бууруулж, ноорог унших чадварыг сайжруулдаг. Номын сангийн үйл ажиллагааг шалгаж үзье.

Юуны өмнө номын сангийн архивыг https://github.com/ivanseidel/ArduinoThread/archive/master.zip албан ёсны сайтаас татаж аваад Arduino IDE-ийн "номын сангууд" директор руу буулгана уу. Дараа нь "ArduinoThread-master" фолдерыг "ArduinoThread" болгон өөрчил.

ArduinoThread номын санг суулгаж байна
ArduinoThread номын санг суулгаж байна

Алхам 5

Холболтын схем хэвээр байх болно. Зөвхөн програмын код өөрчлөгдөх болно. Одоо энэ нь хажуугийн самбартай адилхан байх болно.

Хөтөлбөрт бид хоёр урсгалыг бий болгодог бөгөөд тус бүр нь өөрийн үйлдлийг гүйцэтгэдэг: нэг нь LED-тэй анивчдаг, хоёр дахь нь дуут дохиог удирддаг. Давталт бүрийн давталт бүрт утас бүрийн хувьд бид түүнийг хэрэгжүүлэх цаг болсон эсэхийг шалгадаг. Хэрэв ирвэл "run ()" аргыг ашиглан гүйцэтгэхээр эхлүүлсэн болно. Хамгийн гол нь "delay ()" операторыг ашиглахгүй байх явдал юм.

Илүү дэлгэрэнгүй тайлбарыг кодонд өгсөн болно.

Arduino санах ойд кодыг ачаалж ажиллуулъя. Одоо бүх зүйл яг байх ёстой хэмжээндээ ажиллаж байна!

Зөвлөмж болгож буй: