驴友花雕
发表于 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);
}