Firmata 函式庫

Firmate 是一個規範微處理器如何與主機端互相傳遞資料的協定。Firmata 詳細的協定內容可以看 wiki page 或是 Firmate 官網

Firmata 函式庫實作了 Firmata 協定,讓使用者可以製作自己的韌體而不需要另外建立微處理器與主機端之間的溝通方式。

我們拍了一個使用 86Duino 與電腦透過 Firmata 函式庫傳遞資料的範例影片,也許你會有興趣。

方法

begin()
啟動 Firmata 函式庫

begin(long)
啟動 Firmata 函式庫並同時設定與主機端傳輸資料時的鮑率(baud rate)

printVersion()
傳送使用的 Firmata 版本到主機端

blinkVersion()
使用 pin 13 連接的 LED 標示目前 Firmate 使用的版本

printFirmwareVersion()
傳送韌體名稱和版本到主機端

setFirmwareVersion(byte major, byte minor)
設定韌體名稱和版本,使用草稿碼(sketch)的檔案名稱(不包含副檔名, 如:.ino, .pde)

傳送訊息:

sendAnalog(byte pin, int value)
傳送類比訊息到主機端

sendDigitalPorts(byte pin, byte firstPort, byte secondPort)
傳送數位訊息到主機端,一次傳送一整個埠(port)的數位值

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)
移除訊息型態所對應的回呼函式

回呼函式(Callback Functions)

Firmata 函式庫使用 attach() 設定訊息型態所對應的回呼函式,而這些被訊息型態對應的回呼函式有固定的格式,格式一共有四種,請參考下列:

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
單一腳位的類比值,使用 callbackFunction 作為其對應的回呼函式格式

DIGITAL_MESSAGE
一個埠的數位值(一共有八個腳位),使用 callbackFunction 作為騎對應的回呼函式格式

REPORT_ANALOG
主機端要求回傳指定腳位的類比值請求,使用 callbackFunction 作為其對應的回呼函式格式

REPORT_DIGITAL
主機端要求回傳指定埠的數位值請求,使用 callbackFunction 作為其對應的回呼函式格式

SET_PIN_MODE
改變腳位狀態為 INPUTOUTPUTPWM,使用 callbackFunction 作為其對應的回呼函式格式

FIRMATA_STRING
字串訊息,C 風格字串(C-style string),使用 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)); 
    }
}

範例影片


函式庫參考主頁面

The text of the 86Duino reference is a modification of the Arduino reference, and is licensed under a Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain.