專(zhuān)注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> Arduino >> 瀏覽文章

基于Arduino和Flash的DisLab課件制作教程—4

作者:未知   來(lái)源:不詳   點(diǎn)擊數(shù):  更新時(shí)間:2014年07月31日   【字體:

                   第4節(jié)  Arduino與Flash動(dòng)畫(huà)的互動(dòng)

    其實(shí)如果你同時(shí)玩過(guò)Arduino和Flash的話(huà),有了前幾節(jié)的內(nèi)容,就可以自己做很多東西了。記得我最初在做的時(shí)候網(wǎng)上只能找得到很簡(jiǎn)單的如何將Arduino和Flash連接的介紹,并且?guī)缀跞慷际怯玫搅薋lash中的Actionscript2.0語(yǔ)言來(lái)寫(xiě)的,可是那是很老版本的Flash了,現(xiàn)在大家?guī)缀醵荚谟肁ctionscrpit3.0了。最初的時(shí)候沒(méi)有辦法,只能用as2.0的,因?yàn)樽约簺](méi)有能力改寫(xiě)。后來(lái)終于在一個(gè)國(guó)外的網(wǎng)站上很偶然的發(fā)現(xiàn)了有人用3.0編的一段程序,最后才有了現(xiàn)在的一些制作......可能在高手看來(lái)這么簡(jiǎn)單的東西,但是我覺(jué)得自己還是摸索了很久很久......好了,不提往事,既然現(xiàn)在已經(jīng)搞定了,我就將其寫(xiě)出來(lái),以便后來(lái)的同學(xué)可以不用花那么久就可以學(xué)會(huì)了。
    這節(jié)我們就來(lái)講講Arduino和Flash的互動(dòng)吧,我覺(jué)得之所以選擇用Flash來(lái)做上位機(jī)端的軟件,最關(guān)鍵的還是看中了它的動(dòng)畫(huà),F(xiàn)lash是動(dòng)畫(huà)界的佼佼者,而Arduino有時(shí)連接傳感器的最方便選擇。將兩者結(jié)合變可做出一般的上位機(jī)軟件所無(wú)法達(dá)到的效果。
   首先Arduino端,這次得接點(diǎn)傳感器了。本實(shí)驗(yàn)要用到sharp的紅外測(cè)距模塊,我手邊有一塊是sharp 2Y0A02的紅外測(cè)距模塊,可能你的型號(hào)不同,不過(guò)沒(méi)有關(guān)系,紅外測(cè)距模塊最后輸出的是模擬電壓信號(hào),它只是將距離轉(zhuǎn)化為了模擬電壓信號(hào)輸出。首先將紅外測(cè)距模塊的輸出端接到arduino上的A0端。還得給Arduino寫(xiě)入程序:
************************************以下為Arduino端程序*******************************
int sensorPin = A0;   
int i = 0; 
int juli;
void setup() {
   Serial.begin(9600);
}
 
void loop() {
  i = analogRead(sensorPin);  
  juli=125810/i-23.669;    //將讀到的模擬電壓值轉(zhuǎn)變?yōu)榫嚯x值,mm為單位
 Serial.print(juli);
 Serial.println("$");
  delay(100);                  
}
**********************************************************
程序中的轉(zhuǎn)變的函數(shù)我是自己簡(jiǎn)單測(cè)量的,用excel算出來(lái)的,可以看到線(xiàn)性度還是很好的,只是電壓值與距離是成反比的。

接下去開(kāi)始做Flash動(dòng)畫(huà)了,同樣先新建一個(gè)actionscript3.0類(lèi)文件,取名hongwaiceju.as,當(dāng)然類(lèi)名稱(chēng)也是這個(gè)。程序如下:
***************************以下為hongwaiceju.as類(lèi)文件***************************8
package 
{
import flash.events.Event;
import flash.display.Sprite;
import flash.display.MovieClip;;
import flash.net.Socket;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
import flash.utils.Endian;
import flash.events.MouseEvent;
import flash.text.*; 
import flash.text.TextFieldAutoSize;
public class hongwaiceju extends MovieClip
private static const TOGGLE_LED_STATE:String = "t";//定義一個(gè)與arduino聯(lián)系字符
private static const EOL_DELIMITER:String = "$";//定義一個(gè)結(jié)束字符,注意與arduino上一樣
private var _socket:Socket;
private var _proxyAddress:String = "127.0.0.1";
private var _proxyPort:uint = 5333;
public static var  msg:String;              //新建一個(gè)全局字符串變量
var xsarduinotime:TextField = new TextField();//新建一個(gè)名為xsarduinotime的文本框 
 
 
//gettime主程序
public function hongwaiceju()
{
 
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);    //偵聽(tīng)類(lèi)是否被添加到舞臺(tái),每次添加時(shí)運(yùn)行onAddedToStage
}
            
private function onAddedToStage(event:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);    //移除偵聽(tīng)
 
 //下面的程序是與arduino建立連接,如果連接上了怎么樣,如果斷了怎么樣等等
_socket = new Socket();
_socket.addEventListener( Event.CONNECT, onConnect );
_socket.addEventListener( Event.CLOSE, onClose );
_socket.addEventListener( ProgressEvent.SOCKET_DATA, onSocketData );  //偵聽(tīng)有無(wú)來(lái)自端口的數(shù)據(jù)
_socket.addEventListener( IOErrorEvent.IO_ERROR, onIOError );
_socket.addEventListener( SecurityErrorEvent.SECURITY_ERROR, onSecurityError );
_socket.endian = Endian.LITTLE_ENDIAN;
_socket.connect(_proxyAddress, _proxyPort);
}
//連接上了執(zhí)行
private function onConnect(event:Event):void
{
trace("Socket Connected");//連接上就發(fā)送一個(gè)消息
}
private var buffer:String = "";//定義一個(gè)字符串緩存字符
 //下面程序師接受來(lái)自arduino的數(shù)據(jù),一個(gè)字母一個(gè)字母接收的
       
private function onSocketData(event:ProgressEvent):void
{
var data:String = _socket.readUTFBytes( _socket.bytesAvailable );
buffer += data;
 
var index:int;
                       //下面是把接受到的字符拼起來(lái)
while((index = buffer.indexOf(EOL_DELIMITER)) > -1)
msg = buffer.substring(0, index);
buffer = buffer.substring(index + 1);
trace("Message Received from Arduino : " + msg);
  xsarduinotime.width=200;   //文本框的寬度200
  xsarduinotime.x=100;       //文本框的位置
  xsarduinotime.y=10;
  xsarduinotime.text=msg;     //顯示time from arduino
  var format:TextFormat = new TextFormat();    //新建文字格式format
        format.size=24;                        //文字大小24
    xsarduinotime.setTextFormat(format);       //將文字格式賦予xsarduinotime文本框    
addChild(xsarduinotime);
 
 
}
}
            //下面就是onclick程序,就是點(diǎn)擊按鈕時(shí)要做的
private function onClick(event:MouseEvent):void
{
trace("onClick");
              if(!_socket.connected)         //假如沒(méi)有連接上,發(fā)送你要連什么的
{
trace("You must be connected to send a command to the Arduino.");
return;
}
_socket.writeUTFBytes(TOGGLE_LED_STATE);//如果沒(méi)有不連接上,就發(fā)聯(lián)系字符給arduino
_socket.flush();//發(fā)送
}
               //下面定義關(guān)掉arduino時(shí),顯示Socket Closed
private function onClose(event:Event):void
{
trace("Socket Closed");
}
                //下面是出錯(cuò)時(shí)顯示的消息的
private function onIOError(event:IOErrorEvent):void
{
trace("IOErrorEvent : " + event.text);
}
//下面也是出錯(cuò)時(shí)的
private function onSecurityError(event:SecurityErrorEvent):void
{
trace("SecurityErrorEvent : " + event.text);
}
}
**************************************************************************
和第2節(jié)的類(lèi)文件非常類(lèi)似,只是改一下類(lèi)文件名,還有就是將msg定義為了全局變量,以便待會(huì)可以引用。
接下去在和類(lèi)文件同一個(gè)文件夾下創(chuàng)建一個(gè)actionscript3.0文件,先新建一個(gè)影片取名box(其實(shí)隨你取什么都行):
然后再隨便在你新建的影片剪輯里畫(huà)點(diǎn)什么,我這里畫(huà)了個(gè)方塊,然后再回到主場(chǎng)景,在庫(kù)里面將你剛建好的那個(gè)影片剪輯拖到主場(chǎng)景隨便什么位置,然后再在屬性里給其取名為box1。

然后點(diǎn)擊主場(chǎng)景,在動(dòng)作里添加如下程序:
*********************************主場(chǎng)景動(dòng)作程序******************
import flash.display.Shape; 
addEventListener(Event.ENTER_FRAME,onEnterFrame);
 function onEnterFrame(event:Event):void{        //每一幀加載時(shí)所要運(yùn)行的程序
 
box1.y=600-Number(hongwaiceju.msg);      //box1,就是我們拖進(jìn)去的那個(gè)影片剪輯的y坐標(biāo)定義
 }
***************************************
大功告成,現(xiàn)在先運(yùn)行serproxy.exe,然后按下Ctrl+Enter,觀(guān)看一下最后的結(jié)果吧。把手放在紅外測(cè)距儀上方,上下移動(dòng),怎么樣,F(xiàn)lash動(dòng)畫(huà)里的方塊也會(huì)跟著動(dòng)起來(lái)吧!同理,你可以控制其他的動(dòng)畫(huà),或者Flash小游戲......
關(guān)閉窗口

相關(guān)文章