Utöver StandardFirmata - lägger till stöd för nya (6 / 10 steg)
Steg 6: Genomförandet av PyMata API-kommando och rapport metoder
KOMMANDOT meddelanden - pymata.py
Nästa kod vi PyMata API-metoder för de tre stepper motor underkommandon och en API metod att hämta rapporterade versionsnumret. All ändringar kod för API till pymata.py. De första tre metoderna, stepper_config, stepper_step och stepper_request_library_version översätta kommandot till en korrekt formaterad SysEx-kommando som sedan skickas till Arduino. Den sista metoden, get_stepper_version, leder inte till någon SysEx messaging, men helt enkelt Returnerar resultatet för en tidigare version begäran.
def stepper_config (self, steps_per_revolution, stepper_pins):
"""
Konfigurera stegmotor före operation.
steps_per_revolution: antal steg per motor revolution
stepper_pins: en lista över kontroll pin-nummer - antingen 4 eller 2
"""
data = [själv. STEPPER_CONFIGURE, steps_per_revolution & 0x7f, steps_per_revolution >> 7]
för PIN-kod i range(len(stepper_pins)):
data.append(stepper_pins[PIN])
Self._command_handler.send_sysex (self._command_handler. STEPPER_DATA, data)
def stepper_step (self, motor_speed, number_of_steps):
"""
Flytta en stegmotor för antalet steg vid den specificerade hastigheten
motor_speed: 21 bitar data ange varvtal
number_of_steps: 14 bitar för antal steg & riktning
positiva är framåt, negativ är omvänd
"""
om number_of_steps > 0:
riktning = 1
annat:
riktning = 0
abs_number_of_steps = abs(number_of_steps)
data = [själv. STEPPER_STEP, motor_speed & 0x7f, (motor_speed >> 7) & 0x7f, motor_speed >> 14,
abs_number_of_steps & 0x7f, abs_number_of_steps >> 7, riktning]
Self._command_handler.send_sysex (self._command_handler. STEPPER_DATA, data)
def stepper_request_library_version(self):
"""
Begära stepper bibliotek version från Arduino.
För att hämta versionen efter detta kommando kallas, ring
get_stepper_version
"""
data = [själv. STEPPER_LIBRARY_VERSION]
Self._command_handler.send_sysex (self._command_handler. STEPPER_DATA, data)
Slutligen genomför vi get_stepper_library_version:
def get_stepper_version (self, timeout = 20):
"""
tidsgräns: ange en tid att låta arduino att bearbeta och returnera en version
stepper versionsnumret om det var inställt.
"""
# få aktuell tid
start_time = time.time()
# vänta version komma från Arduino
medan self._command_handler.stepper_library_version < = 0:
om time.time() - starttid > timeout:
skriva ut "Stepper Version biblioteksbegäran timeout. Du skicka ett stepper_request_library_version kommando?"
returnera
annat:
passera
återgå self._command_handler.stepper_library_version
Detta avslutar alla ändringar till pymata.py. Stäng och spara pymata.py.
RAPPORTMEDDELANDEN - pymata_command_handler.py
Vi kommer nu lägga rapporten handler metoden till pymata_command_handler.py, så att den kan ta emot och bearbeta stepper bibliotek version rapporter. Observera att denna metod bygger ihop data från den SysEx meddelandet och butiker det i en intern variabel kallas stepper_library_version.
def stepper_version_response (self, data):
"""
Denna metod hanterar en stepper bibliotek version meddelande sänt från Arduino
data - två 7-bitars byte som innehåller versionsnumret bibliotek
"""
Self.stepper_library_version = (data [0] & 0x7f) + (data [1] << 7)
Slutligen måste vi att uppdatera tabellen command_dispatch för att bearbeta mottagandet av stepper version svar. Lägga till en ny post i botten av den befintliga tabellen för STEPPER_DATA som visas nedan. Varje post i tabellen command_dispatch består av kommandot SysEx, namnet på metoden hantering, och antalet 7 bitars värden returneras. 7 bitars värdena kommer ihop och tolkas enligt de SysEx meddelandeformat vi definierade tidigare.
def run(self):
"""
Den här metoden startar tråden som går kontinuerligt för att ta emot och tolka
meddelanden från Firmata. Detta måste vara den sista metoden i den här filen
Den kontrollerar också deque för meddelanden som ska skickas till Firmata.
"""
# Om du vill lägga till ett kommando i tabellen kommandot dispatch, lägga till här.
Self.command_dispatch.Update ({själv. REPORT_VERSION: [self.report_version, 2]})
Self.command_dispatch.Update ({själv. REPORT_FIRMWARE: [self.report_firmware, 1]})
Self.command_dispatch.Update ({själv. ANALOG_MESSAGE: [self.analog_message, 2]})
Self.command_dispatch.Update ({själv. DIGITAL_MESSAGE: [self.digital_message, 2]})
Self.command_dispatch.Update ({själv. ENCODER_DATA: [self.encoder_data, 3]})
Self.command_dispatch.Update ({själv. SONAR_DATA: [self.sonar_data, 3]})
Self.command_dispatch.Update ({själv. STRING_DATA: [self._string_data, 2]})
Self.command_dispatch.Update ({själv. I2C_REPLY: [self.i2c_reply, 2]})
Self.command_dispatch.Update ({själv. CAPABILITY_RESPONSE: [self.capability_response, 2]})
Self.command_dispatch.Update ({själv. PIN_STATE_RESPONSE: [self.pin_state_response, 2]})
Self.command_dispatch.Update ({själv. ANALOG_MAPPING_RESPONSE: [self.analog_mapping_response, 2]})
Self.command_dispatch.Update ({själv. STEPPER_DATA: [self.stepper_version_response, 2]})
Kommandot dispatch tabell definieras som en karta i pymata_command_handler.py. Dessa kodkommentarer förklara dess användning och hur man kan lägga till nya kommandon till den.
# Det här är en karta som kan leta upp av kommandot handler metoder med ett kommando som nyckel.
# Detta är ifyllt i metoden kör efter python interpreter "ser" alla de
kommandot handler metod definierar (python inte har vidare referenser)
# "Nyckel" är kommandot och värdet innehåller en lista som innehåller metodnamnet
och antalet
# parameter-byte som metoden kräver för att bearbeta meddelandet (i vissa fall den
värdet är oanvända)
command_dispatch = {}
Spara och stäng pymata_command_handler.py. Förändringarna som klienten är nu komplett.