2013年5月20日 星期一

Arduino : 用可變電阻控制 Flash 動畫

2013年5月20日 星期一
前一篇「Arduino : 以 serproxy 搭起和 Flash 間的橋樑」中透過 serproxy 當橋樑,用 Flash 中的按鈕來控制接在 Arduino 上的 LED,這一篇就來試一下,利用接在 Arduino 上的可變電阻來控制 Flash 上的動畫。如果將一個 10k歐姆的可變電阻的中間那支腳接在 Arduino 的類比輸入腳位上,我們可以得到 0~1023 的值,將這個值傳給串列埠,serproxy 再將它轉給 socket server,Flash 經由 XMLSocket 接收到數值後,我們再把它轉換為角度,藉此來改變物件的角度,可變電阻轉到哪裡,Flash 動畫就動到哪裡。下面整理一下如何進行,並提供 source 供參考。


Arduino 硬體配置圖

可變電阻有三支腳,兩側一支接 Arduino 的 +5v,一支接地,中間的則接在類比輸入的 pin 0 上。


Arduino 程式碼

Arduino 要做的事很簡單,就是將可變電阻的讀數 (0~1023) 往串列埠送就對了。不過,為了減少傳送資料的頻率,我讓它將前一次 pin 0 的值保留下來比對,如果和現在的值變化超過 2 時,才會送往 Serial port。另外,因為 Flash 在連線成功後會送資料給 socket server,因此,可以藉由這個機會,將現在的電阻值傳送給 Flash ,讓它將動畫做初始化的處理,轉到正確的角度。底下為程式碼:

#define potPin  0 //指定讀電阻值的腳位
int val = 0; //放電阻值的變數
int oldVal = 999; //放前一次電阻值的變數
void setup() {
  Serial.begin(115200);        //以 115200 的速度連串列埠
}
void loop() {
  val = analogRead(potPin); //讀取電阻值(0-1023)
  if(Serial.available() > 0)  { //Flash 首次連線會送資料
    Serial.read(); //將 Flash 傳來的資料讀走
    Serial.println(val); //傳回目前的電阻值
    oldVal = val;
  }
  if( abs(val - oldVal) > 2 ) { //如果和前一次差 2 以上才回傳
    Serial.println(val); //傳回目前的電阻值
    oldVal = val; //保留回傳過的
  }
  delay(150);
}


Flash 程式碼

Flash 的部份,只使用到一個影格來完成,主要是一個名為 circle 的元件,利用 XMLSocket 接收由 serproxy socket server 所得到的電阻值,並將它換算成 circel 旋轉時的角度。

程式碼如下:

if(server == undefined) {
server = '127.0.0.1';
}
if(port == undefined || isNaN(Number(port))) {
port = 5334;
} else {
port = Number(port);
}

isConnected = false;
socket = new XMLSocket()
socket.onConnect = function(success) {
if (success) {
statusTxt.text = "conneted";
isConnected = true;
} else {
statusTxt.text = "connet failed!";
isConnected = false;
}
}
socket.onData = function(src) {
statusTxt.text =  "data : " + src;
circle._rotation = Number(src.substr(0,src.length-1))*-360/1023;
//trace("data : " + src);
}
socket.onClose = function() {
statusTxt.text = "disconneted";
isConnected = false;
}

infoTxt.text = "Server:" + server + "   Port:" + port;
socket.connect(server, port);
stop();
轉換電阻大小的程式寫在「socket.onData」中的這行
  • circle._rotation = Number(src.substr(0,src.length-1))*-360/1023;
由於在 Arduino 中傳回的值(src)會在尾巴加上換行字元,為了讓傳回的字串可以順利的轉為數字供運算,我先利用 substr 把最後一個字元截去,才用 Number 來轉換。
另外,為了讓電阻順時針轉動時,Flash 中的元件也是順時針轉動,角度轉換中,將原來的 「360 」度換成了「-360 」度。



檔案下載



相關文章



1 則留言:

 
雄::gsyan © 2009. Design by Pocket