【雕爷学编程】Arduino动手做(48)---GY-291 ADXL345 三轴模块4
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输
程序八:使用ADXL345_WE 库测量角度、校正角度和方向
Arduino实验开源代码
/* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 程序八:使用ADXL345_WE 库测量角度、校正角度和方向 Arduino------ADXL345 5V------------VCC GND-----------GND A4-----------SDA IIC 数据线 A5-----------SCL IIC 时钟线 */ #include<Wire.h> #include<ADXL345_WE.h> #define ADXL345_I2CADDR 0x53 // 如果 SDO = HIGH,则为 0x1D /* 有几种方法可以创建您的 ADXL345 对象: ADXL345_WE myAcc = ADXL345_WE() -> uses Wire / I2C Address = 0x53 ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR) -> uses Wire / ADXL345_I2CADDR ADXL345_WE myAcc = ADXL345_WE(&wire2) -> uses the TwoWire object wire2 / ADXL345_I2CADDR ADXL345_WE myAcc = ADXL345_WE(&wire2, ADXL345_I2CADDR) -> all together */ ADXL345_WE myAcc = ADXL345_WE(ADXL345_I2CADDR); void setup() { Wire.begin(); Serial.begin(9600); Serial.println("ADXL345_测试"); Serial.println(); if (!myAcc.init()) { Serial.println("ADXL345 未连接!"); } /* 添加您使用 ADXL345_calibration.ino 找到的最小和最大原始值。 顺序为: setCorrFactors(min x, max x, min y, max y, min z, max z). setCorrFactors 校准斜率并假设零点 is (min+max)/2. 必须将 setCorrFactors 函数添加到全局 */ myAcc.setCorrFactors(-266.0, 285.0, -268.0, 278.0, -291.0, 214.0); /* 在下一步中,角度的偏移被校正以获得相当精确的校正 x 和 y 的角度高达 ~60°。附加的 offsetCorrection 仅用于 校正角度测量。该过程只是确保从 0° 开始。 */ Serial.println("将您的 ADXL345 平放,不要移动它"); delay(2000); myAcc.measureAngleOffsets(); Serial.println("....完成"); /* 选择数据速率Hz ADXL345_DATA_RATE_3200 3200 ADXL345_DATA_RATE_1600 1600 ADXL345_DATA_RATE_800 800 ADXL345_DATA_RATE_400 400 ADXL345_DATA_RATE_200 200 ADXL345_DATA_RATE_100 100 ADXL345_DATA_RATE_50 50 ADXL345_DATA_RATE_25 25 ADXL345_DATA_RATE_12_5 12.5 ADXL345_DATA_RATE_6_25 6.25 ADXL345_DATA_RATE_3_13 3.13 ADXL345_DATA_RATE_1_56 1.56 ADXL345_DATA_RATE_0_78 0.78 ADXL345_DATA_RATE_0_39 0.39 ADXL345_DATA_RATE_0_20 0.20 ADXL345_DATA_RATE_0_10 0.10 */ myAcc.setDataRate(ADXL345_DATA_RATE_50); Serial.print("数据速率:"); Serial.print(myAcc.getDataRateAsString()); /* 选择测量范围 ADXL345_RANGE_16G 16g ADXL345_RANGE_8G 8g ADXL345_RANGE_4G 4g ADXL345_RANGE_2G 2g */ myAcc.setRange(ADXL345_RANGE_2G); Serial.print(" / g-范围: "); Serial.println(myAcc.getRangeAsString()); Serial.println(); } void loop() { xyzFloat raw = myAcc.getRawValues(); xyzFloat g = myAcc.getGValues(); xyzFloat angle = myAcc.getAngles(); xyzFloat corrAngles = myAcc.getCorrAngles(); /* 仍然是未校正的原始值!! */ Serial.print("Raw-x = "); Serial.print(raw.x); Serial.print(" | Raw-y = "); Serial.print(raw.y); Serial.print(" | Raw-z = "); Serial.println(raw.z); /* g 值使用校正后的原始值 */ Serial.print("g-x = "); Serial.print(g.x); Serial.print(" | g-y = "); Serial.print(g.y); Serial.print(" | g-z = "); Serial.println(g.z); /* 角度使用校正后的原始数据。角度简单地计算为 角度 = arcsin(g 值) */ Serial.print("角度 x = "); Serial.print(angle.x); Serial.print(" | 角度 y = "); Serial.print(angle.y); Serial.print(" | 角度 z = "); Serial.println(angle.z); /* 修正后的角度使用修正后的原始数据和额外的角度 偏移以确保它们从 0° 开始 */ Serial.print("修正角度 x = "); Serial.print(corrAngles.x); Serial.print(" | 修正角度 y = "); Serial.print(corrAngles.y); Serial.print(" | 修正角度 z = "); Serial.println(corrAngles.z); Serial.print("模块方向:"); Serial.println(myAcc.getOrientationAsString()); Serial.println(); delay(500); }
实验串口返回情况
实验串口绘图器返回情况
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输
程序九:点阵屏加速度仪
Arduino实验接线示意图
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输
程序九:点阵屏加速度仪
Arduino实验开源代码
/* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 程序九:点阵屏加速度仪 */ #include <LedControl.h> //导入点阵屏驱动库 #include <Wire.h> #define DEVICE (0x53) //ADXL345设备地址 #define TO_READ (6) //我们要读取的字节数(每个轴两个字节) byte buff[TO_READ] ; //6字节缓冲区,用于保存从设备读取的数据 char str[512]; //字符串缓冲区在发送数据之前对其进行转换 int MATRIX_WIDTH = 8; LedControl lc = LedControl(12, 10, 11, 1); // 点阵屏接脚:DIN, CLK, CS, NRDEV unsigned long delaytime = 50; int x_key = A1; int y_key = A0; int x_pos; int y_pos; // 表示单个灯光位置的对象 // 未来的重力更新 class Grain { public: int x = 0; int y = 0; int mass = 1; }; Grain *g; void setup() { //设置一个grain对象 g = new Grain(); ClearDisplay(); Wire.begin(); // 加入 i2c 总线(主机地址可选) Serial.begin(9600); // 启动串口输出 //开启ADXL345 writeTo(DEVICE, 0x2D, 0); writeTo(DEVICE, 0x2D, 16); writeTo(DEVICE, 0x2D, 8); } void loop() { // 第一个轴加速度数据寄存器 int regAddress = 0x32; int x, y, z; readFrom(DEVICE, regAddress, TO_READ, buff); //从ADXL345读取加速度数据 // 合并每个方向的两个字节 // 最低有效位在前 x = (((int)buff[1]) << 8) | buff[0]; y = (((int)buff[3]) << 8) | buff[2]; z = (((int)buff[5]) << 8) | buff[4]; // 将值转换为可以在矩阵上表示的值 x = map(x, -300, 300, 0, 8); y = map(y, -300, 300, 0, 8); z = map(z, -300, 300, 0, 8); //我们将x y z值作为字符串发送到串口 Serial.print("X: "); Serial.print(x); Serial.print(" Y: "); Serial.print(y); Serial.print(" Z: "); Serial.print(z); Serial.print("\n"); ClearDisplay(); //将grain分配到这个位置 g->x = x; g->y = y; lc.setLed(0, g->x, g->y, true); //在每次更新之间添加一些延迟 delay(10); } void ClearDisplay() { //设置液晶显示器 int devices = lc.getDeviceCount(); for (int address = 0; address < devices; address++) { lc.shutdown(address, false); lc.setIntensity(address, 1); lc.clearDisplay(address); } } //将val写入设备上的地址寄存器 void writeTo(int device, byte address, byte val) { Wire.beginTransmission(device); //开始传输到设备 Wire.write(address); // 发送寄存器地址 Wire.write(val); // 发送要写入的值 Wire.endTransmission(); //结束传输 } //从设备上的地址寄存器开始读取num字节到buff数组 void readFrom(int device, byte address, int num, byte buff[]) { Wire.beginTransmission(device); //开始传输到设备 Wire.write(address); //发送要读取的地址 Wire.endTransmission(); //结束传输 Wire.beginTransmission(device); //开始传输到设备 Wire.requestFrom(device, num); // 从设备请求 6 个字节 int i = 0; while (Wire.available()) //设备发送的数据可能少于请求的数据(异常) { buff[i] = Wire.read(); // 接收一个字节 i++; } Wire.endTransmission(); //结束传输 delay(300); }
实验串口返回情况
实验串口绘图器返回情况
Arduino实验场景图
(6)实验的视频记录
https://v.youku.com/v_show/id_XNTgxMDI1NTc3Ng==.html?firsttime=0
程序十:ADXL345三轴传感器控制D13脚LED灯的亮灭
(1)实验接线示意图
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十八:GY-291 ADXL345 数字三轴重力加速度倾斜度模块 IIC/SPI传输
程序十:ADXL345三轴传感器控制D13脚LED灯的亮灭
Arduino实验开源代码
/* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 程序十:ADXL345三轴传感器控制D13脚LED灯的亮灭 */ #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_ADXL345_U.h>//导入ADXL345驱动库 #define LED_PIN 13 //LED接D13 Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(); void setup(void) { Serial.begin(9600);//串口初始化 Serial.println("ADXL345 传感器控制D13脚LED灯"); if (!accel.begin()) { Serial.println("未检测到 ADXL345 传感器。"); while (1); } pinMode(LED_PIN,OUTPUT);//设置LED为输出 } void loop(void) { sensors_event_t event; accel.getEvent(&event); float x = event.acceleration.x; float y = event.acceleration.y; float z = event.acceleration.z; //串口打印X\Y\Z数值 Serial.print("X: "); Serial.print(x); Serial.print(" "); Serial.print("Y: "); Serial.print(y); Serial.print(" "); Serial.print("Z: "); Serial.print(z); Serial.print(" "); Serial.println("m/s^2 "); if (x > 5 || x < -5) { //设置点亮LED的X轴阙值 digitalWrite(LED_PIN,HIGH); Serial.println("X值符合,LED灯亮"); } else if (y > 5 || y < -5) { //设置点亮LED的Y轴阙值 digitalWrite(LED_PIN,HIGH); Serial.println("Y值符合,LED灯亮"); } else{ digitalWrite(LED_PIN,LOW); } delay(500);//延时500毫秒 }
实验串口返回情况
实验串口绘图器返回情况
Arduino实验场景图
实验的视频记录
https://v.youku.com/v_show/id_XNTg2OTk2NjA2NA==.html
刚找到的三轴ADXL345模块内部功能框图与电原理图