Гироскоп IXZ500
- Войдите на сайт для отправки комментариев
Всем доброго времени суток. Сейчас тестирую недавно приобретённый гироскоп 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. стараюсь пока с одной осью работать.
Господа, прошу помощи, и советов от чего такое может быть. Это мой первый опыт с гироскопом. Так же на данный момент не могу сделать скрин, но добавлю уже завтра.
Попробуйте снизить чувствительность
и(или) увеличить ошибку
Это то, о чем писалось выше (едиственное идет уменьшение, а не увеличение). Пробовал поменять значения, как Вы и сказали, но результат тот же. Единственное, теперь разница в уменьшении меньше между числами.
Так же заметил, если убрать ограничение
то счет будет идти с минуса -
-11.2332
-15.2344
...
-350.4422
-infinity
П.С. стараюсь понять, почему всё время возрастает в ту или иную сторону, а не стоит на месте.
Так а readError вы пробовали менять?
пробовал. резултат тотже
в ходе теста, нашел что
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 результат в принципе приемлеммый - реакция на гироскоп в ту или иною сторону очень хорошая, т.е. почему-то действует так, как нужно для градуса.
однако, тестируя строки дальше, обнаружил что
-как раз так и вызывает какой-то "сбой" и подсчет идет с 0 до 360 или с 360 до 0.
У вас по какойто причине не устанавливается 0, попробуйте еще поиграться переменной gyroZeroVoltage.
maksim
Спасибо за советы, нашел и исправил пару недочетов и ошибок в коде. Так же сменил значение zeroVoltage, для более точного ответа. Всё работает как часы.
Не раз видел, как при помощи софта смотрели изменения в поведении гироскопа/акселерометра. Интересует вопрос какое ПО использовалось, или может еще какие внешние приборы подключались?