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
改變腳位狀態為 INPUT
,OUTPUT
或 PWM
,使用 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.