极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 35150|回复: 17

Arduino和Flash

[复制链接]
发表于 2014-4-14 13:16:00 | 显示全部楼层 |阅读模式
本帖最后由 桐桐 于 2014-4-21 21:11 编辑

  原来的名字叫    用arduino和Flash做DisLab课件  ,但是发了几天感觉大家好像都不感兴趣,想想也是,如果仅仅是做DisLab(估计很多人都不知道这是什么),范围太过于狭窄,除了用来做实验外用处不大。所以感兴趣的人不多也合情合理了。但是其实我要讲的并不仅仅是如何做DisLab,而是Arduino和FLash动画的结合来制作点什么。一个是现实中的传感器,一个是虚拟的动画世界,其实我们可以用现实来控制虚拟,或者虚拟的反控制现实......这样讲可能就有点意思了。Arduino不是可以用作互动媒体么,还有Processing的么,但是那个纯代码来制作的互动效果想想都有点头大,其实我们可以用Flash的,你即可以用代码,也可以鼠绘......当然除了互动媒体,Flash其实也可以用来做一个上位机程序的,我之前的制作中更多的是将Flash当作上位机了,当然融合了一点动画在里面。
用arduino和Flash做DisLab课件已经 第6个年头了,虽然本人比较懒,但是断断续续也做出了点东西。这些东西有些做完了就拆了,只留下了点程序留在电脑里,有些连程序都找不到了......想想当初花了这么多功夫,如果就这样丢了也挺可惜的,所以索性花点时间整理一下,写点关于Arduino和Flash连接制作DISLab的教程,好像这方面的研究好像在网上挺难找到的,也算将自己的研究拿出来秀秀了......我本人是个物理教师,虽然城市学校里都配了各种DISLab实验室,但是我想总有很多乡下的学校可能还没钱采购,那么它们就可以采用我的方案,又便宜又好用的基于Arduino和Flash的DisLab实验室,只不过需要自己动手来做硬件和软件,但是做出来的DisLab课件绝对比买来的要有个性化。也可以做一些针对一些疑难实验的特殊解决方案,例如无线力传感器、无线速度传感器等等现在花钱还买不到的Dis设备。
    关于Arduino、Flash知识的普及在本教程中就不介绍了,自己买本书或者上论坛去补习补习。我们就从Arduino和Flash连接开始我们的第一节。
                                                            第一节    Arduino和Flash的连接
    去百度里搜一下Arduino和Flash,发现我的博文Arduino与Flash的连接,和arduino和flash的as3连接居然排在了第2、3位,可见这方面研究真少的可怜。而我那两篇特别是第一篇是很久之前的了,现在大家都用as3来编了,很少再用as2了。而第二篇关于as3连接的却写的不是很详细,下面正式开始吧:
    Arduino和电脑是用串口连接的,当你连接Arduino并装好驱动后,你会在设备管理器中找到你的Arduino的串口号:

可以看到我的Arduino Mega ADK的COM口是4号,你也可以找找你的Arduino用到的COM口号,并记住它。这里要注意的一点是你的ArduinoCOM口号不能大于9,这是因为待会我们要用的一个串口代理软件不支持,我不会自己改软件,没办法,只能用COM9以下的串口号了,如果不幸的发现你的Arduino的COM号大于了9,那就能强制的在端口设置——高级里改成小与9的端口号,只是这样有可能造成COM口号冲突,这是我现在的一个“痛”,真希望有大侠来解决这个问题。
  再来说说Arduino连接Flash的关键程序:serproxy
  共有两个文件,一个是cfg文件,可用记事本打开,修改。另一个就是exe文件。
  首先的先修改cfg文件:
**********************************以下为程序**************************************
  # Config file for serproxy
# See serproxy's README file for documentation
# Comm ports used
comm_ports=4
# Default settings
comm_baud=9600
comm_databits=8
comm_stopbits=1
comm_parity=none
# Idle time out in seconds
timeout=300
# Port 1 settings (ttyS0)
net_port1=5333
# Port 2 settings (ttyS1)
net_port2=5333
# Port 3 settings (ttyS2)
net_port3=5333
# Port 4 settings (ttyS3)
net_port4=5333
# Port 5 settings (ttyS4)
net_port5=5333
# Port 6 settings (ttyS5)
net_port6=5333
# Port 7 settings (ttyS6)
net_port7=5333
# Port 8 settings (ttyS7)
net_port8=5333
# Port 9 settings (ttyS8)
net_port9=5333
# Port 10 settings (ttyS9)
net_port10=5333
****************************************************
先找到程序中的comm_ports=4这一句,因为我的Arduino是COM4端口,所以“=4”。如果你的arduinoCOM端口是5,就改成“=5”,以此类推。改好后保存。
  在这个设置里我把所有的net_port都等于了5333,这里是为了方便Flash端的程序保持一致,当Arduino的COM端口号发生变化时,只要修改serproxy里的comm_ports就可以了,不用修改Flash端的程序。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2014-4-14 13:16:36 | 显示全部楼层
本帖最后由 桐桐 于 2014-4-15 10:27 编辑

第二节  Arduino和Flash的连接——Flash接受来自Arduino的数据
    上那一节讲到了Arduino和Flash连接的基本设置,这节就来做个实验,让FLash接收来自Arduino的数据。整个实验分为两部分,Arduino端的编程和Flash端的编程。没有任何的硬件电路,只是做一个数据传输的测试。
    首先对Arduino进行编程,目的是让Arduino每隔一定的时间由串口发送一个数据,这里每个1秒发送一个Arduino的计时数据。
*************************以下为Arduino端的程序*******************************
unsigned long ntime;    //定义一个长整形数ntime
void setup()
{
  Serial.begin(9600);    //开始一个串口通信,波特率9600
}
void loop()
{
    ntime=millis();         //让ntime等于此刻Arduino的时间
   Serial.print(ntime);    //串口发送ntime
   Serial.println("$");    //发送一个结束字符“$”;  
delay(1000);             //等待1秒
}
**************************************************************************
下面编写Flash端的程序,我用的是Flash professional cs5.5软件
先新建一个Actionscript3.0类文件,类名称就取为gettime,写入以下程序
***************************以下actionscript3.0类文件(gettime)程序********
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 gettime extends Sprite
{
private static const dataend:String = "$";//定义一个结束字符,注意与arduino上一样
private var _socket:Socket;
private var _proxyAddress:String = "127.0.0.1";
private var _proxyPort:uint = 5333;

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


//gettime主程序
public function gettime()
{
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 msg:String;       //再定义一个字符串变量来msg
var index:int;        //一个整形变量index来读取结束字符在buffer字符串中的位置
while((index = buffer.indexOf(dataend)) > -1)  //如果读到了结束字符,也就是"$"
{
msg = buffer.substring(0, index);         //msg就等于去掉了“$”后的字符串
buffer = buffer.substring(index + 1);     //另buffer等于结束字符串的后一位,以便下一个字符串的接受
trace("Message Received from Arduino : " + msg);  //测试时候用,输出以下msg的值
//下面我们让它显示在文本框中  
xsarduinotime.width=200;   //文本框的宽度200
  xsarduinotime.x=100;       //文本框的位置
  xsarduinotime.y=100;
  xsarduinotime.text=msg;     //显示time from arduino
  var format:TextFormat = new TextFormat();    //新建文字格式format
        format.size=24;                        //文字大小24
    xsarduinotime.setTextFormat(format);       //将文字格式赋予xsarduinotime文本框   
addChild(xsarduinotime);
}
}
//下面定义关掉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);
}
}
}
******************************************************************************
好了,下面在用Flash cs新建一个actionscript3.0文件,然后保存在和上面的gettime类文件gettime.as同一个文件夹内,在属性——类中填入gettime。这样就大功告成了。下面来试一下具体的使用。
首先连接Arduino和电脑,然后双击serproxy.exe文件,然后再flash cs软件中按Ctrl+Enter,怎么样,受到来自Arduino的数据了吧。那么如果不在Flash CS软件下怎么运行呢。
  差不多,先双击serproxy.exe文件,然后用Flash Player打开你刚生成的SWF文件......居然打不开?不要急,如果直接用Flash Player来打开的话,需要一些简单的设置,因为Flash Player默认是不允许读取数据的。
在Flash Player窗口中右键——高级——受信任位置设置,把你的SWF所在的位置加进去。这样就成了。
回复 支持 1 反对 0

使用道具 举报

发表于 2014-4-14 15:49:59 | 显示全部楼层
必需要顶。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2014-4-14 21:04:52 | 显示全部楼层
顶一个!!!!楼主威武!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-15 10:01:18 | 显示全部楼层
本帖最后由 桐桐 于 2014-4-15 10:26 编辑

第三节  Arduino和Flash的连接——Arduino接受来自Flash的数据
    上一节我们讲到让Flash接受来自Arduino的数据,不过有时候我们还需要在Flash端来控制一下Arduino,例如在Flash端单击一个按钮来告诉Arduino开始发送或者停止发送数据。当然也可以在Flash端单击一个按钮来控制Arduino端的一个电磁铁,让它开始断电从而让小铁球开始运动。当然所有这些都依赖于让Arduino接受来自Flash端的数据,下面我们就来完成一个简单的控制实验,在Flash端放一个按钮,单击按钮时改变Arduino端的一个Led等的暗亮,为了简单起见,Arduino端的Led等就用D13端口也就是用板载的Led等。
**********************************以下是Arduino端的程序******************************
//此段程序由“桐桐老爸”编写,如要引用请说明出处
#define LED_PIN 13     
#define lianxi '@'   //定义一个来自Flash端的联系字符,随意定,与Flash端一样就可以
#define dataover "$"      //定义一个发送字符结束标记,也随意定
char incoming ;            //定义一个变量,用于接收数据时用
int i=0;                   //定义一个变量i,用于记录灯的状态
void setup()
{
pinMode(LED_PIN, OUTPUT);           //定义LED_PIN端口为输出端口
for(int i = 0; i < 3; i++)          //接通电源后闪3下
{    digitalWrite(LED_PIN, HIGH);
    delay(500);
     digitalWrite(LED_PIN, LOW);
     delay(500);}
Serial.begin(9600);                    //串口开始,波特率9600
Serial.print("Arduino to flash ready!");  //连接上电脑时发送一个字符串
Serial.print(dataover);                   //发送结束字符
}
void loop()
{  if(Serial.available() > 0)      //如果arduino接受到电脑端来的字符
{incoming = Serial.read();         //变量incoming就等于受到的字符
if(incoming == lianxi)   //假如收到的字符与定义的字符相同
{if(i==0)               //如果灯是灭的
   {digitalWrite(LED_PIN, HIGH);   //就点亮
   i=1;   }            //灯的状态量变为1
   else                //否则即灯是亮的         
   {digitalWrite(LED_PIN, LOW);  //就灭灯
   i=0;                 //灯的状态量变为0
   }   
}  }  }
**********************************************************************************
  下面我们再来编写Flash端的程序,只在动画中放一个按钮,单击按钮来发送数据。
  同样用Flash cs来新建一个Actionscript 3.0类文件(flashtoarduino),程序内容如下,注意.as文件名也要取名为flashtoarduino.as。
*******************************以下为Actionscript 3.0类文件*********************
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 flashtoarduino extends Sprite
{
private static const lianxi:String = "@";//定义一个与arduino联系字符
private static const dataover:String = "$";//定义一个结束字符,注意与arduino上一样
private var _socket:Socket;
private var _proxyAddress:String = "127.0.0.1";
private var _proxyPort:uint = 5333;
var xsarduinotime:TextField = new TextField();//新建一个名为xsarduinotime的文本框
//gettime主程序
public function flashtoarduino()
{
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);    //侦听类是否被添加到舞台,每次添加时运行onAddedToStage
}
private function onAddedToStage(event:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);    //移除侦听
///////////////////////按钮绘制 /////////////////////////////////
var s:Sprite = new Sprite();
s.graphics.beginFill(0x00FF00);
s.graphics.drawRect(0,0, 50,25);
s.graphics.endFill();
addChild(s);
s.x = 200;
s.y = 200;
//下面的程序是与arduino建立连接,如果连接上了怎么样,如果断了怎么样等等
s.addEventListener(MouseEvent.CLICK, onClick);
_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 msg:String;
var index:int;
//下面是把接受到的字符拼起来
while((index = buffer.indexOf(dataover)) > -1)
{
msg = buffer.substring(0, index);
buffer = buffer.substring(index + 1);
trace("Message Received from Arduino : " + msg);
  xsarduinotime.width=400;   //文本框的宽度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(lianxi);//如果连接上,就发联系字符给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);
}
}
}
************************************************************************************
好了,下面在用Flash cs新建一个actionscript3.0文件,然后保存在和上面的flashtoarduino类文件flashtoarduino.as同一个文件夹内,在属性——类中填入flashtoarduino。这样就大功告成了。
先连上Arduino,打开serproxy.exe,然后点击Ctrl+Enter,可以看到桌面中间有一个绿色方块,单击它,就可以控制arduino上的灯了,试试看!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-15 10:03:16 | 显示全部楼层
各位同学如果有兴趣,可以上我的博客:http://blog.sina.com.cn/arduinoflash
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-15 10:55:03 | 显示全部楼层
考虑到很多同学可能没有serproxy程序,这里给个下载:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-4-15 12:46:04 | 显示全部楼层
写的很棒,学习了,flash做上位机倒是从来没想过
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-16 14:31:22 | 显示全部楼层
本帖最后由 桐桐 于 2014-4-16 14:33 编辑

                                     第4节  Arduino与Flash动画的互动
其实如果你同时玩过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写入程序:
  1. int sensorPin = A0;   
  2. int i = 0;
  3. int juli;
  4. void setup() {
  5.    Serial.begin(9600);
  6. }

  7. void loop() {
  8.   i = analogRead(sensorPin);  
  9.   juli=125810/i-23.669;    //将读到的模拟电压值转变为距离值,mm为单位
  10. Serial.print(juli);
  11. Serial.println("$");
  12.   delay(100);                  
  13. }
复制代码

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

接下去开始做Flash动画了,同样先新建一个actionscript3.0类文件,取名hongwaiceju.as,当然类名称也是这个。程序如下:
*****************************************************
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(eventrogressEvent):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小游戏......

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-21 21:08:51 | 显示全部楼层
第5节  测量量—时间图像绘制
    在利用传感器做实验时,将测量量随时间变化的情况用图像的方式记录下来是很重要的一种方式。这一节我们就来将如何用Flash来绘制测量量-时间图像。
    我们仍旧选择上一节中的红外测距传感器,来绘制所测得的距离-时间图像。所以Arduino端的程序与连接都与上节一样,这里不再描述。下面主要介绍Flash端的类编写和Flash动画代码。其实将全部代码写在类里面也可以实现,但是个人觉得不是很灵活,毕竟有时候我们需要将图像挪个位置之类的还是直接可视化操作比较简单。
    首先我们先来改写一下上节中的hongwaiceju.as类文件下面就是要添加的语句:
  先是三个定义语句:
************************************************************************
public static var msgarray:Array = new Array();   //新建一个名为msgarray的全局数组
public static var ari:Number=0;    //新建一个全局变量,用来传递数组指针
var ri:Number=0;                      //新建一个变量,用来记录数组指针
************************************************************************
就添加在原来的
public static var  msg:String;
这句后面。
然后在
***************************************************
while((index = buffer.indexOf(EOL_DELIMITER)) > -1)
{
msg = buffer.substring(0, index);
buffer = buffer.substring(index + 1);
*****************************************************
后面添加:
***********************************************
msgarray[ri]=Number(msg);    //将msg变量赋值到msgarray数组
ari=ri;   //全局变量指针等于数组指针
ri++;  //数组指针加一
**************************************************
上面添加的语句主要实现了将读取到的测量值记录在数组中,之所以这样做是因为待会在动画界面读取数据时,由于帧数的关系,并不是每个测量值都会在每一帧运行时被读到,所以有可能会出现数据遗漏,当然如果动画帧数比传感器采集数据要快可能不会有这个问题,但如果动画帧数比较低时,这个问题就比较严重了。所以这里用一个数组来记录所测量到的数据,在每一帧读取时就不会出现漏数据的情况了。
  下面开始制作动画部分,同样新建一个actionscript3.0文件,然后类里面填写hongwaiceju。接下去在新建一个影片剪辑,取名为huitu。然后再huitu影片剪辑的动作代码内添加如下语句:
************************************************************************************
import flash.display.Shape;
var ai:Number=0;
var ii:Number=0;
var msgnum:Number=0;
addEventListener(Event.ENTER_FRAME,onEnterFrame);
var fttuxiang:Shape = new Shape();  //画图线fttuxiang
fttuxiang.graphics.lineStyle(2, 0x990000, .75);
fttuxiang.graphics.moveTo(100, 450);
addChild(fttuxiang);
var ftmask:Shape = new Shape();    //fttuxiang的遮罩层
ftmask.graphics.lineStyle(1, 0x000000);
ftmask.graphics.beginFill(0xff0000);
ftmask.graphics.drawRect(100, 100, 600, 450);
ftmask.graphics.endFill();
this.addChild(ftmask);
fttuxiang.mask=ftmask;
function onEnterFrame(event:Event):void{        //每次运行帧时运行下列语句
while (ai<=hongwaiceju.ari)//如果ai值小于hongwaiceju中的ari,一直执行下列语句
                                     //这样可以读取每两帧间的所有数据。
  {     msgnum=Number(hongwaiceju.msgarray[ai]);
     fttuxiang.graphics.lineTo(100+ai*5, 550-msgnum*0.5);//图线绘制
           ai++;
if(ai>80)//如果图线超过了右边界,则开始向左平移图像
fttuxiang.x=(80-ai)*5;   
  }
  }
*******************************************************
然后再界面上画两条线表示横纵坐标轴,具体位置:x:100     y:100    宽:500  高:450
然后回到主场景,打开库,将库中的huitu拖入主场景,制作完毕,运行后界面如图:

仅仅一个简单的功能演示,你自己可以在坐标轴上加入坐标,或者设定一些按钮来控制图像的大小等等,发挥自己的想象力吧。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-10-5 14:27:22 | 显示全部楼层
楼主万岁!向老师致敬!我正在学习这方面的东西,这真是一篇不可多得的好文章!
回复 支持 反对

使用道具 举报

发表于 2015-3-18 22:57:29 | 显示全部楼层
向老师致敬!我正在学习这方面的东西,这真是一篇不可多得的好文章!
回复 支持 反对

使用道具 举报

发表于 2015-3-22 20:15:00 | 显示全部楼层
想问一下大家flash端程序运行有错么?我们试了几次都有如下错误:
IOErrorEvent : Error #2031: Socket 错误。 URL: 127.0.0.1
求大神相助
回复 支持 反对

使用道具 举报

发表于 2015-3-22 20:56:16 | 显示全部楼层
问题已解决~感谢楼主
回复 支持 反对

使用道具 举报

发表于 2015-3-23 10:06:28 | 显示全部楼层
可以考虑air通过ane直接和做串口通讯
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-9 20:25 , Processed in 0.066258 second(s), 27 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表