이걸 한번... 아두이노 용으로 변환해서 해봐야지..
일단 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축 가속도 센서
값이 바뀌긴 한데 수치만으로는 헷갈리네..
|
|
먼가 값은 나온다.
A4 -> SDA
A5 -> SCL
5V -> VCC
GND -> GND
이렇게 4줄 연결 하고 끝
이제 이걸.. 수학 공식을 이용해서 각도로 계산을 어떻게 한다냐...
'embeded > arduino(genuino)' 카테고리의 다른 글
가속도계 각도 계산.. (2) | 2016.03.31 |
---|---|
아두이노 nano + ADXL345 (0) | 2016.03.31 |
아두이노 나노 pinout / atmega328p (0) | 2016.03.30 |
아두이노 avr 헤더사용하기 / PUD (0) | 2016.03.30 |
아두이노 / avr bootloader (0) | 2016.03.30 |