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

StandardFirmata -ээс давж гарах - Дахин үзсэн: 5 алхам
StandardFirmata -ээс давж гарах - Дахин үзсэн: 5 алхам

Видео: StandardFirmata -ээс давж гарах - Дахин үзсэн: 5 алхам

Видео: StandardFirmata -ээс давж гарах - Дахин үзсэн: 5 алхам
Видео: 🔥УВЕЛИЧЕНИЕ ДОХОДОВ В 2 РАЗА! 2024, Долдугаар сарын
Anonim
StandardFirmata -ээс давж гарах нь - Дахин үзсэн
StandardFirmata -ээс давж гарах нь - Дахин үзсэн

Хэсэг хугацааны өмнө надтай pymata4 хэрэглэгч доктор Мартин Уилер холбогдож pymata4 номын санд DHT22 чийгшил/температур мэдрэгчийн дэмжлэгийг нэмж өгөх талаар заавар зөвлөгөө авлаа. Pymata4 номын сан нь Arduino -ийн хамтрагч FirmataExpress -тэй хамтран хэрэглэгчиддээ Arduino төхөөрөмжөө алсаас удирдах, хянах боломжийг олгодог. Имэйл солилцох хэдхэн цагийн дотор доктор Уилер pymata4 болон FirmataExpress -ийг хоёуланг нь өөрчилж чадсан. Үүний үр дүнд DHT22 ба DHT11 мэдрэгчийг дэмжих нь pymata4 ба FirmataExpress -ийн стандарт хэсэг болжээ.

2014 оны 5 -р сард би нэмэлт төхөөрөмжүүдийн Фирматад дэмжлэг нэмэх тухай нийтлэл бичсэн. Тэр нийтлэлийг эргэцүүлэн бодоход би тэр өгүүлэлд зориулж цааснаас цаас авч хийснээс хойш ямар их зүйл өөрчлөгдсөнийг ойлгосон. Энэ нийтлэлээс гадна доктор Вилер өөрийн хүчин чармайлтаа баримтжуулсан бөгөөд та үүнийг бас шалгаж үзэхийг хүсч магадгүй юм.

FirmataExpress нь StandardFirmata дээр суурилсан бөгөөд StandardFirmata лавлах бүтэц өөрчлөгдсөн. Нэмж дурдахад pymata4 API нь 2014 оны анхны PyMata API -ээс арай өөр юм. Энэ нийтлэлийг дахин үзэх, шинэчлэх хамгийн тохиромжтой үе гэж би бодсон. Доктор Вилерийн ажлыг үндэс болгон ашиглан pymata4/FirmataExpress функцийг хэрхэн өргөжүүлэх талаар судалж үзье.

Эхлэхээсээ өмнө - Arduino/Firmata -ийн талаархи зарим мэдээлэл

Тэгэхээр Фирмата гэж юу вэ? Фирмата вэб хуудаснаас иш татан "Фирмата бол хост компьютер дээрх програм хангамжаас микроконтроллертой харилцах ерөнхий протокол юм."

Arduino Firmata нь цуваа интерфэйсийг ашиглан Arduino микроконтроллер ба компьютерын хооронд мэдээлэл дамжуулах бөгөөд ихэвчлэн 57600 bps -д тохируулсан цуваа/USB холбоосыг ашигладаг. Энэ холбоосоор дамжуулсан өгөгдөл нь хоёртын хэлбэртэй бөгөөд протоколыг үйлчлүүлэгч/серверийн загварт хэрэгжүүлдэг.

Серверийн талыг Arduino ноорог хэлбэрээр Arduino микроконтроллерт байршуулдаг. Arduino IDE -д багтсан StandardFirmata ноорог нь үйлчлүүлэгчийн тушаасан Arduino I/O зүүг хянадаг. Энэ нь оролтын зүүний өөрчлөлт болон бусад тайлангийн мэдээллийг үйлчлүүлэгчид буцааж мэдээлдэг. FirmataExpress бол StandardFirmata -ийн өргөтгөсөн хувилбар юм. Цуваа холболтын хурд нь 115200 bps байна.

Энэ нийтлэлд ашигладаг Arduino клиент нь pymata4 юм. Энэ бол компьютер дээр ажилладаг Python програм юм. Энэ нь хоёулаа Arduino сервер рүү тушаал илгээж, тайлан хүлээн авдаг. Pymata4 нь Python -д хэрэгждэг тул Windows, Linux (Raspberry Pi -г оруулаад) болон macOS компьютер дээр ажилладаг.

Яагаад Фирмата ашиглах ёстой вэ?

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

Гэхдээ энэ нь StandardFirmata ашиглах цорын ганц шалтгаан биш юм. Хөнгөн жинтэй Arduino програмыг хөгжүүлэхдээ компьютер нь Arduino микроконтроллер дээр шууд байдаггүй багаж хэрэгсэл, дибаг хийх боломжийг олгодог. "Тогтмол" үйлчлүүлэгч ба сервер ашиглах нь програмын нарийн төвөгтэй байдлыг удирдахад илүү хялбар байдаг. Аппликешныг төгс болгосны дараа үүнийг захиалгат, бие даасан Arduino ноорог болгон орчуулж болно.

Яагаад pymata4 ашиглах ёстой вэ?

Мэдээжийн хэрэг, түүний зохиогч нь би өрөөсгөл ойлголт юм. Энэ бол сүүлийн хэдэн жилийн турш тасралтгүй хадгалагдаж ирсэн цорын ганц Python дээр суурилсан Фирмата үйлчлүүлэгч юм. Энэ нь зөн совинтой, ашиглахад хялбар API -ийг өгдөг. StandardFirmata дээр суурилсан ноорогоос гадна StandardFirmataWifI ноорог ашиглахдаа ESP-8266 гэх мэт төхөөрөмжүүдэд WiFi-ээр дамжуулан Firmata-ийг дэмждэг.

Түүнчлэн, pymata4 нь одоогоор StandardFirmata -д дэмжигдээгүй байгаа нэмэлт мэдрэгч, идэвхжүүлэгчийг дэмжих зорилгоор хэрэглэгч хялбархан сунгахаар бүтээгдсэн болно.

Алхам 1: Фирмата протоколыг ойлгох

Фирмата протоколыг ойлгох
Фирмата протоколыг ойлгох

Arduino Firmata холбооны протокол нь өгөгдлийг илэрхийлэхийн тулд нэг буюу хэд хэдэн 7 битийн байтыг ашигладаг MIDI протоколоос гаралтай.

Фирмата нь хэрэглэгчийн өргөтгөх боломжтой байхаар бүтээгдсэн. Энэхүү өргөтгөх боломжийг олгодог механизм бол System Exclusive (SysEx) мессеж бичих протокол юм.

Firmata протоколоор тодорхойлсон SysEx мессежийн форматыг дээрх зурагт үзүүлэв. Энэ нь арван зургаатын 0xF0 тогтмол утга бүхий START_SYSEX байтаар эхэлж, дараа нь өвөрмөц SysEx команд байт дагалдана. Байтын тушаалын утга нь арван зургаатын 0x00-0x7F мужид байх ёстой. Командын байтын дараа тодорхойгүй тооны 7 битийн өгөгдлийн байт орно. Эцэст нь зурвасыг арван зургаатын 0xF7 тогтмол утга бүхий END_SYSEX байтаар дуусгавар болгоно.

Фирмата өгөгдлийн кодчилол/декодчилол

SysEx мессежийн хэрэглэгчийн өгөгдлийн хэсэг нь 7 битийн байтаас бүрддэг тул 128 (0x7f) -ээс их утгыг хэрхэн илэрхийлж байгааг та гайхаж магадгүй юм. Фирмата нь эдгээр утгыг өгөгдлийн холбоосоор дамжуулахаас өмнө 7 битийн олон байт хэсгүүдэд задалж кодлодог. Өгөгдлийн зүйлийн хамгийн бага ач холбогдол бүхий байтыг (LSB) эхлээд илгээдэг бөгөөд дараа нь өгөгдлийн элементийн улам бүр чухал бүрэлдэхүүн хэсгүүдийг конвенцоор илгээдэг. Өгөгдлийн зүйлийн хамгийн чухал байт (MSB) нь хамгийн сүүлд илгээсэн өгөгдлийн зүйл юм.

Энэ хэрхэн ажилладаг вэ?

SysEx мессежийн мэдээллийн хэсэгт 525 утгыг оруулахыг хүсч байна гэж бодъё. 525-ийн утга нь 128-ийн утгаас хамаагүй том тул бид үүнийг 7 битийн байт "хэсэг" болгон хуваах эсвэл задлах хэрэгтэй.

Үүнийг хэрхэн яаж хийхийг энд харуулав.

Аравтын бутархайгаар 525 гэсэн утга нь 2 байтын утга болох 0x20D гэсэн арван зургаатын утгатай тэнцэнэ. LSB -ийг авахын тулд бид утгыг 0x7F ашиглан AND хийж өгнө. "C" болон Python -ийн аль алиныг нь доор харуулав.

// LSB -ийг тусгаарлах "C" хэрэгжилт

int max_distance_LSB = max_distance & 0x7f; // доод байтыг масклах # Python хэрэгжилтийг LSB max_distance_LSB = max_distance & 0x7F # mask байт

Маск хийсний дараа max_distance_LSB нь 0x0d -ийг агуулна. 0x20D ба 0x7F = 0x0D.

Дараа нь бид энэ 2 байтын утгын MSB-ийг тусгаарлах хэрэгтэй. Үүнийг хийхийн тулд бид 0x20D утгыг баруун тийш, 7 газар шилжүүлэх болно.

// 2 байтын утгатай MSB -ийг тусгаарлах "C" хэрэгжилт

int max_distance_MSB = max_distance >> 7; // дээд зэрэглэлийн байтыг # Python хэрэгжилтийг 2 байтын утга бүхий isoloate MSB рүү шилжүүлэх max_distance_MSB = max_distance >> 7 # shift to the top byte to get Shift дараа max_distance_MSB нь 0x04 утгыг агуулна.

"Хэсэгжсэн" маршалдсан өгөгдлийг хүлээн авахдаа түүнийг дахин нэг утга болгон нэгтгэх шаардлагатай. Өгөгдлийг "C" болон Python аль алинд нь хэрхэн яаж нэгтгэхийг энд харуулав

// 2 байтыг дахин угсрах "C" хэрэгжилт, // 7 битийн утгыг нэг утга болгон int max_distance = argv [0] + (argv [1] << 7); # Python хэрэгжилт нь 2 байт, # 7 битийн утгыг нэг утга болгон нэгтгэх max_distance = data [0] + (өгөгдөл [1] << 7)

Дахин угсарсны дараа утга нь дахин 525 аравтын бутархай буюу 0x20D арван зургаатын хэмжээтэй тэнцэнэ.

Энэхүү задлах/дахин угсрах процессыг үйлчлүүлэгч эсвэл сервер аль аль нь гүйцэтгэж болно.

Алхам 2: Эхлээд үзье

Шинэ төхөөрөмжийг дэмжихийн тулд Arduino резидент сервер болон PC -ийн оршин суугч Python клиент хоёуланд нь өөрчлөлт оруулах шаардлагатай. Доктор Уилерийн ажлыг шаардлагатай өөрчлөлтүүдийг дүрслэн харуулах болно.

Магадгүй хамгийн чухал алхам бол одоо байгаа туслах төхөөрөмжийн номын санг тэгшитгэлийн Arduino хэсэгт нэгтгэх үү эсвэл өөрийн номыг бичих үү гэдгээ шийдэх явдал юм. Хэрэв та одоо байгаа номын санг олж чадвал үүнийг эхнээс нь бичихээс илүү ашиглахыг зөвлөж байна.

DHT төхөөрөмжийг дэмжихийн тулд доктор Уилер өргөтгөлийн кодыг DHTNew номын санд үндэслэв. Доктор Уилер маш ухаалаг байдлаар DHTNew номын сангийн функцийг Arduino болон pymata4 тэгшитгэлийн хажуугаар хувааж, Arduino тал дээр хамгийн бага хаалт үүсгэнэ.

Хэрэв бид DHTNew -ийг үзвэл энэ нь дараах бүх зүйлийг гүйцэтгэдэг.

  • Сонгосон зүү дижитал гаралтын горимыг тохируулна.
  • Хамгийн сүүлийн чийгшил, температурын утгыг авахын тулд кодлогдсон дохиог гаргадаг.
  • Алдаа гарсан эсэхийг шалгаж, мэдээлдэг.
  • Түүхий өгөгдлөөс хүний унших боломжтой температур, чийгшлийн утгыг тооцоолно.

Аливаа зүйлийг аль болох үр ашигтай байлгахын тулд FirmataExpress тал дээр доктор Уилер Arduino -аас pymata4 руу өгөгдөл хөрвүүлэх горимыг буулгасан.

Алхам 3: DHT -ийн дэмжлэгт зориулж FirmataExpress -ийг өөрчлөх

FirmataExpress лавлах мод

FirmataExpress репозиторыг агуулсан бүх файлыг доор харуулав. Энэ мод нь StandardFiramata -тай ижил бөгөөд зарим файлын нэр нь репозиторын нэрийг тусгадаг.

Өөрчлөлт хийх шаардлагатай файлууд нь хажууд нь од (*) байдаг.

FirmataExpress

Bo * Самбарууд.h

Жишээ

FirmataExpress

X самбар

F ├── * FirmataExpress.ino

LICENSE.txt

Makefile

├── * FirmataConstants.h

├── * FirmataDefines.h

Irm FirmataExpress.cpp

├── FirmataExpress.h

├── FirmataMarshaller.cpp

├── FirmataMarshaller.h

Irm FirmataParser.cpp

Irm FirmataParser.h

Файл тус бүр болон хийсэн өөрчлөлтүүдийг авч үзье.

Самбар.h

Энэ файл нь дэмжигдсэн хавтангийн төрөл тус бүрийн зүү хэлбэрийн макро тодорхойлолтыг агуулдаг. Энэ нь нэгээс олон төхөөрөмжийг дэмжих шаардлагатай үед дэмжигдэх төхөөрөмжийн хамгийн их тоог тодорхойлдог.

DHT төхөөрөмжийн хувьд нэг удаад 6 хүртэлх төхөөрөмжийг холбож болох бөгөөд энэ утгыг дараах байдлаар тодорхойлно.

#ifndef MAX_DHTS

MAX_DHTS 6 #endif -ийг тодорхойлох

Түүнчлэн зүү хэлбэрийн макрог шинэ төхөөрөмжид зориулж бүх төрлийн хавтан эсвэл зөвхөн таны сонирхож буй төхөөрөмжид зориулж сонгож болно. Эдгээр макро нь ихэвчлэн тайлагнах зорилгоор ашиглагддаг бөгөөд төхөөрөмжийг хянахад ашиглагддаггүй. Эдгээр макро нь төхөөрөмжийг дэмждэг голыг хоёуланг нь тодорхойлдог.

#тодорхойлох IS_PIN_DHT (p) (IS_PIN_DIGITAL (p) && (p) - 2 <MAX_DHTS)

Пин дугаар хувиргалтыг тодорхойлох макро.

#PIN_TO_DHT (p) PIN_TO_DIGITAL (p) -ийг тодорхойлох

FirmataConstants.h

Энэ файл нь Arduino -д аль хувилбараа ачаалж байсныг хянахын тулд өөрчлөхийг хүсч буй програмын хувилбарын дугаарыг агуулдаг. Энэ нь Firmata SysEx мессежийг оруулаад Firmata мессежийн утгыг агуулдаг.

Та энэ файлд төхөөрөмждөө шинэ зурвас эсвэл зурвасын багцыг оноох шаардлагатай болно. DHT -ийн хувьд хоёр мессеж нэмэгдсэн. Нэг нь зүүг "DHT" зүүгээр, нөгөө нь DHT -ийн хамгийн сүүлийн үеийн мэдээллийг үйлчлүүлэгчид буцааж илгээхдээ сурвалжлагчийн мессеж болгон тохируулдаг.

статик const int DHT_CONFIG = 0x64;

статик const int DHT_DATA = 0x65;

Пин горимыг мөн энэ файлд зааж өгсөн болно. DHT -ийн хувьд шинэ зүү горимыг бий болгосон.

статик const int PIN_MODE_DHT = 0x0F; // зүү DHT -д тохируулагдсан

Шинэ зүү горим нэмэх үед TOTAL_PIN_MODES -ийг тохируулах шаардлагатай:

статик const int TOTAL_PIN_MODES = 17;

FirmataDefines.h

Энэ файлыг FirmataConstants.h дээр нэмсэн шинэ зурвасуудыг тусгахын тулд шинэчлэх шаардлагатай:

#ifdef DHT_CONFIG #undef DHT_CONFIG #endif #DHT_CONFIG файлыг тодорхойлно:: DHT_CONFIG // DHT хүсэлт #ifdef DHT_DATA #undef DHT_DATA #endif #define DHT_DATA firmata:: DHT_DATA // DHT reply #ifdef PIN_FOD_POD_FOD_DOD:: PIN_MODE_DHT

FirmataExpress.ino

Энэхүү хэлэлцүүлэгт бид энэхүү Arduino ноорог дээр хийсэн өөрчлөлтүүдийн "өндөр оноо" -г авч үзэх болно.

FirmataExpress нь 6 хүртэлх DHT төхөөрөмжийг нэгэн зэрэг дэмжихийн тулд төхөөрөмжийн холбогдох зүү дугаар, түүний WakeUpDelay утга, төхөөрөмжийн төрөл болох DHT22 эсвэл DHT11 -ийг хянах 3 массивыг бий болгосон.

// DHT мэдрэгч

int numActiveDHTs = 0; // хавсаргасан DHT -ийн тоо uint8_t DHT_PinNumbers [MAX_DHTS]; uint8_t DHT_WakeUpDelay [MAX_DHTS]; uint8_t DHT_TYPE [MAX_DHTS];

Хоёр төхөөрөмжийн төрөл хоёулаа унших хооронд ойролцоогоор 2 секунд шаардагддаг тул бид DHT бүрийг 2 секундын хугацаанд нэг удаа уншдаг эсэхийг шалгах хэрэгтэй. DHT төхөөрөмж, HC-SR04 зайны мэдрэгч гэх мэт зарим төхөөрөмжид зөвхөн үе үе ханддаг. Энэ нь тэдэнд орчинтойгоо харьцах боломжийг олгодог.

uint8_t nextDHT = 0; // дараагийн төхөөрөмжийг уншихын тулд dht болгон индексжүүлнэ үү

uint8_t currentDHT = 0; // Аль мэдрэгч идэвхтэй байгааг хянадаг. int dhtNumLoops = 0; // b4 давталтаар дамжуулан DHT руу нэвтрэх зорилтот тоо int dhtLoopCounter = 0; // Loop тоолуур

DHT төхөөрөмжийг тохируулах, унших

FirmataExpress нь DHT үйлдлийн зүү тохируулахын тулд SysEx командыг хүлээн авах үед DHT төхөөрөмжүүдийн дээд хязгаарыг хэтрүүлээгүй болохыг баталгаажуулдаг. Хэрэв шинэ DHT -ийг дэмжих боломжтой бол DHT массив шинэчлэгддэг. Хэрэв DHT төрөл тодорхойгүй бол SysEx стринг мессежийг үүсгэж pymata4 руу буцааж дамжуулдаг

тохиолдол DHT_CONFIG: int DHT_Pin = argv [0]; int DHT_type = argv [1]; if (numActiveDHTs <MAX_DHTS) {if (DHT_type == 22) {DHT_WakeUpDelay [numActiveDHTs] = 1; } өөр бол (DHT_type == 11) {DHT_WakeUpDelay [numActiveDHTs] = 18; } else {Firmata.sendString ("ERROR: UNKNOWN SENSOR TYPE, VALID SENSORS ARE 11, 22"); завсарлага; } // мэдрэгчийг шалгах DHT_PinNumbers [numActiveDHTs] = DHT_Pin; DHT_TYPE [numActiveDHTs] = DHT_ төрөл; setPinModeCallback (DHT_Pin, PIN_MODE_DHT);

Дараа нь FirmataExpress DHT төхөөрөмжтэй холбогдохыг оролддог. Алдаа гарсан тохиолдолд алдааны өгөгдөл бүхий SysEx мессежийг үүсгэж, SysEx мессежийг pymat4 руу буцааж илгээдэг. _Bits хувьсагч нь DHT төхөөрөмжөөс буцааж өгсөн өгөгдлийг хадгалдаг бөгөөд хэрэв хүсвэл pymata4 нэмэлт боловсруулалт хийдэг.

Firmata.write (START_SYSEX);

Firmata.write (DHT_DATA); Firmata.write (DHT_Pin); Firmata.write (DHT_ төрөл); for (uint8_t i = 0; i> 7 & 0x7f); } Firmata.write (abs (rv)); Firmata.write (1); Firmata.write (END_SYSEX);

Хэрэв хүчин төгөлдөр өгөгдлийг буцааж өгвөл идэвхтэй DHT -ийн тоо нэмэгдэнэ. Дараагийн DHT -ийг шалгахын өмнө хичнээн давталт хийх ёстойг хянадаг хувьсагчийг мөн тохируулдаг. Энэхүү хувьсагч нь системд хичнээн DHT -ийг нэмсэн ч гэсэн бүгдийг нь 2 секундын дотор унших болно гэдгийг баталж байна.

int rv = readDhtSensor (numActiveDHTs);

хэрэв (rv == DHTLIB_OK) {numActiveDHTs ++; dhtNumLoops = dhtNumLoops / numActiveDHTs; // бүгд зүгээр}

Хэрэв нэг буюу хэд хэдэн DHT төхөөрөмжийг ноорог функцэд тохируулсан бол дараагийн DHT төхөөрөмжийг уншина. Хүчинтэй өгөгдөл эсвэл алдааны статусыг pysata4 руу SysEx мессеж хэлбэрээр буцаана.

if (dhtLoopCounter ++> dhtNumLoops) {if (numActiveDHTs) {int rv = readDhtSensor (nextDHT); uint8_t current_pin = DHT_PinNumbers [nextDHT]; uint8_t current_type = DHT_TYPE [nextDHT]; dhtLoopCounter = 0; одоогийнDHT = дараагийнDHT; if (nextDHT ++> = numActiveDHTs - 1) {nextDHT = 0; } if (rv == DHTLIB_OK) {// TEST CHECKSUM uint8_t sum = _bits [0] + _bits [1] + _bits [2] + _bits [3]; хэрэв (_bits [4]! = нийлбэр) {rv = -1; }} // Firmata.write (START_SYSEX) алдааны статусаар зурвасыг буцааж илгээх; Firmata.write (DHT_DATA); Firmata.write (current_pin); Firmata.write (current_type); for (uint8_t i = 0; i <sizeof (_bits) - 1; ++ i) {Firmata.write (_bits ); // Firmata.write (_bits ;} Firmata.write (abs (rv)); Firmata.write (0); Firmata.write (END_SYSEX);}}

DHT төхөөрөмжтэй холбогдоход ашигладаг кодыг DHTNew номын сангаас шууд авсан болно.

int readDhtSensor (int индекс) {

// INIT BUFFERVAR өгөгдлийг хүлээн авах uint8_t маск = 128; uint8_t idx = 0; // EMPTY BUFFER // memset (_bits, 0, sizeof (_bits)); for (uint8_t i = 0; i 5 BYTES for (uint8_t i = 40; i! = 0; i--) {loopCnt = DHTLIB_TIMEOUT; while (digitalRead (pin) == LOW) {if (--loopCnt == 0) буцах DHTLIB_ERROR_TIMEOUT;} uint32_t t = micros (); loopCnt = DHTLIB_TIMEOUT; while (digitalRead (pin) == HIGH) {if (--loopCnt == 0) DHTLIB_ERROR_TIMEOUT;} бол ((>) 40) {_bits [idx] | = mask;} mask >> = 1; if (mask == 0) // next byte? {Mask = 128; idx ++;}} DHTLIB_OK -г буцаах;}

Алхам 4: DHT -ийн дэмжлэгт Pymata4 -ийг өөрчлөх

private_constants.h

DHT-ийг дэмжихийн тулд бид шинэ файлын төрөл болон SysEx мессежийг энэ файлд нэмэх шаардлагатай байна.

# зүү горимууд INPUT = 0x00 # зүүг оролтоор тохируулсан OUTPUT = 0x01 # зүүг гаралт болгон тохируулсан ANALOG = 0x02 # аналог дахь аналоги оролт PWM = 0x03 # PWM гаралтын горим дахь дижитал зүү SERVO = 0x04 # Servo гаралтын горимд I2C = 0x06 # зүү I2C тохиргоонд багтсан STEPPER = 0x08 # stepper горимд байгаа ямар ч зүү SERIAL = 0x0a PULLUP = 0x0b # Татах горимд байгаа ямар ч зүү SONAR = 0x0c # SONAR горимд байгаа аливаа зүү TONE = 0x0d # PIXY = 0x0e # pixy камер горимд зориулагдсан DHT = 0x0f # DHT мэдрэгч IGNORE = 0x7f # DHT SysEx тушаалын мессеж DHT_CONFIG = 0x64 # dht config тушаал DHT_DATA = 0x65 # dht мэдрэгчийн хариу

Нэмэгдсэн зүү төрөл болон SysEx командууд нь FirmataExpress дээр нэмсэн FirmataConstants.h дэх утгуудтай тохирч байх ёстой.

pymata4.py

Pymata4 нь ирж буй Фирмата мессежийг мессеж боловсруулагчтай хурдан холбохын тулд Python толь бичгийг ашигладаг. Энэхүү толь бичгийн нэр нь report_dispatch юм.

Толь бичиг оруулах хэлбэр нь:

{MessageID: [message_handler, боловсруулагдах өгөгдлийн байтын тоо]}

Ирж буй DHT мессежийг зохицуулахын тулд толь бичигт оруулга оруулсан болно.

{PrivateConstants. DHT_DATA: [self._dht_read_response, 7]}

Зурваст байгаа 7 байт өгөгдөл нь Arduino дижитал зүү дугаар, DHT төхөөрөмжийн төрөл (22 эсвэл 11), 5 байт түүхий өгөгдөл юм.

_Dht_read_response арга нь мэдээлсэн алдааг шалгадаг. Хэрэв мэдэгдсэн алдаа байхгүй бол чийгшил, температурыг Arduino DHTNew номын сангаас авсан алгоритмыг ашиглан тооцоолно.

Тооцоолсон утгыг хэрэглэгчээс буцааж залгах аргаар мэдээлдэг. Тэд мөн pin_data өгөгдлийн дотоод бүтцэд хадгалагддаг. Мэдэгдсэн хамгийн сүүлийн утгыг dht_read аргыг ашиглан pin_data санал асуулгаар буцааж авч болно.

Шинэ DHT төхөөрөмжийг тохируулах

Шинэ DHT төхөөрөмж нэмэх үед set_pin_mode_dht аргыг дуудна. Энэ арга нь тоон тээглүүрийн pin_data -ийг шинэчилдэг. Энэ нь DHT_CONFIG SysEx мессежийг үүсгэж FirmataExpress руу илгээдэг.

Алхам 5: Боолт хийх

Бидний харж байгаагаар шинэ төхөөрөмжид Фирмата дэмжлэг үзүүлэх нь Arduino FirmataExpress серверийн код болон Python дээр суурилсан pymata4 клиент кодыг өөрчлөх шаардлагатай болдог. FirmataExpress код нь дибаг хийхэд хэцүү байж болно. Алдааг тайлахад туслахын тулд printData хэмээх аргыг FirmataExpress дээр нэмсэн. Энэ арга нь өгөгдлийн утгыг FirmataExpress -аас илгээх боломжийг олгодог бөгөөд тэдгээрийг pymata4 консол дээр хэвлэх болно.

Энэ функц нь тэмдэгт мөрийн заагч болон харахыг хүссэн утгыг хоёуланг нь шаарддаг. Хэрэв өгөгдлийн утга нь argc гэж нэрлэгддэг хувьсагчтай бол та дараах параметрүүдийг ашиглан printData руу залгаж болно.

printData ((char*) "argc =", argc);

Хэрэв танд ямар нэгэн асуулт байвал сэтгэгдлээ үлдээгээрэй, би хариулахад баяртай байх болно.

Аз жаргалтай кодчилол!

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