Arduino:Примеры/Firmata

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Библиотека Firmata[1]

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

Функции

Общие:

begin(); // запускает библиотеку
begin(long); // запускает библиотеку и задает скорость передачи данных в бодах
begin(Stream &s); // запускает библиотеку при помощи класса Stream (http://wikihandbk.com/wiki/Arduino:Справочник_языка_Arduino/Функции/Функции_передачи_данных/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); // отправляет команду c произвольным массивом байтов
write(byte c); // записывает байт в Stream

Получение сообщений:

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

Служебные функции

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

Функции обратного вызова

Чтобы «приклеить» вашу функцию к типу сообщения, она должна соответствовать стандартной функции обратного вызова. В настоящий момент 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);

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

Также в Firmata существуют разные типы сообщений, к которым можно «приклеить» функцию обратного вызова.

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

См.также

Внешние ссылки