驴友花雕 发表于 2022-5-14 06:39:54

(2)实验串口返回情况

驴友花雕 发表于 2022-5-14 06:41:37

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

驴友花雕 发表于 2022-5-14 06:43:05

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

驴友花雕 发表于 2022-5-14 06:44:53

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 ;   //6字节缓冲区,用于保存从设备读取的数据

char str;   //字符串缓冲区,用于在将数据发送到串行端口之前对其进行转换
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) << 8) | buff;
y = (((int)buff) << 8) | buff;
z = (((int)buff) << 8) | buff;

//我们将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 = 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;
}

驴友花雕 发表于 2022-5-14 06:46:19

(2)实验串口返回情况

驴友花雕 发表于 2022-5-14 06:47:55

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

驴友花雕 发表于 2022-5-14 06:49:28

(4)实验场景图

驴友花雕 发表于 2022-5-14 06:50:57

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

驴友花雕 发表于 2022-5-14 06:54:01

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

驴友花雕 发表于 2022-5-14 07:33:38


驴友花雕 发表于 2022-5-14 07:36:35

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

驴友花雕 发表于 2022-5-14 07:40:15


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

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序四:显示传感器的三轴加速度及其状态
Arduino------ADXL345
5V------------VCC
GND-----------GND
A4-----------SDA IIC 数据线
A5-----------SCL IIC 时钟线
*/

#include <Wire.h>
// ADXL345的寄存器
#define ADXL345_ADDRESS (0xA6 >> 1)// 设备地址为 8 位,但转移到
                                     // 右移 1 位使其变为 7 位,因为
                                     // 线库只接受 7 位地址
#define ADXL345_REGISTER_XLSB (0x32)

int accelerometer_data;
// 无效,因为这只告诉 cip 将数据发送到其输出寄存器
// 将数据写入从机的缓冲区
void i2c_write(int address, byte reg, byte data) {

// 发送输出寄存器地址
Wire.beginTransmission(address);
// 连接到设备
Wire.write(reg);
// 发送数据
Wire.write(data); //低电平字节
Wire.endTransmission();
}

// 无效,因为使用了指针
//微控制器从传感器的输入寄存器读取数据
void i2c_read(int address, byte reg, int count, byte* data) {
// 用于读取接收到的数据个数
int i = 0;
// 发送输入寄存器地址
Wire.beginTransmission(address);
// 连接到设备
Wire.write(reg);
Wire.endTransmission();

// 连接到设备
Wire.beginTransmission(address);
// 从slave请求数据
// Count 代表要请求的字节数
Wire.requestFrom(address, count);
while(Wire.available()) // 从机发送的可能少于请求
{
    char c = Wire.read(); // 接收一个字节作为字符
    data = c;
    i++;
}
Wire.endTransmission();
}

void init_adxl345() {
byte data = 0;
i2c_write(ADXL345_ADDRESS, 0x31, 0x0B);   // 13 位模式 +_ 16g
i2c_write(ADXL345_ADDRESS, 0x2D, 0x08);   // 电源寄存器
i2c_write(ADXL345_ADDRESS, 0x1E, 0x00);   // x
i2c_write(ADXL345_ADDRESS, 0x1F, 0x00);   // Y
i2c_write(ADXL345_ADDRESS, 0x20, 0x05);   // Z
// 检查它是否有效!
i2c_read(ADXL345_ADDRESS, 0X00, 1, &data);
if(data==0xE5)
    Serial.println("ADXL345启动成功!");
else
    Serial.println("它工作失败");
}

void read_adxl345() {
byte bytes;
memset(bytes,0,6);
// 从 ADXL345 读取 6 个字节
i2c_read(ADXL345_ADDRESS, ADXL345_REGISTER_XLSB, 6, bytes);
// 解压数据
for (int i=0;i<3;++i) {
    accelerometer_data = (int)bytes + (((int)bytes) << 8);
}
}
// 初始化并启动一切
void setup() {
Wire.begin();
Serial.begin(9600);
for(int i=0; i<3; ++i) {
    accelerometer_data= 0;
}
init_adxl345();
}

void loop() {
read_adxl345();
Serial.print("加速器: ");
//13位模式下3.9mg/LSB比例因子
Serial.print(float(accelerometer_data)*3.9/88);
Serial.print("\t");
Serial.print(float(accelerometer_data)*3.9/88);
Serial.print("\t");
Serial.print(float(accelerometer_data)*3.9/88-10);
Serial.print("\n");
delay(500);
}

驴友花雕 发表于 2022-5-14 07:42:22

(2)实验串口返回情况

驴友花雕 发表于 2022-5-14 07:44:48

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

驴友花雕 发表于 2022-5-14 07:50:10

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

驴友花雕 发表于 2022-5-14 07:52:58

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

驴友花雕 发表于 2022-5-14 08:19:23

5、程序五:使用ADXL345模块控制9克舵机(1)实验开源仿真编程(Linkboy V4.63)

驴友花雕 发表于 2022-5-14 08:47:09

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

驴友花雕 发表于 2022-5-14 08:49:19

(3)实验场景图

驴友花雕 发表于 2022-5-14 08:52:21

(4)实验的视频记录
https://v.youku.com/v_show/id_XNTg2ODk1ODk0MA==.html
https://v.youku.com/v_show/id_XNTg2ODk1ODk0MA==.html

驴友花雕 发表于 2022-5-14 08:54:44

程序六:使用Adafruit_ADXL345_U库读取三轴X\Y\Z (1)Arduino参考开源代码
/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序六:使用Adafruit_ADXL345_U库读取三轴X\Y\Z
Arduino------ADXL345
5V------------VCC
GND-----------GND
A4-----------SDA IIC 数据线
A5-----------SCL IIC 时钟线
*/

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>

//同时给这个传感器分配一个唯一的ID
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);

void displaySensorDetails(void){
sensor_t sensor;

accel.getSensor(&sensor);
Serial.println("------------------------------------");
Serial.print("传感器:       "); Serial.println(sensor.name);
Serial.print("驱动版本:   "); Serial.println(sensor.version);
Serial.print("唯一标识:    "); Serial.println(sensor.sensor_id);
Serial.print("最大值:    "); Serial.print(sensor.max_value); Serial.println(" m/s^2");
Serial.print("最小值:    "); Serial.print(sensor.min_value); Serial.println(" m/s^2");
Serial.print("分辨率:   "); Serial.print(sensor.resolution); Serial.println(" m/s^2");
Serial.println("------------------------------------");
Serial.println("");
delay(500);
}

void displayDataRate(void){
Serial.print("数据速率:");

switch(accel.getDataRate())
{
    case ADXL345_DATARATE_3200_HZ:
      Serial.print("3200 ");
      break;
    case ADXL345_DATARATE_1600_HZ:
      Serial.print("1600 ");
      break;
    case ADXL345_DATARATE_800_HZ:
      Serial.print("800 ");
      break;
    case ADXL345_DATARATE_400_HZ:
      Serial.print("400 ");
      break;
    case ADXL345_DATARATE_200_HZ:
      Serial.print("200 ");
      break;
    case ADXL345_DATARATE_100_HZ:
      Serial.print("100 ");
      break;
    case ADXL345_DATARATE_50_HZ:
      Serial.print("50 ");
      break;
    case ADXL345_DATARATE_25_HZ:
      Serial.print("25 ");
      break;
    case ADXL345_DATARATE_12_5_HZ:
      Serial.print("12.5 ");
      break;
    case ADXL345_DATARATE_6_25HZ:
      Serial.print("6.25 ");
      break;
    case ADXL345_DATARATE_3_13_HZ:
      Serial.print("3.13 ");
      break;
    case ADXL345_DATARATE_1_56_HZ:
      Serial.print("1.56 ");
      break;
    case ADXL345_DATARATE_0_78_HZ:
      Serial.print("0.78 ");
      break;
    case ADXL345_DATARATE_0_39_HZ:
      Serial.print("0.39 ");
      break;
    case ADXL345_DATARATE_0_20_HZ:
      Serial.print("0.20 ");
      break;

    case ADXL345_DATARATE_0_10_HZ:
      Serial.print("0.10 ");
      break;

    default:
      Serial.print("???? ");
      break;
}
Serial.println(" Hz");
}

void displayRange(void){
Serial.print("范围:+/- ");

switch(accel.getRange())
{
    case ADXL345_RANGE_16_G:
      Serial.print("16 ");
      break;
    case ADXL345_RANGE_8_G:
      Serial.print("8 ");
      break;
    case ADXL345_RANGE_4_G:
      Serial.print("4 ");
      break;
    case ADXL345_RANGE_2_G:
      Serial.print("2 ");
      break;
    default:
      Serial.print("?? ");
      break;
}
Serial.println(" g");
}

void setup(void){
#ifndef ESP8266
while (!Serial);
#endif

Serial.begin(9600);
Serial.println("加速度计测试"); Serial.println("");

//初始化传感器
if(!accel.begin())
{
    //检测 ADXL345 时出现问题...检查您的连接
    Serial.println("糟糕,没有检测到 ADXL345……检查你的接线!");
    while(1);
}

//将范围设置为适合您项目的范围
accel.setRange(ADXL345_RANGE_16_G);

// accel.setRange(ADXL345_RANGE_8_G);
// accel.setRange(ADXL345_RANGE_4_G);
// accel.setRange(ADXL345_RANGE_2_G);

//显示这个传感器的一些基本信息
displaySensorDetails();

// 显示附加设置(sensor_t 范围之外)
displayDataRate();
displayRange();
Serial.println("");
}

void loop(void){
//获取新的传感器事件
sensors_event_t event;

accel.getEvent(&event);

//显示结果(加速度以 m/s^2 为单位)
Serial.print("X: "); Serial.print(event.acceleration.x); Serial.print("");
Serial.print("Y: "); Serial.print(event.acceleration.y); Serial.print("");
Serial.print("Z: "); Serial.print(event.acceleration.z); Serial.print("");Serial.println("m/s^2 ");

delay(500);
}

页: 1 [2] 3 4 5
查看完整版本: 【Arduino】168种传感器模块系列实验(48)---三轴ADXL345模块