16206浏览
楼主: 驴友花雕

[项目] 【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块

[复制链接]

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 06:39:54

(2)实验串口返回情况

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 06:41:37

(3)打开Arduino IDE——工具——串口绘图器,查看实验波形

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 06:43:05

(4)实验串口绘图器返回情况

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 06:44:53

1、程序二:在串口显示ADXL345的动态波形之二
1Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序二:在串口显示ADXL345的动态波形之二
  4.   Arduino------ADXL345
  5.   5V------------VCC
  6.   GND-----------GND
  7.   A4-----------SDA IIC 数据线
  8.   A5-----------SCL IIC 时钟线
  9. */
  10. #include <Wire.h>
  11. #define DEVICE (0x53)  //ADXL345设备地址
  12. #define TO_READ (6)    //我们每次要读取的字节数(每个轴两个字节)
  13. byte buff[TO_READ] ;   //6字节缓冲区,用于保存从设备读取的数据
  14. char str[512];   //字符串缓冲区,用于在将数据发送到串行端口之前对其进行转换
  15. int regAddress = 0x32;  //ADXL345上的第一个轴加速度数据寄存器
  16. int x, y, z;      //三轴加速度数据
  17. double roll = 0.00, pitch = 0.00;  //Roll & Pitch 是绕 X 轴和 y 轴旋转的角度
  18. void setup() {
  19.   Wire.begin();    // 加入 i2c 总线(主机地址可选)
  20.   Serial.begin(9600);  // 启动串口输出
  21.   //开启ADXL345
  22.   writeTo(DEVICE, 0x2D, 0);
  23.   writeTo(DEVICE, 0x2D, 16);
  24.   writeTo(DEVICE, 0x2D, 8);
  25. }
  26. void loop() {
  27.   readFrom(DEVICE, regAddress, TO_READ, buff); //从ADXL345读取加速度数据
  28.   //每个轴读数的分辨率为 10 位,即 2 个字节。最低有效字节优先!!
  29.   //因此我们将两个字节转换为一个整数
  30.   x = (((int)buff[1]) << 8) | buff[0];
  31.   y = (((int)buff[3]) << 8) | buff[2];
  32.   z = (((int)buff[5]) << 8) | buff[4];
  33.   //我们将x y z值作为字符串发送到串口
  34.   Serial.print("x,y,z的加速度信息为:");
  35.   sprintf(str, "%d %d %d", x, y, z);
  36.   Serial.print(str);
  37.   Serial.write(10);
  38.   //计算Roll & Pitch
  39.   RP_calculate();
  40.   Serial.print("滚动:");
  41.   Serial.println( roll );
  42.   Serial.print("间距:");
  43.   Serial.println( pitch );
  44.   Serial.println("");
  45.   //看来需要延迟才能不阻塞端口
  46.   delay(500);
  47. }
  48. //将val写入设备上的地址寄存器
  49. void writeTo(int device, byte address, byte val) {
  50.   Wire.beginTransmission(device); //开始传输到设备
  51.   Wire.write(address);        // 发送寄存器地址
  52.   Wire.write(val);        // 发送要写入的值
  53.   Wire.endTransmission(); //结束传输
  54. }
  55. //从设备上的地址寄存器开始读取num字节到buff数组
  56. void readFrom(int device, byte address, int num, byte buff[]) {
  57.   Wire.beginTransmission(device); //开始传输到设备
  58.   Wire.write(address);        //发送要读取的地址
  59.   Wire.endTransmission();     //结束传输
  60.   Wire.beginTransmission(device); //开始传输到设备
  61.   Wire.requestFrom(device, num);  // 从设备请求 6 个字节
  62.   int i = 0;
  63.   while (Wire.available()) //设备发送的数据可能少于请求的数据(异常)
  64.   {
  65.     buff[i] = Wire.read(); // 接收一个字节
  66.     i++;
  67.   }
  68.   Wire.endTransmission(); //结束传输
  69. }
  70. //计算Roll&Pitch
  71. void RP_calculate() {
  72.   double x_Buff = float(x);
  73.   double y_Buff = float(y);
  74.   double z_Buff = float(z);
  75.   roll = atan2(y_Buff , z_Buff) * 57.3;
  76.   pitch = atan2((- x_Buff) , sqrt(y_Buff * y_Buff + z_Buff * z_Buff)) * 57.3;
  77. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 06:46:19

2)实验串口返回情况

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 06:47:55

3)实验串口绘图器返回情况

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 06:49:28

4)实验场景图

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 06:50:57

程序三:串口显示ADXL345的动态波形
1)实验开源仿真编程(Linkboy V4.63)

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 06:54:01

2)打开Linkboy——各种常用小工具——串口绘图器,查看实验波形

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 07:33:38

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 07:36:35

[size=12.0000pt](3)实验串口绘图器返回情况

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 07:40:15


程序四:显示传感器的三轴加速度及其状态
1Arduino参考开源代码


  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序四:显示传感器的三轴加速度及其状态
  4.   Arduino------ADXL345
  5.   5V------------VCC
  6.   GND-----------GND
  7.   A4-----------SDA IIC 数据线
  8.   A5-----------SCL IIC 时钟线
  9. */
  10. #include <Wire.h>
  11. // ADXL345的寄存器
  12. #define ADXL345_ADDRESS (0xA6 >> 1)  // 设备地址为 8 位,但转移到
  13.                                      // 右移 1 位使其变为 7 位,因为
  14.                                      // 线库只接受 7 位地址
  15. #define ADXL345_REGISTER_XLSB (0x32)
  16. int accelerometer_data[3];
  17. // 无效,因为这只告诉 cip 将数据发送到其输出寄存器
  18. // 将数据写入从机的缓冲区
  19. void i2c_write(int address, byte reg, byte data) {
  20.   // 发送输出寄存器地址
  21.   Wire.beginTransmission(address);
  22.   // 连接到设备
  23.   Wire.write(reg);
  24.   // 发送数据
  25.   Wire.write(data); //低电平字节
  26.   Wire.endTransmission();
  27. }
  28. // 无效,因为使用了指针
  29. //微控制器从传感器的输入寄存器读取数据
  30. void i2c_read(int address, byte reg, int count, byte* data) {
  31.   // 用于读取接收到的数据个数
  32.   int i = 0;
  33.   // 发送输入寄存器地址
  34.   Wire.beginTransmission(address);
  35.   // 连接到设备
  36.   Wire.write(reg);
  37.   Wire.endTransmission();
  38.   // 连接到设备
  39.   Wire.beginTransmission(address);
  40. // 从slave请求数据
  41.   // Count 代表要请求的字节数
  42.   Wire.requestFrom(address, count);
  43.   while(Wire.available()) // 从机发送的可能少于请求
  44.   {
  45.     char c = Wire.read(); // 接收一个字节作为字符
  46.     data[i] = c;
  47.     i++;
  48.   }
  49.   Wire.endTransmission();
  50. }
  51. void init_adxl345() {
  52.   byte data = 0;
  53.   i2c_write(ADXL345_ADDRESS, 0x31, 0x0B);   // 13 位模式 +_ 16g
  54.   i2c_write(ADXL345_ADDRESS, 0x2D, 0x08);   // 电源寄存器
  55.   i2c_write(ADXL345_ADDRESS, 0x1E, 0x00);   // x
  56.   i2c_write(ADXL345_ADDRESS, 0x1F, 0x00);   // Y
  57.   i2c_write(ADXL345_ADDRESS, 0x20, 0x05);   // Z
  58.   // 检查它是否有效!
  59.   i2c_read(ADXL345_ADDRESS, 0X00, 1, &data);
  60.   if(data==0xE5)
  61.     Serial.println("ADXL345启动成功!");
  62.   else
  63.     Serial.println("它工作失败");
  64. }
  65. void read_adxl345() {
  66.   byte bytes[6];
  67.   memset(bytes,0,6);
  68.   // 从 ADXL345 读取 6 个字节
  69.   i2c_read(ADXL345_ADDRESS, ADXL345_REGISTER_XLSB, 6, bytes);
  70.   // 解压数据
  71.   for (int i=0;i<3;++i) {
  72.     accelerometer_data[i] = (int)bytes[2*i] + (((int)bytes[2*i + 1]) << 8);
  73.   }
  74. }
  75. // 初始化并启动一切
  76. void setup() {
  77.   Wire.begin();
  78.   Serial.begin(9600);
  79.   for(int i=0; i<3; ++i) {
  80.     accelerometer_data[i]  = 0;
  81.   }
  82.   init_adxl345();
  83. }
  84. void loop() {
  85.   read_adxl345();
  86.   Serial.print("加速器: ");
  87.   //13位模式下3.9mg/LSB比例因子
  88.   Serial.print(float(accelerometer_data[0])*3.9/88);
  89.   Serial.print("\t");
  90.   Serial.print(float(accelerometer_data[1])*3.9/88);
  91.   Serial.print("\t");
  92.   Serial.print(float(accelerometer_data[2])*3.9/88-10);
  93.   Serial.print("\n");
  94.   delay(500);
  95. }
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 07:42:22

2)实验串口返回情况

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 07:44:48

3)实验串口绘图器返回情况之一(快速摇动三轴模块)

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 07:50:10

4)实验串口绘图器返回情况之二(慢速摇动三轴模块)

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 07:52:58

5)实验串口绘图器返回情况之三(缓慢转动三轴模块)

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 08:19:23

5、程序五:使用ADXL345模块控制9克舵机
1)实验开源仿真编程(Linkboy V4.63)
【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 08:47:09

2)打开Linkboy——各种常用小工具——串口绘图器,查看实验波形
实验串口绘图器返回情况

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 08:49:19

3)实验场景图

【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块图1

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 08:52:21

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2022-5-14 08:54:44

程序六:使用Adafruit_ADXL345_U库读取三轴X\Y\Z
1Arduino参考开源代码

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
  3.   程序六:使用Adafruit_ADXL345_U库读取三轴X\Y\Z
  4.   Arduino------ADXL345
  5.   5V------------VCC
  6.   GND-----------GND
  7.   A4-----------SDA IIC 数据线
  8.   A5-----------SCL IIC 时钟线
  9. */
  10. #include <Wire.h>
  11. #include <Adafruit_Sensor.h>
  12. #include <Adafruit_ADXL345_U.h>
  13. //同时给这个传感器分配一个唯一的ID
  14. Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);
  15. void displaySensorDetails(void){
  16.   sensor_t sensor;
  17.   accel.getSensor(&sensor);
  18.   Serial.println("------------------------------------");
  19.   Serial.print  ("传感器:       "); Serial.println(sensor.name);
  20.   Serial.print  ("驱动版本:   "); Serial.println(sensor.version);
  21.   Serial.print  ("唯一标识:    "); Serial.println(sensor.sensor_id);
  22.   Serial.print  ("最大值:    "); Serial.print(sensor.max_value); Serial.println(" m/s^2");
  23.   Serial.print  ("最小值:    "); Serial.print(sensor.min_value); Serial.println(" m/s^2");
  24.   Serial.print  ("分辨率:   "); Serial.print(sensor.resolution); Serial.println(" m/s^2");  
  25.   Serial.println("------------------------------------");
  26.   Serial.println("");
  27.   delay(500);
  28. }
  29. void displayDataRate(void){
  30.   Serial.print  ("数据速率:  ");
  31.   
  32.   switch(accel.getDataRate())
  33.   {
  34.     case ADXL345_DATARATE_3200_HZ:
  35.       Serial.print  ("3200 ");
  36.       break;
  37.     case ADXL345_DATARATE_1600_HZ:
  38.       Serial.print  ("1600 ");
  39.       break;
  40.     case ADXL345_DATARATE_800_HZ:
  41.       Serial.print  ("800 ");
  42.       break;
  43.     case ADXL345_DATARATE_400_HZ:
  44.       Serial.print  ("400 ");
  45.       break;
  46.     case ADXL345_DATARATE_200_HZ:
  47.       Serial.print  ("200 ");
  48.       break;
  49.     case ADXL345_DATARATE_100_HZ:
  50.       Serial.print  ("100 ");
  51.       break;
  52.     case ADXL345_DATARATE_50_HZ:
  53.       Serial.print  ("50 ");
  54.       break;
  55.     case ADXL345_DATARATE_25_HZ:
  56.       Serial.print  ("25 ");
  57.       break;
  58.     case ADXL345_DATARATE_12_5_HZ:
  59.       Serial.print  ("12.5 ");
  60.       break;
  61.     case ADXL345_DATARATE_6_25HZ:
  62.       Serial.print  ("6.25 ");
  63.       break;
  64.     case ADXL345_DATARATE_3_13_HZ:
  65.       Serial.print  ("3.13 ");
  66.       break;
  67.     case ADXL345_DATARATE_1_56_HZ:
  68.       Serial.print  ("1.56 ");
  69.       break;
  70.     case ADXL345_DATARATE_0_78_HZ:
  71.       Serial.print  ("0.78 ");
  72.       break;
  73.     case ADXL345_DATARATE_0_39_HZ:
  74.       Serial.print  ("0.39 ");
  75.       break;
  76.     case ADXL345_DATARATE_0_20_HZ:
  77.       Serial.print  ("0.20 ");
  78.       break;
  79.     case ADXL345_DATARATE_0_10_HZ:
  80.       Serial.print  ("0.10 ");
  81.       break;
  82.     default:
  83.       Serial.print  ("???? ");
  84.       break;
  85.   }  
  86.   Serial.println(" Hz");  
  87. }
  88. void displayRange(void){
  89.   Serial.print  ("范围:  +/- ");
  90.   
  91.   switch(accel.getRange())
  92.   {
  93.     case ADXL345_RANGE_16_G:
  94.       Serial.print  ("16 ");
  95.       break;
  96.     case ADXL345_RANGE_8_G:
  97.       Serial.print  ("8 ");
  98.       break;
  99.     case ADXL345_RANGE_4_G:
  100.       Serial.print  ("4 ");
  101.       break;
  102.     case ADXL345_RANGE_2_G:
  103.       Serial.print  ("2 ");
  104.       break;
  105.     default:
  106.       Serial.print  ("?? ");
  107.       break;
  108.   }  
  109.   Serial.println(" g");  
  110. }
  111. void setup(void){
  112. #ifndef ESP8266
  113.   while (!Serial);
  114. #endif
  115.   Serial.begin(9600);
  116.   Serial.println("加速度计测试"); Serial.println("");
  117.   
  118.   //初始化传感器
  119.   if(!accel.begin())
  120.   {
  121.     //检测 ADXL345 时出现问题...检查您的连接
  122.     Serial.println("糟糕,没有检测到 ADXL345……检查你的接线!");
  123.     while(1);
  124.   }
  125.   //将范围设置为适合您项目的范围
  126.   accel.setRange(ADXL345_RANGE_16_G);
  127.   // accel.setRange(ADXL345_RANGE_8_G);
  128.   // accel.setRange(ADXL345_RANGE_4_G);
  129.   // accel.setRange(ADXL345_RANGE_2_G);
  130.   
  131.   //显示这个传感器的一些基本信息
  132.   displaySensorDetails();
  133.   
  134.   // 显示附加设置(sensor_t 范围之外)
  135.   displayDataRate();
  136.   displayRange();
  137.   Serial.println("");
  138. }
  139. void loop(void){
  140.   //获取新的传感器事件
  141.   sensors_event_t event;
  142.   accel.getEvent(&event);
  143.   //显示结果(加速度以 m/s^2 为单位)
  144.   Serial.print("X: "); Serial.print(event.acceleration.x); Serial.print("  ");
  145.   Serial.print("Y: "); Serial.print(event.acceleration.y); Serial.print("  ");
  146.   Serial.print("Z: "); Serial.print(event.acceleration.z); Serial.print("  ");Serial.println("m/s^2 ");
  147.   delay(500);
  148. }
复制代码


回复

使用道具 举报

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

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail