Библиотека Firmata
В данной библиотеке реализован протокол Firmata, предназначенный для связи микроконтроллера с прикладным программным обеспечением на компьютере. Использование библиотеки Firmata освобождает от необходимости написания собственных протоколов и объектов для взаимодействия устройства и ПК.
Методы
begin()- запустить библиотеку
 begin(long)- запустить библиотеку, переопределив скорость передачи данных
 printVersion()- отправить компьютеру текущую версию протокола
 blinkVersion()- отобразить текущую версию протокола путем изменения логического состояния 13 вывода
 printFirmwareVersion()- отправить компьютеру название и текущую версию прошивки
 setFirmwareVersion(byte major, byte minor)- задать имя и версию прошивки по имени файла (без .pde)
 
Отправка сообщений
sendAnalog(byte pin, int value)- отправить аналоговое сообщение
 sendDigitalPorts(byte pin, byte firstPort, byte secondPort)- отправить состояние цифровых портов в виде двух отдельных байт
 sendDigitalPortPair(byte pin, int value)- отправить состояние цифровых портов в виде целого числа типа int
 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.
- generic
 void callbackFunction(byte pin, int value);- system_reset
 void systemResetCallbackFunction(void);- string
 void stringCallbackFunction(char *myString);- sysex
 void sysexCallbackFunction(byte pin, byte byteCount, byte *arrayPointer);
Типы сообщений
Ниже перечислены разные типы сообщений, с которыми можно ассоциировать функции обратного вызова.
ANALOG_MESSAGE- аналоговое значение для одного вывода
 DIGITAL_MESSAGE- 8-битное цифровое значение (соответствует выводам одного порта)
 REPORT_ANALOG- включение/выключение отчета о состоянии аналогового вывода
 REPORT_DIGITAL- включение/выключение отчета о состоянии цифрового порта
 SET_PIN_MODE- изменение режима работы вывода между 
INPUT/OUTPUT/PWM/и др. FIRMATA_STRING- C-строки, в качестве типа функции необходимо использовать 
stringCallbackFunction SYSEX_START- общие сообщения произвольной длины (через протокол MIDI SysEx), в качестве типа функции необходимо использовать 
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)); 
    }
}

