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

    其实如果你同时玩过Arduino和Flash的话,有了前几节的内容,就可以自己做很多东西了。记得我最初在做的时候网上只能找得到很简单的如何将Arduino和Flash连接的介绍,并且几乎全部都是用到了Flash中的Actionscript2.0语言来写的,可是那是很老版本的Flash了,现在大家几乎都在用Actionscrpit3.0了。最初的时候没有办法,只能用as2.0的,因为自己没有能力改写。后来终于在一个国外的网站上很偶然的发现了有人用3.0编的一段程序,最后才有了现在的一些制作......可能在高手看来这么简单的东西,但是我觉得自己还是摸索了很久很久......好了,不提往事,既然现在已经搞定了,我就将其写出来,以便后来的同学可以不用花那么久就可以学会了。

    这节我们就来讲讲Arduino和Flash的互动吧,我觉得之所以选择用Flash来做上位机端的软件,最关键的还是看中了它的动画,Flash是动画界的佼佼者,而Arduino有时连接传感器的最方便选择。将两者结合变可做出一般的上位机软件所无法达到的效果。

   首先Arduino端,这次得接点传感器了。本实验要用到sharp的红外测距模块,我手边有一块是sharp 2Y0A02的红外测距模块,可能你的型号不同,不过没有关系,红外测距模块最后输出的是模拟电压信号,它只是将距离转化为了模拟电压信号输出。首先将红外测距模块的输出端接到arduino上的A0端。还得给Arduino写入程序:

************************************以下为Arduino端程序*******************************

int sensorPin = A0;   

int i = 0; 

int juli;

void setup() {

   Serial.begin(9600);

}

void loop() {

  i = analogRead(sensorPin);  

  juli=125810/i-23.669;    //将读到的模拟电压值转变为距离值,mm为单位

 Serial.print(juli);

 Serial.println("$");

  delay(100);                  

}

**********************************************************

程序中的转变的函数我是自己简单测量的,用excel算出来的,可以看到线性度还是很好的,只是电压值与距离是成反比的。


接下去开始做Flash动画了,同样先新建一个actionscript3.0类文件,取名hongwaiceju.as,当然类名称也是这个。程序如下:

***************************以下为hongwaiceju.as类文件***************************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";//定义一个与arduino联系字符

private static const EOL_DELIMITER:String = "$";//定义一个结束字符,注意与arduino上一样

private var _socket:Socket;

private var _proxyAddress:String = "127.0.0.1";

private var _proxyPort:uint = 5333;

public static var  msg:String;              //新建一个全局字符串变量

var xsarduinotime:TextField = new TextField();//新建一个名为xsarduinotime的文本框 

//gettime主程序

public function hongwaiceju()

{

addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);    //侦听类是否被添加到舞台,每次添加时运行onAddedToStage

}

            

private function onAddedToStage(event:Event):void

{

removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);    //移除侦听

 //下面的程序是与arduino建立连接,如果连接上了怎么样,如果断了怎么样等等

_socket = new Socket();

_socket.addEventListener( Event.CONNECT, onConnect );

_socket.addEventListener( Event.CLOSE, onClose );

_socket.addEventListener( ProgressEvent.SOCKET_DATA, onSocketData );  //侦听有无来自端口的数据

_socket.addEventListener( IOErrorEvent.IO_ERROR, onIOError );

_socket.addEventListener( SecurityErrorEvent.SECURITY_ERROR, onSecurityError );

_socket.endian = Endian.LITTLE_ENDIAN;

_socket.connect(_proxyAddress, _proxyPort);

}

//连接上了执行

private function onConnect(event:Event):void

{

trace("Socket Connected");//连接上就发送一个消息

}

private var buffer:String = "";//定义一个字符串缓存字符

 //下面程序师接受来自arduino的数据,一个字母一个字母接收的

       

private function onSocketData(event:ProgressEvent):void

{

var data:String = _socket.readUTFBytes( _socket.bytesAvailable );

buffer += data;

var index:int;

                       //下面是把接受到的字符拼起来

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程序,就是点击按钮时要做的

private function onClick(event:MouseEvent):void

{

trace("onClick");

              if(!_socket.connected)         //假如没有连接上,发送你要连什么的

{

trace("You must be connected to send a command to the Arduino.");

return;

}

_socket.writeUTFBytes(TOGGLE_LED_STATE);//如果没有不连接上,就发联系字符给arduino

_socket.flush();//发送

}

               //下面定义关掉arduino时,显示Socket Closed

private function onClose(event:Event):void

{

trace("Socket Closed");

}

                //下面是出错时显示的消息的

private function onIOError(event:IOErrorEvent):void

{

trace("IOErrorEvent : " + event.text);

}

//下面也是出错时的

private function onSecurityError(event:SecurityErrorEvent):void

{

trace("SecurityErrorEvent : " + event.text);

}

}

**************************************************************************

和第2节的类文件非常类似,只是改一下类文件名,还有就是将msg定义为了全局变量,以便待会可以引用。

接下去在和类文件同一个文件夹下创建一个actionscript3.0文件,先新建一个影片取名box(其实随你取什么都行):

然后再随便在你新建的影片剪辑里画点什么,我这里画了个方块,然后再回到主场景,在库里面将你刚建好的那个影片剪辑拖到主场景随便什么位置,然后再在属性里给其取名为box1。


然后点击主场景,在动作里添加如下程序:

*********************************主场景动作程序******************

import flash.display.Shape; 

addEventListener(Event.ENTER_FRAME,onEnterFrame);

 function onEnterFrame(event:Event):void{        //每一帧加载时所要运行的程序

box1.y=600-Number(hongwaiceju.msg);      //box1,就是我们拖进去的那个影片剪辑的y坐标定义

 }

***************************************

大功告成,现在先运行serproxy.exe,然后按下Ctrl+Enter,观看一下最后的结果吧。把手放在红外测距仪上方,上下移动,怎么样,Flash动画里的方块也会跟着动起来吧!同理,你可以控制其他的动画,或者Flash小游戏......

  • 46
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值