风筝
发表于: 2020-4-10 12:39:54 | 显示全部楼层

在本篇文章中,我们将学习如何使用Arduino和Processing Animation连接ADXL345加速度计,并进行3D动画视图显示,同时还将了解加速度计ADXL345的工作原理以及使用该传感器的一些实际应用。

Interface-ADXL345-Accelerometer-with-Arduino-Processing-Animation.png


什么是MEMS加速度计?

大多数加速度计是微机电传感器(Micro-Electro-Mechanical Sensors)。


加速度计是一种机电设备,可同时测量静态(重力)和动态(运动或振动)加速度。加速度计会测量适当的加速度,这是它相对于自由落体所经历的加速度,也是人和物体感受到的加速度。例如,静止在地球表面的加速度计将测量由于地球引力而产生的加速度,按定义为g≈9.81 m / s2。相比之下,自由下落的加速度计(以约9.81 m / s2的速度向地球中心坠落)将测量为零。


加速度计的结构

从概念上讲,加速度计的作用相当于弹簧上的阻尼质量。当加速度计经历加速度时,质量块移动到使弹簧能够以与壳体相同的速率使质量块加速的程度。然后测量位移以给出加速度。

structure-of-accelerometer.png


在工业设备中,压电、压阻和电容组件通常用于将机械运动转换为电信号。现代的加速度计通常是小型的微机电系统(MEMS),实际上是最简单的MEMS装置,仅由具有检测质量的悬臂梁组成。


加速度计的工作原理

制作加速度计的方法有很多!一些加速度计利用压电效应 – 它们包含微小的晶体结构,这些结构会受到加速力的作用,从而产生电压。

加速度计的工作原理

加速度计的工作原理


另一种方法是通过检测电容的变化。如果您有两个彼此相邻的微结构,则它们之间会有一定的电容。如果加速力使结构之一移​​动,则电容将改变。添加一些电路将电容转换为电压,您将获得一个加速度计。还有更多方法,包括使用压阻效应、热气泡和光照。


3轴加速度计ADXL345

ADXL345是一款三轴加速度计,可进行高达±16 g的高分辨率(13位)测量。数字输出数据的格式为16位二进制补码,可通过SPI(3线或4线)或I2C数字接口访问。

adxl345-3-axis-digital-accelerometer.jpg

ADXL345非常适合测量倾斜感应应用中的静态重力加速度,以及由于运动或冲击而产生的动态加速度。其高分辨率(4 mg / LSB)可以测量小于1.0度的倾斜度变化。


ADXL345与I2C通信配合使用

I2C总线是一条共享总线,仅包含两个信号,即时钟线(SCL)和数据线(SDA)。一条I2C总线可以连接两个或更多设备,任何设备都可以是主设备或从设备(同一设备甚至可以在不同时间担当两个角色)。只有主站才能启动通信。从设备通过硬件配置分配了唯一的7位或10位设备地址,并监视总线上要调用的地址,以响应任何开始事务的主设备。这意味着您必须确保I2C总线上的每个从设备都有唯一的地址。

c5881895-0950-4e07-b4ef-4819cb5b4073.png


当主设备和从设备都不驱动总线时,I2C总线要求SDA和SCL线上的上拉电阻将总线保持在高电压电平。通过将每个接口线通过适当大小的电阻器连接到电源电压来创建上拉电阻。电阻的大小由将要使用的走线长度来选择,这会影响走线的电容以及I2C总线的速度。较长的走线会产生较高的电容,并且在I2C器件停止将导线驱动到低电压电平之后,需要使用较低阻值的电阻才能将导线返回到高电压电平。


如何将ADXL345加速度计与Arduino和Processing连接?

要将ADXL345加速度计与Arduino和Processing IDE连接,您需要面包板、连接线、Arduino UNO开发板、ADXL345加速度计和1602 LCD(可选)。 如下图所示组装电路。

ADXL345加速度计与Arduino的连接图

ADXL345加速度计与Arduino的连接图


源代码/程序

下面是ADXL345加速度计与Arduino连接使用的代码

  1. #include <Wire.h>
  2. #include<LiquidCrystal.h>
  3. LiquidCrystal lcd(12,11,5,4,3,2);

  4. #define DEVICE (0x53) //ADXL345 device address
  5. #define TO_READ (6) //num of bytes we are going to read each time (two bytes for each axis)

  6. #define offsetX -10.5 // place your OFFSET values here
  7. #define offsetY -2.5
  8. #define offsetZ -4.5

  9. #define gainX 257.5 // place your GAIN factors
  10. #define gainY 254.5
  11. #define gainZ 248.5

  12. byte buff[TO_READ] ; //6 bytes buffer for saving data read from the device
  13. char str[512]; //string buffer to transform data before sending it to the serial port

  14. void setup()
  15. {
  16. Wire.begin(); // join i2c bus (address optional for master)
  17. Serial.begin(9600); // start serial for output
  18. lcd.begin(16,2);

  19. //Turning on the ADXL345
  20. writeTo(DEVICE, 0x2D, 0);
  21. writeTo(DEVICE, 0x2D, 16);
  22. writeTo(DEVICE, 0x2D, 8);
  23. }

  24. void loop()
  25. {
  26. int regAddress = 0x32; //first axis-acceleration-data register on the ADXL345
  27. int x, y, z;

  28. readFrom(DEVICE, regAddress, TO_READ, buff); //read the acceleration data from the ADXL345

  29. //each axis reading comes in 10 bit resolution, ie 2 bytes. Least Significat Byte first!!
  30. //thus we are converting both bytes in to one int
  31. x = (((int)buff[1]) << 8) | buff[0];
  32. y = (((int)buff[3])<< 8) | buff[2];
  33. z = (((int)buff[5]) << 8) | buff[4];

  34. //we send the x y z values as a string to the serial port
  35. sprintf(str, "%d %d %d", x, y, z);
  36. Serial.print(str);
  37. Serial.print(10, byte());
  38. lcd.setCursor(1,0);
  39. lcd.print("X:");
  40. lcd.setCursor(3,0);
  41. lcd.print(x);
  42. lcd.setCursor(9,0);
  43. lcd.print("Y:");
  44. lcd.setCursor(11,0);
  45. lcd.print(y);
  46. lcd.setCursor(5,1);
  47. lcd.print("Z:");
  48. lcd.setCursor(7,1);
  49. lcd.print(z);

  50. //It appears that delay is needed in order not to clog the port
  51. delay(100);
  52. }

  53. //---------------- Functions
  54. //Writes val to address register on device
  55. void writeTo(int device, byte address, byte val) {
  56. Wire.beginTransmission(device); //start transmission to device
  57. Wire.write(address); // send register address
  58. Wire.write(val); // send value to write
  59. Wire.endTransmission(); //end transmission
  60. }

  61. //reads num bytes starting from address register on device in to buff array
  62. void readFrom(int device, byte address, int num, byte buff[]) {
  63. Wire.beginTransmission(device); //start transmission to device
  64. Wire.write(address); //sends address to read from
  65. Wire.endTransmission(); //end transmission

  66. Wire.beginTransmission(device); //start transmission to device
  67. Wire.requestFrom(device, num); // request 6 bytes from device

  68. int i = 0;
  69. while(Wire.available()) //device may send less than requested (abnormal)
  70. {
  71. buff[i] = Wire.read(); // receive a byte
  72. i++;
  73. }
  74. Wire.endTransmission(); //end transmission
  75. }
复制代码

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 714 | 回复: 1501



手机版|

GMT+8, 2024-12-22 09:54 , Processed in 0.053161 second(s), 9 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

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