Всем привет! Пытаюсь получить угол отклонения с помощью гороскопа Single Axis Analog Gyro за основу взял демо код со страницы http://www.seeedstudio.com/wiki/Grove_-_Single_Axis_Analog_Gyro Добавил туда интегрирование скорости по времени и получил постоянный прирост угла при неподвижном датчике. Смущает, что скорость чаще всего постоянная и довольна большая для шума при неподвижном датчике. Код (Text): int sensorPin = A5; // select the input pin for the sensor const int INTEGR_DELAY = 20; float reference_Value=0; int sensorValue = 0; // variable to store the value coming from the sensor unsigned long time , delta_time , old_time ; double angularVelocity , old_angularVelocity = 0; double delta_deg , deg; void setup() { int i; float sum=0; pinMode(sensorPin, INPUT); time =0; old_time =0; Serial.begin(9600); Serial.println("Please do not rotate it before calibrate!"); Serial.println("Get the reference value:"); for(i=0;i<1000;i++) { // read the value from the sensor: sensorValue = analogRead(sensorPin); sum += sensorValue; delay(5); } reference_Value = sum/1000.0; Serial.println(reference_Value); Serial.println("Now you can begain your test!"); } void loop() { // находим период времени time = millis(); delta_time = time - old_time; if ( delta_time > INTEGR_DELAY ) { Serial.print(delta_time/10000); Serial.print(" s"); Serial.println(" "); // находим новую скорость sensorValue = analogRead(sensorPin); angularVelocity =((double)(sensorValue-reference_Value)*4930.0)/1023.0/0.67; //get the angular velocity Serial.print("old_angularVelocity = "); Serial.print(old_angularVelocity); Serial.println("deg/s"); Serial.println(" "); Serial.print("angularVelocity = "); Serial.print(angularVelocity); Serial.println("deg/s"); Serial.println(" "); // находим прирост угла delta_deg = (angularVelocity + old_angularVelocity)*delta_time/20000; Serial.print(delta_deg); Serial.println(" delta_deg"); Serial.println(" "); //находим угол deg += delta_deg; Serial.print(deg); Serial.print(" deg"); Serial.println(" "); old_angularVelocity = angularVelocity ; } } Может кто сталкивался с подобной задачей, в чем может быть проблема?
А как же вот тут angularVelocity =((double)(sensorValue-reference_Value)*4930.0)/1023.0/0.67; //get the angular velocity ведь reference_Value и есть среднее значение состояния покоя
Сделал скетч в котором в цикле определял reference_Value и заметил интересную особенность reference_Value довольно значительно гуляет , при этом что интересно всегда при запуске выдается нижнее значение. Похоже данный сенсор предназначен только для грубого определения угловой скорости , для определения же угла наклона не подходит. Либо надо что то придумывать по поводу лифта среднего значения.