코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
자이로센서 기울기 값 코딩(답변부탁드립니다ㅠㅠㅠ)
류슬아 | 2017-06-10
|
|
---|---|
#include <Wire.h> #define CTRL_REG1 0x20 #define CTRL_REG2 0x21 #define CTRL_REG3 0x22 #define CTRL_REG4 0x23 #define CTRL_REG5 0x24
int L3G4200D_Address = 0x69;
float DPS_MULT = 0.0000085;
//int x = 0; int y = 0; //int z = 0;
//float angX = 0; float angY = 0; //float angZ = 0;
//float p_angX = 0; float p_angY = 0; //float p_angZ = 0;
//int gyroLowX = 0; int gyroLowY = 0; //int gyroLowZ = 0; //int gyroHighX = 0; int gyroHighY = 0; //int gyroHighZ = 0; unsigned long pastMicros = 0;
void setup() { Wire.begin(); Serial.begin(9600); Serial.println("Starting up L3G4200D"); //vvvv
setupL3G4200D(250); // Configure L3G4200 - 250, 500 or 2000 deg/sec delay(1000); // wait for the sensor to be ready calibrate(); attachInterrupt(0, updateAngle, RISING); pastMicros = micros(); } void loop() { getGyroValues();
float dt; if(micros() > pastMicros) //micros() overflows every ~70 minutes dt = (float) (micros()-pastMicros)/1000000.0; else dt = (float) ((4294967295-pastMicros)+micros())/1000000.0;
//if(x >= gyroHighX || x <= gyroLowX) { //angX += ((p_angX + (x * DPS_MULT))/2) * dt; //p_angX = x * DPS_MULT; //} else { //p_angX = 0; //} if(y >= gyroHighY || y <= gyroLowY) { angY += ((p_angY + (y * DPS_MULT))/2) * dt; p_angY = y * DPS_MULT; } else { p_angY = 0; } //if(z >= gyroHighZ || z <= gyroLowZ) { //angZ += ((p_angZ + (z * DPS_MULT))/2) * dt; //p_angZ = z * DPS_MULT; //} else { //p_angZ = 0; //}
pastMicros = micros(); sendJson(); delay(10); } void updateAngle() { getGyroValues(); } void calibrate() { Serial.println("Calibrating gyro, don't move!"); for(int i = 0; i < 200; i++) { getGyroValues(); //if(x > gyroHighX) //gyroHighX = x; //else if(x < gyroLowX) //gyroLowX = x; if(y > gyroHighY) gyroHighY = y; else if(y < gyroLowY) gyroLowY = y; //if(z > gyroHighZ) //gyroHighZ = z; //else if(z < gyroLowZ) //gyroLowZ = z; delay(10); } Serial.println("Calibration complete."); }
void sendJson() { char json[40]; sprintf(json, "{\"y\":%d}", //(int)(angX*1000), (int)(angY*200) //(int)(angZ*1000) );
Serial.println(json); } void getGyroValues() { //byte xMSB = readRegister(L3G4200D_Address, 0x29); //byte xLSB = readRegister(L3G4200D_Address, 0x28); //x = ((xMSB << 8) | xLSB); byte yMSB = readRegister(L3G4200D_Address, 0x2B); byte yLSB = readRegister(L3G4200D_Address, 0x2A); y = ((yMSB << 8) | yLSB); //byte zMSB = readRegister(L3G4200D_Address, 0x2D); //byte zLSB = readRegister(L3G4200D_Address, 0x2C); //z = ((zMSB << 8) | zLSB); } int setupL3G4200D(int scale) {
writeRegister(L3G4200D_Address, CTRL_REG1, 0b00001111);
writeRegister(L3G4200D_Address, CTRL_REG2, 0b00000000);
writeRegister(L3G4200D_Address, CTRL_REG3, 0b00001000);
if(scale == 250) { writeRegister(L3G4200D_Address, CTRL_REG4, 0b00000000); } else if(scale == 500) { writeRegister(L3G4200D_Address, CTRL_REG4, 0b00010000); } else { writeRegister(L3G4200D_Address, CTRL_REG4, 0b00110000); }
writeRegister(L3G4200D_Address, CTRL_REG5, 0b00000000); } void writeRegister(int deviceAddress, byte address, byte val) { Wire.beginTransmission(deviceAddress); // start transmission to device Wire.write(address); // send register address Wire.write(val); // send value to write Wire.endTransmission(); // end transmission } int readRegister(int deviceAddress, byte address) { int v; Wire.beginTransmission(deviceAddress); Wire.write(address); // register to read Wire.endTransmission(); Wire.requestFrom(deviceAddress, 1); // read a byte while(!Wire.available()) {
// waiting }
v = Wire.read(); return v; }
아두이노에 자이로센서를 인식하게 하는 코딩입니다 저희는 여기서 void sendJson() { char json[40]; sprintf(json, "{\"y\":%d}", //(int)(angX*1000), (int)(angY*200) //(int)(angZ*1000) ); 센서의 y값만 인식되게 하려고 나머지 값을 주석처리하고 또 거기서 y값이 어떤 높이에서 시작하던 시작점이 0이 되고 움직이면 마이너스값이 되게하려면 어떻게 하나요? 지금 sprintf y에 -를 입력해서 값이 전부 마이너스가 나오긴한데 값이 자꾸 쌓이기만하고 0이 되지 않습니다. 시작점이 무조건 0이되고 움직일때 마이너스값이 될수있도록 코딩하는 방법 좀 가르쳐 주세요ㅠㅠㅠ |
|
이전글 | 아두이노 코드 작동이 동시에 되지않아요ㅜㅜ... | 2017-06-10 |
다음글 | MMA7361 가속도센서 관련 질문입니다 | 2017-06-10 |