Библиотека Firmata

Библиотека Firmata реализует протокол Firmata для взаимодействия с программным обеспечением на хост-компьютере. Это позволяет вам писать пользовательскую прошивку, не создавая собственный протокол и объекты для используемой среды программирования.

Для использования этой библиотеки:

#include <Firmata.h>

Методы

begin();                    // запуск библиотеки
begin(long);                // запуск библиотеки с переопределением скорости передачи по умолчанию
begin(Stream &s);           // запуск библиотеки с использованием Stream, отличного от Serial (например, Serial1 или EthernetClient)
printVersion();             // отправка версии протокола на хост-компьютер
blinkVersion();             // мигание версией протокола на встроенном светодиоде (обычно пин 13)
printFirmwareVersion();     // отправка имени и версии прошивки на хост-компьютер
setFirmwareVersion(byte major, byte minor);  // установка имени и версии прошивки, используя имя файла скетча без расширения '.ino'
setFirmwareNameAndVersion(const char *name, byte major, byte minor);  // установка имени и версии прошивки

Отправка сообщений

sendAnalog(byte pin, int value);                          // отправка аналогового сообщения
sendDigitalPort(byte portNumber, int portData);           // отправка 8-битного порта в одном цифровом сообщении
sendString(const char* string);                           // отправка строки на хост-компьютер
sendString(byte command, byte bytec, byte *bytev);        // отправка строки на хост-компьютер с пользовательским типом команды
sendSysex(byte command, byte bytec, byte* bytev);         // отправка команды с произвольным массивом байтов
write(byte c);                                            // запись байта в Stream

Приём сообщений

available();                                              // проверка наличия входящих сообщений в буфере
processInput();                                           // обработка входящих сообщений из буфера, отправка данных в зарегистрированные callback-функции
attach(byte command, callbackFunction myFunction);        // привязка функции к типу входящего сообщения
detach(byte command);                                     // отвязка функции от типа входящего сообщения

Вспомогательные методы

sendValueAsTwo7bitBytes(int value);    // запись значения как 2 байтов
startSysex(void);                      // начало sysex-сообщения
endSysex(void);                        // завершение sysex-сообщения

Callback-функции

Чтобы привязать вашу функцию к типу сообщения, ваша функция должна соответствовать стандартному шаблону callback-функции. В настоящее время в Firmata существует три типа callback-функций: generic, string и sysex.

generic

void callbackFunction(byte pin, int value);

system_reset

void systemResetCallbackFunction(void);

string

void stringCallbackFunction(char *myString);

sysex

void sysexCallbackFunction(byte command, byte byteCount, byte *arrayPointer);

Типы сообщений

Существуют различные типы сообщений, к которым можно привязать callback-функции.

ANALOG_MESSAGE     // аналоговое значение для одного пина
DIGITAL_MESSAGE    // 8 бит данных цифровых пинов (один порт)
REPORT_ANALOG      // включение/отключение отправки данных аналогового пина
REPORT_DIGITAL     // включение/отключение отправки данных цифрового порта
SET_PIN_MODE       // изменение режима пина между INPUT/OUTPUT/PWM и т.д.
STRING_DATA        // строки в стиле 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(FIRMATA_MAJOR_VERSION, FIRMATA_MINOR_VERSION);
  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));
  }
}