Библиотека Firmata предназначена для упрощения обмена информацией между ПК и Arduino при помощи специального протокола Firmata обмена данными. Эта библиотека уже есть в составе Arduino IDE. С ее помощью разработчик значительно облегчит себе жизнь, и избавится от необходимости писать свои собственные протоколы обмена данными между Arduino и компьютером.
Рассмотри основные функции данной библиотеки:
Запуск и инициализация библиотеки
void begin();
void begin(long);
long-cкорость обмена данными, по умолчанию имеет значение 57600.
Печать версии
voidprintVersion(void);
Передает компьютеру информацию о версии протокола.
Сигнализация верcии протокола
void blinkVersion(void);
Данные метод промигивает версию протокола на 13-м пине.
Отправка и версии и прошивки на ПК
void printFirmwareVersion(void);
Установка названия и версии прошивки
void setFirmwareNameAndVersion(const char *name, byte major, byte minor);
данные метод устанавливает название и версию прошивки исходя из названия скетча
Отправка аналоговое сообщение
void sendAnalog(byte pin, int value);
Отправка данных порта
void sendDigitalPort(byte portNumber, int portData);
Отправляет значение целого порта одним сообщением длиной в 8 бит.
void sendSysex(byte b1,byte b2, byte* bytev);
отсылаются в виде массива байт.
void sendString(const char* string);
отправка строки.
void sendString(byte command, const char* string);
отправка строки коммандного типа.
void available(void);
проверка наличии данных в буфере.
void processInput(void);
прочитать данные и отправить всем зарегистрированным функция-обработчикам.
void attach(byte command, callbackFunction newFunction);
void attach(byte command, systemResetCallbackFunction newFunction);
void attach(byte command, stringCallbackFunction newFunction);
void attach(byte command, sysexCallbackFunction newFunction);
методы установки функции обработчика для определенного типа данных.
void detach(byte command);
отмена фунции обработчика для определенного типа сообщения.
#define DIGITAL_MESSAGE 0x90 // данные цифрового порта (8-бит) #define ANALOG_MESSAGE 0xE0 // аналоговое значение пина (PWM) #define REPORT_ANALOG 0xC0 // включить/отключить отчет об аналоговом пине #define REPORT_DIGITAL 0xD0 // включить/отключить отчет о цифровом пине #define SET_PIN_MODE 0xF4 // установить режим пина: INPUT/OUTPUT/PWM/etc #define FIRMATA_STRING 0x71 // строка: stringCallbackFunction #define SYSTEM_RESET 0xFF // сообщение для перезагрузки прошивки: systemResetCallbackFunction
Пример программы которая получает и отправляет данные
#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)); } }
#include <Firmata.h> #include <Servo.h> Servo servo9; Servo servo10; void analogWriteCallback(byte pin, int value) { if(pin == 9) servo9.write(value); if(pin == 10) servo10.write(value); } void setup() { Firmata.setFirmwareVersion(0, 2); Firmata.attach(ANALOG_MESSAGE, analogWriteCallback); servo9.attach(9); servo10.attach(10); Firmata.begin(9600); } void loop() { while(Firmata.available()) Firmata.processInput(); }
Данная программа получает пакет данных отправлеямых с компьютера через сериал соединение и управляет сервоприводами при помощи библиотеки Firmata.
Данные которые отсылаются с компьютера должны соответсвовать определенному формату или протоколу, описание протокола можно посмотреть на сайте Firmata firmata.org/wiki/Protocol.
Установка определенного значения на выходе порта
uint8_t buf[3]; buf[0] = 0x90 | pin; buf[1] = val & 0x7F; buf[2] = (val >> 7) & 0x7F; port.Write(buf, 3);
Установка аналогового значения
uint8_t buf[3]; buf[0] = 0xE0 | pin; buf[1] = val & 0x7F; buf[2] = (val >> 7) & 0x7F; port.Write(buf, 3);
Установка состояния порта
uint8_t buf[4]; buf[0] = 0xF4; buf[1] = pin; buf[2] = mode; port.Write(buf, 3);
где:
Состояние порта mode может быть следующим:
#define MODE_INPUT 0x00 #define MODE_OUTPUT 0x01 #define MODE_ANALOG 0x02 #define MODE_PWM 0x03 #define MODE_SERVO 0x04 #define MODE_SHIFT 0x05 #define MODE_I2C 0x06