В данной библиотеке реализован протокол Firmata, предназначенный для связи микроконтроллера с прикладным программным обеспечением на компьютере. Использование библиотеки Firmata освобождает от необходимости написания собственных протоколов и объектов для взаимодействия устройства и ПК.
begin()
begin(long)
printVersion()
blinkVersion()
printFirmwareVersion()
setFirmwareVersion(byte major, byte minor)
sendAnalog(byte pin, int value)
sendDigitalPorts(byte pin, byte firstPort, byte secondPort)
sendDigitalPortPair(byte pin, int value)
sendSysex(byte command, byte bytec, byte* bytev)
sendString(const char* string)
sendString(byte command, const char* string)
available()
processInput()
attach(byte command, callbackFunction myFunction)
detach(byte command)
Для того, чтобы ассоциировать свою функцию с каким-либо типом сообщений, ее формат должен совпадать с форматом стандартных функций обратного вызова. На данный момент в протоколе Firmata предусмотрено всего три стандартных типа таких функций: generic, string и sysex.
void callbackFunction(byte pin, int value);
void systemResetCallbackFunction(void);
void stringCallbackFunction(char *myString);
void sysexCallbackFunction(byte pin, byte byteCount, byte *arrayPointer);
Ниже перечислены разные типы сообщений, с которыми можно ассоциировать функции обратного вызова.
ANALOG_MESSAGE
DIGITAL_MESSAGE
REPORT_ANALOG
REPORT_DIGITAL
SET_PIN_MODE
INPUT
/OUTPUT
/PWM
/и др.
FIRMATA_STRING
stringCallbackFunction
SYSEX_START
sysexCallbackFunction
SYSTEM_RESET
systemResetCallbackFunction
В данном примере показана процедура отправки и получения аналоговых сообщений с использованием протокола Firmata.
#include <Firmata.h> byte analogPin; void analogWriteCallback(byte pin, int value) { pinMode(pin,OUTPUT); analogWrite(pin, value); } void setup() { Firmata.setFirmwareVersion(0, 1); Firmata.attach(ANALOG_MESSAGE, analogWriteCallback); Firmata.begin(); } void loop() { while(Firmata.available()) { Firmata.processInput(); } for(analogPin = 0; analogPin < TOTAL_ANALOG_PINS; analogPin++) { Firmata.sendAnalog(analogPin, analogRead(analogPin)); } }