读取加速度传感器的数值是用的弘毅老大的那个程序,我想通过y轴的数值控制180度舵机。简图如下:
即传感器水平向右倒时输出的是0到-300多的值,水平向左倒时输出0到+300多的值。
下面是程序(显示3个轴数值是为了观测)
- #include <Wire.h> // 调用I2C库
- // 加速度传感器 ADXL345
- #define ACC (0x53) //定义ADXL345地址
- #define A_TO_READ (6) //读取每次占用的字节数 (每个坐标轴占两个字节)
- // 加速度传感器误差修正的偏移量
- int servopin=9;//定义舵机接口数字接口9
- int myangle;//定义角度变量
- int pulsewidth;//定义脉宽变量
- int a_offx = -30;
- int a_offy = -8;
- int a_offz = 0;
- int angle;
- char str[512];
- void initAcc() {
- //调用 ADXL345
- writeTo(ACC, 0x2D, 0);
- writeTo(ACC, 0x2D, 16); //POWER_CTL 0x2D
- writeTo(ACC, 0x2D, 8);
- //设定在 +-2g 时的默认读数
- }
- void getAccelerometerData(int * result) {
- int regAddress = 0x32; //加速度传感器ADXL345第一轴的数据的设定
- byte buff[A_TO_READ];
- readFrom(ACC, regAddress, A_TO_READ, buff); //读取加速度传感器ADXL345的数据
- //每个轴的读数有10位分辨率,即2个字节.
- //我们要转换两个bytes为一个int变量
- result[0] = (((int)buff[1]) << 8) | buff[0] + a_offx;
- result[1] = (((int)buff[3]) << 8) | buff[2] + a_offy;
- result[2] = (((int)buff[5]) << 8) | buff[4] + a_offz;
- }
- void servopulse(int servopin,int myangle)//定义一个脉冲函数
- {
- pulsewidth=(myangle*11)+500;//将角度转化为500-2480的脉宽值
- digitalWrite(servopin,HIGH);//将舵机接口电平至高
- delayMicroseconds(pulsewidth);//延时脉宽值的微秒数
- digitalWrite(servopin,LOW);//将舵机接口电平至低
- delay(20-pulsewidth/1000);
- }
- void setup()
- {
- Serial.begin(9600);
- Wire.begin();
- initAcc();
- }
- void loop()
- {
- int acc[3];
- getAccelerometerData(acc);
- sprintf(str, "%d,%d,%d", acc[0], acc[1], acc[2]);
- Serial.print(str);
- Serial.print(10, BYTE);
- if(acc[1]<0&&acc[1]>-180)
- {
- angle=acc[1]+180;
- }
- if(acc[1]>0&&acc[1]<180)
- {
- angle=acc[1]+180;
- }
- angle=angle/2;
- for(int i=0;i<=50;i++)//给予舵机足够的时间让它转到指定角度
- {
- servopulse(servopin,angle);//引用脉冲函数
- }
- }
- //---------------- 功能
- //将val写入到加速度传感器的地址寄存器中
- void writeTo(int DEVICE, byte address, byte val) {
- Wire.beginTransmission(DEVICE); //传送到加速度传感器
- Wire.send(address); // 发送寄存器地址
- Wire.send(val); // 发送要写入的值
- Wire.endTransmission(); //结束传输
- }
- //加速度传感器在地址寄存器的缓冲区阵列中读取读数
- void readFrom(int DEVICE, byte address, int num, byte buff[]) {
- Wire.beginTransmission(DEVICE); //开始传送至加速度传感器
- Wire.send(address); //发送读取的地址
- Wire.endTransmission(); //结束传输
- Wire.beginTransmission(DEVICE); //开始传送到ACC
- Wire.requestFrom(DEVICE, num); // 要求从加速度传感器中发送6个字节的数据
- int i = 0;
- while(Wire.available()) //当加速度传感器返回的数据小于要求值时(异常情况)
- {
- buff[i] = Wire.receive(); // 接收数据
- i++;
- }
- Wire.endTransmission(); //结束传输
- }
复制代码
程序运行后无论怎样晃动舵机都不动,我用手转舵机是可以转动的,舵机部分的程序好像都无效。。。这是为什么呢?{:soso__6235880048239246314_3:} |