分享

arduino学习笔记12

 容斋承筐 2016-03-31
前两天我们做了温度传感器实验,大家一定还有印象。今天我们来研究另外一种传感器加速度传感器。

什么是加速度传感器

加速度传感器,作用是测量在加速过程中产生的力。最基本的如咱们平常所熟悉的是重力加速度,大小是1g。

加速度传感器一般用于什么地方

通过测量由重力引起的加速度,你可以计算出设备相对于水平面的倾斜角度。通过分析动态加速度,你可以分析出设备的移动方式。自平衡车中就是使用加速度传感器与陀螺仪进行卡尔曼滤波进行姿态矫正。

本次试验使用的ADXL345数字传感器,通过I2C或者SPI接口直接输出数字信号。在1g的加速度下,输出数值为256.


3206_1226.jpg

下面是硬件连接图

Snap2.jpg

Snap1.jpg

IMGP0018_调整大小.JPG

下面是002X IDE下的代码
ARDUINO 代码复制打印
  1. #include <Wire.h>  //调用arduino自带的I2C库
  2. #include <LiquidCrystal.h>   //调用arduino自带的LiquidCrystal库

  3. #define Register_ID 0
  4. #define Register_2D 0x2D
  5. #define Register_X0 0x32
  6. #define Register_X1 0x33
  7. #define Register_Y0 0x34
  8. #define Register_Y1 0x35
  9. #define Register_Z0 0x36
  10. #define Register_Z1 0x37

  11. LiquidCrystal lcd(12, 11, 10, 9, 8, 7);//设置接口

  12. int ADXAddress = 0xA7>>1;  //转换为7位地址
  13. int reading = 0;
  14. int val = 0;
  15. int X0,X1,X_out;
  16. int Y0,Y1,Y_out;
  17. int Z1,Z0,Z_out;
  18. double Xg,Yg,Zg;

  19. void setup()
  20. {
  21.   lcd.begin(16, 2);  //初始化LCD
  22.   delay(100);
  23.   Wire.begin();  //初始化I2C
  24.   delay(100);
  25.   Wire.beginTransmission(ADXAddress);
  26.   Wire.send(Register_2D);
  27.   Wire.send(8);
  28.   Wire.endTransmission();
  29. }

  30. void loop()
  31. {
  32.   Wire.beginTransmission(ADXAddress);
  33.   Wire.send(Register_X0);
  34.   Wire.send(Register_X1);
  35.   Wire.endTransmission();
  36.   Wire.requestFrom(ADXAddress,2);
  37.   if(Wire.available()<=2);
  38.   {
  39.     X0 = Wire.receive();
  40.     X1 = Wire.receive();
  41.     X1 = X1<<8;
  42.     X_out = X0+X1;
  43.   }

  44.   Wire.beginTransmission(ADXAddress);
  45.   Wire.send(Register_Y0);
  46.   Wire.send(Register_Y1);
  47.   Wire.endTransmission();
  48.   Wire.requestFrom(ADXAddress,2);
  49.   if(Wire.available()<=2);
  50.   {
  51.     Y0 = Wire.receive();
  52.     Y1 = Wire.receive();
  53.     Y1 = Y1<<8;
  54.     Y_out = Y0+Y1;
  55.   }

  56.   Wire.beginTransmission(ADXAddress);
  57.   Wire.send(Register_Z0);
  58.   Wire.send(Register_Z1);
  59.   Wire.endTransmission();
  60.   Wire.requestFrom(ADXAddress,2);
  61.   if(Wire.available()<=2);
  62.   {
  63.     Z0 = Wire.receive();
  64.     Z1 = Wire.receive();
  65.     Z1 = Z1<<8;
  66.     Z_out = Z0+Z1;
  67.   }

  68.   Xg = X_out/256.00;//把输出结果转换为重力加速度g,精确到小数点后2位。
  69.   Yg = Y_out/256.00;
  70.   Zg = Z_out/256.00;
  71.   lcd.clear(); //清屏
  72.   lcd.print("X="); //使屏幕显示文字X=
  73.   lcd.print(Xg);
  74.   lcd.setCursor(8, 0);
  75.   lcd.print("Y=");
  76.   lcd.print(Yg);
  77.   lcd.setCursor(0, 1);
  78.   lcd.print("Z=");
  79.   lcd.print(Zg);
  80.   delay(300);  //延时0.3秒,刷新频率这里进行调整

  81. }
试验效果如下



附件为ADXL345中文手册
ADXL345中文PDF.pdf (895.84 KB, 下载次数: 1383)

1.0以后Arduino语法修改很大,下面的代码是1.0以后的IDE使用的代码。
ARDUINO 代码复制打印
  1. #include <Wire.h>  //调用arduino自带的I2C库
  2. #include <LiquidCrystal.h>   //调用arduino自带的LiquidCrystal库

  3. #define Register_ID 0
  4. #define Register_2D 0x2D
  5. #define Register_X0 0x32
  6. #define Register_X1 0x33
  7. #define Register_Y0 0x34
  8. #define Register_Y1 0x35
  9. #define Register_Z0 0x36
  10. #define Register_Z1 0x37

  11. LiquidCrystal lcd(12, 11, 10, 9, 8, 7);//设置接口

  12. int ADXAddress = 0xA7>>1;  //转换为7位地址
  13. int reading = 0;
  14. int val = 0;
  15. int X0,X1,X_out;
  16. int Y0,Y1,Y_out;
  17. int Z1,Z0,Z_out;
  18. double Xg,Yg,Zg;

  19. void setup()
  20. {
  21.   lcd.begin(16, 2);  //初始化LCD
  22.   delay(100);
  23.   Wire.begin();  //初始化I2C
  24.   delay(100);
  25.   Wire.beginTransmission(ADXAddress);
  26.   Wire.write(Register_2D);
  27.   Wire.write(8);
  28.   Wire.endTransmission();
  29. }

  30. void loop()
  31. {
  32.   Wire.beginTransmission(ADXAddress);
  33.   Wire.write(Register_X0);
  34.   Wire.write(Register_X1);
  35.   Wire.endTransmission();
  36.   Wire.requestFrom(ADXAddress,2);
  37.   if(Wire.available()<=2);
  38.   {
  39.     X0 = Wire.read();
  40.     X1 = Wire.read();
  41.     X1 = X1<<8;
  42.     X_out = X0+X1;
  43.   }

  44.   Wire.beginTransmission(ADXAddress);
  45.   Wire.write(Register_Y0);
  46.   Wire.write(Register_Y1);
  47.   Wire.endTransmission();
  48.   Wire.requestFrom(ADXAddress,2);
  49.   if(Wire.available()<=2);
  50.   {
  51.     Y0 = Wire.read();
  52.     Y1 = Wire.read();
  53.     Y1 = Y1<<8;
  54.     Y_out = Y0+Y1;
  55.   }

  56.   Wire.beginTransmission(ADXAddress);
  57.   Wire.write(Register_Z0);
  58.   Wire.write(Register_Z1);
  59.   Wire.endTransmission();
  60.   Wire.requestFrom(ADXAddress,2);
  61.   if(Wire.available()<=2);
  62.   {
  63.     Z0 = Wire.read();
  64.     Z1 = Wire.read();
  65.     Z1 = Z1<<8;
  66.     Z_out = Z0+Z1;
  67.   }

  68.   Xg = X_out/256.00;//把输出结果转换为重力加速度g,精确到小数点后2位。
  69.   Yg = Y_out/256.00;
  70.   Zg = Z_out/256.00;
  71.   lcd.clear(); //清屏
  72.   lcd.print("X="); //使屏幕显示文字X=
  73.   lcd.print(Xg);
  74.   lcd.setCursor(8, 0);
  75.   lcd.print("Y=");
  76.   lcd.print(Yg);
  77.   lcd.setCursor(0, 1);
  78.   lcd.print("Z=");
  79.   lcd.print(Zg);
  80.   delay(300);  //延时0.3秒,刷新频率这里进行调整

  81. }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多