Utöver StandardFirmata - lägger till stöd för nya
INTRODUKTION
Har du någonsin tänkt på att använda Firmata för din Arduino projekt, bara för att finna att den enhet som du vill använda inte stöds av Firmata? Denna artikel visar steg för steg strategi jag brukade lägga till stepper motor stöd till PyMata och dess associerade Arduino skiss, FirmataPlus. Efter att ha läst denna handledning bör du vara redo att utvidga Firmata för din enhet.
Innan vi börjar - bakgrundsinformation några om Arduino/Firmata
Så vad är Firmata? Citerar från webbsidan Firmata, är"Firmata ett generiskt protokoll för kommunikation med mikrokontroller från programvara på en värddator."
Arduino Firmata använder ett seriellt gränssnitt för att transportera både kommandot och rapportera uppgifter mellan en Arduino mikrokontroller och en dator, oftast via en seriell/USB-länk att en skattesats på 57600 bps. Data som överförs via denna länk är binär i naturen och protokollet genomförs i enklient- servermodell.
Serversidan är upp till en Arduino mikrokontroller i form av en Arduino skiss. StandardFirmata skiss, ingår i Arduino IDE, kontrollerar de Arduino I/O pins, som under befäl av klienten och rapporter ingångsstift förändringar, liksom andra rapportinformationen tillbaka till klienten. FirmataPlus är en utökad version av StandardFIrmata.
Arduino klienten används för denna artikel är PyMata. Det är ett Python-program som körs på en PC. Det både skickar kommandon till, och tar emot rapporter från Arduino servern.
Varför använda Firmata?
Arduino microcontrollers är underbara små enheter, men processor och minne resurser är något begränsad. För program som är processor eller minne intensiv, finns det ofta inget annat val än att lasta resursefterfrågan på en PC för att ansökan ska lyckas.
Men det är inte enda skälet för att använda StandardFirmata. När de utvecklar lättare vikt Arduino program, kan en PC tillhandahålla verktyg och felsökning kapacitet inte direkt tillgängliga på en Arduino mikrokontroller. Använda en "fast" klient och server hjälper isolera variation till ett PC-program, där det lättare hanteras. När ansökan är perfekt, kan det översättas till en egen, fristående Arduino skiss.
Varför använda PyMata?
Vid tidpunkten för denna skrift är PyMata bara Python klienten som implementerar protokollet komplett StandardFirmata. Det är en multi-plattform bibliotek som stöder Windows, MAC och Linux operativsystem direkt ur lådan!
PyMata är dessutom utformad för att användare kan lätt utvidgas den för att stödja ytterligare sensorer och ställdon, för närvarande inte stöds av StandardFirmata.
Inte länge efter PyMata publicerades först, var det utvidgas att stödja Arduino tonen biblioteket, och att stödja upp till sex samtidiga HC-SR04 typ sonar avstånd sensorer. Sidan servertilläggen för dessa funktioner finns i FirmataPlus.
Översikt över de PyMata klient- och FirmataPlus
PyMata är en högpresterande flertrådade Python program. Dess "kommandot tråden" översätter användaren API-anrop till Firmata protokollmeddelanden och vidarebefordrar meddelandena till Arduino mikrokontroller. "Reporter tråden" tar emot, tolkar och fungerar på Firmata meddelanden från Arduino mikrokontroller.
En anpassad version av StandardFirmata, kallade FirmataPlus, ingår i PyMata fördelning. För närvarande läggs följande till StandardFirmata:
- Piezo enhetsgränssnittet med hjälp av Arduino tonen biblioteket
- Stöd för flera ultraljud avstånd sensorer med hjälp av NewPing biblioteket
- Begränsat stöd (Arduino Uno endast) för roterande pulsgivare med hjälp av adafruit rotationsencoder biblioteket
- En debug Skriv ut-funktion för att skriva ut interna skiss värden Python konsolen.
Förstå Firmata Data Representation
Firmata använder en seriell kommunikationsgränssnitt till transport data till och från Arduino. Firmata kommunikationsprotokoll härstammar från MIDI -protokollet som använder en eller flera 7 bitars byte för att representera. Eftersom 7 bitar kan hålla ett högsta värde på 128, måste ett dataobjekt som har ett värde större än 128, tas "isär" i flera 7 bitars byte bitar innan som marshaled över datalänken för. Konventionen skickas den minst signifikanta byten (LSB) av ett dataobjekt först, följt av allt större delar av dataobjektet. I den mest betydande byten (MSB) i dataobjektet är senaste data objekt skickas.
Så till exempel om en parameter som kallas max_distance med ett decimalvärde på 525 måste skickas över den seriella länken, måste det först vara "isär" i 7 bitars bitar.
Här är en diskussion om hur detta sker:
525 decimala värdet motsvarar det hexadecimala värdet på 0x20D, en 2 byte värde. För att få LSB, mask vi värdet av AND'ing det med 0x7F. Både "C" och Python implementeringar visas nedan:
"C" genomförande isolera LSB
int max_distance_LSB = max_distance & 0x7f; maskera den lägre byten
# Python genomförande isolera LSB
max_distance_LSB = max_distance & 0x7F # maskera den lägre byten
Efter maskering innehåller max_distance_LSB 0x0d. 0x20D & 0x7F = 0x0D
Sedan behöver vi isolera MSB för detta 2 byte värde. För att göra detta, kommer vi flytta värdet på 0x20D till höger, 7 platser.
"C" genomförande isolera MSB av 2 byte värde
int max_distance_MSB = max_distance >> 7. flytta den kick beställer byten
# Python genomförandet till isoloate MSB av 2 byte värde
max_distance_MSB = max_distance >> 7 # SKIFT att få den övre byten
Efter skiftande, innehåller max_distance_MSB värdet 0x04.
När "chunkified" marshaled data tas emot, måste det vara ihop till ett enda värde. Här är hur data är ihop i både "C" och Python
"C" genomförandet att sätta ihop 2 byte,
7 bitars värden till ett enda värde
int max_distance = argv [0] + (argv [1] << 7);
# Python genomförandet att sätta ihop 2 byte,
# 7 bitars värden till ett enda värde
max_distance = data [0] + (data [1] << 7)
Efter återmontering, värdet återigen är lika 525 decimala eller hexadecimala 0x20D.
Denna demontering/montering processer kan utföras av antingen klienten eller servern.