ADS

2013年3月8日 星期五

[Arduino]Arduino Flash了解與修改StandardFimata

閱讀本篇需先了解上一篇的範例使用
本篇程式下載
StandardFimata下載

由於我也是個初學者,我也還沒有弄懂他底層的做法(懶懶的我之後再做研究),但是在本篇呢我要介紹StandardFimata這個範例的程式大略解析,StandardFimata是一個還不錯的範例他把許多實用的功能函式都寫進去了,那身為初學者的我還是不要重寫這麼大的程式好了...直接了解他的函式並修改就好了。因為這範例該有的功能都有了,我們在做作品或專題的時候,通常只是需要修改一下Flash的UI介面就好了,所以我們必須了解Flash的語言,如果你跟我一樣對於這一塊仍然是個新手,那麼你可以參考這個網站學習ActionScript以及UI使用


在StandardFimata的Arduino程式實在是有夠大的,他把很多功能都寫了進去,像是可以在Flash調整Arduino的IO PIN、I2C、數位類比輸出入都有寫上去,所以我們只要學會"應用"就好了,就不要去修改他的程式碼了直接上傳到Arduino板子仍然是可以使用的。我們可以在Arduino程式上的setup看到他會與許多事件連結,第二個引數就是來自於程式上端的函式,你可以利用Ctrl+F去看看或修改這些函式的內容。







void setup()

{
  Firmata.setFirmwareVersion(FIRMATA_MAJOR_VERSION, FIRMATA_MINOR_VERSION);

  Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);

  Firmata.attach(DIGITAL_MESSAGE, digitalWriteCallback);
  Firmata.attach(REPORT_ANALOG, reportAnalogCallback);
  Firmata.attach(REPORT_DIGITAL, reportDigitalCallback);
  Firmata.attach(SET_PIN_MODE, setPinModeCallback);
  Firmata.attach(START_SYSEX, sysexCallback);
  Firmata.attach(SYSTEM_RESET, systemResetCallback);

  Firmata.begin(57600);

  systemResetCallback();  // reset to default config
}



關於loop(){

.....

  while(Firmata.available())

    Firmata.processInput();
......

Firmata.sendAnalog(analogPin, analogRead(analogPin));

.....
}迴圈可想而知的他裡面都是寫些把Arduino上的值回傳到Flash上面的程式碼。

我們在Arduino這塊程式我們只需要了解,我們在Flash給的命令會對應到Arduino的Firmata.attach(.....,.....);裡面的函式,至於他怎麼做的我們就不要追根究底了,能用就好...


好現在重要的是了解Flash的程式,因為我們的UI介面都在這個上面,整個專題的外觀都在這上面了。我們現在來看看Flash(as3glue_standalone_monitor.fla)程式,由於我們是要去修改他上面的UI所以我把顯示UI的函式區塊全部刪除了,只剩下連結Arduino的部分程式。


簡單介紹一下Flash的程式碼以及開發環境的問題



import net.eriksjodin.arduino.*;

import net.eriksjodin.arduino.events.ArduinoEvent;
import net.eriksjodin.arduino.events.ArduinoSysExEvent;


首先你編譯後會遇到一些


找不到 Type,或它不是編譯時期常數:ArduinoEvent。

這個問題是因為ArduinoEnvent的外掛函式net資料夾必須跟你的.fla放在同一個資料夾底下,


import fl.controls.TextArea;

import fl.controls.ScrollPolicy;

var txt:TextArea = new TextArea();

txt.text ="";
txt.editable = false;
txt.wordWrap=true;
txt.verticalScrollPolicy = ScrollPolicy.ON;
txt.width = 740;
txt.height = 58;
txt.x=10;
txt.y=10;

addChild(txt);

這些就是在新增一個TextArea的物件在UI介面上,其他UI物件的使用請參考

關於在編譯此處時你也會遇到一個找不到物件的問題,這時候你必須在Flash畫面右邊的元件庫新增組件,按下組件就可以選擇你要使用的UI元件,點兩下放入。




var a:ArduinoWithServo;

// connect to a serial proxy on port 5331
a = new ArduinoWithServo("127.0.0.1", 5331);

// listen for connection 
a.addEventListener(Event.CONNECT,onSocketConnect); 
a.addEventListener(Event.CLOSE,onSocketClose);
a.addEventListener(IOErrorEvent.IO_ERROR,errorHandler);

// listen for firmware (sent on startup)
a.addEventListener(ArduinoEvent.FIRMWARE_VERSION, onReceiveFirmwareVersion);


以上這些函式是有關於連結Arduino的事件處理,程式裡也看得到他的事件函式,多半都是顯示一些目前連結狀態到txt物件上。



var timer = new Timer(50);

timer.addEventListener("timer", timerEvent);


在程式後面也新增了一個timer事件,用於監聽Arduino上的資料關於讀取Arduino的函式,我們主要會用到這兩個。

a.getAnalogData(pin);
a.getDigitalData(pin);
其中引數輸入您要讀取的pin腳就可以了,順便一題寫入Arduino的函式是

a.writeAnalogPin(pin,data);

a.writeDigitalPin(pin,data);
引數輸入PIN腳和資料值就可以了

講了這麼多,其實我們主要用到的就是這4個函式


a.getAnalogData(pin);

a.getDigitalData(pin);

a.writeAnalogPin(pin,data);

a.writeDigitalPin(pin,data);
和一些Flash的UI介面使用方法而已
例如按下Button的觸發可以讓LED亮等等的
EX:


import fl.controls.Button;


var aButton:Button = new Button();

addChild(aButton);
aButton.label = "Click me";
aButton.toggle =true;
aButton.move(100, 100);
aButton.addEventListener(MouseEvent.CLICK, clickHandler);

 var cont:int = 0;

function clickHandler(event:MouseEvent):void {
if(cont%2 == 1){
            a.writeAnalogPin(10,255);
}else{
a.writeAnalogPin(10,0);
}
cont++;
}





中間那個Label和EditView我不知道為什麼會出現耶...希望有人可以幫助我找出答案感恩捏!!

最後來個接線很亂畫質很差的接線圖...


我寫的不一定是對的,如果有什麼問題都可以一起討論謝謝。


2 則留言:

  1. EditView 在Flash的31行
    中間的那按鈕回場景1刪掉就好啦

    話說不知道為什麼11以上的pin我就無法亮了

    回覆刪除
  2. EditView應該不是在31行 31行是txt顯示文字的
    後來我發現那個按鈕和editView直接在場景一刪除就好了...我真是傻傻的= =

    然後關於11以上的pin 是不是因為12 13都是digital pin輸出
    而我上面寫的是a.writeAnalogPin(10,255);
    改成a.writeDigitalPin(pin,data);或許就可以了?
    Flash的第5行開始有腳位設定 可以看一下

    回覆刪除