Гироскоп IXZ500

Nut
Offline
Зарегистрирован: 03.03.2013

Всем доброго времени суток. Сейчас тестирую недавно приобретённый гироскоп IXZ500 и столкнлся с проблемой. 
После запуска, градус автоматически увеличивается пока не достигнет 360 (т.к. задал ограничение с -360 до 360). После того как достигнет 360, опять вовращается к 0 и возрастает опять. В тоже время, когда позиция гироскопа меняется он отображает это, но после остановки опять начинает автоматически возрастать. 

 Думал, что ошибка в коде, переписал заного, получил тот же результат, по правде сказать уже не знаю, что делать. Код который использую на данный момент:

float gyroVoltage = 5;  
float gyroZeroVoltage = 1.35; // взято из datasheet
float gyroSensitivity = 0.002; // datasheet

float rotationThreshold = 1; 

float readError = (gyroVoltage/1023)*2;
float currentAngle = 0;

unsigned long time;

void setup() {
  Serial.begin(9600);
  time = micros();
}

unsigned long time2;
long loopNumber = 0;

void loop() {
  time2 = micros();
  loopNumber++;

  int gyroValue = analogRead(0);
  
  float gyroActualVoltage = (gyroValue * gyroVoltage) / 1023;
  
  float gyroActualZero = gyroActualVoltage - gyroZeroVoltage;
  
  if (gyroActualZero <= readError && gyroActualZero >= -readError) {
    gyroActualZero = 0;
  }
  
  float gyroRate = gyroActualZero / gyroSensitivity;
  
  float gyroRateTime = 0;
  
  if (gyroRate >= rotationThreshold || gyroRate <= -rotationThreshold) {
    gyroRateTime = gyroRate/( 1000000.0/(time2-time) ); 
    currentAngle += gyroRateTime;
  }
  
  if (currentAngle < 0)
  currentAngle += 360;
  else if (currentAngle > 359)
  currentAngle -= 360;
  
  if (time2-time> 1000000L) {
  
    Serial.println(currentAngle, 10);

    loopNumber = 0;
    time = micros();
  }
  
  delay (100);
}

Соединён он - 5V - VCC; x-out - analog Pin 0; GND - GND. стараюсь пока с одной осью работать.

Господа, прошу помощи, и советов от чего такое может быть. Это мой первый опыт с гироскопом.  Так же на данный момент не могу сделать скрин, но добавлю уже завтра.

maksim
Offline
Зарегистрирован: 12.02.2012

Попробуйте снизить чувствительность

float gyroSensitivity = 0.01; 

и(или) увеличить ошибку

float readError = (gyroVoltage/1023)*3;

 

Nut
Offline
Зарегистрирован: 03.03.2013

 

Это то, о чем писалось выше (едиственное идет уменьшение, а не увеличение). Пробовал поменять значения, как Вы и сказали, но результат тот же. Единственное, теперь разница в уменьшении меньше между числами.
 

Так же заметил, если убрать ограничение

 

 if (currentAngle < 0)
  currentAngle += 360;
  else if (currentAngle > 359)
  currentAngle -= 360;

то счет будет идти с минуса - 
-11.2332

-15.2344

...

-350.4422

-infinity

П.С. стараюсь понять, почему всё время возрастает в ту или иную сторону, а не стоит на месте.

 

maksim
Offline
Зарегистрирован: 12.02.2012

Так а readError вы пробовали менять?

Nut
Offline
Зарегистрирован: 03.03.2013

пробовал. резултат тотже

в ходе теста, нашел что 

 float gyroRate = gyroActualZero / gyroSensitivity;
  float gyroRateTime=0;
  if (gyroRate >= rotationThreshold || gyroRate <= -rotationThreshold) {
    gyroRateTime = gyroRate/( 1000000.0/(time2-time) );
   Serial.println(gyroRate, 10);
    currentAngle += gyroRateTime;

в этой части кода, после подсчета gyroRate результат в принципе приемлеммый - реакция на гироскоп в ту или иною сторону очень хорошая, т.е. почему-то действует так, как нужно для градуса.

однако, тестируя строки дальше, обнаружил что

 

gyroRateTime = gyroRate/( 1000000.0/(time2-time) )

 

currentAngle += gyroRateTime;

 -как раз так и вызывает какой-то "сбой" и подсчет идет с 0 до 360 или с 360 до 0. 

maksim
Offline
Зарегистрирован: 12.02.2012

У вас по какойто причине не устанавливается 0, попробуйте еще поиграться переменной gyroZeroVoltage.

Nut
Offline
Зарегистрирован: 03.03.2013

maksim

Спасибо за советы, нашел и исправил пару недочетов и ошибок в коде. Так же сменил значение zeroVoltage, для более точного ответа. Всё работает как часы.

Не раз видел, как при помощи софта смотрели изменения в поведении гироскопа/акселерометра. Интересует вопрос какое ПО использовалось, или может еще какие внешние приборы подключались?