Как считывать данные с платы 10DOF GY-87
- Войдите на сайт для отправки комментариев
Вс, 27/03/2016 - 12:04
Ребят, подскажите как считывать данные с платы 10DOF (GY-87)? В часности нужны паказатели датчика MPU 6050.
Не могу найти про неё нормальную инфу. Ну или где почитать, может статья есть хорошая?
читай даташит на чип. у 6050 два интерфейса, какой разведен на плате тот и используй.
Значит подключать к nano3.0 надо так?
поищите для 6000 (помоему так или 6010 точно не помню) у них различия вроде только в наличии спи интерфейса в 6050. под первую на ардуино точка ком библиотеки попадались и примеры.
Не получается установить библиотеку "Kalman.h". Пишет неверная библиотека. Скачивал тут в RAR архиве http://iarduino.ru/file/209.html
Непойму в чём дело...
По этому скечу удалось считывать данные X:___ Y:___
#include <Wire.h> #include "Kalman.h" Kalman kalmanX; Kalman kalmanY; uint8_t IMUAddress = 0x68; /* IMU Data */ int16_t accX; int16_t accY; int16_t accZ; int16_t tempRaw; int16_t gyroX; int16_t gyroY; int16_t gyroZ; double accXangle; // Angle calculate using the accelerometer double accYangle; double temp; double gyroXangle = 180; // Angle calculate using the gyro double gyroYangle = 180; double compAngleX = 180; // Calculate the angle using a Kalman filter double compAngleY = 180; double kalAngleX; // Calculate the angle using a Kalman filter double kalAngleY; uint32_t timer; #define KEYON_PIN 2 // пин для запуска считывания #define KEYOFF_PIN 3 // пин для остановки считывания и отключения РЕЛЕ #define RELAY_PIN 4 // пин для подключения реле void setup() { Wire.begin(); Serial.begin(9600); pinMode(RELAY_PIN, OUTPUT); pinMode(KEYON_PIN, INPUT); pinMode(KEYOFF_PIN, INPUT); i2cWrite(0x6B,0x00); // Disable sleep mode kalmanX.setAngle(180); // Set starting angle kalmanY.setAngle(180); timer = micros(); } void loop() { /* Update all the values */ uint8_t* data = i2cRead(0x3B,14); accX = ((data[0] << 8) | data[1]); accY = ((data[2] << 8) | data[3]); accZ = ((data[4] << 8) | data[5]); tempRaw = ((data[6] << 8) | data[7]); gyroX = ((data[8] << 8) | data[9]); gyroY = ((data[10] << 8) | data[11]); gyroZ = ((data[12] << 8) | data[13]); /* Calculate the angls based on the different sensors and algorithm */ accYangle = (atan2(accX,accZ)+PI)*RAD_TO_DEG; accXangle = (atan2(accY,accZ)+PI)*RAD_TO_DEG; double gyroXrate = (double)gyroX/131.0; double gyroYrate = -((double)gyroY/131.0); gyroXangle += kalmanX.getRate()*((double)(micros()-timer)/1000000); // Calculate gyro angle using the unbiased rate gyroYangle += kalmanY.getRate()*((double)(micros()-timer)/1000000); kalAngleX = kalmanX.getAngle(accXangle, gyroXrate, (double)(micros()-timer)/1000000); // Calculate the angle using a Kalman filter kalAngleY = kalmanY.getAngle(accYangle, gyroYrate, (double)(micros()-timer)/1000000); timer = micros(); Serial.println(); Serial.print("X:"); Serial.print(kalAngleX,0); Serial.print(" "); Serial.print("Y:"); Serial.print(kalAngleY,0); Serial.println(" "); // The accelerometer's maximum samples rate is 1kHz } void i2cWrite(uint8_t registerAddress, uint8_t data){ Wire.beginTransmission(IMUAddress); Wire.write(registerAddress); Wire.write(data); Wire.endTransmission(); // Send stop } uint8_t* i2cRead(uint8_t registerAddress, uint8_t nbytes) { uint8_t data[nbytes]; Wire.beginTransmission(IMUAddress); Wire.write(registerAddress); Wire.endTransmission(false); // Don't release the bus Wire.requestFrom(IMUAddress, nbytes); // Send a repeated start and then release the bus after reading for(uint8_t i = 0; i < nbytes; i++) data [i]= Wire.read(); return data; }Но как сделать так чтобы он по нажатию кнопки на одном из цифровых вводов допустим D2 запоминал данные с осей X и Y. И сравнивал их с данными которые получает после нажатия кнопки. И если они отклонились от исходных скажем градусов на 5 по любоой оси, то срабатывает какаянибудь функция на D4 ну например загорается светодиод или РЕЛЕ включается. А после нажатия D3 выходил из этого режима и отключал D4.