搜索
bottom↓
回复: 9

求用于检测汽车加速度和转向的方案

[复制链接]

出0入0汤圆

发表于 2012-9-26 23:48:39 | 显示全部楼层 |阅读模式
RT,本人目前的项目中的一个模块要求可以检测到汽车的加速度和转向,目前采用的是加速度传感器MMA7660和磁传感器MAG3110,MMA7660用于检测加速度貌似比较靠谱,但是MAG3110用于检测转向觉得没有底,不知道总体来说是否靠谱?so,请教大家伙

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-9-27 08:06:25 | 显示全部楼层
单用电子罗盘看转向没有动态效果(而且在汽车上,需要做很好的硬铁和软铁纠偏),结合一个陀螺仪积分算角度,然后利用加速度传感器和电子罗盘对陀螺仪积分进行校准,一般要这么干吧……

出0入0汤圆

发表于 2012-9-27 08:11:51 | 显示全部楼层
可以用MPU6050就可以了。

出0入0汤圆

 楼主| 发表于 2012-9-27 08:55:12 | 显示全部楼层
laber_1912 发表于 2012-9-27 08:06
单用电子罗盘看转向没有动态效果(而且在汽车上,需要做很好的硬铁和软铁纠偏),结合一个陀螺仪积分算角度 ...

不同的硬铁和软铁纠偏,不同的汽车可能还不一样吧?如果这样,就蛋疼的紧了

出0入0汤圆

 楼主| 发表于 2012-9-27 08:55:40 | 显示全部楼层
johnsonz999 发表于 2012-9-27 08:11
可以用MPU6050就可以了。

有没有便宜一点的类似于MPU6050的片子,这个貌似很贵的说

出0入8汤圆

发表于 2012-9-27 09:04:26 | 显示全部楼层
参见光电鼠标原理,即能检测加速度又能检测转弯

出0入0汤圆

发表于 2012-10-16 15:34:55 | 显示全部楼层
有没有资料。。

出0入0汤圆

 楼主| 发表于 2013-1-7 16:52:02 | 显示全部楼层
大家好,中间停顿一会,我又回来了,目前有个问题不能确定,MMA7660最小可以测量多大的加速度值?网上众说纷纭,没有统一口径啊,有的说是1.5g以上,那就别玩了,我目前的理解是1.5g应该是最大量程,按照XOUT、YOUT、ZOUT的最大表示为32,也就是最小分辨率应该是1.5g/32=0.047g=0.46m/S2?
不知道我理解是否有误?

出0入0汤圆

发表于 2013-1-7 17:10:33 | 显示全部楼层
// inspired by Martijn The's sketch, adding all functionality of the 2610 chip, skipping
// the whole library-thing
#define SCLK 2  // Serial clock pin on the Arduino
#define SDIO 3  // Serial data (I/O) pin on the Arduino
#define sensorConfig 0x00
#define sensorStatus 0x01
#define Delta_Y        0x02
#define Delta_X        0x03
#define SQUAL   0x04
#define Maximum_pixel 0x05
#define Minimum_pixel 0x06
#define Pixel_Sum 0x07
#define picture 0x08
#define Shutter_MSB 0x09
#define Shutter_LSB 0x0A

unsigned char pixels[325];

void setup(){
  Serial.begin(38400);
  pinMode (SCLK, OUTPUT);
  pinMode (SDIO, INPUT);
  reSync();
  forceAwake(1); // LED on
}

void loop(){
    getPicture();  // take snapshot
    sendPicture(); // send the picture
    delay(100);
}
void reSync(){
  // ReSync (startup) mouse
  digitalWrite(SCLK, HIGH);                     
  delayMicroseconds(5);
  digitalWrite(SCLK, LOW);
  delayMicroseconds(1);
  digitalWrite(SCLK, HIGH);       
  // wait for OptiMouse serial transaction timer to time out:
  delay(1000);
}
void getPicture(void){
  writeRegister(picture,0); // default write: initiate picture transfer
  for (int x=0;x<18;x++){   // 18 rows of pixels
    for (int y=17;y>=0;y--){// 18 collumns (reverse order)
      unsigned char pix = readRegister(picture); // SPI read operation
      int timeout = 12;                          // Try 12 times max to
      while (!(pix & 0x40) && timeout>0){        // check for valid data
        pix = readRegister(picture);             // read the picture data
        timeout--;
      }
      pixels[x*18+y]=pix&0x3F; // store the data (might still be invalid after 12 tries) // was pix&0x2F
    }
  }
}
void sendPicture(void){
  for(int z=0;z<324;z++)  {
    Serial.print((unsigned char)(pixels[z]&0x3F)); // send block of 324 bytes //was pixels[z]&0x2F
  }
}
void forceAwake(char value){
  if (value>0) writeRegister(sensorConfig,0x01);
  else writeRegister(sensorConfig,0x00);
}
signed char getDx(void){
  return (signed char) readRegister(Delta_X);
}
signed char getDy(void){
  return (signed char) readRegister(Delta_Y);
}
signed int getShutter(void){
  signed int shutter = readRegister(Shutter_MSB) <<8;
  shutter += readRegister(Shutter_LSB); // + LSB
  return shutter;
}
uint8_t readRegister(uint8_t address){ // Bitbang SPI read operation
  int i = 7;
  uint8_t r = 0;
  pinMode (SDIO, OUTPUT);   // Write the address of the register we want to read:
  for (; i>=0; i--)  {
    digitalWrite (SCLK, LOW);
    digitalWrite (SDIO, address & (1 << i));
    digitalWrite (SCLK, HIGH);
  }
  pinMode (SDIO, INPUT);    // Switch data line from OUTPUT to INPUT
  delayMicroseconds(100);   // Wait according to datasheet
  for (i=7; i>=0; i--)        {     // Fetch the data!                          
    digitalWrite (SCLK, LOW);
    digitalWrite (SCLK, HIGH);
    r |= (digitalRead (SDIO) << i);
  }
  delayMicroseconds(100);
  return r;
}
void writeRegister(uint8_t address, uint8_t data){
   int i = 7;       
   // Set MSB high, to indicate write operation:
  address |= 0x80;       
  // Write the address:
  pinMode (SDIO, OUTPUT);
  for (; i>=0; i--){
    digitalWrite (SCLK, LOW);
    digitalWrite (SDIO, address & (1 << i));
    digitalWrite (SCLK, HIGH);
  }       
  // Write the data:
  for (i=7; i>=0; i--){
    digitalWrite (SCLK, LOW);
    digitalWrite (SDIO, data & (1 << i));
    digitalWrite (SCLK, HIGH);
  }
}

出0入0汤圆

发表于 2013-1-7 17:11:27 | 显示全部楼层
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 23:33

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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