BV1AL 之無所不記

2013-10-11

Arduino Pro Mini A6 A7

目前市面上較新的Arduino Pro Mini 似乎都多加了兩支Analog 腳 A6 及A7,
http://www.arduino.cc/en/Main/ArduinoBoardProMini

當我們燒了Firmata 協議而不是用一般Arduino sketch 來寫固定的程式時,這兩支
多出來的腳會讀不到。

這是因為較早官方Pro Mini 沒這兩支腳,所以當我們用Arduino IDE 燒錄Firmata 時,
這兩支腳是沒被定義的。如果需要用到這兩支腳,必須改一下Firmata 相關程式裡的定義:

1. Arduino IDE 的 libraies/Firmata/Board.h
  裡面的Arduino Duemilanove, Diecimila, and NG 下兩行的
  TOTAL_ANALOG_PINS 6 改成 8
  TOTAL_PINS        20 改成 22
  再用Arduino IDE 把Firmata 燒進Pro Mini 裡

接下來是電腦端所使用的程式庫
2. 使用pyFirmata 的話,需修改 pyFirmata/pyfirmata/boards.py
  'analog':tuple(x for x in range(6)),   <===改成 8
3. 使用pyduino 的話,需修改 pyduino.py
  self.analog = []
  for i in range(6):  <==改成8

目前使用經驗:
pyFirmata 支援PWM 及Servo 沒問題, 但要做 install 的動作
pyduino PWM 失敗, Servo 未支援, 單一支pyduino.py 可以不做 install,
直接跟執行程式放同目錄載入(import)即可。

標籤: ,

2013-10-07

Arduino Firmata python 控

Physical computing 讓我們脫離數十年來電腦總是看得到摸不到的現象。
為什麼說看得到摸不到?螢幕上一朵花你摸得到嗎?一粒燈泡你摸得到嗎?

Physical compiting 讓我們可以跟實體的東西互動,最簡單的就是透過微控器
(MCU)加上一些電子零件,就可以讓我們把動作延伸到真實的東西上,像說可以
叫電腦幫你關電扇、開電燈……。

長久以來說到微控器總是讓人想到8051,不過這近十年來已經有更方便撰寫程式
的各種微控器在市面上流通。不管哪一種微控器,最普遍的用法就是把對應於各
種動作的程式(或說firmware)寫好燒進微控器的晶片,開動後它便會自主運作。

微控器最多的使用方式是讓它獨立運作,不過它也可以連接著電腦,成為電腦的
週邊設備,讓我們透過電腦跟實體物件進行互動式接觸。

只是每當你要改變微控器的用法時(例如接的感測器或訊號器要換腳位),都要重
新燒錄一次程式,就算只改一個bit 也都要重燒。

如果微控器是做為電腦的延伸器官來用,其實可以不用每次重燒程式,反正它一
直連接著電腦,就讓電腦來運算,最後只要丟出指令給微控器,或者讀取微控器
偵測到的數據,來電腦裡運算、紀錄,這樣就可以了。

也就是只要燒一個通用的協定(protocol),然後各種運算都在電腦裡進行,最後
傳送給微控器做出你要它做的動作。

以Arduino 來說,它的IDE 裡就附了一個通用協定 Firmata, 選其中的
StandardFirmata 燒進 Arduino 之後,便可以在電腦上寫程式來指揮 Arduino
運作而不必事先燒到 Arduino 裡面。

如果你要求用最新的,那 Arduino IDE 裡的就要換成 firmata 官方最新版
2.3.6, 可以在 http://www.firmata.org/wiki/Main_Page 下載。

網路上有多種支援 Firmata 的程式,個人覺得其中之一的 pyduino 蠻方便入手
,只要俱備基本python 語言知識,就可以立即把玩。這個版本比較新
http://pyduino.googlecode.com/svn/trunk/
最基本的 digital In/Out, digital PWM, analog In 立即可用。

另外一個也不錯的是 https://github.com/tino/pyFirmata
它除了上面的功能外,已經確認可以用它來控制 servo

但其它方面如I2C, PulseIn.... 目前似乎尚未成功支援,不過這幾項基本動作
也夠玩一些花樣了。

當然你也可以傳送raw command 給微控器,Firmata 是一種類似MIDI 的協定,
像說送出 serial.write(chr(0x90)+chr(0x08)+chr(0x00)) 來讓第三pin 的
LED 亮起來(其實 0x08 是mask來算的, 除了第三pin 之外的都不亮).

標籤: ,