极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17893|回复: 8

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

[复制链接]
发表于 2012-4-8 23:28:43 | 显示全部楼层 |阅读模式
读取加速度传感器的数值是用的弘毅老大的那个程序,我想通过y轴的数值控制180度舵机。简图如下:

即传感器水平向右倒时输出的是0到-300多的值,水平向左倒时输出0到+300多的值。
下面是程序(显示3个轴数值是为了观测)
  1. #include <Wire.h>  // 调用I2C库

  2. // 加速度传感器 ADXL345
  3. #define ACC (0x53)    //定义ADXL345地址
  4. #define A_TO_READ (6)        //读取每次占用的字节数 (每个坐标轴占两个字节)
  5. // 加速度传感器误差修正的偏移量
  6. int servopin=9;//定义舵机接口数字接口9
  7. int myangle;//定义角度变量
  8. int pulsewidth;//定义脉宽变量
  9. int a_offx = -30;
  10. int a_offy = -8;
  11. int a_offz = 0;
  12. int angle;
  13. char str[512];

  14. void initAcc() {
  15.   //调用 ADXL345
  16.   writeTo(ACC, 0x2D, 0);      
  17.   writeTo(ACC, 0x2D, 16);     //POWER_CTL 0x2D
  18.   writeTo(ACC, 0x2D, 8);
  19.   //设定在 +-2g 时的默认读数
  20. }

  21. void getAccelerometerData(int * result) {
  22.   int regAddress = 0x32;    //加速度传感器ADXL345第一轴的数据的设定
  23.   byte buff[A_TO_READ];

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

  25.   //每个轴的读数有10位分辨率,即2个字节.  
  26.   //我们要转换两个bytes为一个int变量
  27.   result[0] = (((int)buff[1]) << 8) | buff[0] + a_offx;   
  28.   result[1] = (((int)buff[3]) << 8) | buff[2] + a_offy;
  29.   result[2] = (((int)buff[5]) << 8) | buff[4] + a_offz;
  30. }
  31. void servopulse(int servopin,int myangle)//定义一个脉冲函数
  32. {
  33.   pulsewidth=(myangle*11)+500;//将角度转化为500-2480的脉宽值
  34.   digitalWrite(servopin,HIGH);//将舵机接口电平至高
  35.   delayMicroseconds(pulsewidth);//延时脉宽值的微秒数
  36.   digitalWrite(servopin,LOW);//将舵机接口电平至低
  37.   delay(20-pulsewidth/1000);
  38. }
  39. void setup()
  40. {
  41.   Serial.begin(9600);
  42.   Wire.begin();
  43.   initAcc();
  44. }


  45. void loop()
  46. {
  47.   int acc[3];
  48.   getAccelerometerData(acc);
  49.   sprintf(str, "%d,%d,%d", acc[0], acc[1], acc[2]);  
  50.   Serial.print(str);
  51.   Serial.print(10, BYTE);
  52.   if(acc[1]<0&&acc[1]>-180)
  53.   {
  54.     angle=acc[1]+180;
  55.   }
  56.   if(acc[1]>0&&acc[1]<180)
  57.   {
  58.     angle=acc[1]+180;
  59.   }
  60.   angle=angle/2;  
  61.   for(int i=0;i<=50;i++)//给予舵机足够的时间让它转到指定角度
  62.   {
  63.     servopulse(servopin,angle);//引用脉冲函数
  64.   }
  65. }



  66. //---------------- 功能
  67. //将val写入到加速度传感器的地址寄存器中
  68. void writeTo(int DEVICE, byte address, byte val) {
  69.   Wire.beginTransmission(DEVICE); //传送到加速度传感器
  70.   Wire.send(address);        // 发送寄存器地址
  71.   Wire.send(val);        // 发送要写入的值
  72.   Wire.endTransmission(); //结束传输
  73. }


  74. //加速度传感器在地址寄存器的缓冲区阵列中读取读数
  75. void readFrom(int DEVICE, byte address, int num, byte buff[]) {
  76.   Wire.beginTransmission(DEVICE); //开始传送至加速度传感器
  77.   Wire.send(address);        //发送读取的地址
  78.   Wire.endTransmission(); //结束传输

  79.   Wire.beginTransmission(DEVICE); //开始传送到ACC
  80.   Wire.requestFrom(DEVICE, num);    // 要求从加速度传感器中发送6个字节的数据

  81.   int i = 0;
  82.   while(Wire.available())    //当加速度传感器返回的数据小于要求值时(异常情况)
  83.   {
  84.     buff[i] = Wire.receive(); // 接收数据
  85.     i++;
  86.   }
  87.   Wire.endTransmission(); //结束传输
  88. }
复制代码

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2012-4-9 17:06:54 | 显示全部楼层
一口气吃不成个胖子。
你先调试舵机,把舵机调试好了再做联合调试。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-4-9 22:02:17 | 显示全部楼层
风的孩子 发表于 2012-4-9 17:06
一口气吃不成个胖子。
你先调试舵机,把舵机调试好了再做联合调试。

。。。。。舵机单独控制是没问题的啊
回复 支持 反对

使用道具 举报

发表于 2012-6-13 12:18:13 | 显示全部楼层
&#160;&#160;delay(20-pulsewidth/1000);
这个问题吧!{:soso_e116:}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-14 17:02:47 | 显示全部楼层
cacil 发表于 2012-6-13 12:18
&#160;&#160;delay(20-pulsewidth/1000);
这个问题吧!

饿,这段程序后来能用了,我都忘了怎么改得了。。。
回复 支持 反对

使用道具 举报

发表于 2013-4-13 18:23:02 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2013-8-2 14:02:48 | 显示全部楼层
请问楼主,void servopulse(int servopin,int myangle)//定义一个脉冲函数中的digitalWrite(servopin,HIGH);HIGH怎么得到的
回复 支持 反对

使用道具 举报

发表于 2013-9-29 14:50:34 | 显示全部楼层
楼主,后来还有没有进展?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-5 18:46 , Processed in 0.039551 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表