Sisällysluettelo:

Going Beyond StandardFirmata - Tarkistettu: 5 vaihetta
Going Beyond StandardFirmata - Tarkistettu: 5 vaihetta

Video: Going Beyond StandardFirmata - Tarkistettu: 5 vaihetta

Video: Going Beyond StandardFirmata - Tarkistettu: 5 vaihetta
Video: The Space travellers | ANUNNAKI SECRETS REVEALED 7 | The 12th Planet by Zecharia Sitchin 2024, Heinäkuu
Anonim
Going Beyond StandardFirmata - Revisited
Going Beyond StandardFirmata - Revisited

Vähän aikaa sitten, pymata4 -käyttäjä Dr. Pymata4 -kirjasto yhdessä Arduino -vastineen FirmataExpressin kanssa mahdollistaa käyttäjien hallita ja valvoa Arduino -laitteitaan etänä. Muutaman sähköpostivaihdon aikana Dr. Wheeler onnistui muokkaamaan sekä pymata4: ää että FirmataExpressiä. Tämän seurauksena DHT22- ja DHT11 -antureiden tuki on nyt vakio -osa pymata4- ja FirmataExpress -laitteissa.

Toukokuussa 2014 kirjoitin artikkelin tuen lisäämisestä Firmatalle lisälaitteille. Tätä artikkelia pohtiessani ymmärsin, kuinka paljon on muuttunut sen jälkeen, kun otin kynän paperille kyseistä artikkelia varten. Tämän artikkelin lisäksi tohtori Wheeler dokumentoi ponnistelunsa, ja saatat haluta tarkistaa myös sen.

FirmataExpress perustuu StandardFirmataan, ja StandardFirmata -hakemistorakenne on kehittynyt. Lisäksi pymata4 -sovellusliittymä on myös melko erilainen kuin vuoden 2014 alkuperäinen PyMata -sovellusliittymä. Ajattelin, että tämä olisi täydellinen aika tarkastella ja päivittää tämä artikkeli. Wheelerin työn pohjalta tutkitaan, miten pymata4/FirmataExpress -toimintoja voidaan laajentaa.

Ennen kuin aloitamme - joitakin taustatietoja Arduinosta/Firmatasta

Joten mikä on Firmata? Lainaus Firmata -verkkosivulta: "Firmata on yleinen protokolla kommunikointiin mikro -ohjaimien kanssa isäntätietokoneen ohjelmistosta."

Arduino Firmata käyttää sarjaliitäntää siirtämään sekä komento- että raporttitietoja Arduino -mikrokontrollerin ja tietokoneen välillä, tyypillisesti käyttämällä sarja-/USB -linkkiä, jonka nopeus on 57600 bps. Tämän linkin kautta siirretyt tiedot ovat binäärisiä, ja protokolla on toteutettu asiakas/palvelin -mallissa.

Palvelinpuoli ladataan Arduino -mikrokontrolleriin Arduino -luonnoksen muodossa. Arduino IDE: n mukana toimitettu StandardFirmata -luonnos ohjaa Arduino I/O -nastoja asiakkaan ohjeiden mukaan. Se raportoi myös syöttötasojen muutokset ja muut raporttitiedot takaisin asiakkaalle. FirmataExpress on StandardFirmatan laajennettu versio. Se toimii 115200 bps: n sarjayhteyden nopeudella.

Tässä artikkelissa käytetty Arduino -asiakas on pymata4. Se on Python -sovellus, joka suoritetaan tietokoneella. Se sekä lähettää komentoja että vastaanottaa raportteja Arduino -palvelimelta. Koska pymata4 on toteutettu Pythonissa, se toimii Windowsissa, Linuxissa (mukaan lukien Raspberry Pi) ja macOS -tietokoneissa.

Miksi käyttää Firmataa?

Arduino -mikrokontrollerit ovat ihania pieniä laitteita, mutta prosessori- ja muistiresurssit ovat hieman rajalliset. Sovelluksissa, jotka kuluttavat prosessoria tai muistia, ei usein ole muuta vaihtoehtoa kuin siirtää resurssitarve tietokoneelle, jotta sovellus onnistuu.

Mutta tämä ei ole ainoa syy StandardFirmatan käyttämiseen. Kun kehitetään kevyempiä Arduino -sovelluksia, tietokone voi tarjota työkaluja ja virheenkorjausominaisuuksia, jotka eivät ole suoraan käytettävissä Arduino -mikrokontrollerissa. "Kiinteän" asiakkaan ja palvelimen käyttö rajoittaa sovelluksen monimutkaisuuden tietokoneeseen, jota on helpompi hallita. Kun sovellus on viimeistelty, se voidaan kääntää mukautetuksi, itsenäiseksi Arduino -luonnokseksi.

Miksi käyttää pymata4?

Kirjoittajana olen tietysti puolueellinen. Se on kuitenkin ainoa Python-pohjainen Firmata-asiakas, jota on ylläpidetty jatkuvasti viimeisten vuosien aikana. Se tarjoaa intuitiivisen ja helppokäyttöisen sovellusliittymän. StandardFirmata-pohjaisten luonnosten lisäksi se tukee Firmata-yhteyttä WiFi-yhteydellä laitteille, kuten ESP-8266, kun käytetään StandardFirmataWifI-luonnosta.

Lisäksi pymata4 on suunniteltu siten, että käyttäjä voi helposti laajentaa sitä tukemaan muita antureita ja toimilaitteita, joita StandardFirmata ei tällä hetkellä tue.

Vaihe 1: Firmata -protokollan ymmärtäminen

Firmata -protokollan ymmärtäminen
Firmata -protokollan ymmärtäminen

Arduino Firmata -viestintäprotokolla on johdettu MIDI-protokollasta, joka käyttää yhtä tai useampaa 7-bittistä tavua tietojen esittämiseen.

Firmata on suunniteltu käyttäjän laajennettavaksi. Tämän laajennettavuuden tarjoaa mekanismi System Exclusive (SysEx) -viestintäprotokolla.

Firmata -protokollan määrittämä SysEx -viestin muoto on esitetty yllä olevassa kuvassa. Se alkaa START_SYSEX -tavulla, jonka kiinteä arvo on heksadesimaali 0xF0, ja sitä seuraa ainutlaatuinen SysEx -komento. Komento tavun arvon on oltava heksadesimaalialueella 0x00-0x7F. Komento tavua seuraa sitten määrittelemätön määrä 7-bittisiä datatavuja. Lopuksi sanoma päättyy END_SYSEX -tavuun, jonka kiinteä arvo on heksadesimaalinen 0xF7.

Firmata -tietojen koodaus/dekoodaus

Koska SysEx-viestin käyttäjätieto-osa koostuu 7-bittisestä tavusta, saatat ihmetellä, kuinka yksi edustaa arvoa, joka on suurempi kuin 128 (0x7f)? Firmata koodaa nämä arvot purkamalla ne useiksi 7-bittisiksi tavuiksi ennen kuin tiedot on järjestetty datalinkin yli. Tietokohteen vähiten merkitsevä tavu (LSB) lähetetään ensin, ja sen jälkeen yhä tärkeämpiä tietokohteen osia sopimuksen mukaan. Tietokohteen merkittävin tavu (MSB) on viimeinen lähetetty tieto.

Miten tämä toimii?

Oletetaan, että haluamme sisällyttää arvon 525 SysEx -sanoman dataosaan. Koska arvo 525 on selvästi suurempi kuin arvo 128, meidän on jaettava tai purettava se 7-bittisiin "paloihin".

Näin se tehdään.

Desimaaliluku 525 vastaa heksadesimaalista arvoa 0x20D, 2-tavuista. LSB: n saamiseksi peitämme arvon AND' -merkinnällä 0x7F. Sekä "C" että Python -toteutukset on esitetty alla:

// "C" toteutus LSB: n eristämiseksi

int max_distance_LSB = max_distance & 0x7f; // peitä alempi tavu # Python -toteutus eristääksesi LSB max_distance_LSB = max_distance & 0x7F # peitä alempi tavu

Peittämisen jälkeen max_distance_LSB sisältää arvon 0x0d. 0x20D & 0x7F = 0x0D.

Seuraavaksi meidän on eristettävä MSB tälle 2-tavuiselle arvolle. Tätä varten siirrämme arvon 0x20D oikealle, 7 paikkaa.

// "C" toteutus 2 tavun arvoisen MSB: n eristämiseksi

int max_distance_MSB = max_distance >> 7; // siirrä ylemmän tason tavu # Python -toteutus eristämään MSB 2 tavun arvosta max_distance_MSB = max_distance >> 7 # shift saadaksesi ylemmän tavun Siirron jälkeen max_distance_MSB sisältää arvon 0x04.

Kun "paloiteltu" järjestetty data vastaanotetaan, se on koottava uudelleen yhdeksi arvoksi. Näin tiedot kootaan uudelleen sekä "C" että Pythonissa

// "C" toteutus 2 tavun kokoamiseksi uudelleen, // 7 bitin arvot yhdeksi arvoksi int max_distance = argv [0] + (argv [1] << 7); # Python -toteutus koota 2 tavun ja # 7 bitin arvot yhdeksi arvoksi max_distance = data [0] + (data [1] << 7)

Kokoonpanon jälkeen arvo on jälleen 525 desimaalia tai 0x20D heksadesimaali.

Tämän purkamis-/kokoamisprosessin voi suorittaa joko asiakas tai palvelin.

Vaihe 2: Aloitetaan

Uuden laitteen tukeminen vaatii muutoksia sekä Arduinon palvelimeen että PC: n Python -asiakasohjelmaan. Wheelerin työtä käytetään havainnollistamaan tarvittavat muutokset.

Ehkä tärkein vaihe on päättää, haluatko integroida olemassa olevan tukilaitekirjaston yhtälön Arduino -puolelle vai kirjoittaa oman. On suositeltavaa, että jos löydät olemassa olevan kirjaston, sen käyttäminen on paljon helpompaa kuin oman kirjoittaminen tyhjästä.

Wheeler perusti DHT -laitteen tuen laajennuskoodinsa DHTNew -kirjastoon. Tohtori Wheeler jakoi erittäin taitavasti DHTNew -kirjaston toiminnot yhtälön Arduino- ja pymata4 -puolille, jotta Arduino -puolella olisi minimaalinen esto.

Jos katsomme DHTNew -ohjelmaa, se suorittaa kaikki seuraavat:

  • Asettaa valitun nastan digitaalisen lähtötilan.
  • Kellottaa koodatun signaalin ja hakee viimeisimmät kosteus- ja lämpötila -arvot.
  • Tarkistaa virheet ja ilmoittaa niistä.
  • Laskee ihmisen luettavissa olevat lämpötila- ja kosteusarvot haetuista raakatiedoista.

Jotta asiat pysyisivät mahdollisimman tehokkaina FirmataExpress -puolella, tohtori Wheeler ladasi datamuuntorutiinit Arduinosta pymata4: een.

Vaihe 3: FirmataExpressin muokkaaminen DHT -tukea varten

FirmataExpress -hakemistopuu

Alla on kaikki tiedostot, jotka sisältävät FirmataExpress -arkiston. Tämä puu on identtinen StandardFiramatan puun kanssa vain siinä, että jotkin tiedostonimet heijastavat arkiston nimeä.

Muokattavia tiedostoja ovat ne, joiden vieressä on tähti (*).

FirmataExpress

├── * Levyt. H

Examples── esimerkkejä

Irm └── FirmataExpress

│ ├── boardx

F ├── * FirmataExpress.ino

IC ├── LICENSE.txt

│ └── Makefile

├── * FirmataConstants.h

├── * FirmataDefines.h

├── FirmataExpress.cpp

Irm── FirmataExpress.h

Irm── FirmataMarshaller.cpp

├── FirmataMarshaller.h

├── FirmataParser.cpp

Irm── FirmataParser.h

Katsotaanpa kutakin tiedostoa ja tehtyjä muutoksia.

Laudat. H

Tämä tiedosto sisältää pin-tyyppiset makromääritelmät kullekin tuetulle korttityypille. Se määrittää tuettujen laitteiden enimmäismäärän, kun useampaa kuin yhtä laitetta on tuettava.

DHT -laitteeseen voidaan liittää enintään 6 laitetta kerrallaan ja tämä arvo määritellään seuraavasti:

#ifndef MAX_DHTS

#define MAX_DHTS 6 #endif

Lisäksi nastatyyppiset makrot voidaan valinnaisesti määrittää uudelle laitteelle, joko kaikille korttityypeille tai vain niille, jotka kiinnostavat sinua. Näitä makroja käytetään enimmäkseen raportointitarkoituksiin, eikä niitä käytetä laitteiden ohjaamiseen. Nämä makrot määrittävät molemmat laitetta tukevat nastat:

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

Sekä makro, joka määrittää pin-numeron muunnoksen.

#define PIN_TO_DHT (p) PIN_TO_DIGITAL (p)

FirmataConstants.h

Tämä tiedosto sisältää laiteohjelmiston versionumeron, jota haluat ehkä muokata, jotta voit seurata, minkä version olet ladannut Arduinoosi. Se sisältää myös Firmata -sanoma -arvot, mukaan lukien Firmata SysEx -viestit.

Sinun on määritettävä laitteellesi uusi viesti tai viestisarja tähän tiedostoon. DHT: lle lisättiin kaksi viestiä. Toinen määrittää nastan "DHT" -naulaksi ja toinen reportteriviestiksi, kun lähetetään viimeisimmät DHT -tiedot takaisin asiakkaalle.

staattinen const int DHT_CONFIG = 0x64;

staattinen const int DHT_DATA = 0x65;

Pin -tilat on määritetty myös tässä tiedostossa. DHT: lle luotiin uusi pin -tila:

staattinen const int PIN_MODE_DHT = 0x0F; // pin määritetty DHT: lle

Kun lisäät uuden nastaisen tilan, TOTAL_PIN_MODES on säädettävä:

staattinen const int TOTAL_PIN_MODES = 17;

FirmataDefines.h

Tämä tiedosto on päivitettävä vastaamaan FirmataConstantsiin lisättyjä uusia viestejä. H:

#ifdef DHT_CONFIG #undef DHT_CONFIG #endif #define DHT_CONFIG firmata:: DHT_CONFIG // DHT -pyyntö #ifdef DHT_DATA #undef DHT_DATA #endif #define DHT_DATA firmata:: PIN_MODE_DHT

FirmataExpress.ino

Tässä keskustelussa käsittelemme tähän Arduinon luonnokseen tehtyjen muutosten "kohokohtia".

Jotta FirmataExpress voisi tukea jopa kuutta DHT -laitetta samanaikaisesti, luotiin 3 ryhmää, jotka seuraavat jokaisen laitteen pin -numeroa, sen WakeUpDelay -arvoa ja laitetyyppiä eli DHT22 tai DHT11:

// DHT -anturit

int numActiveDHTs = 0; // liitettyjen DHT -laitteiden lukumäärä uint8_t DHT_PinNumbers [MAX_DHTS]; uint8_t DHT_WakeUpDelay [MAX_DHTS]; uint8_t DHT_TYPE [MAX_DHTS];

Koska molempien laitetyyppien lukeminen kestää noin 2 sekuntia, meidän on varmistettava, että luemme jokaisen DHT: n vain kerran 2 sekunnin aikavälissä. Jotkin laitteet, kuten DHT-laitteet ja HC-SR04-etäisyysanturit, ovat käytettävissä vain määräajoin. Tämä antaa heille aikaa olla vuorovaikutuksessa ympäristönsä kanssa.

uint8_t nextDHT = 0; // indeksoi dht seuraavaksi luettavaksi

uint8_t currentDHT = 0; // Seuraa, mikä anturi on aktiivinen. int dhtNumLoops = 0; // Tavoitemäärä silmukan b4 kautta, joka käyttää DHT: tä int dhtLoopCounter = 0; // Silmukkalaskuri

DHT -laitteen määrittäminen ja lukeminen

Kun FirmataExpress vastaanottaa SysEx -komennon PIN -koodin määrittämiseksi DHT -toimintaa varten, se varmistaa, että DHT -laitteiden enimmäismäärää ei ole ylitetty. Jos uutta DHT: tä voidaan tukea, DHT -taulukot päivitetään. Jos DHT -tyyppiä ei tunneta, SysEx -merkkijonoviesti luodaan ja lähetetään takaisin pymata4: ään

tapaus DHT_CONFIG: int DHT_Pin = argv [0]; int DHT_type = argv [1]; jos (numActiveDHTs <MAX_DHTS) {if (DHT_type == 22) {DHT_WakeUpDelay [numActiveDHTs] = 1; } muu jos (DHT_type == 11) {DHT_WakeUpDelay [numActiveDHTs] = 18; } else {Firmata.sendString ("ERROR: UNKNOWN SENSOR TYPE, VALID SENSOR ARE 11, 22"); tauko; } // testaa anturia DHT_PinNumbers [numActiveDHTs] = DHT_Pin; DHT_TYPE [numActiveDHTs] = DHT_type; setPinModeCallback (DHT_Pin, PIN_MODE_DHT);

FirmataExpress yrittää sitten kommunikoida DHT -laitteen kanssa. Jos virheitä ilmenee, se muodostaa SysEx -viestin virhetiedon kanssa ja lähettää SysEx -viestin takaisin pymat4: lle. Muuttuja _bits sisältää DHT -laitteen palauttamat tiedot pymata4: n lisäkäsittelyyn haluttaessa.

Firmata.write (START_SYSEX);

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

Jos kelvolliset tiedot palautetaan, aktiivisten DHT: iden määrä kasvaa. Säädetään myös muuttuja, joka seuraa, kuinka monta silmukan iteraatiota on suoritettava ennen seuraavan DHT -datan tarkistamista. Tämä muuttuja varmistaa, että riippumatta siitä, kuinka monta DHT: tä lisätään järjestelmään, ne kaikki luetaan 2 sekunnin kuluessa.

int rv = lukuDhtSensor (numActiveDHTs);

jos (rv == DHTLIB_OK) {numActiveDHTs ++; dhtNumLoops = dhtNumLoops / numActiveDHTs; // Kaikki okei }

Jos luonnoksen silmukkatoiminnossa on määritetty yksi tai useampi DHT -laite, seuraava DHT -laite luetaan. Joko kelvolliset tiedot tai niiden virhetila palautetaan pymata4: ään SysEx -viestin muodossa:

if (dhtLoopCounter ++> dhtNumLoops) {if (numActiveDHTs) {int rv = readDhtSensor (nextDHT); uint8_t current_pin = DHT_PinNumbers [seuraavaDHT]; uint8_t current_type = DHT_TYPE [seuraavaDHT]; dhtLoopCounter = 0; currentDHT = seuraavaDHT; if (nextDHT ++> = numActiveDHTs - 1) {nextDHT = 0; } if (rv == DHTLIB_OK) {// TESTIEN TARKISTUSSUMMA uint8_t summa = _bittiä [0] + _bittiä [1] + _bittiä [2] + _bittiä [3]; jos (_bittiä [4]! = summa) {rv = -1; }} // lähetä viesti takaisin virheilmoituksella Firmata.write (START_SYSEX); Firmata.write (DHT_DATA); Firmata.write (current_pin); Firmata.write (nykyinen_tyyppi); 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 -laitteen kanssa kommunikoimiseen käytettävä koodi johdetaan suoraan DHTNew -kirjastosta:

int readDhtSensor (int -indeksi) {

// INIT BUFFERVAR TIETOJEN VASTAANOTTAMISEKSI uint8_t mask = 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) 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) // seuraava tavu? {Mask = 128; idx ++;}} palauta DHTLIB_OK;}

Vaihe 4: Pymata4: n muokkaaminen DHT -tuelle

private_constants.h

DHT: n tukemiseksi meidän on lisättävä sekä uudet pin-tyyppiset että SysEx-viestit tähän tiedostoon:

# nastatilat INPUT = 0x00 # nasta asetettu tuloksi OUTPUT = 0x01 # nasta asetettu lähtöksi ANALOG = 0x02 # analoginen nasta analogisessa Tulotilassa PWM = 0x03 # digitaalinen nasta PWM -lähtötilassa SERVO = 0x04 # digitaalinen nasta servolähtötilassa I2C = 0x06 # nasta sisältyy I2C -määritykseen STEPPER = 0x08 # mikä tahansa nasta stepper -tilassa SERIAL = 0x0a PULLUP = 0x0b # Mikä tahansa nasta pullup -tilassa SONAR = 0x0c # Mikä tahansa SONAR -tilan TONE = 0x0d # Mikä tahansa nasta äänitilassa PIXY = 0x0e # varattu pikakameratilaan DHT = 0x0f # DHT -anturi IGNORE = 0x7f # DHT SysEx -komentoviestit DHT_CONFIG = 0x64 # dht config -komento DHT_DATA = 0x65 # dht -anturivastaus

Lisätty nastatyypin ja SysEx -komentojen on vastattava FirmataExpressiin lisätyn FirmataConstants.h: n arvoja.

pymata4.py

Pymata4 yhdistää Python -sanakirjan nopeasti saapuvan Firmata -viestin viestinkäsittelijään. Tämän sanakirjan nimi on report_dispatch.

Sanakirjan merkintämuoto on:

{MessageID: [message_handler, käsiteltävien datatavujen määrä]}

Sanakirjaan lisättiin kohde saapuvien DHT -viestien käsittelemiseksi:

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

Viestin 7 tavua dataa ovat Arduinon digitaalinen pin -numero, DHT -laitteen tyyppi (22 tai 11) ja 5 tavua raakatietoa.

_Dht_read_response -menetelmä tarkistaa ilmoitetut virheet. Jos ilmoitettuja virheitä ei ole, kosteus ja lämpötila lasketaan käyttämällä Arduino DHTNew -kirjastosta siirrettyä algoritmia.

Lasketut arvot raportoidaan käyttäjän toimittaman takaisinsoittomenetelmän kautta. Ne tallennetaan myös sisäiseen pin_data -tietorakenteeseen. Viimeisin raportoitu arvo voidaan palauttaa kyselyllä pin_data käyttämällä dht_read -menetelmää.

Uuden DHT -laitteen määrittäminen

Kun lisäät uutta DHT -laitetta, kutsutaan set_pin_mode_dht -menetelmää. Tämä menetelmä päivittää digitaalisten nastojen pin_data. Se myös luo ja lähettää DHT_CONFIG SysEx -viestin FirmataExpressille.

Vaihe 5: Kääriminen ylös

Kuten olemme nähneet, Firmata-tuen lisääminen uudelle laitteelle edellyttää Arduino FirmataExpress -palvelinkoodin ja Python-pohjaisen pymata4-asiakaskoodin muokkaamista. FirmataExpress -koodin virheenkorjaus voi olla haastavaa. PrintData -niminen menetelmä lisättiin FirmataExpressiin virheenkorjauksen helpottamiseksi. Tämän menetelmän avulla voit lähettää data -arvoja FirmataExpressistä ja tulostaa ne pymata4 -konsoliin.

Tämä toiminto vaatii sekä merkkijonon osoittimen että arvon, jota haluat tarkastella. Jos data -arvo sisältyy argc -nimiseen muuttujaan, voit kutsua printData -parametrin seuraavilla parametreilla.

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

Jos sinulla on kysyttävää, jätä kommentti, niin vastaan mielelläni.

Hyvää koodausta!

Suositeltava: