Arduino加速度传感器与Processing幻彩立方的互动_第1页
Arduino加速度传感器与Processing幻彩立方的互动_第2页
Arduino加速度传感器与Processing幻彩立方的互动_第3页
Arduino加速度传感器与Processing幻彩立方的互动_第4页
Arduino加速度传感器与Processing幻彩立方的互动_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

这篇文章介绍MMA7361三轴加速度传感器的原理及应用。为了体验下这个传感器反馈物体运动姿态的功效,我设计了一个互动任务,任务为:根据MMA7361加速度传感器绕坐标轴的倾斜角度,实时作用于Processing虚拟环境下的幻彩立方,使其旋转三维空间角度,让由Arduino采样的加速度传感器与幻彩立方产生互动效应。MMA7361三轴加速度传感器是基于加速度的基本原理去实现工作的,加速度是个空间矢量,一方面,要准确了解物体的运动状态,必须测得其三个坐标轴上的分量;另一方面,在预先不知道物体运动方向的场合下,只有应用三轴加速度传感器来检测加速度信号。通过测量由于重力引起的加速度,你可以计算出设备相对于水平面的倾斜角度。通过分析动态加速度,你可以分析出设备移动的方式。三轴加速度传感器具有体积小和重量轻特点,可以测量空间加速度,能够全面准确反映物体的运动性质,在航空航天、机器人、汽车和医学等领域都得到了广泛的应用。MMA7361三轴加速度传感器是替代停产的MMA7260三轴加速度传感器,MMA7361三轴加速度传感器芯片,对于普通的互动应用来讲应该是种不错的选择,可以应用到摩托车和汽车放倒报警、遥控航模、游戏手柄、人形机器人跌倒检测、硬盘冲击保护、倾斜度测量等场合。gcug£kGgcug£kG稳旺芯片最程选择图2MM7361三轴加速度传感器MMA7361三轴加速度传感器把加速度分解成X、Y和Z三个方向上的分量,并产生相应的三个0~5V的电压值输出,然后从MM7361传感器的三个模拟量输出端,连线到Arduino控制器的模拟端口0、1、2上。如图3所示,接着Arduino控制器的10位模数转换器把它们转换成0~1023的整数值。

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

图4Arduino控制器与MM7361加速度传感器的安装图看图2所示,MMA7361加速度传感器提供了±1.5g/6g两个量程,用户可通过开关选择这2个灵敏度。制作这个互动作品时,我选用了灵敏度高的±1.5g量程,高灵敏度量程所产生的加速度转换值的分辨率高,数值变化范围大,体现在Processing幻彩立方的旋转动作上,就更加平顺。注意:实验视频中,我选用了6g量程,所以幻彩立方旋转地不够平顺。原先我一直不理解通过加速度传感器是如何了解设备相对于水平面的倾斜角度的,实际上只要实践下,这个问题无师自通。首先如图4所示,我把加速度传感器用双面胶带粘在Arduino控制器的背面,插上USB数据线,形成一个体感设备,再把如下测试程序,写入Arduino控制器,通过ArduinoIDE编程环境中串口监视器,如图5所示,观测体感设备旋转时,X、Y和Z轴三个分量上加速度转换值的变化。图5ArduinoIDE编程环境中的串口监视器voidsetup(){Serial・begin(9600);//启动串行通信,波特率为9600bps}voidloop(){intx,y,z;x=analogRead(0);//采集重力加速度X轴分量的转换值,输入到模拟端口0y=analogRead(1);〃釆集重力加速度Y轴分量的转换值,输入到模拟端口1z=analogRead(2);〃釆集重力加速度Z轴分量的转换值,输入到模拟端口2//把重力加速度X、Y和Z轴分量的转换值上传到上位机串口监视器Serial・print("x=");Serial・print(x,DEC);Serial.print(',');Serial・print("y=");Serial・print(y,DEC);Serial.print(',');Serial・print("z=");Serial・println(z,DEC);delay(800);〃延时0.8s,以便有足够时间观测各加速度分量值的变化}如何通过以上程序,来标定加速度转换值与绕轴旋转的角度之间的关系?方法是:根据图6所示三轴坐标系定义,把体感设备放置水平,它的三个模拟量输出端朝后,另一端朝前至Y轴。这时让设备向左旋转到90度垂直位置,记录下X轴加速度分量是175,而传感器向右旋转至垂直位置,这个分量值为495。然后把设备恢复到水平位置,这时再绕X轴向后旋转90度垂直位置,记录下Y轴加速度分量是195,而传感器向前旋转至垂直位置,这个分量值为525。Y00)0(100,0,0^—<x(61冷Y00)0(100,0,0^—<x(61冷Q)“-1C0)(呱too期图6X、Y和Z轴坐标系定义通过观测,我们发现了重力加速度X、Y分量转换值与绕Y轴和X轴旋转角度的对应关系,并标定如下:X轴加速度分量175~495对应Y轴旋转角度-90度~+90度。Y轴加速度分量195~525对应X轴旋转角度值-90度~+90度。可以通过下面的Arduino程序中map()函数,建立这个算式,并把绕Y轴和X轴旋转的两个角度值以字节形式上传Processing软件处理。为了使上传的角度值不出现负数,我把-90~+90度值等效为0~180度。注意:如果您也用MMA7361传感器做项目,希望再重新标定一下,重力加速度X、Y分量转换值与绕Y轴和X轴旋转角度的对应关系。以下Arduino程序与Processing程序的串行通信部分,我用红色字体标注出来。Arduino程序://初始化voidsetup(){Serial・begin(9600);//启动串行通信,波特率为9600b/s}〃主程序voidloop(){〃把MM7361加速度传感器重力加速度的X、Y、Z轴分量,分别接入//Arduino控制器的模拟量端子0、1、2。intxValue=analogRead(O);intyValue=analogRead(l);intzValue=analogRead(2);/*当Arduino稳压后的电压为5V(实测为4・95v~4.97v),并选择±1・5g量程时先把加速度传感器放置水平,若定义前方是Y轴,那么传感器向左旋转至90度垂直位置,则重力加速度X轴分量xValue值标定为175,而传感器向右旋转至垂直位置,xValue值为495。*/〃把绕Y轴旋转180度的两个特定位置的xValue值175~495转换成角度值0~180intyRotate=map(xValue,175,495,0,180);//把绕X轴旋转180度的两个特定位置的yValue值195~525转换成角度值0~180intxRotate=map(yValue,195,525,0,180);if(yRotate<=0)yRotate=0;〃如果绕Y轴旋转的角度值出现负数,则强制为0if(xRotatev=0)xRotate=0;〃如果绕X轴旋转的角度值出现负数,则强制为0Serial・print(yRotate,BYTE);〃以字节形式,上传绕Y和X的旋转角度值Serial・print(xRotate,BYTE);delay(100);//延时100ms}在Processing环境下,创建一个幻彩立方,并接受Arduino程序上传的两个绕Y轴和X轴的角度信息。由于体感设备位于水平位置时,是幻彩立方的初始状态。体感设备旋转时,则幻彩立方也随之顺时针或逆时针旋转,所以Processing程序要把Arduino上传的0~180度角度值通过下面程序中蓝色字体标注的算式转换为-90~+90度,然后通过rotateX()和rotateZ()函数来旋转变换幻彩立方。Processing程序:importprocessing.serial・*;//导入serial通信库Serialduankou;//创建对象duankouintY_Rotate=90,X_Rotate=90;voidsetup(){size(800,600,P3D);//设置画布尺寸,创建3D环境stroke(102);//图形线条颜色为灰色strokeWeight(20);〃图形线条的宽度colorMode(RGB,1);//设定通讯端口为COM3,波特率为9600//(Arduino与Processing联机的串口号COM?可以通过设备管理器观査得到。)duankou=newSerial(this,"COM3",9600);}〃主程序voiddraw(){background(0・5);//设置画布背景颜色pushMatrix();//把当前坐标值保存在堆栈中//把坐标原点移动到画布中央,同时向屏幕后移动-150translate(width/2,height/2,-150);while(duankou・available()V3);//读取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();〃从堆栈中复原当前坐标值}看图4所示的由Arduino控制器与MMA7361加速度传感器组成的体感设备,这次实验是采用USB供电并传送数据的,但如果您想做个蓝牙无线体感设备,对于设备的电池盒供电电压要特别注意:要求电源电压应大于6.5V,因为小于6.5V的电源,Arduino控制板上的板载稳压电路不能把电压稳定于5V,实测电压是4.95V,而若稳压后产生电压值不同,我发现

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论