1、程序二:在串口显示ADXL345的动态波形之二 (1)Arduino参考开源代码
- /*
- 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
- 程序二:在串口显示ADXL345的动态波形之二
- Arduino------ADXL345
- 5V------------VCC
- GND-----------GND
- A4-----------SDA IIC 数据线
- A5-----------SCL IIC 时钟线
- */
-
- #include <Wire.h>
-
- #define DEVICE (0x53) //ADXL345设备地址
- #define TO_READ (6) //我们每次要读取的字节数(每个轴两个字节)
- byte buff[TO_READ] ; //6字节缓冲区,用于保存从设备读取的数据
-
- char str[512]; //字符串缓冲区,用于在将数据发送到串行端口之前对其进行转换
- int regAddress = 0x32; //ADXL345上的第一个轴加速度数据寄存器
- int x, y, z; //三轴加速度数据
-
- double roll = 0.00, pitch = 0.00; //Roll & Pitch 是绕 X 轴和 y 轴旋转的角度
-
- void setup() {
- Wire.begin(); // 加入 i2c 总线(主机地址可选)
- Serial.begin(9600); // 启动串口输出
-
- //开启ADXL345
- writeTo(DEVICE, 0x2D, 0);
- writeTo(DEVICE, 0x2D, 16);
- writeTo(DEVICE, 0x2D, 8);
- }
-
- void loop() {
- readFrom(DEVICE, regAddress, TO_READ, buff); //从ADXL345读取加速度数据
-
- //每个轴读数的分辨率为 10 位,即 2 个字节。最低有效字节优先!!
- //因此我们将两个字节转换为一个整数
- x = (((int)buff[1]) << 8) | buff[0];
- y = (((int)buff[3]) << 8) | buff[2];
- z = (((int)buff[5]) << 8) | buff[4];
-
- //我们将x y z值作为字符串发送到串口
- Serial.print("x,y,z的加速度信息为:");
- sprintf(str, "%d %d %d", x, y, z);
- Serial.print(str);
- Serial.write(10);
-
- //计算Roll & Pitch
- RP_calculate();
- Serial.print("滚动:");
- Serial.println( roll );
- Serial.print("间距:");
- Serial.println( pitch );
- Serial.println("");
- //看来需要延迟才能不阻塞端口
- delay(500);
- }
-
- //将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(); //结束传输
- }
-
- //计算Roll&Pitch
- void RP_calculate() {
- double x_Buff = float(x);
- double y_Buff = float(y);
- double z_Buff = float(z);
-
- roll = atan2(y_Buff , z_Buff) * 57.3;
- pitch = atan2((- x_Buff) , sqrt(y_Buff * y_Buff + z_Buff * z_Buff)) * 57.3;
- }
复制代码
|