Датчик- компас GY-271 - ФОРУМ ДВ Робот dvrobot.ru
Четверг, 16.05.2024, 20:12
Главная Мой профиль Регистрация Выход
  • НАШ МАГАЗИН
  • Вы вошли как Гость | Группа "Гости"Приветствую Вас, Гость
    [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
    • Страница 1 из 1
    • 1
    Модератор форума: GRACH, Serg  
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » Датчик- компас GY-271 (Пробуем получить первые результаты от компаса)
    Датчик- компас GY-271
    SergДата: Пятница, 11.01.2013, 00:12 | Сообщение # 1
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Приобрести можно здесь
    Попробуем этот модуль компаса. Нам потребуется:
    1. любая плата Arduino
    2. дисплей 2 строки по 16 символов


    Для более удобного восприятия выведем данные от компаса на дисплей. Научившись это делать, легко можно будет управлять моторами или любыми движущимися шасси.

    Начинаем работу. Для это подключаем:
    Arduino----- модуль
    +3,3V --------+3,3V
    GND ----------GND
    А4 -----------SDA
    A5 -----------SCL
    Вывод DRDY компаса можно не подключать. На него выходит сигнал о готовности компаса к работе после самокалибровки.

    Соединяем Arduino c дисплеем по этой схеме:



    Не будем изобретать велосипед и пользуемся готовыми библиотеками от разработчиков.
    Код

    #include "Wire.h"// подключаем библиотеки
    #include "HMC5883L.h"  // для компаса
    #include <LiquidCrystal.h>// и дисплея
    HMC5883L compass;
    // тут выводы для подключения дисплея      
    LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //
    int Data;
    void setup(){

           Wire.begin();
           lcd.begin(16, 2);//инициализация дисплея
           lcd.print("< DV-ROBOT >");// реклама магазина))
           delay(2000);
           compass.SetMeasurementMode(Measurement_Continuous); //устанавливаем непрерывный режим работы компаса
    }

    void loop(){
           lcd.setCursor(0, 1);// устанавливаем курсор      
           float heading = getHeading();
           Data  =    heading /1.00; // избавлемся от знаков после запятой (округляем до целого числа)
           lcd.clear(); //очищаем дисплей от предыдущего значения
           lcd.print(Data);// выводим на дисплей новое значение
           delay(250); // обновляем значение на дисплее через 0,25секунд
    }

    float getHeading(){      
           // основная функция считывания данных с компаса и расчета  направления
           MagnetometerScaled scaled = compass.ReadScaledAxis(); // получаем значения с датчика
           float heading = atan2(scaled.YAxis, scaled.XAxis);    // расчет направления поворота

           // корректируем значения с учетом знаков
           if(heading < 0) heading += 2*PI;
           if(heading > 2*PI) heading -= 2*PI;

           return heading * RAD_TO_DEG; // переводим радианы в удобные для восприятия градусы 0-360
    }


    К сожалению, этот модуль нельзя использовать в качестве реального компаса. У него есть такая особенность- наклон в вертикальной плоскости приводит к искажению реальных значений его положения в горизонтальной плоскости. Проще говоря- что бы не заблудится с ним в лесу- надо держать его строго горизонтально. Для компенсации этих отклонений нужен дополнительный гироскоп, который будет высчитывать наклон и вносить поправку. Ну и, как любой компас, этот модуль хорошо " чувствует" намагниченные предметы около себя.

    Область применения модуля:
    1. Управление сервоприводами рулевого управления колесного шасси. Наклоняем пульт управления влево-вправо и колеса соответственно изменяют направление.
    2. Охранная сигнализация. Модуль хорошо свое положение в пространстве. Устанавливаем модуль компаса в охраняемом обьекте, например автомобиле. И при любой попытке сдвинуть, пошевелить, толкнуть модуль выдаст микроконтроллеру сигнал о изменении своего положения.
    3. Еще много чего... biggrin
    Ну и напоследок видео:


    Библиотеку от разработчиков скачиваем здесь.
    Прикрепления: HMC5883L-Arduin.zip (6.7 Kb)
     
    CyberДата: Суббота, 15.06.2013, 04:43 | Сообщение # 2
    1.5 Вольт
    Группа: Пользователи
    Сообщений: 4
    Репутация: 0
    Статус: Offline
    Всем доброго времени!  Какая  все-таки у Вас используется платка в проекте?
     Гугля по просторам инета, вот нашел: 1. http://ru.aliexpress.com/item/GY-272-HMC5883L-3V-System-Interface-Triple-Axis-Compass-Magnetometer-Sensor-Module/709768971.html одна микросхема HMC5883L с элементами обвязки согласно даташит, и какойбольшой на нем электролит, видимо фильтрация питания.

    2. http://ru.aliexpress.com/item/GY-271-HMC5883L-module-electronic-compass-compass-module-three-axis-magnetic-field-sensor/764678739.html Микросхема HMC5883L с элементами обвязки согласно даташит, скорее всегостабилизатор питания и наверно преобразователь логических уровней на
    транзисторной сборке.

    3.  http://www.dvrobot.ru/shop/i269.GY-271_Datchik-_kompas.htmздесь на фото что-то  другое http://www.dvrobot.ru/images/shop_items/269.jpg.По всей видимости стоит стабилизатор питания и элементы обвязки. Я себе здесь
    такой заказал.

    И естественно вопросы.1.Так что же это за зверь.которого я себе заказал?

    2. И в вышеописанном проектетребуется или нет согласование логических уровней?
     
    SergДата: Суббота, 15.06.2013, 12:25 | Сообщение # 3
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Используется плата от магазина "Дв-Робот". Вот ссылка http://www.dvrobot.ru/shop/i269.GY-271_Datchik-_kompas.htm
    Согласование уровней не нужно.
     
    SergДата: Суббота, 15.06.2013, 23:42 | Сообщение # 4
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Мне непонятен смысл всех ваших вопросов. Что вас смущает?
     
    CyberДата: Суббота, 15.06.2013, 23:51 | Сообщение # 5
    1.5 Вольт
    Группа: Пользователи
    Сообщений: 4
    Репутация: 0
    Статус: Offline
    Меня смущает Вопрос согласования логических уровней. И второе что это не модуль GY-271 а какая то недоделанная эго копия хотя чипы одинаковые.
     
    SergДата: Суббота, 15.06.2013, 23:59 | Сообщение # 6
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Компас, купленный в магазине "Дв-Робот", не нуждается в согласовании логических уровней. Это прекрасно видно на видео в первом сообщении.
    Arduino прекрасно воспринимает уровни напряжения от компаса.
    Это не недоделанная копия, просто на ней нет стабилизатора напряжения 3,3 Вольт. В стабилизаторе нет необходимости, так как он имеется на плате Arduino.
     
    CyberДата: Воскресенье, 16.06.2013, 00:03 | Сообщение # 7
    1.5 Вольт
    Группа: Пользователи
    Сообщений: 4
    Репутация: 0
    Статус: Offline
    Спасибо за понимание и ответ! но по фотографиям там как раз и есть стабилизатор а нет согласования уровней
     
    SergДата: Воскресенье, 16.06.2013, 00:12 | Сообщение # 8
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Зачем нужно два одинаковых стабилизатора? Зачем нужно согласовывать логические уровни? Если все работает без проблем, зачем создать сложности на пустом месте?
    Компас с фотографии может подключаться к источнику 5 Вольт через стабилизатор и к источнику 3,3 Вольта в обход стабилизатора.
     
    CyberДата: Воскресенье, 16.06.2013, 00:15 | Сообщение # 9
    1.5 Вольт
    Группа: Пользователи
    Сообщений: 4
    Репутация: 0
    Статус: Offline
    Вот в этой ветке http://forumdvrobot.ru/forum/2-38-1 я понял что получен горький опыт когда нет согласования уровней
     
    SergДата: Воскресенье, 16.06.2013, 00:28 | Сообщение # 10
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    Ну если вы не верите своим глазам, то сделайте согласование уровней. smile
    Будет полезно ознакомиться про толерантность.
     
    aalleexxaaДата: Понедельник, 01.07.2013, 01:04 | Сообщение # 11
    1.5 Вольт
    Группа: Пользователи
    Сообщений: 1
    Репутация: 0
    Статус: Offline
    Здравствуйте, опишу свою проблему. I2C работает удачно, потому что чтение Identification Register совпадает со значениями из даташита.
    Устанавливаю настройки в регистре A=16 (default 0x10),  в регистре B=224 (0xE0   +-8.1Ga, 230 Gain/LSb/Gauss ), в регистре Mode 0. При чтении старших регистров значений по осям получаю либо 255 в десятичном (0xFF) или 0 (0x00), хотя согласно даташита при положительном направлении оси я должен получить в старшем байте 0x7, а при отрицательном 0xF7, при чем 0 получаю для оси X примерно только в одной четверти, для остальных не смотрел. и у меня почему-то при небольшом отклонении от горизонтальности в некоторых положениях значения данных скачут (вместо 0 в старшем байте могу получить уже 255 или наоборот для осей X и Y). Бывали у вас такие проблемы?
    Что я делаю не так?
    Можете еще выложить свои данные (имеено данные, которые получаете от компаса без математики)?
    еще вопрос: корректируете ли вы угол после математичесих расчетов значением Magnetic declination (местами встречал это в каких-то проектах Ardunio)?
     
    HippoДата: Понедельник, 15.06.2015, 16:03 | Сообщение # 12
    1.5 Вольт
    Группа: Пользователи
    Сообщений: 2
    Репутация: 0
    Статус: Offline
    Дорогие форумчане! Нужна ваша помощь!
    Купил я значит вот такой датчик http://ru.aliexpress.com/item/3V-5V-HMC5883L-Triple-Axis-Compass-Magnetometer-Sensor-Module-For-Arduino-Hot-sale/32259879923.html. Далее в поисках способа подключения, наткнулся на ваш форум. Я немного переделал представленный скетч, а именно, убрал работу с дисплеем. так как его у меня нет. Ещё одним отличием от вашего способа подключения является то, что у меня Arduino Mega 2560, и я подключил SDA и SCl с датчика к SDA и SCl на плате. 
    Код скетча:
    
    Код
    #include "Wire.h"// подключаем библиотеки  
      #include "HMC5883L.h"  // для компаса  
       
      HMC5883L compass;  

      int Data;  
       
      void setup(){  
            Serial.begin(9600);
            Wire.begin();  
            //delay(2000);  
            compass.SetMeasurementMode(Measurement_Continuous); //устанавливаем непрерывный режим работы компаса  
      }  

      void loop(){       
            float Heading = getHeading();  
            Data = Heading /1.00; // избавлемся от знаков после запятой (округляем до целого числа)  
            Serial.println(Data);
            delay(100); // обновляем значение на дисплее через 0,25секунд  
      }  

      float getHeading(){       
            // основная функция считывания данных с компаса и расчета  направления  
            MagnetometerScaled scaled = compass.ReadScaledAxis(); // получаем значения с датчика  
            float Heading = atan2(scaled.YAxis, scaled.XAxis);    // расчет направления поворота  

            // корректируем значения с учетом знаков  
            if(Heading < 0) Heading += 2*PI;  
            if(Heading > 2*PI) Heading -= 2*PI;  

            return Heading * RAD_TO_DEG; // переводим радианы в удобные для восприятия градусы 0-360
            //Serial.println(heading);
      }
    И вот долгожданный результат работы:

    Собственно возникает вопрос, почему датчик выдаёт такие значения? Как я его не крутил, значения не менялись. к тому же я убрал все металлические предметы подальше, но результата всё равно нет. В чём может быть проблема?
    Заранее спасибо.
    Прикрепления: 4774052.png (27.7 Kb)
     
    SergДата: Понедельник, 15.06.2015, 19:38 | Сообщение # 13
    Ампер
    Группа: Модераторы
    Сообщений: 510
    Репутация: 28
    Статус: Offline
    http://dvrobot.ru/forum/blog/2/entry-105/
    подключение к ножкам 20 и 21 не перепутали?
     
    HippoДата: Среда, 17.06.2015, 18:19 | Сообщение # 14
    1.5 Вольт
    Группа: Пользователи
    Сообщений: 2
    Репутация: 0
    Статус: Offline
    Сначала я тоже так подумал, что тупо перепутал ножки, но потом оказалось, что если пины переставить, то датчик вообще ничего не пишет.
     
    ФОРУМ ДВ Робот dvrobot.ru » DV ROBOT » Библиотека Проектов » Датчик- компас GY-271 (Пробуем получить первые результаты от компаса)
    • Страница 1 из 1
    • 1
    Поиск:

    ДВ Робот - Чат