Arduino 和Processing 互动

2014-01-089817
AI 快速预览详细 收起
本文介绍了一个项目,通过MMA7361三轴加速度传感器与Arduino控制器和Processing软件的结合,实现实时控制虚拟环境中的幻彩立方旋转。项目中,传感器的数据被转换为角度值并通过串行通信传输给Processing,从而实现物理世界与虚拟世界的互动效果。这个项目适用于STEM教育和创客项目,展示了传感器数据采集和处理的实际应用。

根据MM7361加速度传感器绕坐标轴的倾斜角度,实时作用于Processing虚拟环境下的幻彩立方,使其旋转三维空间角度,让由Arduino采样的加速度传感器与幻彩立方产生互动效应。

MMA7361三轴加速度传感器把加速度分解成X、Y和Z三个方向上的分量,并产生相应的三个0~5V的电压值输出,然后从MM7361传感器的三个模拟量输出端,连线到Arduino控制器的模拟端口0、1、2上。如图3所示,接着Arduino控制器的10位模数转换器把它们转换成0~1023的整数值。

图3中的电控设备有:1、Arduino UNO控制板;2、Xbee传感器扩展板V5;3、MM7361三轴加速度传感器。这三个电控部件全部由DFRobot公司出品,公司网址:http://blog.dfrobot.com.cn/。这个传感器的说明书网址:http://goo.gl/056E7


Arduino程序:[mw_shl_code=applescript,true]void setup() {
  Serial.begin(9600);//启动串行通信,波特率为9600b/s
}

//主程序
void loop()
{
  //把MM7361加速度传感器重力加速度的X、Y、Z轴分量,分别接入
  //Arduino控制器的模拟量端子0、1、2。
  int xValue = analogRead(0);  
  int yValue = analogRead(1);  
  int zValue = analogRead(2);  /*当Arduino稳压后的电压为5V(实测为4.95v~4.97v),并选择±1.5g量程时  先把加速度传感器放置水平,若定义前方是Y轴,那么传感器向左旋转至90度垂直位置,  则重力加速度X轴分量xValue值标定为175,而传感器向右旋转至垂直位置,xValue值为495。  */
  //把绕Y轴旋转180度的两个特定位置的xValue值175~495转换成角度值0~180  i
  int yRotate=map(xValue,175,495,0,180);  //把绕X轴旋转180度的两个特定位置的yValue值195~525转换成角度值0~180  
  int xRotate=map(yValue,195,525,0,180);
  if(yRotate<=0) yRotate=0;//如果绕Y轴旋转的角度值出现负数,则强制为0
  if(xRotate<=0) xRotate-0;//如果绕X轴旋转的角度值出现负数,则强制为0  
  Serial.print(yRotate);//以字节形式,上传绕Y和X的旋转角度值  
  Serial.print(xRotate);  
  delay(100);//延时100ms
}[/mw_shl_code]


[mw_shl_code=applescript,true]import processing.serial.*; //导入serial通信库
Serial duankou;//创建对象
duankouint   Y_Rotate=90, X_Rotate=90;
void setup(){  
size(800,600, P3D); //设置画布尺寸,创建3D环境
stroke(102); //图形线条颜色为灰色  
strokeWeight(20);//图形线条的宽度  
colorMode(RGB, 1);  //设定通讯端口为COM3,波特率为9600//(Arduino与Processing联机的串口号COM?可以通过设备管理器观查得到。)  
duankou = new Serial(this,"COM3",9600);
}
//主程序
void draw(){
background(0.5); //设置画布背景颜色  
pushMatrix(); //把当前坐标值保存在堆栈中  //把坐标原点移动到画布中央,同时向屏幕后移动-150  
translate(width/2, height/2, -150);  
while(duankou.available()<3);//读取Arduino上传的两个字节  
Y_Rotate= duankou.read();//第一个字节反映了加速度传感器,绕Y轴的旋转角度
X_Rotate = duankou.read();//第一个字节反映了加速度传感器,绕X轴的旋转角度  //把Arduino上传的0~180度值转换为-90~+90度
rotateX((X_Rotate-90) * PI / 180.0);//使幻彩立方旋转  
rotateZ((Y_Rotate-90) * PI / 180.0);   
scale(150);//放大1个单位的立方体到150倍
beginShape(QUADS);//定义单位边长为1的幻彩立方体
fill(0, 1, 1);vertex(-1,  1,  1);
fill(1, 1, 1); vertex( 1,  1,  1);
fill(1, 0, 1); vertex( 1, -1,  1);
fill(0, 0, 1); vertex(-1, -1,  1);
fill(1, 1, 1); vertex( 1,  1,  1);  
fill(1, 1, 0); vertex( 1,  1, -1);  
fill(1, 0, 0); vertex( 1, -1, -1);
fill(1, 0, 1); vertex( 1, -1,  1);
fill(1, 1, 0); vertex( 1,  1, -1);
fill(0, 1, 0); vertex(-1,  1, -1);
fill(0, 0, 0); vertex(-1, -1, -1);
fill(1, 0, 0); vertex( 1, -1, -1);  
fill(0, 1, 0); vertex(-1,  1, -1);
fill(0, 1, 1); vertex(-1,  1,  1);
fill(0, 0, 1); vertex(-1, -1,  1);
fill(0, 0, 0); vertex(-1, -1, -1);  
fill(0, 1, 0); vertex(-1,  1, -1);  
fill(1, 1, 0); vertex( 1,  1, -1);  
fill(1, 1, 1); vertex( 1,  1,  1);  
fill(0, 1, 1); vertex(-1,  1,  1);  
fill(0, 0, 0); vertex(-1, -1, -1);
fill(1, 0, 0); vertex( 1, -1, -1);
fill(1, 0, 1); vertex( 1, -1,  1);  
fill(0, 0, 1); vertex(-1, -1,  1);  
endShape();//结束立方体的造型
popMatrix(); //从堆栈中复原当前坐标值
}[/mw_shl_code]

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(1)
lauren
lauren
我擦这也可以?
- 没有更多了 -