Pages

Subscribe:

Ads 468x60px

Labels

2013年5月28日 星期二

Flash互動遊戲-打地鼠 [光敏電阻應用]

小專案(Project,適合入門到中型專案作品)


作者是 ken   
週二, 11 十月 2011 02:40

難度:LV2
類別:Flash + Arduino應用
包含範圍:Flash ActionScript 3.0 + Arduino + MAC平台
使用零件:光敏電阻
電路:
光敏電阻x6, 220歐姆電阻x6
Arduino程式碼:
請使用standardFirmata

Arduino 論壇

發現一個Arduino的論壇

很不錯,推薦給各位

極客工坊

2013年5月27日 星期一

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

利用接在 Arduino 上的可變電阻來控制 Flash 上的動畫。如果將一個 10k歐姆的可變電阻的中間那支腳接在 Arduino 的類比輸入腳位上,我們可以得到 0~1023 的值,將這個值傳給串列埠,serproxy 再將它轉給 socket server,Flash 經由 XMLSocket 接收到數值後,我們再把它轉換為角度,藉此來改變物件的角度,可變電阻轉到哪裡,Flash 動畫就動到哪裡。
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 」度。



Arduino 與Flash 按鈕互動

用 Flash 上的兩個按鈕來控制連接在 Arduino 上的兩顆 LED,當 Flash 的綠色按鈕被按住時,接在 Arduino pin 12 的綠色 LED 就保持亮的狀態,按鈕放開後就熄滅,而 Flash 的紅色按鈕則以同樣的方式來控制接在 Arduino pin 13 上的紅色 LED。

1.設定 serproxy

2.Arduino配置
將紅色 LED 接在 pin 13,而綠色 LED 則是接在 pin 12
Arduino 程式碼

假設當我們在 Flash 中按下綠色按鈕時會送出「G:1」,放開按鈕時會送出「G:0」;而按下紅色按鈕時會送出「R:1」,放開按鈕時會送出「R:0」。serproxy 經由 socket server 收到後,會將字串送往串列埠。Arduino 中接收串列埠資料的函數有以下幾個:

  • Serial.read()
  • Serial.readBytes()
  • Serial.readBytesUntil()

Flash 送給 socket server 的字串都會以 0x00 來結束,我們利用 Serial.readBytesUntil() 就可以讓它用 0x00 來判斷資料是否讀取完畢了。以下是 Arduino 的程式碼:

#define bufferSize   16
#define greenLedPin  12
#define redLedPin    13
void setup() {
  pinMode(greenLedPin, OUTPUT); // declare the greenLedPin as an OUTPUT
  pinMode(redLedPin, OUTPUT); // declare the redLedPin as an OUTPUT
  Serial.begin(115200);
}
void loop() {
  while (Serial.available() > 0) {
    char inBuffer[bufferSize];
    int stringLength;
    stringLength = Serial.readBytesUntil('\0', inBuffer, bufferSize);
    if (stringLength > 0) {
      inBuffer[stringLength] = '\0';
      String inString = String(inBuffer);
      Serial.println(inString);
      if ( inString == "G:1" ) {
          digitalWrite(greenLedPin, HIGH);
      } else  if ( inString ==  "G:0" ) {
          digitalWrite(greenLedPin, LOW);
      } else  if ( inString == "R:1" ) {
          digitalWrite(redLedPin, HIGH);
      } else  if ( inString == "R:0" ) {
          digitalWrite(redLedPin, LOW);
      }
    }
  }
}
3.Flash

Flash 程式碼


Flash 的部份因為我是用 Flash 8 ,AS2 和新版的語法可能有些許不同。主要是利用 XMLSocket 來和 serproxy 所建立的 socket server 來通訊。使用兩個關鍵影格來完成任務。
影格一:

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;
}
socket.onClose = function() {
statusTxt.text = "disconneted";
isConnected = false;
}

主要內容說明如下:

  • socket.onConnect:設定連線成功(失敗)時要進行的動作。
  • socket.onData:設定資料接收完成要進行的動作。
  • socket.onClose:設定斷線後要進行的動作。


影格二:

stop();
infoTxt.text = "Server:" + server + "   Port:" + port;
socket.connect(server, port);
greenButton.onPress = function() {
if( isConnected ) {
socket.send("G:1");
};
}
greenButton.onRelease = function() {
if( isConnected ) {
socket.send("G:0");
};
}
redButton.onPress = function() {
if( isConnected ) {
socket.send("R:1");
};
}
redButton.onRelease = function() {
if( isConnected ) {
socket.send("R:0");
};
}

影格二主要是進行連線,並建立按鈕所要做的動作:

  • socket.connect(server, port):依指定的 IP 及 port (設定影格一)和 socket server 連線。
  • greenButton.onPress、greenButton.onRelease:設定綠色按鈕按下、放開時要進行的動作。
  • redButton.onPress、redButton.onRelease:設定紅色按鈕按下、放開時要進行的動作。

[注意] 由於 Flash 的安全管制,編譯完的 .swf 並無法在本機執行,記得要修改「受信任的位置設定」,將 .swf 的位置加入,不然,啟動 .swf 時只會看到「安全性」警語而無法正常動作。

以上是利用Flash Actionscript 2.0所完成

05-mood-cue-控制伺服馬達

第五章的難度是2,耗時1小時


這一章的零件列表
伺服馬達*1
100uf電容*2
可變電阻10K*1
這一章的電路可以說是很簡單的,但是Ervin 在組裝的電路時卻掙扎了很久,因為伺服馬達的接線和書上面不一樣,還好一開始沒有直接接上去,不然就燒掉了。燒電路板還好,電腦燒壞就慘了。
This image has been resized. Click this bar to view the full image. The original image is sized 800x600px.

不過還好看了書上這一段:紅色是電源,黑色是接地,白色是控制訊號。

一開始要先幫馬達做一個接頭,以後使用在麵包板上比較方便,先拿出針腳,剪下三個,放到麵包板上面調整適合的長度

再插到伺服馬達上面

接下來把這個簡單的電路完成,要注意的是電容的極性不要插錯了

程式碼的部分:
以下是示範影片
但是我發現上面的
在最後超過167以後會讓馬達一直無法定位,發生抖動的情況
所以可以設定成
就好了

RoBoard魔人的每週日誌: [延伸範例] 用wii搖桿控制小機械手臂

RoBoard魔人的每週日誌: [延伸範例] 用wii搖桿控制小機械手臂:  小機械手臂 手臂上共有4顆馬達為KONDO的KRS-786馬達 有feedback的功能 而前端的DMP小手之前介紹過 所以這邊不多說 介紹影片: 第一次上鏡頭有點緊張啦... 啟動的時候會震動是因為手臂下方過輕... 原本想要塞一些東西的  ...

中國機器人網


推薦一下

中國機器人網提供豐富的機器人產業相關資訊

前往網站