moon 发表于 2012-4-8 23:28:43

问大家一下读取加速度传感器控制舵机的问题

读取加速度传感器的数值是用的弘毅老大的那个程序,我想通过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;

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;

readFrom(ACC, regAddress, A_TO_READ, buff); //读取加速度传感器ADXL345的数据

//每个轴的读数有10位分辨率,即2个字节.
//我们要转换两个bytes为一个int变量
result = (((int)buff) << 8) | buff + a_offx;   
result = (((int)buff) << 8) | buff + a_offy;
result = (((int)buff) << 8) | buff + 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;
getAccelerometerData(acc);
sprintf(str, "%d,%d,%d", acc, acc, acc);
Serial.print(str);
Serial.print(10, BYTE);
if(acc<0&&acc>-180)
{
    angle=acc+180;
}
if(acc>0&&acc<180)
{
    angle=acc+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 = Wire.receive(); // 接收数据
    i++;
}
Wire.endTransmission(); //结束传输
}

程序运行后无论怎样晃动舵机都不动,我用手转舵机是可以转动的,舵机部分的程序好像都无效。。。这是为什么呢?{:soso__6235880048239246314_3:}

风的孩子 发表于 2012-4-9 17:06:54

一口气吃不成个胖子。
你先调试舵机,把舵机调试好了再做联合调试。

moon 发表于 2012-4-9 22:02:17

风的孩子 发表于 2012-4-9 17:06 static/image/common/back.gif
一口气吃不成个胖子。
你先调试舵机,把舵机调试好了再做联合调试。

。。。。。舵机单独控制是没问题的啊

cacil 发表于 2012-6-13 12:18:13

  delay(20-pulsewidth/1000);
这个问题吧!{:soso_e116:}

moon 发表于 2012-6-14 17:02:47

cacil 发表于 2012-6-13 12:18 static/image/common/back.gif
  delay(20-pulsewidth/1000);
这个问题吧!

饿,这段程序后来能用了,我都忘了怎么改得了。。。

北斗 发表于 2013-4-13 18:23:02

http://soso3.gtimg.cn/sosopic_f/0/6235880048239246314/0

mowen110 发表于 2013-8-2 14:02:48

请问楼主,void servopulse(int servopin,int myangle)//定义一个脉冲函数中的digitalWrite(servopin,HIGH);HIGH怎么得到的

牛仔 发表于 2013-9-29 14:50:34

楼主,后来还有没有进展?
页: [1]
查看完整版本: 问大家一下读取加速度传感器控制舵机的问题