Акселерометр своими руками - ФОРУМ ДВ Робот dvrobot.ru
Пятница, 16.11.2018, 07:46
Главная Мой профиль Регистрация Выход
  • НАШ МАГАЗИН
  • Вы вошли как Гость | Группа "Гости"Приветствую Вас, Гость
    [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
    • Страница 1 из 1
    • 1
    Модератор форума: GRACH, Serg  
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » Акселерометр своими руками (Модуль акселерометр на базе LIS302DL)
    Акселерометр своими руками
    VLADONixДата: Воскресенье, 06.10.2013, 03:24 | Сообщение # 1
    1.5 Вольт
    Группа: Пользователи
    Сообщений: 4
    Репутация: 0
    Статус: Offline

    Всем привет. Понадобился акселерометр для проекта, ну а я покупать втридорога готовые модули не привык. Решил спаять своими руками. ПРЕДУПРЕЖДАЮ тема для тех, кто умеет работать паяльником.
    Что понадобится:
    1. микросхема LIS302DL (купил у себя в городе за 50р. , но кое где цена превышает 200 р. и получается не очень выгодно);
    2. конденсатор 0.1 мкф

    Микросхема имеет 14 ног. Ножки 8, 9, 12 я не использовал.
    Пользуемся статьей http://easystm32.ru/sensors/49-lis302dl , узнаём обозначение ножек.

    I. Пайка контактов на LIS302DL

    Т. к. микросхема имеет неудобный корпус (LGA14) и я не имел при себе фена для пайки, пришлось удлинять контакты:
    Сделать это на самом деле не сложно : 1. Лудим ножки чипа; 2. Зажимаем чип каким-нибудь удобным образом; 3. Лудим жало паяльника( будет удобно, если получится так олово образует "сосульку"); 4. Прикладываем тонкий проводок к ножке и быстро касаемся кончиком олова; 6. Не забываем убрать флюс (я не парюсь и растворяю обычным бензином); 7. Прозваниваем каждую ножку (некоторые могут "пищать", например, ножки 2 и 5, т.к обозначают одно и то же GND-GND).

    II. Изготовление печатной платы (для удобства в подключении)
    У меня получилось так :

    Вот кому надо в формате .lay

    III. Пайка чипа на плату
    Ну тут ни чего хитрого нет. Конденсатор припаян внизу.


    IV. Программа

    Не забудьте подтянуть линии I2C резисторами по 10к Ом  к питанию.

    Код
    #include <Wire.h>

    #define i2cID 0x1D

    //TWI (I2C) sketch to communicate with the LIS302DL accelerometer - Modified and tested Ben Gatti - 6/9/2008
    //http://www.st.com/stonline/products/literature/ds/12726.pdf
    //Note 5.6K pullup resister on data lines.
    //Device is 3 volt was tested at 5 volts no level shifting.
    //Reference claims 6 volts is pin max.

    //Modified from // TWI (I2C) sketch to communicate with the LIS3LV02DQ accelerometer
    //http://www.nearfuturelaboratory.com/2007/01/11/arduino-and-twi/
    //Modified code from http://research.techkwondo.com/blog/julian/279
    //Thanks Julian.

    // Using the Wire library (created by Nicholas Zambetti)
    // http://wiring.org.co/reference/libraries/Wire/index.html
    // On the Arduino board, Analog In 4 is SDA, Analog In 5 is SCL
    // These correspond to pin 27 (PC4/ADC4/SDA) and pin 28 (PC5/ADC5/SCL) on the Atmega8
    // The Wire class handles the TWI transactions, abstracting the nitty-gritty to make
    // prototyping easy.
           
    void setup()

    {
           
         Wire.begin(); // join i2c bus (address optional for master)
         Serial.begin(57600);
           
         Serial.println("Wire.begin");
            
         Wire.beginTransmission(i2cID);
         Wire.send(0x21); // CTRL_REG2 (21h)
         Wire.send(B01000000);
         //SPI 4/3 wire
         //1=ReBoot - reset chip defaults
         //n/a
         //filter off/on
         //filter for freefall 2
         //filter for freefall 1
         //filter freq MSB
         //filter freq LSB - Hipass filter (at 400hz) 00=8hz, 01=4hz, 10=2hz, 11=1hz (lower by 4x if sample rate is 100hz)      
         Wire.endTransmission();

         Wire.beginTransmission(i2cID);
         Wire.send(0x20); // CTRL_REG1 (20h)
         Wire.send(B01000111);
         //sample rate 100/400hz
         //power off/on
         //2g/8g
         //self test
         //self test
         //z enable
         //y enable
         //x enable
         Wire.endTransmission();

    }

    void loop()
    {

    #define outXhigh 0x29
    #define outYhigh 0x2B
    #define outZhigh 0x2D
    #define statusReg 0x27

    boolean goodRead;
    goodRead = false;

    //----------Status Register-----------------------
         byte status;
         status = B00000000;
         //

    //-------------------------------
         Wire.beginTransmission(i2cID);
         Wire.send(statusReg);
         Wire.endTransmission();
             
         Wire.requestFrom(i2cID, 1);
         if(Wire.available())
        {
          status = Wire.receive();
        }

    //----------X Values-----------------------
         byte x_val;

    //-------------------------------
         Wire.beginTransmission(i2cID);
         Wire.send(outXhigh);
         Wire.endTransmission();
             
    Wire.requestFrom(i2cID, 1);
    if(Wire.available())
        {
          x_val = Wire.receive();
        }

    //----------Y Values-----------------------
         byte y_val;

    //-------------------------------
         Wire.beginTransmission(i2cID);
         Wire.send(outYhigh);
         Wire.endTransmission();
             
    Wire.requestFrom(i2cID, 1);
    if(Wire.available())
        {
          y_val = Wire.receive();
        }
           
        //----------Z Values-----------------------
         byte z_val;

    //-------------------------------
         Wire.beginTransmission(i2cID);
         Wire.send(outZhigh);
         Wire.endTransmission();
             
    Wire.requestFrom(i2cID, 1);
    if(Wire.available())
        {
          z_val = Wire.receive();
          goodRead=true;
        }
    //-------------------------------    
           
           
        if (goodRead==true)
        {

    //Serial.print("x_val_l= "); Serial.println(x_val_l, DEC);
    //Serial.print("x_val_h= "); Serial.println(x_val_h, DEC);
    //Serial.print("x_val= "); Serial.println(x_val, DEC);

    //Serial.print("y_val_l= "); Serial.println(y_val_l, DEC);
    //Serial.print("y_val_h= "); Serial.println(y_val_h, DEC);
    //Serial.print("y_val= "); Serial.println(y_val, DEC);

    //Serial.print("z_val_l= "); Serial.println(z_val_l, DEC);
    //Serial.print("z_val_h= "); Serial.println(z_val_h, DEC);
    Serial.print("status "); Serial.println(status, BIN);    
    Serial.print(" val= "); Serial.print(x_val, DEC);    
    Serial.print(":"); Serial.print(y_val, DEC);    
    Serial.print(":"); Serial.println(z_val, DEC);
        }
        else
    Serial.print("no data");
           
         delay(100);
    }


    Спасибо. Кому что не понятно спрашивайте.

    Добавлено (06.10.2013, 03:24)
    ---------------------------------------------
    Не судите строго - первая тема.
    Прикрепления: 8554139.jpg(229.6 Kb) · 9750812.png(5.3 Kb) · 9219232.jpg(219.6 Kb) · 2089864.jpg(275.2 Kb) · Acseleromrtr.lay(7.6 Kb)
     
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » Акселерометр своими руками (Модуль акселерометр на базе LIS302DL)
    • Страница 1 из 1
    • 1
    Поиск:

    ДВ Робот - Чат