BV1AL 之無所不記

2016-11-28

FirmataPlus Serial 直送碼

之前一直都用 pyfirmata 來控制 Arduino, 但是 digital pin 的數量受制, 所以要改
Board.h 又要改 pyfirmata.py 所以使用上不是很方便, 最近改用 PyMata 它可以
讓 mega32u4 用到更多 digital pins, 以 Leonardo 來說可以用到 23 支, 小一點的
Micro 也能用到 22 支, 更小的 Pro Micro 也能有 18 支可用, 所以不管是控制 7seg
LED 或 8x8 matrix LED 也夠用.

原本都要依賴 pyfirmata 或 PyMata 的 module, 但它的啟動有點長, 加上如果是要
透過別的機器不一定能提供完整的 library 給 pyfirmata/PyMata 呼叫, 因此嚐試
改用 python serial 直送 firmata 控制碼.

這裡以 digital pin 為例, 說明一下如何直接傳送控制碼, 以及 pin 腳的接法以達到
「最少傳送」而且能讓多支腳工作的方式.

Arduino (Leonardo/Micro/ProMicro)是裝了 PyMata 的 FirmataPlus32u4
這一支, 然後控制端只要用到 python serial 即可. Arduino 的腳分成幾個 port:
port 0: pin 0 -- 7
port 1: pin 8 -- 15
port 2: pin 16 -- 23

Firmata 的控制碼:
port 碼 + pin 碼 + 尾pin碼
例如要給 0(或 8 或 16) pin 拉 High, 就是送出
 第0腳:  0x90 + 1 + 0 三碼
 第8腳:  0x91 + 1 + 0 三碼
 第16腳: 0x92 + 1 + 0 三碼

 第7腳:  0x90 + 0 + 1 三碼
 第15腳: 0x91 + 0 + 1 三碼
 第23腳: 0x92 + 0 + 1 三碼
 (以上三支腳比較特別, 中間那一碼就保持原有的值, 不必加減)

 第3腳: 0x90 + 8 + 0 三碼
 第11腳: 0x91 + 8 + 0 三碼
 第19腳: 0x92 + 8 + 0 三碼

 同時 3 及 7 腳: 0x90 + 8 + 1 三碼
 同時 11 及 15 腳: 0x91 + 8 + 1 三碼
 同時 19 及 23 腳: 0x92 + 8 + 1 三碼

 同時 3 及 4 及 7 腳: 0x90 + (8+16) + 1 也就是 0x90 24 1 三碼

腳的算法是這個 port 的第幾支腳就是 2 的幾次方,
第3腳是 2的3次方, 所以是8
第11腳是 port 1 的第 3腳(由0開始), 所以也是 2 的 3次方, 也是8

第 8 腳是 port 1 的 0 腳, 所以 2 的 0次方, 及 第11腳同時 high 就是 1+8=9
所以送出的三碼是 0x91 9 0, 用 python serial 就是
serial.write(chr(0x91)+chr(9)+chr(0))
所以如果把同一個 port 的 pin 接在像是 8x8 LED 上相續的 row (或 column)
這樣就可以只送出一次控制碼, 便能同時讓多支 digital pin High/Low.
serial.write(chr(0x91)+chr(9)+chr(1))
可以讓 pin 8,11,15 三支同時 High.

標籤: , ,