본문으로 바로가기

  아두이노(Arduino) 중급 3축 자이로센서(L3G4200D)  


애드라이프의 아두이노 모든 포스팅 리스트를 보고 싶으신 분은 공지 읽어주세요.


참고로 중급편 부터는 응용편이 없습니다. 

왜냐하면 고급편에서 중급에 사용했던 부품의 응용편을 다룰 예정이기 때문이죠!!



안녕하세요. 애드라이프 입니다.

이번 포스팅에서는 3축 자이로 센서인 L3G4200D에 대해서 알아보겠습니다.

자이로 센서는 스마트 폰이나 드론에 보편적으로 들어가는 센서입니다.


아두이노 자이로센서 L3G4200





이번에 사용할 센서의 실물입니다. ▲


우선 자이로센서는 무엇인지 알아볼까요?

많은 사람들이 착각하고 있는 것 중 하나입니다만,

자이로센서는 각도를 측정하는 센서가 절대!! 아닙니다.


정확히는 각속도를 측정하는 센서죠.

각속도는 시간당 이동한 각도를 의미하겠죠.

그렇다고 각도를 구할 수 없는 것은 아닙니다.

하지만 복잡한 계산식이 들어가야 하기때문에 본 포스팅에서는 다루지 않습니다.


이번에 L3G4200D 3축 자이로 센서를 다루기 위해서

I2C통신을 이용한 예제를 구현합니다.

I2C통신은 이전 아두이노끼리 통신에서 다뤘기 때문에 참고 부탁드립니다.


회로 구성을 확인해 볼까요?▼

아두이노 Fritzing 자이로센서 회로

아두이노 Fritzing 자이로센서 회로

Fritzing을 이용하여 회로를 구성해 보았습니다.

Fritzing에 보이는 센서와 모습이 다를 뿐 핀맵은 동일합니다.


센서----------아두이노

Vcc-----------3.3v

GND-----------GND

      SDA----------SDA(A4)

     SCL----------SCL(A5)


이번 포스팅은 프로그램 설명이 매우 많기 때문에 바로 프로그램을 살펴보겠습니다.▼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <Wire.h> //라이브러리 추가(기본 라이브러리입니다.)
 
//setupL3G4200D 함수에서 각 레지스터 주석을 참고하세요.
#define CTRL_REG1 0x20
#define CTRL_REG2 0x21
#define CTRL_REG3 0x22
#define CTRL_REG4 0x23
#define CTRL_REG5 0x24
 
int L3G4200D_Address = 0x69;        //L3G4200D의 I2C통신 슬레이브 주소값은 0x69
 
int X_Value;
int Y_Value;
int Z_Value;
 
void setup() {
  Wire.begin();
  Serial.begin(9600);                     //시리얼 통신속도 9600
  Serial.println("Read start L3G4300d");
  setupL3G4200D(2000);                    //스케일을 정합니다.  250, 500 ,2000 중 택일
  delay(1500);                            //센서 안정화 시간을 대기합니다.
}
 
void loop() {
  
  getGyroValues();                        //x,y,z의 값을 받아옵니다.
  
  Serial.print("X=");
  Serial.print(X_Value,DEC);
  Serial.print("\t");
  Serial.print("Y=");
  Serial.print(Y_Value,DEC);
  Serial.print("\t");
  Serial.print("Z=");
  Serial.print(Z_Value,DEC);
  Serial.print("\t");
  Serial.println();
 
  delay(100);                             //데이터를 받아오는 대기시간 >> 이 시간을 조절 하여 값을 받아오는 시간을 조절 할 수 있다.
}
 
void getGyroValues()
{
  byte X_msb = readRegister(L3G4200D_Address,0x29);
  byte X_lsb = readRegister(L3G4200D_Address,0x28);
  X_Value = ((X_msb<<8)|X_lsb);                  //8bit Data 2개를 16bit Data에 저장하기 위해 Shift연산자 <<를 사용
 
  byte Y_msb = readRegister(L3G4200D_Address,0x2B);
  byte Y_lsb = readRegister(L3G4200D_Address,0x2A);
  Y_Value = ((Y_msb<<8)|Y_lsb);                  //8bit Data 2개를 16bit Data에 저장하기 위해 Shift연산자 <<를 사용
 
  byte Z_msb = readRegister(L3G4200D_Address,0x2D);
  byte Z_lsb = readRegister(L3G4200D_Address,0x2C);
  Z_Value = ((Z_msb<<8)|Z_lsb);                  //8bit Data 2개를 16bit Data에 저장하기 위해 Shift연산자 <<를 사용
 
}
 
int setupL3G4200D(int scale)
{
  writeRegister(L3G4200D_Address,CTRL_REG1,0b00001111);     //x,y,z 활성화, 파워 다운모드 끄기
  writeRegister(L3G4200D_Address,CTRL_REG2,0b00000000);     //high pass filter cut off freq 설정과 모드 설정
  writeRegister(L3G4200D_Address,CTRL_REG3,0b00001000);     //CTRL_REG3을 그림으로 표시하여 INT2에 대한 데이터 준비 인터럽트를 생성합니다.
                                                            // INT1을 구성하려면 INT1에 인터럽트가 사용되지 않음
                                                            //또는 INT2가 아니면 데이터시트를 참조하십시오.
 
  if(scale==250)
  {
    writeRegister(L3G4200D_Address,CTRL_REG4,0b00000000);   //CTRL_REG4는 다음 중 전체 스케일 범위를 제어합니다.
  }
  else if(scale==500)
  {
    writeRegister(L3G4200D_Address,CTRL_REG4,0b00010000);
  }
  else
  {
    writeRegister(L3G4200D_Address,CTRL_REG4,0b00110000);
  }
  writeRegister(L3G4200D_Address,CTRL_REG5,0b00000000);       //Ctrl_REG5는 출력의 고역 통과 필터링을 제어합니다 >> 하이패스필터 안씀
}
 
void writeRegister(int DeviceAddress, byte Address, byte Value)
{
  Wire.beginTransmission(DeviceAddress);    
  Wire.write(Address);
  Wire.write(Value);
  Wire.endTransmission();
}
 
int readRegister(int DeviceAddress, byte Address)
{
  int val;
  Wire.beginTransmission(DeviceAddress);          //지정된 주소로 I2C 슬레이브 장치로 전송을 시작합니다. 이후 write() 함수로 전송하기 위해 바이트형 데이타를 대기열에 넣고 endTransmission()을 호출하여 전송합니다.
  Wire펴햖.write(Address);
  Wire.endTransmission();
 
  Wire.requestFrom(DeviceAddress,1);              //마스터가 슬레이브 디바이스에서 바이트형 데이타를 요청하는 데 사용합니다. 그런 다음 사용 available() 및 read() 함수를 사용하여 받아온 데이타를 검색할 수 있습니다.
 
  while(!Wire.available())
  {
    //딜레이.
  }
  val = Wire.read();
  return val;
}
 

cs

프로그램의 전체적인 흐름은 주석을 참고해주세요.(옆으로 넘기면서 보실 수 있습니다.)


I2C통신을 이용하여 자이로센서를 컨트롤 할 경우 가장 중요한 것은 

컨트롤 해야하는 레지스터 주소값입니다.

L3G4200D_Address = 0x69 는 I2C통신시 슬레이브가 갖는 주소값을 의미 합니다만 

Device마다 다른 주소값을 갖고 있을 수 있으니 항상 데이터 시트를 확인 바랍니다.


setupL3G4200D(2000); 같은 경우 스케일을 정한다고 주석을 달아 놓았습니다만

정확히 설명 드리면 표현하는 최대값의 범위를 설정하는 것입니다.

위에서 잠깐 언급했지만 자이로센서는 각속도를 측정하는 센서입니다.

setupL3G4200D(2000); 함수에서 지정하는 숫자의 의미는 

±2000*/sec 1초에 변할 수있는 각도의 최값이 -2000에서 +2000이라는 뜻입니다.


컨트롤 하는 레지스터들의 더 자세한 정보를 얻고 싶으신 분은 아래 데이터 시트를 참고부탁드립니다.


L3G4200_DATASHEET.pdf


아두이노 자이로센서 축별 방향

결과 확인 전에 IC에 표시되어있는 각 축방향을 확인 해주세요.


결과를 확인 해볼까요?


지금까지 아두이노(Arduino) 중급 아두이노 자이로센서(L3G4200) 3축에 대한 포스팅이였습니다.

계속해서 도움되는 포스팅으로 찾아 뵙겠습니다.

by 애드라이프




참고자료 [북두출판사] 실험KIT와 함께하는 ARDUINO 입문서 아두이노 완전정복