(비공개)
Elektronika제품이다.
국내에선 가치창조기술에서 독점하고 있다.
다 좋은데 공부들을 안해서 물어봐도 모른다.
그래서 이 블로그에서 정리해서 공유하려고 한다.
우선 Pinout을 볼 필요가 있다.
NC는 안쓰는 핀이니 제외하고,
INT, SCL, SDA, GND, RDY, CS, SCK, SDO, SDI, 3V3, GND
이걸 기반으로 코드상에서 어떻게 쓰였는지 보면된다.
아래 코드는 ATMEGA32를 기반으로 적었다.
ATMEGA128기반으로 사용하려면 약간의 코드변경이 필요하다.
----------------------------------------------
1405512397_gyro_click___exa_mikroc_avr.rar
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
/*
* Project name:
Gyro click
* Copyright:
(c) mikroElektronika, 2012.
* Revision History:
20130115:
- Initial release (DO);
* Description:
This is a demonstration how Gyro click can be used to measure angular displacement.
It'is calculated by integrating of angular rate of X Y and Z axis,
which is measured by Gyroscope module.
It uses threshold value and zero-rate level cancellation for reducing readout error.
Example uses UART communication to dispaly data on PC Terminal application.
* Test configuration:
MCU: ATMEGA32
http://www.atmel.com/Images/doc2503.pdf
Dev.Board: EasyAVR v7
http://www.mikroe.com/easyavr/
Oscillator: External Clock 08.0000 MHz
Ext. Modules: Gyro click - ac:Gyro_click
http://www.mikroe.com/click/gyro/
SW: mikroC PRO for AVR
http://www.mikroe.com/mikroc/avr/
* NOTES:
- Place Gyro click board in the mikroBUS socket 1.
- Place J5 voltage selection jumper in the 3.3V position.
- Turn ON UART communication on SW10.1 and SW10.2
- Set jumpers J12 and J23 to RS-232 or USB based on desired port.
*/
#include"L3GD20_Driver.h"
#define TSHLD 50
sbit GYRO_CS at PORTA5_bit; // Chip Select pin
sbit GYRO_CS_Dir at DDA5_bit; //입출력 방향을 위한 변수
sbit DATA_RDY at PINA6_bit; // DataReady - DRDY/INT2 pin
sbit DATA_RDY_Dir at DDA6_bit; //입출력 방향을 위한 변수
sbit GYRO_INT at PIND2_bit; // Interrupt - INT1 pin
sbit GYRO_INT_Dir at DDD2_bit; //입출력 방향을 위한 변수
GData value;
long int r0_x, r0_y, r0_z;
float sumX, sumY, sumZ;
char response;
void MCU_Init() //초기화 메소드
{
UART1_Init(56000); // Initialize UART
Delay_ms(100); // Wait for UART module to stabilize
TWI_Init(100000); // Initialize I2C
}
void UART_Write_New_Line()
{
UART1_Write_Text("\r\n");
//그 행의 맨 처음으로 이동하는 것(\r)과 한번은 다음줄로 이동하는 것(\n)이죠
}
void Gyro_Config()
{
unsigned short response;
unsigned short i;
unsigned short ID;
char txt[3];
r0_x = 0;
r0_y = 0;
r0_z = 0;
response = 0;
response += L3GD20_Configure(L3GD20_CTRL_REG1, 0x1F);
// Turn ON module (normal mode), enable X, Y and Z axis , ODR=95Hz, Cut-Off=25
response += L3GD20_Configure(L3GD20_CTRL_REG4, 0x00);
// Full scale selection - 250dps
response += L3GD20_Configure(L3GD20_CTRL_REG3, 0x08);
// Enable Date-ready on DRDY/INT2 pin
if (response == 3)
{ // Sum of all resposne values should be 3
UART1_Write_Text("Gyro module initialized.");
UART1_Write_Text("\r\n");
}
else
{
UART1_Write_Text("Error: Gyro Config!");
UART1_Write_Text("\r\n");
}
ID = Identify_Gyro(); // Get ID from Gyroscope module
ByteToHex(ID, txt); // Convert byte value to HEX-String
UART1_Write_Text("GyroID: "); //
UART1_Write_Text(txt); //
UART_Write_New_Line(); //
UART1_Write_Text("Calibration: Module should be in rest position.");
UART_Write_New_Line();
for (i = 0 ; i < 64 ; i++ ) // Collect 64 values in rest position
{
L3GD20_GetAngRateRaw(&value);
r0_x += value.X_AXIS; // Sum the values
r0_y += value.Y_AXIS; // for every
r0_z += value.Z_AXIS; // axis
}
r0_x >>= 6; // Find avreage reding in resting position
r0_y >>= 6; // and use them as correction values
r0_z >>= 6; // for all three axis
UART1_Write_Text("Calibration: Done!");
UART_Write_New_Line();
} //Gyro_Config() 메소드의 끝
void DisplayAngleRate(char *str, float val)
{
char txt[20];
UART1_Write_Text("| ");
UART1_Write_Text(str);
UART1_Write_Text(": ");
sprintf(txt, "%7.2f", val);
UART1_Write_Text(txt);
UART1_Write_Text(" deg |");
}
void NewLine()
{
UART1_Write_Text("\r\n");
}
void main() //메인 메소드
{
int Xval, Yval, Zval;
char display_flag = 0;
MCU_Init(); //UART:56000 >>Delay_ms(100) >>TWI_Init(100000)(☜I2C통신)
Gyro_Init();
Gyro_Config();
NewLine();
NewLine();
sumX = 0;
sumY = 0;
sumZ = 0;
display_flag = 0;
while(1){
response = L3GD20_GetAngRateRaw(&value); // Colect new set of values
if (response == 1){
if (abs(value.X_AXIS - r0_x) > TSHLD){ // If corrected value of X axis is over treshold level use the vale for integration
Xval = value.X_AXIS - r0_x; // Calculate Angular rate for X axis
sumX += Xval * 0.00875 / 94.8 * 3.0; // Multuply with dps factor for 250dps i's 8.75 mdps/sec (0,00875)
// frequecy of readig values from module ~95Hz(94.8) - three chanel (3.0)
display_flag = 1; // Raise the flag for data to be displayed via UART
}
if (abs(value.Y_AXIS - r0_y) > TSHLD){ // If corrected value of Y axis is over treshold level use the vale for integration
Yval = value.Y_AXIS - r0_y; // Calculate Angular rate for Y axis
sumY += Yval * 0.00875 / 94.8 * 3.0; // Multuply with dps factor for 250dps i's 8.75 mdps/sec (0,00875)
// frequecy of readig values from module ~95Hz(94.8) - three chanel (3.0)
display_flag = 1; // Raise the flag for data to be displayed via UART
}
if (abs(value.Z_AXIS - r0_z) > TSHLD){ // If corrected value of Z axis is over treshold level use the vale for integration
Zval = value.Z_AXIS - r0_z; // Calculate Angular rate for Z axis
sumZ += Zval * 0.00875 / 94.8 * 3.0; // Multuply with dps factor for 250dps i's 8.75 mdps/sec (0,00875)
// frequecy of readig values from module ~95Hz(94.8) - three chanel (3.0)
display_flag = 1; // Raise the flag for data to be displayed via UART
}
if(display_flag){ // If change was detected, send data via UART
DisplayAngleRate("sX", sumX);
DisplayAngleRate("sY", sumY);
DisplayAngleRate("sZ", sumZ);
NewLine();
display_flag = 0; // Reset flag variable
}
}
else
{
UART1_Write_Text("Error reading data!");
}
}
}
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
GSR센서를 이해하기위해선 ESC센서와 비교해볼 필요가 있다.
GSR sensor:
measures the electrical conductance of the skin between two points.
As you can see from the sensor consists of two electrodes,
one is placed on the index finger and on the other the average of the non-dominant hand.
(conductance ↔ resistance)
(여기서 non-dominant hand는 reference volt에 해당한다.)
(☆2개의 electrodes로 구성)
ECG sensor:
allows to derive the electrocardiogram of the patient.
With this system, it is possible to measure the electrical functionality and muscle of the heart.
This sensor consists of three electrodes, two of them is measured between the potential difference (positive and negative electrode) and the third acts as a reference (neutral).
(☆3개의 electrodes로 구성)
(기준점을 중심으로 positive, negative 전압으로 구분된다. = Oscilloscope와 비슷한 원리)
MAI-3AXIS : 자이로센서
12:00 ~ 03:15
제목:GSR을 이용한 공포,분노 시스템 |
사양완성도 |
% |
부품리스트 : ATmega128, GSR센서, 온도센서, 가속도센서 센서별 원리 : GSR센서는 두개의 포인트에 전극을 연결해서 전위차를 감지하는 원리이다. 흔히 알고있는 5V전압을 갖기 위해서는 반드시 GND가 있어야 GND를 기준으로 5V의 전위차가 필요하듯이 GSR센서 또한 전위차가 필요하다. 그 전위차를 위해 필요한 GND단자를 대신하는게 중지손가락에 해당하고 검지손가락은 그 전위차를 감지하는 포인트에 해당한다. 이때 중지손가락에 가해지는 전압을 전자적 관점에서 정확히 표현하자면 "reference voltage가 적용되었다" 라고 할 수 있다. 의외로 간단하며 이 센서만 따로 사용하며 출력되는 전위차를 tester를 통해 체크해보는것도 좋은 방법이다. 온도센서는 아래 그림처럼 TMP36을 사용한다. 센서의 가장 표준형은 3핀이며 Vcc,GND,Signal 로 구성된다. 위 pinout은 V+,GND,Vout으로 표현되었지만 같은 표현이다. V+, GND에 각각 5V, GND를 인가시키고, 센서에서 감지되는 온도에 따라 Vout의 출력전압이 MCU의 입력으로 전달되며, 이때의 입력핀은 ADC에 해당한다. ADC는 Analog to Digital Converter의 약자이며, 쉽게 표현하자면 아날로그로 표현되는 선형값을 디지털화 시켜서 MCU가 받아들일 수 있도록 변환시키는걸 의미한다. (☆ MCU : MicroControllerUnit의 약자이며 ATmega128은 MCU의 한 종류에 해당) 이때 디지털 값은 2진수 10자리로 표시되며 공식에의해 2^10=1024 즉, 0~1023까지 표시된다. 예컨데 5V가 감지되면 1023을 입력으로 받아들이고, 0V가 감지되면 0을 입력으로 받아들이는 이치이다. https://www.livescience.com/40103-accelerometer-vs-gyroscope.html 가속도센서를 이해하기위해선 Gyroscope와 Accelerometer의 차이를 이해해야한다. Gyroscope는 X,Y,Z축 중 어느축으로 기울여져있냐를 감지하는 원리이고 이를 복합적으로 체크하기위해서 X,Y,Z축의 출력이 개별적으로 있다. Accelerometer는 갑작스런 움직임을 감지하는 센서이다. 등속도는 정지상태와 같게 감지하고 가속도를 감지한다. 여기서 가속도는 감속까지 포함된다. 회로도 가속도센서는 회로도로 표현이 안되므로 최대한 가깝게 그리려면 X,Y,Z축을 감지하도록 가변저항 3개를 개별적으로 그려야한다. 온도센서 TMP36은 회로상의 RV5로 대체한다. GSR센서는 내부에 비교기를 갖고있으므로 비교기 LM139로 대체했다. 이때 반전입력이 중지손가락에 해당하고, 비반전입력이 검지손가락에 해당한다. 그리고 이때 출력이 ADC4 채널 입력으로 들어온다. 코드상에서는 If statement를 통해서 진동이 없고, 온도가 낮을때의 조건시 GSR센서를 통해 습도를 체크해서 상중하 3단계로 LCD에 메세지를 표시하는 원리이다. 이렇게 코드를 구성하는 이유는 공포영화를 볼때 체온이 낮아지고 미동없이 집중해서 영화를 관람하고있다는 조건에서 손에 땀을 쥐고있다는 상황을 가정했기 때문이다. |