Satura rādītājs:

Iet ārpus standartaFirmata - pārskatīts: 5 soļi
Iet ārpus standartaFirmata - pārskatīts: 5 soļi

Video: Iet ārpus standartaFirmata - pārskatīts: 5 soļi

Video: Iet ārpus standartaFirmata - pārskatīts: 5 soļi
Video: Новый год в реальной жизни. Страшные истории про Рождество. Ужасы. Мистика 2024, Novembris
Anonim
Going Beyond StandardFirmata - atkārtoti
Going Beyond StandardFirmata - atkārtoti

Pirms neilga laika ar mani sazinājās pymata4 lietotājs Dr Martyn Wheeler, lai saņemtu norādījumus, kā pymata4 bibliotēkai pievienot atbalstu DHT22 mitruma/temperatūras sensoram. Bibliotēka pymata4 kopā ar Arduino kolēģi FirmataExpress ļauj lietotājiem attālināti vadīt un uzraudzīt savas Arduino ierīces. Dažu e -pasta apmaiņas kārtu laikā Dr Wheeler veiksmīgi mainīja gan pymata4, gan FirmataExpress. Rezultātā DHT22 un DHT11 sensoru atbalsts tagad ir pymata4 un FirmataExpress standarta sastāvdaļa.

2014. gada maijā es uzrakstīju rakstu par atbalsta pievienošanu Firmata papildu ierīcēm. Pārdomājot šo rakstu, es sapratu, cik daudz ir mainījies, kopš es šim rakstam paņēmu pildspalvu uz papīra. Papildus šim rakstam Dr Wheeler dokumentēja savus centienus, un jūs, iespējams, vēlēsities to pārbaudīt.

FirmataExpress pamatā ir StandardFirmata, un StandardFirmata direktoriju struktūra ir attīstījusies. Turklāt pymata4 API arī nedaudz atšķiras no sākotnējās PyMata API 2014. gadā. Es domāju, ka šis būtu īstais laiks šī raksta pārskatīšanai un atjaunināšanai. Pamatojoties uz Dr Wheeler darbu, izpētīsim, kā paplašināt pymata4/FirmataExpress funkcionalitāti.

Pirms mēs sākam - daži pamatinformācija par Arduino/Firmata

Kas tad ir Firmata? Citāts no Firmata tīmekļa lapas: "Firmata ir vispārējs protokols saziņai ar mikrokontrolleriem no saimniekdatora programmatūras."

Arduino Firmata izmanto seriālo saskarni, lai pārsūtītu gan komandu, gan ziņojumu informāciju starp Arduino mikrokontrolleri un datoru, parasti izmantojot sērijas/USB saiti, kas iestatīta uz 57600 bps. Šajā saitē pārsūtītie dati ir bināri, un protokols tiek ieviests klienta/servera modelī.

Servera puse tiek augšupielādēta Arduino mikrokontrollerī Arduino skices veidā. StandardFirmata skice, kas iekļauta Arduino IDE, kontrolē Arduino I/O tapas, kā to pavēlējis klients. Tas arī ziņo klientam par ievades tapu izmaiņām un citu pārskatu informāciju. FirmataExpress ir StandardFirmata paplašināta versija. Tas darbojas ar sērijveida saites ātrumu 115200 bps.

Šajā rakstā izmantotais Arduino klients ir pymata4. Tā ir Python lietojumprogramma, kas tiek izpildīta personālajā datorā. Tas gan sūta komandas, gan saņem ziņojumus no Arduino servera. Tā kā pymata4 ir ieviests Python, tas darbojas operētājsistēmās Windows, Linux (ieskaitot Raspberry Pi) un macOS datoros.

Kāpēc izmantot Firmata?

Arduino mikrokontrolleri ir brīnišķīgas mazas ierīces, taču procesora un atmiņas resursi ir nedaudz ierobežoti. Lietojumprogrammām, kas aizņem daudz procesora vai atmiņas, bieži vien nav citas izvēles, kā resursu pieprasījumu pārkraut datorā, lai lietojumprogramma būtu veiksmīga.

Bet tas nav vienīgais iemesls, kāpēc izmantot StandardFirmata. Izstrādājot vieglākas Arduino lietojumprogrammas, dators var nodrošināt rīkus un atkļūdošanas iespējas, kas nav tieši pieejamas Arduino mikrokontrollerī. "Fiksēta" klienta un servera izmantošana palīdz ierobežot lietojumprogrammas sarežģītību ar datoru, kas ir vieglāk pārvaldāms. Kad lietojumprogramma ir pilnveidota, to var tulkot kā pielāgotu, atsevišķu Arduino skici.

Kāpēc izmantot pymata4?

Es, būdams tā autors, protams, esmu neobjektīvs. Tomēr tas ir vienīgais Python bāzētais Firmata klients, kas pēdējo gadu laikā ir nepārtraukti uzturēts. Tas nodrošina intuitīvu un viegli lietojamu API. Papildus uz StandardFirmata balstītajām skicēm, izmantojot StandardFirmataWifI skici, tā atbalsta Firmata, izmantojot WiFi, tādām ierīcēm kā ESP-8266.

Turklāt pymata4 tika izstrādāts tā, lai lietotājs to varētu viegli paplašināt, lai atbalstītu papildu sensorus un izpildmehānismus, ko pašlaik neatbalsta StandardFirmata.

1. darbība. Izprotiet Firmata protokolu

Izpratne par Firmata protokolu
Izpratne par Firmata protokolu

Arduino Firmata sakaru protokols ir iegūts no MIDI protokola, kas datu attēlošanai izmanto vienu vai vairākus 7 bitu baitus.

Firmata tika izstrādāta tā, lai to varētu paplašināt lietotājs. Mehānisms, kas nodrošina šo paplašināmību, ir sistēmas ekskluzīvās (SysEx) ziņojumapmaiņas protokols.

SysEx ziņojuma formāts, kā noteikts Firmata protokolā, ir parādīts iepriekš redzamajā attēlā. Tas sākas ar START_SYSEX baitu ar fiksētu heksadecimālo vērtību 0xF0, un tam seko unikāls SysEx komandu baits. Komandas baita vērtībai jābūt heksadecimālā diapazonā 0x00-0x7F. Pēc tam komandas baitam seko nenoteikts 7 bitu datu baitu skaits. Visbeidzot, ziņojums tiek pārtraukts ar baitu END_SYSEX ar fiksētu heksadecimālu vērtību 0xF7.

Firmata datu kodēšana/dekodēšana

Tā kā SysEx ziņojuma lietotāja datu daļa sastāv no 7 bitu baitu sērijas, jums var rasties jautājums, kā attēlot vērtību, kas lielāka par 128 (0x7f)? Firmata kodē šīs vērtības, izjaucot tās vairākos 7 bitu gabalos pirms datu sakārtošanas pa datu saiti. Vispirms tiek nosūtīts datu vienības vismazākais nozīmīgais baits (LSB), kam pēc vienošanās seko arvien nozīmīgākas datu vienības sastāvdaļas. Datu vienības nozīmīgākais baits (MSB) ir pēdējais nosūtītais datu vienums.

Kā tas darbojas?

Pieņemsim, ka mēs vēlamies SysEx ziņojuma datu daļā iekļaut vērtību 525. Tā kā vērtība 525 nepārprotami ir lielāka par vērtību 128, mums tā jāsadala vai jāizjauc 7 bitu “gabalos”.

Lūk, kā tas tiek darīts.

Vērtība 525 decimāldaļā ir ekvivalenta heksadecimālajai vērtībai 0x20D, 2 baitu vērtībai. Lai iegūtu LSB, mēs maskējam vērtību, nosakot to ar ANDx ar 0x7F. Gan "C", gan Python ieviešana ir parādīta zemāk:

// "C" ieviešana, lai izolētu LSB

int max_distance_LSB = max_distance & 0x7f; // maskējiet apakšējo baitu # Python ieviešana, lai izolētu LSB max_distance_LSB = max_distance & 0x7F # maskētu apakšējo baitu

Pēc maskēšanas max_distance_LSB saturēs 0x0d. 0x20D un 0x7F = 0x0D.

Tālāk mums ir jāizolē MSB šai 2 baitu vērtībai. Lai to izdarītu, mēs pārvietosim 0x20D vērtību pa labi, 7 vietās.

// "C" ieviešana, lai izolētu MSB 2 baitu vērtībā

int max_distance_MSB = max_distance >> 7; // pārvietot augstākās kārtas baitu # Python ieviešana, lai izolētu MSB 2 baitu vērtībā max_distance_MSB = max_distance >> 7 # shift, lai iegūtu augšējo baitu Pēc maiņas max_distance_MSB saturēs vērtību 0x04.

Kad tiek saņemti "sašķelti" sakārtoti dati, tie ir jāsamontē vienā vērtībā. Lūk, kā dati tiek atkārtoti salikti gan "C", gan Python

// "C" ieviešana, lai saliktu 2 baitus, // 7 bitu vērtības vienā vērtībā int max_distance = argv [0] + (argv [1] << 7); # Python ieviešana, lai saliktu 2 baitu, # 7 bitu vērtības vienā vērtībā max_distance = dati [0] + (dati [1] << 7)

Pēc salikšanas vērtība atkal ir vienāda ar 525 decimālzīmēm vai 0x20D heksadecimālām.

Šo demontāžas/salikšanas procesu var veikt vai nu klients, vai serveris.

2. darbība. Sāksim darbu

Lai atbalstītu jaunu ierīci, ir jāmaina gan Arduino pastāvīgais serveris, gan datora pastāvīgais Python klients. Dr Wheeler darbs tiks izmantots, lai ilustrētu nepieciešamās izmaiņas.

Varbūt vissvarīgākais solis ir izlemt, vai vēlaties integrēt esošu atbalsta ierīču bibliotēku vienādojuma Arduino pusē vai rakstīt savu. Ieteicams, ja atrodat esošu bibliotēku, to izmantot ir daudz vienkāršāk nekā rakstīt savu bibliotēku no nulles.

Lai atbalstītu DHT ierīces, Dr Wheeler savu paplašinājuma kodu pamatoja ar DHTNew bibliotēku. Ļoti gudri Dr Wheeler sadalīja DHTNew bibliotēkas funkcionalitāti vienādojuma Arduino un pymata4 pusēs, lai nodrošinātu minimālu bloķēšanu Arduino pusē.

Ja paskatāmies uz DHTNew, tas veic visas šīs darbības:

  • Iestata izvēlēto tapu digitālās izvades režīmu.
  • Izmeklē kodētu signālu, lai iegūtu jaunākās mitruma un temperatūras vērtības.
  • Pārbauda kļūdas un ziņo par tām.
  • Aprēķina cilvēkam nolasāmas temperatūras un mitruma vērtības no iegūtajiem neapstrādātajiem datiem.

Lai viss būtu pēc iespējas efektīvāks FirmataExpress pusē, Dr Wheeler ielādēja datu pārveidošanas kārtību no Arduino uz pymata4.

3. darbība: FirmataExpress modificēšana DHT atbalstam

FirmataExpress direktoriju koks

Zemāk ir visi faili, kas ietver FirmataExpress repozitoriju. Šis koks ir identisks StandardFiramata kokam, tikai daži failu nosaukumi atspoguļo krātuves nosaukumu.

Faili, kas jāmaina, ir tie, kuriem blakus ir zvaigznīte (*).

FirmataExpress

├── * Dēļi.h

Examples── piemēri

│ └── FirmataExpress

│ ├── boardx

├── * FirmataExpress.ino

IC ├── LICENSE.txt

│ └── Makefile

├── * FirmataConstants.h

├── * FirmataDefines.h

├── FirmataExpress.cpp

├── FirmataExpress.h

├── FirmataMarshaller.cpp

├── FirmataMarshaller.h

├── FirmataParser.cpp

└── FirmataParser.h

Apskatīsim katru failu un veiktās izmaiņas.

Dēļi.h

Šis fails satur pin tipa makro definīcijas katram atbalstītajam plates tipam. Tas nosaka maksimālo atbalstīto ierīču skaitu, ja jāatbalsta vairākas ierīces.

DHT ierīcei vienlaikus var pievienot līdz 6 ierīcēm, un šī vērtība tiek definēta šādi:

#ifndef MAX_DHTS

#define MAX_DHTS 6 #endif

Tāpat jaunajai ierīcei pēc izvēles var tikt noteikti pin tipa makro, vai nu visiem dēļu veidiem, vai tikai tiem, kas jūs interesē. Šie makro tiek izmantoti galvenokārt ziņošanas nolūkos un netiek izmantoti ierīču vadībai. Šie makro nosaka abas tapas, kas atbalsta ierīci:

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

Kā arī makro, lai definētu pin-skaitļa konversiju.

#define PIN_TO_DHT (p) PIN_TO_DIGITAL (p)

FirmataConstants.h

Šajā failā ir programmaparatūras versijas numurs, kuru, iespējams, vēlēsities mainīt, lai izsekotu, kuru versiju esat ielādējis savā Arduino. Tajā ir arī Firmata ziņojumu vērtības, ieskaitot Firmata SysEx ziņojumus.

Šajā failā ierīcei būs jāpiešķir jauns ziņojums vai ziņojumu kopa. DHT tika pievienoti divi ziņojumi. Viens konfigurē tapu kā “DHT” tapu, bet otrs kā reportiera ziņojumu, nosūtot klientam jaunākos DHT datus.

statiskā konst int int DHT_CONFIG = 0x64;

statiskā konst int int DHT_DATA = 0x65;

Šajā failā ir norādīti arī pin režīmi. DHT tika izveidots jauns tapas režīms:

static const int PIN_MODE_DHT = 0x0F; // PIN konfigurēts DHT

Pievienojot jaunu tapas režīmu, ir jāpielāgo TOTAL_PIN_MODES:

static const int TOTAL_PIN_MODES = 17;

FirmataDefines.h

Šis fails ir jāatjaunina, lai atspoguļotu jaunos ziņojumus, kas pievienoti FirmataConstants.h:

#ifdef DHT_CONFIG #undef DHT_CONFIG #endif #define DHT_CONFIG firmata:: DHT_CONFIG // DHT pieprasījums #ifdef DHT_DATA #undef DHT_DATA #endif #define DHT_DATA firmata:: DHT_DATA // DHT atbilde #ifDFDD_FIN_OD:: PIN_MODE_DHT

FirmataExpress.ino

Šajā diskusijā mēs apskatīsim šajā Arduino skicē veikto izmaiņu “augstos punktus”.

Lai FirmataExpress vienlaikus atbalstītu līdz sešām DHT ierīcēm, tika izveidoti 3 masīvi, lai izsekotu katram ar ierīci saistītajam PIN numuram, tā WakeUpDelay vērtībai un ierīces tipam, tas ir, DHT22 vai DHT11:

// DHT sensori

int numActiveDHTs = 0; // pievienoto DHT skaits uint8_t DHT_PinNumbers [MAX_DHTS]; uint8_t DHT_WakeUpDelay [MAX_DHTS]; uint8_t DHT_TYPE [MAX_DHTS];

Tā kā abiem ierīču veidiem starp lasījumiem ir nepieciešamas aptuveni 2 sekundes, mums jāpārliecinās, ka katru DHT lasām tikai vienu reizi 2 sekunžu laikā. Dažām ierīcēm, piemēram, DHT ierīcēm un HC-SR04 attāluma sensoriem, var piekļūt tikai periodiski. Tas viņiem dod laiku mijiedarboties ar savu vidi.

uint8_t nextDHT = 0; // indeksēt uz dht , lai nākamā ierīce tiktu nolasīta

uint8_t strāvaDHT = 0; // Seko, kurš sensors ir aktīvs. int dhtNumLoops = 0; // Mērķa reižu skaits, izmantojot cilpu b4, piekļūstot DHT int dhtLoopCounter = 0; // Cilpas skaitītājs

DHT ierīces konfigurēšana un lasīšana

Kad FirmataExpress saņem SysEx komandu, lai konfigurētu tapu DHT darbībai, tā pārbauda, vai nav pārsniegts maksimālais DHT ierīču skaits. Ja jauno DHT var atbalstīt, DHT masīvi tiek atjaunināti. Ja DHT tips nav zināms, tiek izveidots SysEx virknes ziņojums un nosūtīts atpakaļ uz pymata4

gadījums DHT_CONFIG: int DHT_Pin = argv [0]; int DHT_type = argv [1]; ja (numActiveDHTs <MAX_DHTS) {ja (DHT_type == 22) {DHT_WakeUpDelay [numActiveDHTs] = 1; } cits if (DHT_type == 11) {DHT_WakeUpDelay [numActiveDHTs] = 18; } else {Firmata.sendString ("KĻŪDA: UNKNOWNENS SENSOR TYPE, VALID SENSORS ARE 11, 22"); pārtraukums; } // pārbaudīt sensoru DHT_PinNumbers [numActiveDHTs] = DHT_Pin; DHT_TYPE [numActiveDHTs] = DHT_type; setPinModeCallback (DHT_Pin, PIN_MODE_DHT);

Pēc tam FirmataExpress mēģina sazināties ar DHT ierīci. Ja ir kādas kļūdas, tas veido SysEx ziņojumu ar kļūdas datiem un nosūta SysEx ziņojumu atpakaļ uz pymat4. Mainīgais _bits satur datus, ko atgriezusi DHT ierīce, lai pēc vajadzības tos apstrādātu pymata4.

Firmata.write (START_SYSEX);

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

Ja tiek atgriezti derīgi dati, aktīvo DHT skaits tiek palielināts. Tiek pielāgots arī mainīgais, kas izseko cik ciklu atkārtojumu ir jāpabeidz pirms nākamā DHT datu pārbaudes. Šis mainīgais nodrošina, ka neatkarīgi no tā, cik DHT ir pievienoti sistēmai, tie visi tiks nolasīti 2 sekunžu laikā.

int rv = readDhtSensor (numActiveDHTs);

ja (rv == DHTLIB_OK) {numActiveDHTs ++; dhtNumLoops = dhtNumLoops / numActiveDHTs; // viss kārtībā}

Ja skices cilpas funkcijā ir konfigurēta viena vai vairākas DHT ierīces, tiek nolasīta nākamā DHT ierīce. Vai nu derīgie dati, vai to kļūdas statuss tiek atgriezti pymata4 SysEx ziņojuma veidā:

ja (dhtLoopCounter ++> dhtNumLoops) {if (numActiveDHTs) {int rv = readDhtSensor (nextDHT); uint8_t current_pin = DHT_PinNumbers [nextDHT]; uint8_t current_type = DHT_TYPE [nextDHT]; dhtLoopCounter = 0; pašreizējaisDHT = nākamaisDHT; ja (nextDHT ++> = numActiveDHTs - 1) {nextDHT = 0; } ja (rv == DHTLIB_OK) {// TESTA PĀRBAUDES SUMMA uint8_t summa = _bits [0] + _bits [1] + _bits [2] + _bits [3]; ja (_biti [4]! = summa) {rv = -1; }} // nosūtīt ziņojumu atpakaļ ar kļūdas statusu Firmata.write (START_SYSEX); Firmata.write (DHT_DATA); Firmata.write (pašreizējais_pins); Firmata.write (pašreizējais_tips); par (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);}}

Kods, ko izmanto, lai sazinātos ar DHT ierīci, ir iegūts tieši no DHTNew bibliotēkas:

int readDhtSensor (int indekss) {

// INIT BUFFERVAR DATU SAŅEMŠANAI 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) atgriezt 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] | = maska;} maska >> = 1; if (maska == 0) // nākamais baits? {Mask = 128; idx ++;}} atgriezt DHTLIB_OK;}

4. darbība: Pymata4 modificēšana DHT atbalstam

private_constants.h

Lai atbalstītu DHT, mums šim failam jāpievieno gan jaunie pin tipa, gan SysEx ziņojumi:

# tapas režīmi INPUT = 0x00 # tapas iestatītas kā ieeja OUTPUT = 0x01 # tapas iestatītas kā izejas ANALOG = 0x02 # analog pin in analog Input mode PWM = 0x03 # digital pin in PWM output mode SERVO = 0x04 # digital pin in Servo output mode I2C = 0x06 # tapa iekļauta I2C iestatījumā STEPPER = 0x08 # jebkura tapa stepper režīmā SERIAL = 0x0a PULLUP = 0x0b # Jebkurš tapa piespraušanas režīmā SONAR = 0x0c # Jebkurš tapa SONAR režīmā TONE = 0x0d # Jebkurš tapa toņa režīmā PIXY = 0x0e # rezervēts pixy kameras režīmam DHT = 0x0f # DHT sensors IGNORE = 0x7f # DHT SysEx komandu ziņojumi DHT_CONFIG = 0x64 # dht config komanda DHT_DATA = 0x65 # dht sensoru atbilde

Pievienotajam tapas veidam un SysEx komandām jāatbilst FirmataConstants.h pievienotajām vērtībām FirmataExpress.

pymata4.py

Pymata4 izmanto Python vārdnīcu, lai ātri saistītu ienākošo Firmata ziņojumu ar ziņojumu apstrādātāju. Šīs vārdnīcas nosaukums ir report_dispatch.

Vārdnīcas ieraksta formāts ir šāds:

{Ziņojuma ID: [īsziņu apstrādātājs, apstrādājamo datu baitu skaits]}

Vārdnīcai tika pievienots ieraksts, lai apstrādātu ienākošos DHT ziņojumus:

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

Ziņojumā iekļautie 7 baiti ir Arduino digitālās tapas numurs, DHT ierīces tips (22 vai 11) un 5 baiti neapstrādātu datu.

Metode _dht_read_response pārbauda, vai nav konstatētas kļūdas. Ja nav ziņots par kļūdām, mitrums un temperatūra tiek aprēķināti, izmantojot algoritmu, kas pārnests no Arduino DHTNew bibliotēkas.

Aprēķinātās vērtības tiek ziņotas, izmantojot lietotāja atzvanīšanas metodi. Tie tiek saglabāti arī iekšējā pin_data datu struktūrā. Pēdējo ziņoto vērtību var atsaukt, aptaujājot pin_data, izmantojot metodi dht_read.

Jaunas DHT ierīces konfigurēšana

Pievienojot jaunu DHT ierīci, tiek izsaukta metode set_pin_mode_dht. Šī metode atjaunina ciparu tapas pin_data. Tas arī izveido un nosūta DHT_CONFIG SysEx ziņojumu FirmataExpress.

5. solis: iesaiņošana

Kā redzējām, pievienojot Firmata atbalstu jaunai ierīcei, ir jāmaina Arduino FirmataExpress servera kods un Python bāzes pymata4 klienta kods. FirmataExpress kodu var būt grūti atkļūdot. Lai atvieglotu atkļūdošanu, FirmataExpress tika pievienota metode printData. Šī metode ļauj nosūtīt datu vērtības no FirmataExpress un izdrukāt tās pymata4 konsolē.

Šai funkcijai nepieciešams gan rādītājs uz rakstzīmju virkni, gan vērtība, kuru vēlaties skatīt. Ja datu vērtība ir iekļauta mainīgajā, ko sauc par argc, varat izsaukt printData ar šādiem parametriem.

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

Ja jums ir kādi jautājumi, vienkārši atstājiet komentāru, un es labprāt atbildēšu.

Laimīgu kodēšanu!

Ieteicams: