Библиотека Firmata и Arduino

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

где:

  • port- объект класса Serial для работы с COM портом;
  • pin- номер вывода Arduino;
  • val- определенное значение для передачи;
  • mode - состояние порта.

Состояние порта 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

Добавить комментарий


Защитный код
Обновить

Последние комментарии

Последнии темы форума

  • Нет сообщений для показа