Помогите плиз заставить HMC5883L заставить работать

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем ToxaRU, 12 май 2015.

  1. ToxaRU

    ToxaRU Гик

    Помогите ламеру.... Есть скетчь нужного мне робота, там используется шильд с библиотекой afmotor.h управления моторами. у меня нет шильда и покупать не хочется, но есть драйверы моторов L298N целых 2 штуки.... Так вот могу ли я как нибудь присандалить вместо шильда драйвер мотора чтобы не химичить со скетчем(а то я не силен-могу только чужое ковырять) И как грамотно заменить LSM303 на hmc5883L? Огромнейшее спасибо всем кто чем нить поможет....))))

    Скетчь ниже в сообщении))))
     
    Последнее редактирование: 12 май 2015
  2. DrProg

    DrProg Вечный нерд

    Код нужно вставлять в специальное окно а не в текст сообщения, так он отображается неправильно и читать неудобно. Кнопка возле кавычек, попробуйте.
     
    ToxaRU нравится это.
  3. ToxaRU

    ToxaRU Гик

    Код (Text):
    // Compass Rider - Робот удерживающий направление
    // Note: робот поворачивается по кратчайшему пути!
    // http://blockduino.org/
    // http://blockduino.blogger.com/2013/10/compass-rider.html
    // Vasyl Yudin
    // Oct 2013

    #include <Wire.h>  // библиотека для подключения по протоколу I2C
    #include <LSM303.h>  // библиотека для работы с микросхемой LSM303
    //#include <BDMotor.h>    // для BlockDuino и BlockMotor
    #include <AFMotor.h>  // для Arduino и MotorShield

    #define SPEED 255        // скорость вращения моторчиков, 255 - максимум
    #define LED_PIN 13      // номер порта для ножки индикаторного светодиода

    int sensor;              // переменная для хранения показания сенсора
    int dir = 180;  // заданное направление
    int tol = 20;  // допустимая точность удерживания направления

    AF_DCMotor mL(1);        // #1 моторчик левой гусеницы
    AF_DCMotor mR(4);        // #2 моторчик правой гусеницы

    LSM303 compass;

    void setup() {
      Serial.begin(9600);      // Создаем подключение серийного порта
      Wire.begin();      // Подключаем протокол I2C
      compass.init();    // подключаем и
      compass.enableDefault();  // запускаем компас
      // Значение калибровки. Используйте пример Calibrate для вашего компаса
      compass.m_min.x = -543; compass.m_min.y = -303; compass.m_min.z = -300;
      compass.m_max.x = +195; compass.m_max.y = +408; compass.m_max.z = 312;

      pinMode(LED_PIN, OUTPUT); // Объявляем порт индикаторного светодиода

      mL.setSpeed(SPEED);    // устанавливаем скорость вращения левого моторчика
      mR.setSpeed(SPEED);    // устанавливаем скорость вращения правого моторчика
    }

    void loop() { // -------  Основное тело программы
      compass.read();            // считываем показания компаса
      int heading = compass.heading();  // вынимаем из показаний величину направление компаса
      if (abs(heading - sensor)>320) sensor = heading; // отсекаем проблемный переход из 359° в 1°
      sensor = (int)digitalLowPass(sensor, heading, 0.7);  // отфильтровываем показания компаса (сглаживаем)
      int dif = sensor - dir;    // вычисляем разницу между реальным направлением и заданным
      int absdif = abs(dif);
      if (absdif <= tol) Stop();        // если разница меньше допустимой погрешности, то останавливаемся
        else if (((absdif > 180) && (dif != absdif)) || ((absdif < 180) && (dif == absdif))) TurnLeft();  // иначе определяем кратчайшее направление поворота
              else TurnRight();
    //  delay(25);

    } // конец основной программы, начинаем все сначала

    //
    // Подпрограммы
    //
    // Цифровой низкочастотный фильт
    double digitalLowPass(double last_smoothed, double new_value, double filterVal)
    {
      return (new_value * (1 - filterVal)) + (last_smoothed * filterVal);
    }

    void Stop(){  // подпрограмма Остановка
          mL.run(RELEASE);
          mR.run(RELEASE);
          digitalWrite(LED_PIN, HIGH);
    }

    void TurnRight(){ // подпрограмма Поворот направо
          mL.run(FORWARD);
          mR.run(BACKWARD);
          digitalWrite(LED_PIN, LOW);
    }

    void TurnLeft(){ // подпрограмма Поворот налево
          mR.run(FORWARD);
          mL.run(BACKWARD);
          digitalWrite(LED_PIN, LOW);
    }
     


    Спасибо за подсказку поправил))) ПоМогИтЕ кТо чем можеТ!!!))) Очень хочу такую игрушку))
     
    Последнее редактирование: 12 май 2015
  4. ANV

    ANV Гуру

    1. Какой шилд в оригинале?
    2. Компас заменяется легко, т.к. по коду от него сразу получают азимут и дальше работают с ним, а не некими абстрактными величинами.
     
  5. ToxaRU

    ToxaRU Гик


    а вот видео этого самокатика

    а вот статья про него http://blockduino.blogspot.ru/2013/10/compass-rider.html а какой там шильд незнаю... просто ребенку хотел что то простенькое собрать.... первый опыт... понравилась фигулька... собрать то соберу а как в скетче шильд на драйвер поменять и магнитометр не вкурю никак))) второй день капашусь пытаюсь что нить изменить-сплошная ошибка(((
     
  6. ToxaRU

    ToxaRU Гик

    Люди ну помогите пожалуйста.... Может еще кому захочется собрать потом.... Хочу такую штуку... железо есть-мозгов нет((((
     
  7. vvr

    vvr Инженерище

    мозги надо под конкретное железо писать:)
     
  8. iglooshtosser

    iglooshtosser Гик

    В оригинале такой: http://blockduino.org/mediawiki/index.php?title=BlockMotor
    Как опция, предлагается такой: http://robotosha.ru/arduino/motor-shield.html

    Это если судить по библиотекам в коде. В обоих случаях используется L293D

    Тут есть схема шилда на L298: http://amperka.ru/product/arduino-motor-shield и библиотека для работы с ним.
    Исходный скретч нужно будет немного переделать. Но тут выбор или купть шилд или напрячь голову ;)
     
    ToxaRU нравится это.
  9. vvr

    vvr Инженерище

    в скетче используется библиотека под определённый шилд.
    поставите другой - ковыряйте библиотеку:)
     
  10. ToxaRU

    ToxaRU Гик

    Да конкретней некуда))))))) Arduinка Nano+HMC5883L+драйвер мотора L298N- тем более как я понял(возможно неправильно) в скетче основное прописано, просто надо поменять датчик магнитометр(библиотеки и переменные) и вместо шильда(библиотека <AFMotor.h>) ввести драйвер мотора.... А как сделать не соображу.... Хотя если по правде чтобы сообразить конкретно знаний не хватает... пытался сравнить примеры и поменять библиотеки и переменные но ничего не вышло... Если кто возьмется в свободное время поковыряться рублей 500 на тел закину по результату не в качестве оплаты проекта, а скажем за интерес))) хотелось бы к этой крутилки еще пультик присандалить)) А может кто видел подобные проекты? скинте что есть почитать
     
  11. ToxaRU

    ToxaRU Гик


    Голова кипит....напрягается....перегревается...... а результат пар из ушей и ноль результата))))))))
     
  12. ToxaRU

    ToxaRU Гик


    А Вы про библиотеку StepperAmperka говорите она вроде для шаговых двигателей а у меня обычный колекторный? А она для драйвера подойдет L298N, а то как я понял драйвер и шильд немного разные вещи и вроде как драйвер без библиотек управляется, сразу с пинов ардуинки......
     
  13. iglooshtosser

    iglooshtosser Гик

    Да вы схемку-то амперкиного шилда посмотрите. Он очень прост.
     
  14. ToxaRU

    ToxaRU Гик

    Установил библиотеку, загрузил пример и как понял там с шаговиком работа.... у меня колекторные моторы и драйвер для них L298N помоему это не совсем то Или я как всегда что то не понял?
     
  15. ToxaRU

    ToxaRU Гик

    Посидел посмотрел примеры работы с драйвером L298N и родил вот это:

    Код (Text):
    // Compass Rider - Робот удерживающий направление
    // Note: робот поворачивается по кратчайшему пути!
    // http://blockduino.org/
    // http://blockduino.blogger.com/2013/10/compass-rider.html
    // Vasyl Yudin
    // Oct 2013

    #include <Wire.h>  // библиотека для подключения по протоколу I2C
    #include <LSM303.h>  // библиотека для работы с микросхемой LSM303

    #define LED_PIN 13      // номер порта для ножки индикаторного светодиода

    int IN3 = 5;
    int IN4 = 4;
    int ENB = 3;
    int sensor;              // переменная для хранения показания сенсора
    int dir = 180;  // заданное направление
    int tol = 20;  // допустимая точность удерживания направления

    LSM303 compass;

    void setup() {
      pinMode (ENB, OUTPUT);
      pinMode (IN3, OUTPUT);
      pinMode (IN4, OUTPUT);
      Serial.begin(9600);      // Создаем подключение серийного порта
      Wire.begin();      // Подключаем протокол I2C
      compass.init();    // подключаем и
      compass.enableDefault();  // запускаем компас
      // Значение калибровки. Используйте пример Calibrate для вашего компаса
      compass.m_min.x = -543; compass.m_min.y = -303; compass.m_min.z = -300;
      compass.m_max.x = +195; compass.m_max.y = +408; compass.m_max.z = 312;

      pinMode(LED_PIN, OUTPUT); // Объявляем порт индикаторного светодиода

    }

    void loop() { // -------  Основное тело программы
      compass.read();            // считываем показания компаса
      int heading = compass.heading();  // вынимаем из показаний величину направление компаса
      if (abs(heading - sensor)>320) sensor = heading; // отсекаем проблемный переход из 359° в 1°
      sensor = (int)digitalLowPass(sensor, heading, 0.7);  // отфильтровываем показания компаса (сглаживаем)
      int dif = sensor - dir;    // вычисляем разницу между реальным направлением и заданным
      int absdif = abs(dif);
      if (absdif <= tol) Stop();        // если разница меньше допустимой погрешности, то останавливаемся
        else if (((absdif > 180) && (dif != absdif)) || ((absdif < 180) && (dif == absdif))) TurnLeft();  // иначе определяем кратчайшее направление поворота
              else TurnRight();
    //  delay(25);

    } // конец основной программы, начинаем все сначала

    //
    // Подпрограммы
    //
    // Цифровой низкочастотный фильт
    double digitalLowPass(double last_smoothed, double new_value, double filterVal)
    {
      return (new_value * (1 - filterVal)) + (last_smoothed * filterVal);
    }

    void Stop(){  // подпрограмма Остановка
          digitalWrite (IN3, LOW);
          digitalWrite (IN4, LOW);
          analogWrite(ENB,0);
          delay(200);
    }

    void TurnRight(){ // подпрограмма Поворот направо
          digitalWrite (IN3, HIGH);
          digitalWrite (IN4, LOW);
          analogWrite(ENB,255);
      delay(200);
    }

    void TurnLeft(){ // подпрограмма Поворот налево
          digitalWrite (IN3, LOW);
          digitalWrite (IN4, HIGH);
          analogWrite(ENB,255);
          delay(200);
    }
     
    Тут есть хоть чуть чуть правды?.......... Или опять мимо....? И направте пожалуйста в нужное русло как магнитометр поменять на hmc5883L.... ?))) сие творение не проверял так как магнитометр как в скетче отсутствует а есть только 5883L...
     
    Последнее редактирование: 14 май 2015
  16. ToxaRU

    ToxaRU Гик

    Ковыряюсь пол дня-подскажите безграмотному где капать........
    Код (Text):
    // Compass Rider - Робот удерживающий направление
    // Note: робот поворачивается по кратчайшему пути!
    // http://blockduino.org/
    // http://blockduino.blogger.com/2013/10/compass-rider.html
    // Vasyl Yudin
    // Oct 2013

    #include "Wire.h"  // библиотека для подключения по протоколу I2C
    #include "I2Cdev.h"
    #include "HMC5883L.h"

    #define LED_PIN 13      // номер порта для ножки индикаторного светодиода

    int IN3 = 5;
    int IN4 = 4;
    int ENB = 3;
    int sensor;              // переменная для хранения показания сенсора
    int dir = 180;  // заданное направление
    int tol = 20;  // допустимая точность удерживания направления

    HMC5883L compass;

    void setup() {
      pinMode (ENB, OUTPUT);
      pinMode (IN3, OUTPUT);
      pinMode (IN4, OUTPUT);
      Serial.begin(9600);      // Создаем подключение серийного порта
      Wire.begin();      // Подключаем протокол I2C
     
      compass = HMC5883L();  // создаем экземпляр HMC5883L библиотеки
      setupHMC5883L();      // инициализация HMC5883L
     
      // Значение калибровки. Используйте пример Calibrate для вашего компаса
      //compass.m_min.x = -543; compass.m_min.y = -303; compass.m_min.z = -300;
    // compass.m_max.x = +195; compass.m_max.y = +408; compass.m_max.z = 312;

      pinMode(LED_PIN, OUTPUT); // Объявляем порт индикаторного светодиода

    }

    void loop() { // -------  Основное тело программы
      compass.read();            // считываем показания компаса
      int heading = compass.heading();  // вынимаем из показаний величину направление компаса
      if (abs(heading - sensor)>320) sensor = heading; // отсекаем проблемный переход из 359° в 1°
      sensor = (int)digitalLowPass(sensor, heading, 0.7);  // отфильтровываем показания компаса (сглаживаем)
      int dif = sensor - dir;    // вычисляем разницу между реальным направлением и заданным
      int absdif = abs(dif);
      if (absdif <= tol) Stop();        // если разница меньше допустимой погрешности, то останавливаемся
        else if (((absdif > 180) && (dif != absdif)) || ((absdif < 180) && (dif == absdif))) TurnLeft();  // иначе определяем кратчайшее направление поворота
              else TurnRight();
    //  delay(25);

    } // конец основной программы, начинаем все сначала

    //
    // Подпрограммы
    //
    // Цифровой низкочастотный фильт
    double digitalLowPass(double last_smoothed, double new_value, double filterVal)
    {
      return (new_value * (1 - filterVal)) + (last_smoothed * filterVal);
    }

    void Stop(){  // подпрограмма Остановка
          digitalWrite (IN3, LOW);
          digitalWrite (IN4, LOW);
          analogWrite(ENB,0);
          delay(200);
    }

    void TurnRight(){ // подпрограмма Поворот направо
          digitalWrite (IN3, HIGH);
          digitalWrite (IN4, LOW);
          analogWrite(ENB,255);
      delay(200);
    }

    void TurnLeft(){ // подпрограмма Поворот налево
          digitalWrite (IN3, LOW);
          digitalWrite (IN4, HIGH);
          analogWrite(ENB,255);
          delay(200);
    }
     
    Постоянно ошибки и подсвечивается желтым setupHMC5883L(); // инициализация HMC5883L
    библиотеки все стоят..... возможно глупость наисправлял-ну хоть глянте где пожалуйста
     
  17. ToxaRU

    ToxaRU Гик

    Пытаюсь поменять в скетче магнитометр на HMC5883L....полная засада-помогите плиз кто чем может:
    Вот исходный вариант
    Код (Text):
    // Compass Rider - Робот удерживающий направление
    // Note: робот поворачивается по кратчайшему пути!
    // http://blockduino.org/
    // http://blockduino.blogger.com/2013/10/compass-rider.html
    // Vasyl Yudin
    // Oct 2013
    int IN3 = 5;
    int IN4 = 4;
    int ENB = 3;

    #include <Wire.h>  // библиотека для подключения по протоколу I2C
    #include <LSM303.h>  // библиотека для работы с микросхемой LSM303

    #define LED_PIN 13      // номер порта для ножки индикаторного светодиода

    int sensor;              // переменная для хранения показания сенсора
    int dir = 180;  // заданное направление
    int tol = 20;  // допустимая точность удерживания направления

    LSM303 compass;

    void setup() {
      pinMode (ENB, OUTPUT);
      pinMode (IN3, OUTPUT);
      pinMode (IN4, OUTPUT);
      Serial.begin(9600);      // Создаем подключение серийного порта
      Wire.begin();      // Подключаем протокол I2C
      compass.init();    // подключаем и
      compass.enableDefault();  // запускаем компас
      // Значение калибровки. Используйте пример Calibrate для вашего компаса
      compass.m_min.x = -543; compass.m_min.y = -303; compass.m_min.z = -300;
      compass.m_max.x = +195; compass.m_max.y = +408; compass.m_max.z = 312;

      pinMode(LED_PIN, OUTPUT); // Объявляем порт индикаторного светодиода

      //mL.setSpeed(SPEED);    // устанавливаем скорость вращения левого моторчика
      //mR.setSpeed(SPEED);    // устанавливаем скорость вращения правого моторчика
    }

    void loop() { // -------  Основное тело программы
      compass.read();            // считываем показания компаса
      int heading = compass.heading();  // вынимаем из показаний величину направление компаса
      if (abs(heading - sensor)>320) sensor = heading; // отсекаем проблемный переход из 359° в 1°
      sensor = (int)digitalLowPass(sensor, heading, 0.7);  // отфильтровываем показания компаса (сглаживаем)
      int dif = sensor - dir;    // вычисляем разницу между реальным направлением и заданным
      int absdif = abs(dif);
      if (absdif <= tol) Stop();        // если разница меньше допустимой погрешности, то останавливаемся
        else if (((absdif > 180) && (dif != absdif)) || ((absdif < 180) && (dif == absdif))) TurnLeft();  // иначе определяем кратчайшее направление поворота
              else TurnRight();
    //  delay(25);

    } // конец основной программы, начинаем все сначала

    //
    // Подпрограммы
    //
    // Цифровой низкочастотный фильт
    double digitalLowPass(double last_smoothed, double new_value, double filterVal)
    {
      return (new_value * (1 - filterVal)) + (last_smoothed * filterVal);
    }

    void Stop(){  // подпрограмма Остановка
          digitalWrite (IN3, LOW);
          digitalWrite (IN4, LOW);
          analogWrite(ENB,0);
          delay(200);
    }

    void TurnRight(){ // подпрограмма Поворот направо
          digitalWrite (IN3, HIGH);
          digitalWrite (IN4, LOW);
          analogWrite(ENB,255);
      delay(200);
    }

    void TurnLeft(){ // подпрограмма Поворот налево
          digitalWrite (IN3, LOW);
          digitalWrite (IN4, HIGH);
          analogWrite(ENB,255);
          delay(200);
    }
     
    А вот мои безграмотные мытарства
    Код (Text):
    // Compass Rider - Робот удерживающий направление
    // Note: робот поворачивается по кратчайшему пути!
    // http://blockduino.org/
    // http://blockduino.blogger.com/2013/10/compass-rider.html
    // Vasyl Yudin
    // Oct 2013

    #include "Wire.h"  // библиотека для подключения по протоколу I2C
    #include "I2Cdev.h"
    #include "HMC5883L.h"

    #define LED_PIN 13      // номер порта для ножки индикаторного светодиода

    int IN3 = 5;
    int IN4 = 4;
    int ENB = 3;
    int sensor;              // переменная для хранения показания сенсора
    int dir = 180;  // заданное направление
    int tol = 20;  // допустимая точность удерживания направления

    HMC5883L compass;

    void setup() {
      pinMode (ENB, OUTPUT);
      pinMode (IN3, OUTPUT);
      pinMode (IN4, OUTPUT);
      Serial.begin(9600);      // Создаем подключение серийного порта
      Wire.begin();      // Подключаем протокол I2C
     
      compass = HMC5883L();  // создаем экземпляр HMC5883L библиотеки
      setupHMC5883L();      // инициализация HMC5883L
     
      // Значение калибровки. Используйте пример Calibrate для вашего компаса
      //compass.m_min.x = -543; compass.m_min.y = -303; compass.m_min.z = -300;
    // compass.m_max.x = +195; compass.m_max.y = +408; compass.m_max.z = 312;

      pinMode(LED_PIN, OUTPUT); // Объявляем порт индикаторного светодиода

    }

    void loop() { // -------  Основное тело программы
      compass.read();            // считываем показания компаса
      int heading = compass.heading();  // вынимаем из показаний величину направление компаса
      if (abs(heading - sensor)>320) sensor = heading; // отсекаем проблемный переход из 359° в 1°
      sensor = (int)digitalLowPass(sensor, heading, 0.7);  // отфильтровываем показания компаса (сглаживаем)
      int dif = sensor - dir;    // вычисляем разницу между реальным направлением и заданным
      int absdif = abs(dif);
      if (absdif <= tol) Stop();        // если разница меньше допустимой погрешности, то останавливаемся
        else if (((absdif > 180) && (dif != absdif)) || ((absdif < 180) && (dif == absdif))) TurnLeft();  // иначе определяем кратчайшее направление поворота
              else TurnRight();
    //  delay(25);

    } // конец основной программы, начинаем все сначала

    //
    // Подпрограммы
    //
    // Цифровой низкочастотный фильт
    double digitalLowPass(double last_smoothed, double new_value, double filterVal)
    {
      return (new_value * (1 - filterVal)) + (last_smoothed * filterVal);
    }

    void setupHMC5883L(){
      // инициализация HMC5883L, и проверка наличия ошибок
      int error;
      error = compass.SetScale(0.88); // чувствительность датчика из диапазона: 0.88, 1.3, 1.9, 2.5, 4.0, 4.7, 5.6, 8.1
      if(error != 0) Serial.println(compass.GetErrorText(error)); // если ошибка, то выводим ее
      error = compass.SetMeasurementMode(Measurement_Continuous); // установка режима измерений как Continuous (продолжительный)
      if(error != 0) Serial.println(compass.GetErrorText(error)); // если ошибка, то выводим ее
    }

    float getHeading(){
      // считываем данные с HMC5883L и рассчитываем  направление
      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; // переводим радианы в градусы
    }

    void Stop(){  // подпрограмма Остановка
          digitalWrite (IN3, LOW);
          digitalWrite (IN4, LOW);
          analogWrite(ENB,0);
          delay(200);
    }

    void TurnRight(){ // подпрограмма Поворот направо
          digitalWrite (IN3, HIGH);
          digitalWrite (IN4, LOW);
          analogWrite(ENB,255);
      delay(200);
    }

    void TurnLeft(){ // подпрограмма Поворот налево
          digitalWrite (IN3, LOW);
          digitalWrite (IN4, HIGH);
          analogWrite(ENB,255);
          delay(200);
    }
     
    Помогите плиз кто чем может
     
  18. Megakoteyka

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

    Не нужно засорять форум одинаковыми темами.