Помогите пожалуйста с запуском гироскопа

Тема в разделе "Arduino & Shields", создана пользователем grx1a, 24 фев 2013.

  1. grx1a

    grx1a Гик

    Люди, помогите с подключением 3-х осного гироскопа пожалуйста. Уже не знаю что и делать с ним. Завалялся у меня вот такой 3-х осный гироскоп на чипе L3G4200DПодключаю к ARDUINOMEGA 2560 следующим образом
    GND на GND ARDUINO
    3,3V на 3,3V ARDUINO
    SCL на Digital PIN 21 ARDUINO (Для MEGA2560)
    SDA на Digital PIN 20 ARDUINO (Для MEGA2560)
    Подключения как указано на этой странице https://github.com/pololu/L3G, единственная разница в напряжении питания, так как на этой странице описания почти такого же гироскопа с той разницей что у последнего есть стабилизатор напряжения с 5В на 3,3 В у моего питание 3,3В
    Затем делаю все так как указано в разделе SOFTWAREна той же странице, закачиваю с сайта ZIPархив, распаковываю его и папку с названием L3Gзакидываю в папку библиотек ардуины.
    Затем запускаю Example -> L3G -> Serial
    Выглядит он так:
    #include <Wire.h>
    #include <L3G.h>

    L3G gyro;

    void setup() {
    Serial.begin(9600);
    Wire.begin();

    if (!gyro.init())
    {
    Serial.println("Failed to autodetect gyro type!");
    while (1);
    }

    gyro.enableDefault();
    }

    void loop() {
    gyro.read();

    Serial.print("G ");
    Serial.print("X: ");
    Serial.print((int)gyro.g.x);
    Serial.print(" Y: ");
    Serial.print((int)gyro.g.y);
    Serial.print(" Z: ");
    Serial.println((int)gyro.g.z);

    delay(100); }

    Затем запускаю SerialMonitor, а там ничего не происходит, а должны поступать координаты по трем осям??!! Примерно такие
    G X: 188 Y: -10 Z: -47
    G X: 138 Y: -40 Z: -26
    G X: 110 Y: -55 Z: 4

    Может я что то не так делаю, или гироскоп спалил когда к нему лапы припаивал, или может статический разряд его убил ?????
     
  2. grx1a

    grx1a Гик

    Вот фотка
     

    Вложения:

  3. Megakoteyka

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

    Но сообщения о неудачной инициализации при этом тоже нет?
     
  4. grx1a

    grx1a Гик

    вообще ничего нет, но если подключить на аналоговые входы как описано для Arduino UNO, тогда появляется Failed to autodetect gyro type
     
  5. grx1a

    grx1a Гик

  6. grx1a

    grx1a Гик

    Меня смущает одна малопримечательная штука, в схеме подключения есть в правом верхнем углу схема перемычки, у меня все три точки разомкнуты, но как я понял их можно между собой спаять, может в этом причина!? файл со схемой прилагается
     

    Вложения:

  7. grx1a

    grx1a Гик

    Serial monitor чист, пустой экран при любой ситуации, за исключением когда появляется Failed to autodetect gyro type если подключить через аналоговые входы как для UNO
     
  8. grx1a

    grx1a Гик

    код загружается без проблем, но на serial monitor пустой экран
     
  9. grx1a

    grx1a Гик

    Хотя нет со вторым вариантом что на странице http://bildr.org/2011/06/l3g4200d-arduino/ в SERIAL MONITOR постоянно горит надпись starting up L3G4200D, и больше ничего не меняется, координат как не было так и нет, может все таки вся проблема в адресах I2C ?
     
  10. roggedhorse

    roggedhorse Гик

    В даташите на L3G4200D в главе "5 Digital interfaces" написано:
    "To select/exploit the I2C interface, the CS line must be tied high (i.e., connected to Vdd_IO)"

    По моему мнению, в приведенной здесь http://bildr.org/2011/06/l3g4200d-arduino/ схеме не хватает как раз подключенного к VDD пина CS.
     
  11. grx1a

    grx1a Гик

    подал дополнительно на CS 3.3B от VCC и SDO, ничего не изменилось, все осталось так же как было. может все таки проблема в адресе I2C?
     
  12. roggedhorse

    roggedhorse Гик

    В библиотеке L3G адрес определяется вызовом autoDetectAddress()
    Так что проблема не в адресе скорее всего
     
  13. roggedhorse

    roggedhorse Гик

    Попробуйте после вызова
    gyro.enableDefault();
    в setup() вставить строку
    Код (Text):
    Serial.print("I am: ");Serial.println(readReg(L3G_WHO_AM_I), HEX);
    ответ должен быть I am: D3
     
  14. grx1a

    grx1a Гик

    даже не знаю что делать
     
  15. grx1a

    grx1a Гик

    вставил
    Serial.print("I am: ");Serial.println(readReg(L3G_WHO_AM_I), HEX);в код
    но после этого код не загружается на arduino, выдает ошибку 'readReg' was not declared in this scope
     
  16. roggedhorse

    roggedhorse Гик

    Упс, сорри
    Вместо readReg нужно написать gyro.readReg
     
  17. grx1a

    grx1a Гик

    сейчас код загрузился, но на serial monitor все равно чистый экран, ответ не приходит
     
  18. roggedhorse

    roggedhorse Гик

    Ок
    Тогда сделайте 2 вещи:
    1. Убедитесь, что Serial monitor у вас открыт на скорости 9600 (такой же, как в строке Serial.begin)
    2. Вставьте в коде L3G.cpp после каждой строчки в функции gyro.init() и gyro.enableDefault() что-нибудь типа Serial.println("Line ##");
    где ## - номер строки

    Чтобы понять, на каком моменте софт загибается
     
  19. grx1a

    grx1a Гик

    serial monitor везде стоит 9600, с L3G.cpp что то я наверное не правильно понял, открыл файл с таким именем через текстовый редактор, файл расположен в папке библиотек arduino /L3G/ но в нем что то я не нашел таких словосочетаний gyro.init() и gyro.enableDefault() ,вот он
    #include <L3G.h>
    #include <Wire.h>
    #include <math.h>
    // Defines ////////////////////////////////////////////////////////////////
    // The Arduino two-wire interface uses a 7-bit number for the address,
    // and sets the last bit correctly based on reads and writes
    #define L3G4200D_ADDRESS_SA0_LOW (0xD0 >> 1)
    #define L3G4200D_ADDRESS_SA0_HIGH (0xD2 >> 1)
    #define L3GD20_ADDRESS_SA0_LOW (0xD4 >> 1)
    #define L3GD20_ADDRESS_SA0_HIGH (0xD6 >> 1)
    // Public Methods //////////////////////////////////////////////////////////////
    bool L3G::init(byte device, byte sa0)
    {
    _device = device;
    switch (_device)
    {
    case L3G4200D_DEVICE:
    if (sa0 == L3G_SA0_LOW)
    {
    address = L3G4200D_ADDRESS_SA0_LOW;
    return true;
    }
    else if (sa0 == L3G_SA0_HIGH)
    {
    address = L3G4200D_ADDRESS_SA0_HIGH;
    return true;
    }
    else
    return autoDetectAddress();
    break;
    case L3GD20_DEVICE:
    if (sa0 == L3G_SA0_LOW)
    {
    address = L3GD20_ADDRESS_SA0_LOW;
    return true;
    }
    else if (sa0 == L3G_SA0_HIGH)
    {
    address = L3GD20_ADDRESS_SA0_HIGH;
    return true;
    }
    else
    return autoDetectAddress();
    break;
    default:
    return autoDetectAddress();
    }
    }
    // Turns on the L3G's gyro and places it in normal mode.
    void L3G::enableDefault(void)
    {
    // 0x0F = 0b00001111
    // Normal power mode, all axes enabled
    writeReg(L3G_CTRL_REG1, 0x0F);
    }
    // Writes a gyro register
    void L3G::writeReg(byte reg, byte value)
    {
    Wire.beginTransmission(address);
    Wire.write(reg);
    Wire.write(value);
    Wire.endTransmission();
    }
    // Reads a gyro register
    byte L3G::readReg(byte reg)
    {
    byte value;
    Wire.beginTransmission(address);
    Wire.write(reg);
    Wire.endTransmission();
    Wire.requestFrom(address, (byte)1);
    value = Wire.read();
    Wire.endTransmission();
    return value;
    }
    // Reads the 3 gyro channels and stores them in vector g
    void L3G::read()
    {
    Wire.beginTransmission(address);
    // assert the MSB of the address to get the gyro
    // to do slave-transmit subaddress updating.
    Wire.write(L3G_OUT_X_L | (1 << 7));
    Wire.endTransmission();
    Wire.requestFrom(address, (byte)6);
    while (Wire.available() < 6);
    uint8_t xlg = Wire.read();
    uint8_t xhg = Wire.read();
    uint8_t ylg = Wire.read();
    uint8_t yhg = Wire.read();
    uint8_t zlg = Wire.read();
    uint8_t zhg = Wire.read();
    // combine high and low bytes
    g.x = (int16_t)(xhg << 8 | xlg);
    g.y = (int16_t)(yhg << 8 | ylg);
    g.z = (int16_t)(zhg << 8 | zlg);
    }
    void L3G::vector_cross(const vector *a,const vector *b, vector *out)
    {
    out->x = a->y*b->z - a->z*b->y;
    out->y = a->z*b->x - a->x*b->z;
    out->z = a->x*b->y - a->y*b->x;
    }
    float L3G::vector_dot(const vector *a,const vector *b)
    {
    return a->x*b->x+a->y*b->y+a->z*b->z;
    }
    void L3G::vector_normalize(vector *a)
    {
    float mag = sqrt(vector_dot(a,a));
    a->x /= mag;
    a->y /= mag;
    a->z /= mag;
    }
    // Private Methods //////////////////////////////////////////////////////////////
    bool L3G::autoDetectAddress(void)
    {
    // try each possible address and stop if reading WHO_AM_I returns the expected response
    address = L3G4200D_ADDRESS_SA0_LOW;
    if (readReg(L3G_WHO_AM_I) == 0xD3) return true;
    address = L3G4200D_ADDRESS_SA0_HIGH;
    if (readReg(L3G_WHO_AM_I) == 0xD3) return true;
    address = L3GD20_ADDRESS_SA0_LOW;
    if (readReg(L3G_WHO_AM_I) == 0xD4) return true;
    address = L3GD20_ADDRESS_SA0_HIGH;
    if (readReg(L3G_WHO_AM_I) == 0xD4) return true;
    return false;
    }
    Может я не туда залез?
     
  20. roggedhorse

    roggedhorse Гик

    Вы открыли именно тот файл