Работа с Single Axis Analog Gyro

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем utaimas, 3 окт 2014.

  1. utaimas

    utaimas Нуб

    Всем привет!
    Пытаюсь получить угол отклонения с помощью гороскопа 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 ;
        }
    }    
    Может кто сталкивался с подобной задачей, в чем может быть проблема?
     
  2. Unixon

    Unixon Оракул Модератор

    Похоже, вы забыли вычесть среднее значение, соответствующее состоянию покоя.
     
  3. utaimas

    utaimas Нуб

    А как же вот тут
    angularVelocity =((double)(sensorValue-reference_Value)*4930.0)/1023.0/0.67; //get the angular velocity

    ведь reference_Value и есть среднее значение состояния покоя
     
  4. Unixon

    Unixon Оракул Модератор

    Верно, проглядел. А откуда приращение то берется?
     
  5. Unixon

    Unixon Оракул Модератор

    Какая погрешность у опорного значения (reference_Value)?
     
  6. utaimas

    utaimas Нуб

    Сделал скетч в котором в цикле определял reference_Value и заметил интересную особенность reference_Value довольно значительно гуляет , при этом что интересно всегда при запуске выдается нижнее значение.
    Похоже данный сенсор предназначен только для грубого определения угловой скорости , для определения же угла наклона не подходит. Либо надо что то придумывать по поводу лифта среднего значения.