Помогите найти ошибку в скетче

Тема в разделе "Arduino & Shields", создана пользователем ToxaRU, 4 июл 2015.

  1. ToxaRU

    ToxaRU Гик

    Собрал поворотную системку на ардуино нано с магнитометром GY-273 должна удерживать направление и двумя кнопками вправо влево крутиться. крутится с помощью двигателя который подключен через драйвер 298. Но вот залил скетчь а результат тишина и спокойствие... Посмотрите плиз скетчь-помогите где капашиться)) спасибо))
    Код (Text):
    // Reference the I2C Library
    // Reference the I2C Library
    #include <Wire.h>
    #include <HMC5883L.h>
    #include "I2Cdev.h".
    HMC5883L compass;
    int error = 0;
    #define XX 6 // XX подключен к пину 6
    #define YY 7 // YY подключен к пину 7
    const int step = 10; // шаг приращения
    const int max = 360; // максимум
    const int min = 0; // минимум
    int dir; // переменная, хранящая направлени
    int IN3 = 5;
    int IN4 = 4;
    int ENB = 3;
    int sensor;              // переменная для хранения показания сенсора
    //int dir = 180;  // заданное направление
    int tol = 20;  // допустимая точность удерживания направления
    float heading;

    void setup()
    {
      Serial.begin(9600);
      Wire.begin();
      compass = HMC5883L(); // создаем экземпляр HMC5883L библиотеки
      setupHMC5883L(); // инициализация HMC5883L
     
      pinMode(XX, INPUT_PULLUP); // пин подключен напрямую, без резистора, поэтому используем внутреннюю подтяжку
      pinMode(YY, INPUT_PULLUP);
      dir = 180; // задаем уставку по умолчанию
      pinMode (ENB, OUTPUT);
      pinMode (IN3, OUTPUT);
      pinMode (IN4, OUTPUT);
    }

    void loop(){
      float heading = getHeading();
      Serial.println(heading);
      delay(100); //only here to slow down the serial print

    }
    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; // переводим радианы в градусы
    }
    {
    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();
             
               if(!digitalRead(XX)) // если на пин XX подали HIGH
             
      }      
      {
        dir = dir + step; // прибавляем 10
      }

                if(!digitalRead(YY)) // если на пин YY подали HIGH
      {
        dir = dir - step; // убавляем 10
      }

                if(dir > max) // проверяем выход за пределы верхней границы
      {
        dir = dir - max;
      }

                if(dir < min) // проверяем выход за пределы нижней границы
      {
        dir = max - dir;
      }

                 if(dir == max) // корректируем непонятки с 360 и 0 (один и тот же угол)
      {
        dir = min;
      }
    //  delay(25);
    } // конец основной программы, начинаем все сначала

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


    // Output the data down the serial port.
    void Output(MagnetometerRaw raw, MagnetometerScaled scaled, float heading, float headingDegrees)
    {
      Serial.print("Raw:\t");
      Serial.print(raw.XAxis);
      Serial.print("   ");
      Serial.print(raw.YAxis);
      Serial.print("   ");
      Serial.print(raw.ZAxis);
      Serial.print("   \tScaled:\t");
      Serial.print(scaled.XAxis);
      Serial.print("   ");
      Serial.print(scaled.YAxis);
      Serial.print("   ");
      Serial.print(scaled.ZAxis);

      Serial.print("   \tHeading:\t");
      Serial.print(heading);
      Serial.print(" Radians   \t");
      Serial.print(headingDegrees);
      Serial.println(" Degrees   \t");
      }
      {
      void Stop(){  // подпрограмма Остановка
          digitalWrite (IN3, LOW);
          digitalWrite (IN4, LOW);
          analogWrite(ENB,0);
          delay(200);
    }

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

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

     



    после последнего редактирования на токен ругается...... блин пыхтю весь день

    че то я помоемк совсем не так делаю- до строчки return heading* RAD_TO_DEG; все работает-показания с магнитометра идут.... а вот далее идет часть из другого скетча где был другой магнитометр.... и тут все колом...
     
    Последнее редактирование: 5 июл 2015
  2. I_v_a_n

    I_v_a_n Нуб

    немного не понятно что у вас тут
    Код (Text):
    int dir; // переменная, хранящая направлени

    //int dir = 180;
     
  3. ToxaRU

    ToxaRU Гик

    это при старте переменной присваивается-чтобы стартовало с позиции 180 градусов, но я закоментировал так как в принцепе без разници что там... просто скетчь склепывал из нескольких вот так сказать остатки
    у меня проблемма с магнитометром разобраться
     
  4. ToxaRU

    ToxaRU Гик

    подправил чуть чуть но все равно в heading = compass.heading(); ошибка ПоМоГиТе ПлИз
     
    Последнее редактирование: 5 июл 2015