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