Sisukord:

Standardfirmast kaugemale minnes - uuesti vaadatud: 5 sammu
Standardfirmast kaugemale minnes - uuesti vaadatud: 5 sammu

Video: Standardfirmast kaugemale minnes - uuesti vaadatud: 5 sammu

Video: Standardfirmast kaugemale minnes - uuesti vaadatud: 5 sammu
Video: Subnet Mask - Explained 2024, Juuli
Anonim
Going Beyond StandardFirmata - uuesti vaadatud
Going Beyond StandardFirmata - uuesti vaadatud

Mõni aeg tagasi võttis minuga ühendust pymata4 kasutaja dr Martyn Wheeler, et saada juhiseid DHT22 niiskuse/temperatuuri anduri toe lisamiseks pymata4 teeki. Raamatukogu pymata4 koos oma Arduino kolleegi FirmataExpressiga võimaldab kasutajatel oma Arduino seadmeid eemalt juhtida ja jälgida. Mõne vooru e -kirjavahetuse jooksul õnnestus dr Wheeleril edukalt muuta nii pymata4 kui ka FirmataExpressi. Selle tulemusel on DHT22 ja DHT11 andurite tugi nüüd pymata4 ja FirmataExpressi standardosa.

2014. aasta mais kirjutasin artikli täiendavate seadmete Firmata toe lisamise kohta. Mõeldes sellele artiklile, mõistsin, kui palju on muutunud sellest ajast, kui võtsin selle artikli jaoks pliiatsi paberile. Lisaks sellele artiklile dokumenteeris dr Wheeler oma jõupingutusi ja võiksite seda ka kontrollida.

FirmataExpress põhineb StandardFirmata ja StandardFirmata kataloogistruktuur on arenenud. Lisaks erineb pymata4 API ka 2014. aasta algsest PyMata API -st üsna palju. Arvasin, et see on ideaalne aeg selle artikli uuesti vaatamiseks ja värskendamiseks. Kasutades aluseks dr Wheeleri tööd, uurime, kuidas laiendada pymata4/FirmataExpress funktsioone.

Enne alustamist - mõned taustteave Arduino/Firmata kohta

Mis on siis Firmata? Tsiteerides Firmata veebilehelt: "Firmata on üldine protokoll suhtlemiseks mikrokontrolleritega tarkvarast arvutis."

Arduino Firmata kasutab jadaliidest, et edastada nii käsu- kui ka aruandeteavet Arduino mikrokontrolleri ja arvuti vahel, kasutades tavaliselt seeria-/USB -linki, mille väärtus on 57600 bps. Selle lingi kaudu edastatud andmed on binaarsed ja protokoll on rakendatud kliendi/serveri mudelis.

Serveripool laaditakse Arduino mikrokontrollerisse üles Arduino visandina. StandardFirmata visand, mis on kaasas Arduino IDE -ga, juhib Arduino I/O kontakte vastavalt kliendi juhistele. Samuti teatab see kliendile sisendnõelte muudatustest ja muust aruandeteabest. FirmataExpress on StandardFirmata laiendatud versioon. See töötab jadaühenduse kiirusega 115200 bps.

Selle artikli jaoks kasutatav Arduino klient on pymata4. See on Pythoni rakendus, mida käivitatakse arvutis. See saadab Arduino serverile käske ja võtab aruandeid vastu. Kuna pymata4 on rakendatud Pythonis, töötab see Windowsis, Linuxis (sh Raspberry Pi) ja macOS -i arvutites.

Miks kasutada Firmatat?

Arduino mikrokontrollerid on imelised väikesed seadmed, kuid protsessori ja mälu ressursid on mõnevõrra piiratud. Protsessori- või mälumahukate rakenduste puhul pole sageli muud valikut kui ressursivajadus arvutisse laadida, et rakendus oleks edukas.

Kuid see pole ainus põhjus StandardFirmata kasutamiseks. Kergema kaaluga Arduino rakenduste väljatöötamisel võib arvuti pakkuda tööriistu ja silumisvõimalusi, mis pole Arduino mikrokontrolleril otseselt saadaval. Fikseeritud kliendi ja serveri kasutamine aitab piirata rakenduse keerukust arvutiga, mida on lihtsam hallata. Kui rakendus on täiustatud, saab selle tõlkida kohandatud, eraldiseisvaks Arduino visandiks.

Miks kasutada pymata4?

Olles selle autor, olen ma muidugi erapoolik. Nagu öeldud, on see ainus Pythoni-põhine Firmata klient, mida on viimastel aastatel pidevalt hooldatud. See pakub intuitiivset ja hõlpsasti kasutatavat API -d. Lisaks StandardFirmata-põhistele visanditele toetab see StandardFirmataWifI eskiisi kasutamisel Firmata WiFi kaudu selliste seadmete jaoks nagu ESP-8266.

Samuti oli pymata4 mõeldud kasutajale hõlpsasti laiendatavaks, et toetada täiendavaid andureid ja täiturmehhanisme, mida StandardFirmata praegu ei toeta.

Samm: mõistke Firmata protokolli

Firmata protokolli mõistmine
Firmata protokolli mõistmine

Arduino Firmata sideprotokoll on tuletatud MIDI-protokollist, mis kasutab andmete esitamiseks ühte või mitut 7-bitist baiti.

Firmata oli loodud kasutajale laiendatavaks. Seda laiendatavust pakkuv mehhanism on süsteemi eksklusiivne (SysEx) sõnumiprotokoll.

SysExi sõnumi vorming, nagu on määratletud Firmata protokollis, on näidatud ülaltoodud joonisel. See algab START_SYSEX baidiga, mille fikseeritud väärtus on kuueteistkümnendarv 0xF0, ja sellele järgneb kordumatu SysExi käsubait. Käsubaidi väärtus peab jääma kuueteistkümnendsüsteemi vahemikku 0x00-0x7F. Seejärel järgneb käsubaidile määramata arv 7-bitiseid andmebaite. Lõpuks lõpetatakse sõnum END_SYSEX baidiga, mille fikseeritud väärtus on kuueteistkümnendarv 0xF7.

Firmata andmete kodeerimine/dekodeerimine

Kuna SysExi sõnumi kasutajaandmete osa koosneb 7-bitistest baitidest, võite küsida, kuidas tähistada väärtust, mis on suurem kui 128 (0x7f)? Firmata kodeerib need väärtused, demonteerides need mitmeks 7-bitiseks baiditükiks, enne kui andmed andmeedastuse kaudu liigutatakse. Kõigepealt saadetakse andmeüksuse kõige vähem oluline bait (LSB), millele järgnevad kokkuleppel andmeelemendi järjest olulisemad komponendid. Andmeelemendi kõige olulisem bait (MSB) on viimane saadetud andmeüksus.

Kuidas see töötab?

Oletame, et soovime lisada SysExi sõnumi andmeosasse väärtuse 525. Kuna väärtus 525 on selgelt suurem kui väärtus 128, peame selle jagama või lahti võtma 7-bitisteks tükkideks.

Siin on, kuidas seda tehakse.

Väärtus 525 kümnendkohas on samaväärne kuueteistkümnendarvuga 0x20D, 2-baitine. LSB saamiseks maskeerime väärtuse, andes selle väärtusele 0x7F. Allpool on näidatud nii "C" kui ka Pythoni rakendused:

// "C" rakendamine LSB eraldamiseks

int max_distance_LSB = max_distance & 0x7f; // maskeeri alumine bait # Pythoni teostus, et eraldada LSB max_distance_LSB = max_distance & 0x7F # maskeeri alumine bait

Pärast maskeerimist sisaldab max_distance_LSB 0x0d. 0x20D ja 0x7F = 0x0D.

Järgmisena peame selle 2-baidise väärtuse jaoks isoleerima MSB. Selleks nihutame 0x20D väärtust paremale, 7 kohta.

// "C" rakendamine, et eraldada 2 -baitine MSB

int max_distance_MSB = max_distance >> 7; // nihutage kõrge järku baiti # Pythoni rakendamine, et eraldada MSB 2 -baitine väärtus max_distance_MSB = max_distance >> 7 # shift, et saada ülemine bait Pärast nihutamist sisaldab max_distance_MSB väärtust 0x04.

Kui "tükeldatud" marsaleeritud andmed on saadud, tuleb need uuesti kokku panna üheks väärtuseks. Siin on, kuidas andmeid nii "C" kui ka Pythonis uuesti kokku pannakse

// "C" rakendamine kahe baidi kokkupanekuks, // 7 -bitised väärtused üheks väärtuseks int max_distance = argv [0] + (argv [1] << 7); # Pythoni rakendamine 2 -baitise, # 7 -bitise väärtuse uuesti kokku panemiseks üheks väärtuseks max_distance = andmed [0] + (andmed [1] << 7)

Pärast kokkupanekut on väärtus veel kord võrdne 525 kümnendkohaga või 0x20D kuueteistkümnendkohaga.

Seda demonteerimis-/kokkupanekuprotsessi võib teostada klient või server.

2. samm: alustame

Uue seadme toetamine nõuab muudatusi nii Arduino residendiserveris kui ka PC resident Pythoni kliendis. Dr Wheeleri tööd kasutatakse vajalike muudatuste illustreerimiseks.

Võib -olla on kõige olulisem samm otsustada, kas soovite olemasoleva tugiseadmete kogu integreerida võrrandi Arduino poolele või kirjutada oma. Kui leiate olemasoleva raamatukogu, on soovitatav seda kasutada palju lihtsam kui oma nullist kirjutamine.

DHT -seadmete toe jaoks tugines dr Wheeler oma laienduskoodile DHTNew raamatukogus. Väga nutikalt jagas dr Wheeler DHTNew raamatukogu funktsionaalsuse võrrandi Arduino ja pymata4 külgedele, et tagada minimaalne blokeerimine Arduino poolel.

Kui vaatame DHTNew'i, täidab see kõiki järgmisi toiminguid:

  • Määrab valitud tihvtiga digitaalse väljundrežiimi.
  • Väljastab kodeeritud signaali, et hankida viimased niiskuse ja temperatuuri väärtused.
  • Kontrollib vigu ja teatab neist.
  • Arvutab väljaloetavate algandmete põhjal inimestele loetavad temperatuuri ja niiskuse väärtused.

Et asjad FirmataExpressi poolel võimalikult tõhusad oleksid, laadis dr Wheeler andmete teisendamise rutiinid Arduinost pymata4 alla.

3. samm: FirmataExpressi muutmine DHT -toe jaoks

FirmataExpressi kataloogipuu

Allpool on kõik failid, mis sisaldavad FirmataExpressi hoidlat. See puu on identne StandardFiramata omaga, lihtsalt mõned failinimed peegeldavad hoidla nime.

Failid, mis vajavad muutmist, on need, mille kõrval on tärn (*).

FirmataExpress

├── * Lauad.h

├── näited

│ └── FirmataExpress

│ ├── boardx

│ ├── * FirmataExpress.ino

│ ├── LICENSE.txt

│ └── Makefile

├── * FirmataConstants.h

├── * FirmataDefines.h

├── FirmataExpress.cpp

├── FirmataExpress.h

├── FirmataMarshaller.cpp

├── FirmataMarshaller.h

├── FirmataParser.cpp

└── FirmataParser.h

Vaatame kõiki faile ja tehtud muudatusi.

Lauad.h

See fail sisaldab iga toetatud tahvlitüübi jaoks pin-tüüpi makromääratlusi. See määrab maksimaalse toetatavate seadmete arvu, kui on vaja toetada rohkem kui ühte seadet.

DHT -seadme puhul võib korraga olla ühendatud kuni 6 seadet ja see väärtus on määratletud järgmiselt:

#ifndef MAX_DHTS

#define MAX_DHTS 6 #endif

Samuti võidakse uue seadme jaoks valikuliselt määrata tihvti tüüpi makrosid, kas kõikide tahvlitüüpide või ainult nende jaoks, mis teile huvi pakuvad. Neid makrosid kasutatakse enamasti aruandluse eesmärgil ja neid ei kasutata seadmete juhtimiseks. Need makrod määravad mõlemad seadet toetavad tihvtid:

#define IS_PIN_DHT (p) (IS_PIN_DIGITAL (p) && (p) - 2 <MAX_DHTS)

Nagu ka makro, et määratleda pin-arvu teisendamine.

#define PIN_TO_DHT (p) PIN_TO_DIGITAL (p)

FirmataConstants.h

See fail sisaldab püsivara versiooni numbrit, mida võiksite muuta, et jälgida, millise versiooni olete Arduinole laadinud. See sisaldab ka Firmata sõnumi väärtusi, sealhulgas Firmata SysExi sõnumeid.

Selles failis peate oma seadmele määrama uue sõnumi või sõnumite komplekti. DHT jaoks lisati kaks sõnumit. Üks konfigureerib tihvti DHT -nööpnõelaks ja teine reporterisõnumiks, kui saadetakse kliendile tagasi viimased DHT -andmed.

staatiline konst int DHT_CONFIG = 0x64;

staatiline konst int DHT_DATA = 0x65;

Selles failis on määratud ka pin -režiimid. DHT jaoks loodi uus pin -režiim:

staatiline konst int PIN_MODE_DHT = 0x0F; // PIN on konfigureeritud DHT jaoks

Uue tihvtirežiimi lisamisel tuleb TOTAL_PIN_MODES kohandada:

staatiline konst int TOTAL_PIN_MODES = 17;

FirmataDefines.h

Seda faili tuleb värskendada, et kajastada FirmataConstants.h lisatud uusi sõnumeid:

#ifdef DHT_CONFIG #undef DHT_CONFIG #endif #define DHT_CONFIG firmata:: DHT_CONFIG // DHT request #ifdef DHT_DATA #undef DHT_DATA #endif #define DHT_DATA firmata:: DHT_DATA // DHT answer #ifdef PINDFD #:: PIN_MODE_DHT

FirmataExpress.ino

Selles arutelus käsitleme selles Arduino visandis tehtud muudatuste tipphetki.

Selleks, et FirmataExpress toetaks korraga kuni kuut DHT -seadet, loodi 3 massiivi, mis jälgivad iga seadmega seotud PIN -koodi, selle WakeUpDelay väärtust ja seadme tüüpi, st DHT22 või DHT11:

// DHT -andurid

int numActiveDHTs = 0; // manustatud DHT -de arv uint8_t DHT_PinNumbers [MAX_DHTS]; uint8_t DHT_WakeUpDelay [MAX_DHTS]; uint8_t DHT_TYPE [MAX_DHTS];

Kuna mõlemad seadmetüübid nõuavad lugemiste vahel umbes 2 sekundit, peame veenduma, et loeme iga DHT-d ainult üks kord 2-sekundilise ajavahemiku jooksul. Mõnele seadmele, näiteks DHT-seadmetele ja kaugusanduritele HC-SR04, pääseb juurde ainult perioodiliselt. See annab neile aega oma keskkonnaga suhelda.

uint8_t nextDHT = 0; // indeks järgmisse seadmesse lugemiseks dht

uint8_t praeguneDHT = 0; // Jälgib, milline andur on aktiivne. int dhtNumLoops = 0; // Sihtmärkide arv silmusest b4, juurdepääs DHT -le int dhtLoopCounter = 0; // Silmusloendur

DHT -seadme seadistamine ja lugemine

Kui FirmataExpress saab käsu SysEx, et konfigureerida tihvt DHT -toiminguks, kontrollib see, et DHT -seadmete maksimaalset arvu pole ületatud. Kui uut DHT -d saab toetada, värskendatakse DHT -massiive. Kui DHT tüüp pole teada, luuakse SysExi stringisõnum ja edastatakse see tagasi pymata4 -le

juhtum DHT_CONFIG: int DHT_Pin = argv [0]; int DHT_type = argv [1]; kui (numActiveDHTs <MAX_DHTS) {if (DHT_type == 22) {DHT_WakeUpDelay [numActiveDHTs] = 1; } muu, kui (DHT_type == 11) {DHT_WakeUpDelay [numActiveDHTs] = 18; } else {Firmata.sendString ("VIGA: TUNDMATU ANDURITÜÜP, KEHTIVAD ANDURID ON 11, 22"); murda; } // testi andurit DHT_PinNumbers [numActiveDHTs] = DHT_Pin; DHT_TYPE [numActiveDHTs] = DHT_type; setPinModeCallback (DHT_Pin, PIN_MODE_DHT);

Seejärel üritab FirmataExpress DHT -seadmega suhelda. Vigade korral moodustab see veaandmetega SysExi sõnumi ja saadab SysExi teate tagasi pymat4 -le. Muutuja _bits hoiab DHT -seadme tagastatud andmeid, et soovi korral pymata4 neid täiendavalt töödelda.

Firmata.write (START_SYSEX);

Firmata.write (DHT_DATA); Firmata.write (DHT_Pin); Firmata.write (DHT_type); jaoks (uint8_t i = 0; i> 7 & 0x7f); } Firmata.write (abs (rv)); Firmata.write (1); Firmata.write (END_SYSEX);

Kui tagastatakse kehtivad andmed, suurendatakse aktiivsete DHT -de arvu. Korrigeeritakse ka muutujat, mis jälgib, mitu tsüklite iteratsiooni enne järgmise DHT -i andmete kontrollimist lõpule viia. See muutuja tagab, et olenemata sellest, kui palju DHT -sid süsteemile lisatakse, loetakse need kõik 2 sekundi jooksul.

int rv = readDhtSensor (numActiveDHTs);

kui (rv == DHTLIB_OK) {numActiveDHTs ++; dhtNumLoops = dhtNumLoops / numActiveDHTs; // kõik korras}

Kui visandi silmusefunktsioonis on konfigureeritud üks või mitu DHT -seadet, loetakse järgmine DHT -seade. Kas kehtivad andmed või selle vea olek tagastatakse pymata4 -le SysExi sõnumi kujul:

if (dhtLoopCounter ++> dhtNumLoops) {if (numActiveDHTs) {int rv = readDhtSensor (nextDHT); uint8_t current_pin = DHT_PinNumbers [nextDHT]; uint8_t praegune_tüüp = DHT_TYPE [järgmineDHT]; dhtLoopCounter = 0; praeguneDHT = järgmineDHT; if (nextDHT ++> = numActiveDHTs - 1) {nextDHT = 0; } if (rv == DHTLIB_OK) {// TESTI KONTROLLISUMM uint8_t summa = _bit [0] + _bit [1] + _bit [2] + _bit [3]; kui (_bitit [4]! = summa) {rv = -1; }} // saatke sõnum veateatega tagasi Firmata.write (START_SYSEX); Firmata.write (DHT_DATA); Firmata.write (praegune_pin); Firmata.write (praegune_tüüp); 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 -seadmega suhtlemiseks kasutatav kood pärineb otse DHTNew raamatukogust:

int readDhtSensor (int indeks) {

// INIT BUFFERVAR ANDMETE VASTUVÕTMISEKS uint8_t mask = 128; uint8_t idx = 0; // EMPTY BUFFER // memset (_bit, 0, sizeof (_bit)); 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) return DHTLIB_ERROR_TIMEOUT;} uint32_t t = micros (); loopCnt = DHTLIB_TIMEOUT; while (digitalRead (pin) == HIGH) {if (--loopCnt == 0) return DHTLIB_ERROR_TIMEOUT;} if ((micros ()-t)> 40) {_bits [idx] | = mask;} mask >> = 1; if (mask == 0) // järgmine bait? {Mask = 128; idx ++;}} tagasta DHTLIB_OK;}

Samm: Pymata4 muutmine DHT -toe jaoks

private_constants.h

DHT toetamiseks peame sellesse faili lisama nii uued pin-tüüpi kui ka SysExi sõnumid:

# pin režiimid INPUT = 0x00 # pin määratud sisendiks OUTPUT = 0x01 # pin määratud väljundiks ANALOG = 0x02 # analoogpinge analoogis Sisendrežiim PWM = 0x03 # digitaalne tihvt PWM väljundrežiimis SERVO = 0x04 # digitaalne tihvt servoväljundi režiimis I2C = 0x06 # tihvt sisaldub I2C seadistuses STEPPER = 0x08 # mis tahes tihvt stepper -režiimis reserveeritud pixy kaamera režiimile DHT = 0x0f # DHT sensor IGNORE = 0x7f # DHT SysEx käsusõnumid DHT_CONFIG = 0x64 # dht config käsk DHT_DATA = 0x65 # dht sensor vastus

Lisatud nööpnõelatüüp ja SysExi käsud peavad vastama FirmataExpressile lisatud FirmataConstants.h väärtustele.

pymata4.py

Pymata4 kasutab Pythoni sõnastikku sissetuleva Firmata sõnumi kiireks seostamiseks sõnumihalduriga. Selle sõnastiku nimi on report_dispatch.

Sõnastikukirje vorming on järgmine:

{Sõnumi ID: [sõnumihaldur, töödeldavate andmebaitide arv]}

Sõnastikku lisati sissetulevate DHT -sõnumite haldamiseks kirje:

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

Sõnumis olevad 7 baiti on Arduino digitaalne pin -number, DHT -seadme tüüp (22 või 11) ja 5 baiti algandmeid.

Meetod _dht_read_response kontrollib kõiki teatatud vigu. Kui teatatud vigu pole, arvutatakse niiskus ja temperatuur Arduino DHTNew raamatukogust teisaldatud algoritmi abil.

Arvutatud väärtused esitatakse kasutaja pakutud tagasihelistamismeetodi abil. Neid hoitakse ka sisemises pin_data andmestruktuuris. Viimase teatatud väärtuse võib meelde tuletada küsitlemisega pin_data, kasutades meetodit dht_read.

Uue DHT -seadme seadistamine

Uue DHT -seadme lisamisel kutsutakse meetodit set_pin_mode_dht. See meetod värskendab digitaalsete tihvtide pin_data. Samuti loob ja saadab FirmataExpressile DHT_CONFIG SysEx sõnumi.

5. samm: pakkimine

Nagu nägime, nõuab Firmata toe lisamine uuele seadmele Arduino FirmataExpressi serverikoodi ja Pythoni-põhise pymata4 kliendikoodi muutmist. FirmataExpressi koodi silumine võib olla keeruline. Silumise hõlbustamiseks lisati FirmataExpressi meetod nimega printData. See meetod võimaldab teil FirmataExpressist andmeväärtusi saata ja prindib need pymata4 konsoolile.

See funktsioon nõuab nii tähemärgi kursorit kui ka väärtust, mida soovite vaadata. Kui andmete väärtus sisaldub muutuja nimega argc, võite helistada printData järgmiste parameetritega.

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

Kui teil on küsimusi, jätke lihtsalt kommentaar ja vastan hea meelega.

Head kodeerimist!

Soovitan: