Погрузился в акселерометр MMA7361 - помогите вынырнуть

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем teddyfox, 23 июн 2012.

  1. teddyfox

    teddyfox Нерд

    Вожусь с 3-осным акселерометром MMA7361. Собрал вот такую конструкцию: акселерометр (через Troyka Shield) связан с Arduino Mega 2560. Сам акселерометр сидит на спарке из двух серв (панорамная + тангажная).
    zz.jpg
    Сервы крутятся - программа меряет показания с выходов X,Y,Z акселерометра. Все пины акселерометра заведены на соотв входы Меги. В программе используется библиотека AcceleroMMA7361.h. Библиотека позволяет читать с выходов XYZ три вида значений - Raw, Volt, Accel. Нигде в header'e библиотеки (ни в datasheet'e на Freescal'овский чип MMA7361) явно не указан четкий смысл этих трех видов значений. Разъясните, кто знает или дайте ссылку, плз! Из общих соображений понятно, что Raw и Volt как-то связаны с замерами координат, а Accel - с замером ускорений. Программа получилась такая:


    Код (Text):
    // 3-осевой акселерометр MMA7361 DFRobot (библиотека AcceleroMMA7361)
     
     
     
    // Акселерометр <-> Arduino Mega 2560: X - A10; Y - A11; Z - A12; Vcc - 3,3V; GND - GND;
     
    // ST - 50; 0gD - 48; SLP - 46;
     
    // Функция настройки акселерометра: begin(SLP,ST,0gD,gSelect,X,Y,Z);
     
    // на этом устройстве нет пина для gSelect - есть ручной переключатель -
     
    // - 1.5G - 6G - я его выставил в 6G - 206 mV/g - high sensitivity
     
    // Сервы: MyServo1 (панорамный) - 8 (PWM); MyServo2 (тангаж) - 9 (PWM)
     
    // Используем 3 библ. функции для снятия показ-й (???): getXRaw(); getXVolt(); getXAccel()
     
     
     
    #include <Servo.h>
     
    #include <AcceleroMMA7361.h>
     
     
     
    byte PinX = 10; byte PinY = 11; byte PinZ = 12;    // аналог. выводы XYZ акселер-ра
     
    int RawX; int RawY; int RawZ;                // значения Raw XYZ с акселерометра
     
    int VoltX; int VoltY; int VoltZ;                // значения Volt XYZ с акселерометра
     
    int AclrX; int AclrY; int AclrZ;                // значения Aclr XYZ с акселерометра
     
    byte Angle=0;                        // угол на сервы
     
    int StartButton=40;                    // кнопка ПУСК
     
    int GreenLED=30;    int YellowLED=32;            // светодиоды
     
     
     
    Servo MyServo1; Servo MyServo2;
     
    AcceleroMMA7361 Myaccel;
     
     
     
    void setup()
     
    {    Serial.begin(9600);
     
        pinMode(StartButton, INPUT);
     
        pinMode(GreenLED, OUTPUT); pinMode(YellowLED, OUTPUT);
     
        MyServo1.attach(8);  MyServo2.attach(9);    // attache servos    
     
        // сервы крутим в диапазоне 30 - 150 градусов
     
        MyServo1.write(30); MyServo2.write(30);    // сервы в исходное
     
       
     
        Myaccel.begin(46,50,48,52, A10, A11, A12);
     
        Myaccel.setARefVoltage(3.3);    // sets the AREF voltage to 3.3V
     
        Myaccel.setSensitivity(HIGH);    // sets the sensitivity to +/-6G - fake
     
        Myaccel.calibrate();
     
        Serial.println();
     
        Serial.println(" === Accelero: Moving Servos - Reading Raw & Volt XYZ ===");
     
    }
     
    void loop()
     
    {    digitalWrite(GreenLED,LOW); digitalWrite(YellowLED,HIGH);
     
        while (digitalRead(StartButton)==LOW) {}    // ждем кнопку ПУСК
     
        digitalWrite(GreenLED,HIGH); digitalWrite(YellowLED,LOW);        // поехали
     
     
     
        Serial.println(); Serial.print("Angle="); Serial.print("\t");    // печать заголовка данных
     
        Serial.print("RawX="); Serial.print("\t");
     
        Serial.print("RawY="); Serial.print("\t");
     
        Serial.print("RawZ="); Serial.print("\t");
     
        Serial.print("VoltX="); Serial.print("\t");
     
        Serial.print("VoltY="); Serial.print("\t");
     
        Serial.println("VoltZ=");
     
     
     
       
     
        Serial.println("=== Forward Cycle");    // цикл "туда"
     
        for (Angle=30; Angle<=150; Angle=Angle+30)
     
        {    MyServo1.write(Angle);        // поворачиваем сервы (обе)
     
            MyServo2.write(Angle);
     
            delay(500);
     
     
     
            RawX = Myaccel.getXRaw();        // читаем Raw
     
            RawY = Myaccel.getYRaw();
     
            RawZ = Myaccel.getZRaw();
     
     
     
            VoltX = Myaccel.getXVolt();        // читаем Volt
     
            VoltY = Myaccel.getYVolt();
     
            VoltZ = Myaccel.getZVolt();
     
     
     
            Serial.print(Angle); Serial.print("\t"); Serial.print(RawX); Serial.print("\t");
     
            Serial.print(RawY); Serial.print("\t"); Serial.print(RawZ); Serial.print("\t");
     
            Serial.print(VoltX); Serial.print("\t"); Serial.print(VoltY); Serial.print("\t");
     
            Serial.println(VoltZ);
     
     
     
        }    // цикл "туда" закончен
     
       
     
        Serial.println("=== Backward Cycle");    // цикл "обратно"  
     
        for (Angle=150; Angle>=30; Angle=Angle-30)
     
        {    MyServo1.write(Angle);        // поворачиваем сервы (обе)
     
            MyServo2.write(Angle);
     
            delay(500);
     
     
     
            RawX = Myaccel.getXRaw();        // читаем Raw
     
            RawY = Myaccel.getYRaw();
     
            RawZ = Myaccel.getZRaw();
     
     
     
            VoltX = Myaccel.getXVolt();        // читаем Volt
     
            VoltY = Myaccel.getYVolt();
     
            VoltZ = Myaccel.getZVolt();
     
     
     
            Serial.print(Angle); Serial.print("\t"); Serial.print(RawX); Serial.print("\t");
     
            Serial.print(RawY); Serial.print("\t"); Serial.print(RawZ); Serial.print("\t");
     
            Serial.print(VoltX); Serial.print("\t"); Serial.print(VoltY); Serial.print("\t");
     
            Serial.println(VoltZ);
     
     
     
        }    // цикл "обратно" закончен
     
     
     
        // теперь меряем ускорение: гоним сервы из 30 в 150 и обратно и
     
        // 8 раз меряем ускорение с интервалом 5 мс
     
            Serial.println(); Serial.print("AclrX="); Serial.print("\t");
     
            Serial.print("AclrY="); Serial.print("\t");
     
            Serial.println("AclrZ=");
     
            // туда
     
            MyServo1.write(150); MyServo2.write(150);    // сервы 30 -> 150
     
            for (int i=1; i<=8; i++)
     
            {    delay(5);
     
                AclrX = Myaccel.getXAccel(); AclrY = Myaccel.getYAccel();
     
                AclrZ = Myaccel.getZAccel();
     
                Serial.print(AclrX); Serial.print("\t"); Serial.print(AclrY); Serial.print("\t");
     
                Serial.println(AclrZ);      
     
            }      
     
            delay(500);
     
            // обратно
     
            MyServo1.write(30); MyServo2.write(30);    // сервы 150 -> 30
     
            for (int i=1; i<=8; i++)
     
            {    delay(5);
     
                AclrX = Myaccel.getXAccel(); AclrY = Myaccel.getYAccel();
     
                AclrZ = Myaccel.getZAccel();
     
                Serial.print(AclrX); Serial.print("\t"); Serial.print(AclrY); Serial.print("\t");
     
                Serial.println(AclrZ);      
     
            }
     
    }
     
     
    В результате трех пусков в совершенно одинаковых условиях (три раза нажимал кнопку ПУСК) получил распечатку довольно-таки различающихся цифр:
    Код (Text):
    Calibrating MMA7361011..................................................
    DONE
    === Accelero: Moving Servos - Reading Raw & Volt XYZ ===
     
    1-й пуск
    Angle=    RawX=    RawY=    RawZ=    VoltX=    VoltY=    VoltZ=
    === Forward Cycle
    30    509    481    760    1643    1550    2449
    60    509    492    760    1643    1585    2449
    90    510    501    758    1643    1620    2442
    120    509    496    755    1640    1653    2433
    150    509    487    750    1640    2368    2420
    === Backward Cycle
    150    509    477    749    1640    1537    2413
    120    509    489    754    1640    1533    2429
    90    509    775    760    1640    2500    2449
    60    509    498    761    1640    1601    2452
    30    509    550    761    1643    1517    2452
     
    AclrX=    AclrY=    AclrZ=
    -1    10    100
    -1    -6    100
    -1    -9    100
    -1    -8    98
    -1    33    100
    -1    -11    99
    -1    -7    100
    -1    5    97
    -2    -3    95
    -1    -6    95
    -3    -2    94
    -1    -3    94
    -2    -5    95
    -1    12    95
    -1    16    95
    -1    22    94
     
    2-й пуск
    Angle=    RawX=    RawY=    RawZ=    VoltX=    VoltY=    VoltZ=
    === Forward Cycle
    30    509    412    762    1640    1327    2458
    60    509    425    763    1640    1369    2455
    90    509    536    760    1640    1727    2452
    120    509    771    757    1640    2487    2439
    150    509    529    751    1640    1704    2420
    === Backward Cycle
    150    509    507    750    1640    1633    2416
    120    509    463    755    1640    1492    2429
    90    508    477    759    1640    1533    2449
    60    509    459    762    1640    1479    2455
    30    509    449    762    1640    1446    2455
     
    AclrX=    AclrY=    AclrZ=
    -2    -26    100
    -2    -25    100
    -2    -25    100
    -2    -31    102
    -1    -23    99
    -2    -26    100
    -2    -24    99
    -1    -29    100
    -2    -18    95
    -2    -15    95
    -2    -12    96
    -3    -8    94
    -2    -7    95
    -2    -11    95
    -2    -15    94
    -2    -16    95
     
    3-й пуск
    Angle=    RawX=    RawY=    RawZ=    VoltX=    VoltY=    VoltZ=
    === Forward Cycle
    30    508    515    762    1640    1659    2458
    60    508    553    763    1637    1772    2458
    90    508    497    760    1637    1601    2449
    120    508    492    756    1637    1582    2436
    150    508    488    750    1637    1575    2416
    === Backward Cycle
    150    508    372    749    1637    1198    2416
    120    508    392    755    1637    1263    2433
    90    508    509    760    1637    1640    2449
    60    508    413    762    1637    1330    2455
    30    508    413    761    1637    1330    2452
     
    AclrX=    AclrY=    AclrZ=
    -2    -37    99
    -2    -40    100
    -2    -39    100
    -2    -49    102
    -1    -41    100
    -2    -42    99
    -2    -40    99
    -2    -45    100
    -2    7    95
    -2    22    95
    -2    26    96
    -3    26    94
    -2    10    94
    -2    8    95
    -2    -1    94
    -2    10    95
     
    Вопрос: три вида значений - Raw, Volt, Accel - это что? почему в одинаковых условиях (как мне кажется) различаются цифры?

    Спасибо
     
  2. Unixon

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

    Из документации к библиотеке:
    Первая функция отдает результат analogRead() как есть, остальные две масштабируют его в [милли]вольты и [сотые] единицы G.