Библиотека 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));
}
}