embeded/arduino(genuino)2016.03.30 19:38

이걸 한번... 아두이노 용으로 변환해서 해봐야지..

일단 0x53이고

파워업 리셋시 센서 작동하지 않으므로


Rate는 0x0A(1010b)로 설정되어 100Hz 표준 i2c 속도의 출력 속도에 맞춰 지는건가?


0x2d 레지스터에 0x18을 넣어

AUTO_SLEEP 과 Measure를 설정해 값을 측정하도록 한다.

AUTO_SLEEP은 좀더 봐야 할 듯


0x31에서는 측정할 가속도의 범위를 설정하는데

기본값은 0x00으로 Range +-2g를 측정하게 된다.

+

2016.03.31

FULL_RES=1의 경우 무조건 4mg=1 로 계산되고 Range에 영향을 받아 출력되는 범위가 달라진다.

예를 들어 +2g로 Range 설정시 256으로 출력되며 1g(4mg*256=1024mg=1g) 흔들어서나오는 값이

+-512를 넘지 못한다(512*4=2048=2g)


FULL_RES=0의 경우 Range를 0x03으로 하면 8g이고 32값이 나오게 된다(1g에 대한 값)

즉, 최대 범위에 대해서 0~1023으로 scaling된 값이 나오게 된다.

+


그리고는 0x32~0x37까지 6바이트에 대해서 x,y,z 축에 대한 값을 받아 온다.

DATAX0이 LSB쪽

DATAX1이 MSB쪽이다.


#include <stdio.h>
#include <stdlib.h>
#include <linux/i2c-dev.h>
#include <fcntl.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <iostream>

int main(int argc, char **argv)
{
   printf("**** ADXL435 example program ****\n");
   
   int fd;                                          // File descrition
   char *fileName = "/dev/i2c-1";                        // Name of the port we will be using
   int  address = 0x53;                              // Address of the SRF02 shifted right one bit
   char buf[6];                              // Buffer for data being read/ written on the i2c bus
   short x,y,z;

   if ((fd = open(fileName, O_RDWR)) < 0) {               // Open port for reading and writing
      printf("Failed to open i2c port\n");
      exit(1);
   }
   
   if (ioctl(fd, I2C_SLAVE, address) < 0) {               // Set the port options and set the address of the device we wish to speak to
      printf("Unable to get bus access to talk to slave\n");
      exit(1);
   }

   buf[0] = 0x2d;                                       // Commands for performing a ranging
   buf[1] = 0x18;
   
   if ((write(fd, buf, 2)) != 2) {                        // Write commands to the i2c port
      printf("Error writing to i2c slave\n");
      exit(1);
   }

   buf[0] = 0x31;                                       // Commands for performing a ranging
   buf[1] = 0x09;
   
   if ((write(fd, buf, 2)) != 2) {                        // Write commands to the i2c port
      printf("Error writing to i2c slave\n");
      exit(1);
   }

                                       // This sleep waits for the ping to come back
while(true){   

   buf[0] = 0x32;                                       // This is the register we wish to read from
   if ((write(fd, buf, 1)) != 1) {                        // Send the register to read from
      printf("Error writing to i2c slave\n");
      exit(1);
   }
   

usleep(1000);
  memset(&buf,0,sizeof(buf));

   if (read(fd, buf, 6) != 6) {                        // Read back data into buf[]
      printf("Unable to read from slave\n");
      exit(1);
   }
   else { x=y=z=0;
//               memset(&buf,0,sizeof(buf));

      x = ((short)buf[1]<<8) | (short) buf[0]; 
       y = ((short)buf[3]<<8) | (short) buf[2];
       z = ((short)buf[5]<<8) | (short) buf[4];
       std::cout<<"x:"<<x<<"\ty:"<<y<<"\tz:"<<z<<std::endl;
   }
}
   return 0;

} 


2015/08/24 - [개소리 왈왈/라즈베리 파이(rpi)] - 라즈베리 파이 i2c ADXL345 3축 가속도 센서


값이 바뀌긴 한데 수치만으로는 헷갈리네..


#include <avr/io.h> #include <Wire.h> #define I2C_ID  0x53 // ADXL-345 void setup() {  // put your setup code here, to run once:  Wire.begin();  Serial.begin(9600); } void loop() {  // put your main code here, to run repeatedly:  char str[30];  char data[6];  unsigned char idx = 0;  short acc_x;  short acc_y;  short acc_z;  // power setting  Wire.beginTransmission(I2C_ID);    Wire.write(byte(0x2d));    Wire.write(byte(0x18));  Wire.endTransmission();  // range setting  Wire.beginTransmission(I2C_ID);    Wire.write(byte(0x31));    Wire.write(byte(0x09));  Wire.endTransmission();  // data request  Wire.beginTransmission(I2C_ID);    Wire.write(byte(0x32));  Wire.endTransmission();  Wire.requestFrom(0x53, 6);  idx = 0;  while (Wire.available())    data[idx++] = Wire.read();  acc_x = (data[1] << 8) | data[0];  acc_y = (data[3] << 8) | data[2];  acc_z = (data[5] << 8) | data[4];  sprintf(str,"x:%6d y:%6d z:%6d",acc_x, acc_y, acc_z);  Serial.println(str);  delay(100); }


#include <avr/io.h> #include <Wire.h> #define I2C_ID  0x53 // ADXL-345 void setup() {  // put your setup code here, to run once:  Wire.begin();  Serial.begin(115200); } void loop() {  // put your main code here, to run repeatedly:  char str[30];  char data[6];  unsigned char idx = 0;  short acc_x;  short acc_y;  short acc_z;  sprintf(str,"%c%c",0x2d,0x18);  // power setting  Wire.beginTransmission(I2C_ID);    Wire.write(str);  Wire.endTransmission();  sprintf(str,"%c%c",0x31,0x09);  // range setting  Wire.beginTransmission(I2C_ID);    Wire.write(str);  Wire.endTransmission();  sprintf(str,"%c",0x32);         // data request  Wire.beginTransmission(I2C_ID);    Wire.write(str);  Wire.endTransmission();  Wire.requestFrom(0x53, 6);  idx = 0;  while (Wire.available())    data[idx++] = Wire.read();  acc_x = (data[1] << 8) | data[0];  acc_y = (data[3] << 8) | data[2];  acc_z = (data[5] << 8) | data[4];  sprintf(str,"x:%6d y:%6d z:%6d",acc_x, acc_y, acc_z);  Serial.println(str);  delay(100); }


먼가 값은 나온다.


A4 -> SDA

A5 -> SCL

5V -> VCC

GND -> GND

이렇게 4줄 연결 하고 끝

SAMSUNG | SHV-E120K | Aperture priority | Average | 1/15sec | F/2.6 | 0.00 EV | 4.0mm | ISO-100 | Off Compulsory | 2016:03:30 20:16:23


이제 이걸.. 수학 공식을 이용해서 각도로 계산을 어떻게 한다냐...

신고
Posted by 구차니

댓글을 달아 주세요