EINFÜHRUNG
Haben Sie jemals daran gedacht, mit Firmata für das Arduino -Projekt, nur um herauszufinden, dass das Gerät, das Sie verwenden möchten, nicht von Firmata unterstützt wird? Dieser Artikel beschreibt Schritt für Schritt Vorgehensweise ich Stepper motor PyMata und seiner damit verbundenen Arduino Sketch, unterstützen FirmataPlus. Sie sollten nach der Lektüre dieses Tutorial bereit, Firmata für Ihr Gerät zu erweitern.
Bevor wir beginnen - Hintergrundinformationen einige Informationen über Arduino/Firmata
Was ist Firmata? Zitat von der Webseite Firmata ist"Firmata ein generisches Protokoll für die Kommunikation mit Mikrocontrollern von Software auf einem Host-Computer."
Arduino Firmata verwendet eine serielle Schnittstelle, um Befehl und Bericht Informationen zwischen einem Arduino-Mikrocontroller und einem PC, in der Regel mit einem seriell/USB-Link setzen auf eine Rate von 57600 bps zu transportieren. Die Daten über diese Verbindung übertragen ist binär in der Natur und das Protokoll wird in einerClient/Server -Modell realisiert.
Die Server -Seite ist ein Arduino-Mikrocontroller in Form von einem Arduino-Skizze hochgeladen. Die StandardFirmata Skizze, aufgenommen mit der Arduino IDEsteuert die Arduino-i/o-Pins, wie durch den Kunden geboten, und es meldet Eingangs-Pin-Änderungen sowie sonstige Berichtsinformationen an den Client zurück. FirmataPlus ist eine erweiterte Version des StandardFIrmata.
Der Arduino- Client verwendet für diesen Artikel ist PyMata. Es ist eine Python-Anwendung, die auf einem PC ausgeführt wird. Es sendet Befehle, um sowohl Berichte aus dem Arduino-Server erhält.
Warum verwenden Firmata?
Arduino-Mikrocontroller sind wunderbare kleine Geräte, aber Prozessor und Speicher-Ressourcen sind etwas begrenzt. Für Anwendungen, die Prozessor oder speicherintensiv sind, gibt es oft wenig Wahl aber, entlasten den Ressourcenbedarf auf einem PC in Reihenfolge für die erfolgreiche Bewerbung.
Aber das ist nicht der einzige Grund für die Verwendung von StandardFirmata. Bei der Entwicklung von leichterer Gewicht Arduino Anwendungen kann ein PC Tools und debugging-Funktionen nicht direkt verfügbar auf einen Arduino-Mikrocontroller bieten. Mit einem "festen" Client und Server hilft Variabilität auf einer PC-Anwendung zu isolieren, wo es leichter verwaltet wird. Wenn die Anwendung perfektioniert ist, kann es zu einem benutzerdefinierten, eigenständigen Arduino Sketch übersetzt werden.
Warum verwenden PyMata?
Zum Zeitpunkt des Schreibens dieses Artikels ist PyMata nur Python-Client, der das komplette StandardFirmata-Protokoll implementiert. Es ist ein Multi-Plattform-Bibliothek, die Windows, MAC und Linux Betriebssysteme direkt aus der Box unterstützt!
Darüber hinaus war PyMata so konzipiert, dass Benutzer problemlos erweitert es um zusätzliche Sensoren und Aktoren, unterstützt derzeit nicht durch StandardFirmata zu unterstützen können.
Nicht lange nach PyMata ursprünglich veröffentlicht wurde, war es, die Arduino- Ton -Bibliothek unterstützen und bis zu sechs gleichzeitige HC-SR04 Art Sonar Abstandssensoren unterstützen erweitert. Die Server-Seite-Erweiterungen für diese Funktionen werden in FirmataPlusangeboten.
Übersicht über die PyMata Client- und FirmataPlus
PyMata ist ein Hochleistungs-Multi-threaded Python-Anwendung. Seine "Befehl-Thread" übersetzt Benutzer API-Aufrufe in Firmata Protokollnachrichten und leitet diese Nachrichten an den Arduino-Mikrocontroller. Die "Reporter-Thread" empfängt, interpretiert und wirkt auf die Firmata Nachrichten von der Arduino-Mikrocontroller.
Eine angepasste Version von StandardFirmata, genannt FirmataPlus, ist die PyMata Verteilung enthalten. Derzeit werden StandardFirmata Folgendes hinzugefügt:
- Ein Piezo-Device-Schnittstelle mit der Arduino-Ton-Bibliothek
- Unterstützung für mehrere Ultraschall Abstandssensor mit Hilfe der NewPing-Bibliothek
- Eingeschränkter Support (nur Arduino Uno) für Drehgeber Adafruit Drehgeber Bibliotheksbenützung
- Eine Debug-Druckfunktion, interne Skizze-Werte in der Python-Konsole zu drucken.
Verständnis Firmata Datendarstellung
Firmata verwendet eine seriellen Schnittstelle um Daten zu transportieren und nach dem Arduino. Firmata Kommunikationsprotokoll ist das MIDI- Protokoll abgeleitet, die mindestens eine 7-Bit-Byte verwendet, um Daten darzustellen. Weil 7 Bits zu einen maximalen Wert von 128 halten können, muss ein Datenelement, das einen Wert größer als 128, hat "demontiert" in mehrere 7-Bit-Byte-Blöcke vor über die Datenverbindung gemarshallt wird. Gemäß der Konvention ist das niederwertigste Byte (LSB) eines Datenelements zuerst schickte gefolgt von zunehmend wichtige Komponenten des Datenelements. Der das höchstwertige Byte (MSB) des Datenelements ist das letzte Element gesendeten Daten.
So zum Beispiel, wenn muss ein Parameter mit dem Namen Max_distance mit einem Dezimalwert von 525 muss über die serielle Schnittstelle gesendet werden, es zuerst in 7-Bit-Stücke "zerlegt" werden.
Hier wird besprochen, wie dies erreicht wird:
Der Wert Dezimal 525 ist gleichbedeutend mit der hexadezimale Wert des 0x20D, eine 2-Byte-Wert. Um die LSB zu erhalten, haben wir den Wert von AND'ing verdecken es mit 0x7F. "C" und Python-Implementierungen sind nachfolgend dargestellt:
// "C" implementation to isolate LSB int max_distance_LSB = max_distance & 0x7f ; // mask the lower byte # Python implementation to isolate LSB max_distance_LSB = max_distance & 0x7F # mask the lower byte
Nach der Maskierung, wird Max_distance_LSB 0x0d enthalten. 0x20D & 0x7F = 0x0D
Als nächstes müssen wir das MSB für diese 2-Byte-Wert zu isolieren. Um dies zu tun, werden wir den Wert des 0x20D auf der rechten Seite, 7 Plätze verschoben.
// "C" implementation to isolate MSB of 2 byte value int max_distance_MSB = max_distance >> 7 ; // shift the high order byte # Python implementation to isoloate MSB of 2 byte value max_distance_MSB = max_distance >> 7 # shift to get the upper byte
Nach einer Verlagerung, enthält die Max_distance_MSB einen Wert von 0 x 04.
Wenn die "chunkified" gemarshallten Daten empfangen werden, muss es in einen einzelnen Wert zusammengesetzt werden. Hier ist, wie die Daten in "C" und Python zusammengesetzt ist
// "C" implementation to reassemble the 2 byte, // 7 bit values into a single value int max_distance = argv[0] + (argv[1] << 7) ; # Python implementation to reassemble the 2 byte, # 7 bit values into a single value max_distance = data[0] + (data[1] << 7)
Nach dem Zusammenbau entspricht dem Wert erneut 525 dezimal oder Hexadezimal 0x20D.
Diese Demontage/Remontage Verfahren können durch den Client oder Server ausgeführt werden.