Processor

【라즈베리파이】 wiringPi C 언어 : 자이로 센서 MPU6050

작성자 임베디드코리아 작성일26-02-17 18:20 조회162회 댓글0건
◆ MPU6050 센서 모듈은 통합 6 축 모션 추적 장치이다.
   3축 자이로 스코프, 3 축 가속도계, 디지털 모션 프로세서 및 온도 센서가 모두 단일 IC에 있다.
   보조 I2C 버스를 사용하여 3 축 자력계 또는 압력 센서와 같은 다른 센서의 입력을 받을 수 있다.
   외부 3 축 자력계를 연결하면 완전한 9 축 Motion Fusion 출력을 제공할 수 있다.
   마이크로 컨트롤러는 I2C 통신 프로토콜을 사용하여이 모듈과 통신 할 수 있습니다.
   I2C 통신을 사용하여 특정 레지스터의 주소에서 값을 읽어서 다양한 매개 변수를 찾을 수 있다.
   X, Y 및 Z 축을 따라 판독하는 자이로 스코프 및 가속도계는 2의 보수 형태로 제공된다.
   자이로 스코프 판독 값은 초당도 (dps) 단위입니다. 가속도계 판독 값은 g 단위이다.
 
◆ Raspberry Pi를 사용하여 MPU6050을 연동하려면 Raspberry Pi의 I2C 프로토콜이 켜져 있는지 확인해야 한다.
◆ MPU6050을 raspberry Pi와 연동하기 전에 Raspberry Pi I2C를 참조할 수 있는 Raspberry Pi에서 몇 가지 I2C 구성을 만들어야 한다.

--->>> 예제 : Gyro_MPU6050.c  <<<------------------------------
#include <wiringPiI2C.h>
#include <stdlib.h>
#include <stdio.h>
#include <wiringPi.h>

#define Device_Address 0x68 /*Device Address/Identifier for MPU6050*/

#define PWR_MGMT_1  0x6B
#define SMPLRT_DIV  0x19
#define CONFIG      0x1A
#define GYRO_CONFIG  0x1B
#define INT_ENABLE  0x38
#define ACCEL_XOUT_H 0x3B
#define ACCEL_YOUT_H 0x3D
#define ACCEL_ZOUT_H 0x3F
#define GYRO_XOUT_H  0x43
#define GYRO_YOUT_H  0x45
#define GYRO_ZOUT_H  0x47

int fd;

void MPU6050_Init(){
        wiringPiI2CWriteReg8 (fd, SMPLRT_DIV, 0x07); /* Write to sample rate register */
        wiringPiI2CWriteReg8 (fd, PWR_MGMT_1, 0x01); /* Write to power management register */
        wiringPiI2CWriteReg8 (fd, CONFIG, 0); /* Write to Configuration register */
        wiringPiI2CWriteReg8 (fd, GYRO_CONFIG, 24); /* Write to Gyro Configuration register */
        wiringPiI2CWriteReg8 (fd, INT_ENABLE, 0x01); /*Write to interrupt enable register */
}

short read_raw_data(int addr){
        short high_byte,low_byte,value;
        high_byte = wiringPiI2CReadReg8(fd, addr);
        low_byte = wiringPiI2CReadReg8(fd, addr+1);
        value = (high_byte << 8) | low_byte;
        return value;
}

void ms_delay(int val){
        int i,j;
        for(i=0;i<=val;i++)
            for(j=0;j<1200;j++);
}

int main(){
        float Acc_x,Acc_y,Acc_z;
        float Gyro_x,Gyro_y,Gyro_z;
        float Ax=0, Ay=0, Az=0;
        float Gx=0, Gy=0, Gz=0;
        fd = wiringPiI2CSetup(Device_Address);  /*Initializes I2C with device Address*/
        MPU6050_Init();                 /* Initializes MPU6050 */

        while(1)
        {
                /*Read raw value of Accelerometer and gyroscope from MPU6050*/
                Acc_x = read_raw_data(ACCEL_XOUT_H);
                Acc_y = read_raw_data(ACCEL_YOUT_H);
                Acc_z = read_raw_data(ACCEL_ZOUT_H);

                Gyro_x = read_raw_data(GYRO_XOUT_H);
                Gyro_y = read_raw_data(GYRO_YOUT_H);
                Gyro_z = read_raw_data(GYRO_ZOUT_H);

                /* Divide raw value by sensitivity scale factor */
                Ax = Acc_x/16384.0;
                Ay = Acc_y/16384.0;
                Az = Acc_z/16384.0;

                Gx = Gyro_x/131;
                Gy = Gyro_y/131;
                Gz = Gyro_z/131;

                printf("\n Gx=%.3f °/s\tGy=%.3f °/s\tGz=%.3f °/s\tAx=%.3f g\tAy=%.3f g\tAz=%.3f g\n",Gx,Gy,Gz,Ax,Ay,Az);
                delay(500);
        }
        return 0;
}
------------------------------------------------------------------------------------------------------------------------
$ gcc  -o  Gyro_MPU6050  Gyro_MPU6050.c  -lwiringPi
$ sudo  ./Gyro_MPU6050