ошибка в скетче помогите пожалуйста разобраьься

ToxaRU
Offline
Зарегистрирован: 03.04.2015

Собрал поворотную системку на ардуино нано с магнитометром GY-273 должна удерживать направление и двумя кнопками вправо влево крутиться. крутится с помощью двигателя который подключен через драйвер 298. Но вот залил скетчь а результат тишина и спокойствие... Посмотрите плиз скетчь-помогите где капашиться)) спасибо))

// 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;  // допустимая точность удерживания направления

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

// Initialize the serial port.
Serial.begin(9600);

Serial.println("Starting the I2C interface.");
Wire.begin(); // Start the I2C interface.

Serial.println("Constructing new HMC5883L");
compass = HMC5883L(); // Construct a new HMC5883 compass.

Serial.println("Setting scale to +/- 1.3 Ga");
error = compass.SetScale(1.3); // Set the scale of the compass.
if(error != 0) // If there is an error, print it out.
  Serial.println(compass.GetErrorText(error));
Serial.println("Setting measurement mode to continous.");
error = compass.SetMeasurementMode(Measurement_Continuous); // Set the measurement mode to Continuous
if(error != 0) // If there is an error, print it out.
  Serial.println(compass.GetErrorText(error));
}

// Our main program loop.
void loop()
{
// Retrive the raw values from the compass (not scaled).
MagnetometerRaw raw = compass.ReadRawAxis();
// Retrived the scaled values from the compass (scaled to the configured scale).
MagnetometerScaled scaled = compass.ReadScaledAxis();
// Values are accessed like so:
int MilliGauss_OnThe_XAxis = scaled.XAxis;// (or YAxis, or ZAxis)

// Calculate heading when the magnetometer is level, then correct for signs of axis.
float heading = atan2(scaled.ZAxis, scaled.XAxis);
// Once you have your heading, you must then add your 'Declination Angle', which is the 'Error' of the magnetic field in your location.
// Find yours here: http://www.magnetic-declination.com/
// Mine is: 2? 37' W, which is 2.617 Degrees, or (which we need) 0.0456752665 radians, I will use 0.0457
// If you cannot find your Declination, comment out these two lines, your compass will be slightly off.
float declinationAngle = 0.0457;
heading += declinationAngle;
// Correct for when signs are reversed.
if(heading < 0)
  heading += 2*PI;

// Check for wrap due to addition of declination.
if(heading > 2*PI)
  heading -= 2*PI;

// Convert radians to degrees for readability.
float headingDegrees = heading * 180/M_PI;

// Output the data via the serial port.
Output(raw, scaled, heading, headingDegrees);

// Normally we would delay the application by 66ms to allow the loop
// to run at 15Hz (default bandwidth for the HMC5883L).
// However since we have a long serial out (104ms at 9600) we will let
// it run at its natural speed.
// delay(66);
  //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();
        
          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);
}
 

грешу на //int heading = compass.heading(); // вынимаем из показаний величину направление компаса (закоментировал...) раскоментировав выдает что незадекларировано как я понимаю что то не так int heading

 

 

Coolerr
Offline
Зарегистрирован: 30.06.2014

перед этим heading объявлен как float

ToxaRU
Offline
Зарегистрирован: 03.04.2015

что то не выходит-уже пытался и как flot декларировать

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

ToxaRU пишет:

что то не выходит-уже пытался и как flot декларировать

FLOT это когда там корабли всякие кучей собираются...

а вот floAt это уже как то ближе к типа переменных :)

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

Puhlyaviy пишет:

FLOT это когда там корабли всякие кучей собираются...

а вот floAt это уже как то ближе к типа переменных :)

Пухлявый, хотел узнать твоё мнение как лингвиста в области программирования, а скетчь - это шо за нах?

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Клапауций 999 пишет:

Пухлявый, хотел узнать

угу, как с таким количеством ошибок, опечаток и прочего можно вообще написать хоть что то работающее?

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

ToxaRU
Offline
Зарегистрирован: 03.04.2015

Ну я как раз с флота))) и для флота делаю)))) должно антену крутить по магнитометру)))

ToxaRU
Offline
Зарегистрирован: 03.04.2015

Не спорю в ардуине я еще как обезьяна-тыкаю куда получится)))))   склепывал это произведение из разных скетчей и спотыкаюсь как раз на магнитометре....  и так и сяк тыкаю-а толку как от козла молока))

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

ToxaRU пишет:

Ну я как раз с флота))) и для флота делаю)))) должно антену крутить по магнитометру)))

шото у меня сомнения, что оно будет стабильно работать без системы магнитного экранирования локальных магнитных источников магнитного поля лазящего по пасудине.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Вот именно, попробуйте, зная где Север, поискать его с помощью сотовика.....
Может указывать куда угодно

Или софтом типа SatFinder найти куда направить тарелку.
 

 

ToxaRU
Offline
Зарегистрирован: 03.04.2015

На мобильнике компас работает хорошо в любой точке судна...думаю что и ардуинка сбоить не будет...

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

ToxaRU пишет:
На мобильнике компас работает хорошо в любой точке судна...думаю что и ардуинка сбоить не будет...

ты как определял критерий "хорошо" - есть дефолтный компАс, что бы стравнить или, по каким звёздам сейчас навигация происходит?

ToxaRU
Offline
Зарегистрирован: 03.04.2015

мне в принцепе не нужно вообще определять правильные координаты, а нужно чтобы точно было позиционирование относительно палубы...  тоесть начинает крутить палубу относительно магнитного поля земли а ардуинка компенсирует с помощью разворота это смещение....   так что юг там или север пофиг главное чтобы могло определить что есть смещение. А компас на моем мобильнике стабильно показывал не хуже старого механического-так что проблем быть не должно

 

проблема только скетчь доделать я уже и в метале все собрал и плату спаял

 

качьку сделал компенсацию с помощью мультивия-таместь для подвеса конфигурацию(работает отлично) а вот с направлением пока запара а это основное(вот и ищу кто бы помог с магнитометром разобраться

 

 

весь день ковыряюсь  вот такое наковырял

// 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; // переводим радианы в градусы

а вот далее идет из другого скетча где магнитометр был другой и как я понимаю там алгоритм другой какой то... плюс непонятная переменная sensor.... короче мрак....

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

В общем, тут вот сначала про войну а дальше я надрал страницы из комиксов и Капитала от Карл Маркса. И чет сюжет замылился.

ToxaRU
Offline
Зарегистрирован: 03.04.2015

Примерно так)))  концовка тожея про войну сам про моторчик писал)) а вот серединка точно из комиксов.... Может что подскажете?)))

ToxaRU
Offline
Зарегистрирован: 03.04.2015

Puhlyaviy пишет:
В общем, тут вот сначала про войну а дальше я надрал страницы из комиксов и Капитала от Карл Маркса. И чет сюжет замылился.

 

Примерно так)))  концовка тожея про войну сам про моторчик писал)) а вот серединка точно из комиксов.... Может что подскажете?)))

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

ToxaRU пишет:

Примерно так)))  концовка тожея про войну сам про моторчик писал)) а вот серединка точно из комиксов.... Может что подскажете?)))


Подсказываю.
берете другую библиотеку
или берете учебник математики и учитесь как при помощи карандаша и бумаги пересчитать радианы в градусы. Потом пишите формулу в скече.

ToxaRU
Offline
Зарегистрирован: 03.04.2015

Puhlyaviy пишет:
ToxaRU пишет:

Примерно так)))  концовка тожея про войну сам про моторчик писал)) а вот серединка точно из комиксов.... Может что подскажете?)))

Подсказываю. берете другую библиотеку или берете учебник математики и учитесь как при помощи карандаша и бумаги пересчитать радианы в градусы. Потом пишите формулу в скече.

 

УУУУУУУУУ))))) Аж страшно)))))))   Так там вроде с градусами все ок?.... я запускал до строчки 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;     // вычисляем разницу между реальным направлением и заданным

в частности откуда брать SENSOR и что это....  heading-как я понял это как раз то что мы с магнитометра получим

 

 

вообще я это все выковырял из скетча робота удерживающего напрвление-но беда в том что у меня магнитометры HMC5883L...... Вот и пытаюсь ковыряться пока безрезультатно...  Может хотябы про sensor и heading подскажете? а то мозг кипит а толку нет, а скоро  в море, а устройство хотелось бы иметь-на рейдах позволит на связь выходить

// 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);
}

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Может для начала взять библиотеки для своих компасов и там есть примеры. А не пытаться впихнуть невпихуемое

ToxaRU
Offline
Зарегистрирован: 03.04.2015

Puhlyaviy пишет:
Может для начала взять библиотеки для своих компасов и там есть примеры. А не пытаться впихнуть невпихуемое

 

ну так я взял и впихнул-данные с магнитометра идут

 

а проблемма где то тут

float heading = 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);

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Почему тут а не там?

ToxaRU
Offline
Зарегистрирован: 03.04.2015

ToxaRU пишет:

Puhlyaviy пишет:
Может для начала взять библиотеки для своих компасов и там есть примеры. А не пытаться впихнуть невпихуемое

 

ну так я взял и впихнул-данные с магнитометра идут

 

а проблемма где то тут

float heading = 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);

 

ну во первых если залить до этого места то скетчь работает и данные идут

во вторых подсвечивает желтым float heading = heading(); 

ну и в третих не понятно только это место и в частности  sensor

тут как раз обрабатываются данные с компаса, а за этим куском уже к мотору и кнопкам поворота относится с приращением к переменной поворота

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

И чего тут понимать то?
heading(); функция которая осталась там откуда вырвали строчку.вот и всё.

ToxaRU
Offline
Зарегистрирован: 03.04.2015

Puhlyaviy пишет:
И чего тут понимать то? heading(); функция которая осталась там откуда вырвали строчку.вот и всё.

 

я в свой перенес-она должна по идее оттуда брать данные-получается с магнитометра.... Или я неправ? и что там за sensor

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Гыыыы. . Тоесть если к дизельному двигателю приклеить наклейку от бензинового. То все должно работать? Вы вообще впиливаете что датчики разные и читать их нужно поразному. Даже если они ездят одинаково.

ToxaRU
Offline
Зарегистрирован: 03.04.2015

Puhlyaviy пишет:
Гыыыы. . Тоесть если к дизельному двигателю приклеить наклейку от бензинового. То все должно работать? Вы вообще впиливаете что датчики разные и читать их нужно поразному. Даже если они ездят одинаково.

 

понятно ---как я понял sensor и есть данные а функция не заработает(((((( И значит все пропало с моей проектиной так необходимой.... надо искать скетчь такого же робота с моим GY-273..... Стлько времени пилил и все зря((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((

ToxaRU
Offline
Зарегистрирован: 03.04.2015

Puhlyaviy пишет:
Гыыыы. . Тоесть если к дизельному двигателю приклеить наклейку от бензинового. То все должно работать? Вы вообще впиливаете что датчики разные и читать их нужно поразному. Даже если они ездят одинаково.

 

А если я Вас очень попрошу мне помочь, Вы мне конечно же откажете?  Не осилю за 2 недели до моря, а сейчас просто некогда заниматься, жена не в том положении чтобы днями за ардуиной сидеть))) да и жалко все бросать, уже собрал в алюминии огромную фигулину спаял Poe пассивный на 34V и плата спаяна, вся и стабилизацию по гераскопу полностью сделана на мультивие(работает отлично), USB удленитель по витой паре 13  метров с доп питанием спаял, осталось только скетчь залить этот а тут запара такая...

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Я откажу? Я вообще никому не отказываю вроде. Просто если я это сделаю за вас, то зачем оно мне? А если вы сами будете разбираться при помощи пинков , то видимо это займет время. Ибо вам уже все написали. Просто нужно брать родную датчикам библиотеку и пользоваться ее методами. В примерах к библиотекам все показано.

ToxaRU
Offline
Зарегистрирован: 03.04.2015

Puhlyaviy пишет:
Я откажу? Я вообще никому не отказываю вроде. Просто если я это сделаю за вас, то зачем оно мне? А если вы сами будете разбираться при помощи пинков , то видимо это займет время. Ибо вам уже все написали. Просто нужно брать родную датчикам библиотеку и пользоваться ее методами. В примерах к библиотекам все показано.

Да я ее крутил уже и так и сяк сам по профессии механик и электрик судовой... но электроника и програмирование не мой конек.... вроде начало и концовка там понятно-даже что то сам дописал а вот с датчиком что то я не совсем вкурил(точнее совсем не вкурил)   там в принцепе весь пример в начале скетча.... Как я понял там как раз и должна где то храниться переменная которая в продолжении(от другого датчика)  имеет название sensor , но даже если ее найти гипотетически, остается функция...которая тоже не совсем понятно...

как я понял вывод ее в монитор Serial.println(heading); как раз выдает показания с сенсора-значит heading как раз и содержит в моем магнитометре данные которые в том скетче в sensor записаны..... а с другой стороны там есть строка heading = compass.heading(); значит heading присваивается значение с compass.heading  а в моем есть просто compass...... короче манная каша из ушей течет а в голове уже пригорает....

ToxaRU
Offline
Зарегистрирован: 03.04.2015
heading = getHeading();  // вынимаем из показаний величину направление компаса
  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
  }       

поменял на getHeading(); если копаться в библиотеке кажется что там данные магнитометра-в компиляторе проскочило, но что то мне подсказывает что не все так просто и работать не будет, потому как что делать с sensor я так и не вкурил.. ну и дальше начинает на токены ругаться

ToxaRU
Offline
Зарегистрирован: 03.04.2015

фиг с ним я сдался!!!!

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

https://github.com/sleemanj/HMC5883L_Simple
Библиотека и простой пример

ToxaRU
Offline
Зарегистрирован: 03.04.2015

Посмотрю сейчас))) хотя я был уже там))

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Что там смотреть?
Старую библиотеку удаляем в топку.
качаем эту. Ставим.
открываем пример от нее
там весь пример 5 строчек. Остальные очень подробное обьяснение что каждая строчка делает.
профит

ToxaRU
Offline
Зарегистрирован: 03.04.2015

Puhlyaviy пишет:
Что там смотреть? Старую библиотеку удаляем в топку. качаем эту. Ставим. открываем пример от нее там весь пример 5 строчек. Остальные очень подробное обьяснение что каждая строчка делает. профит

 

Спасибо)))) буду мучать сейчас)))

ToxaRU
Offline
Зарегистрирован: 03.04.2015

Puhlyaviy пишет:
Что там смотреть? Старую библиотеку удаляем в топку. качаем эту. Ставим. открываем пример от нее там весь пример 5 строчек. Остальные очень подробное обьяснение что каждая строчка делает. профит

 

библиотека и правда простая совсем все всунул но опять засада

 

// Reference the I2C Library
#include <Wire.h>
#include <HMC5883L_Simple.h>
#include "I2Cdev.h".
HMC5883L_Simple 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.SetDeclination(23, 35, 'E'); 
  Compass.SetSamplingMode(COMPASS_CONTINUOUS);
  Compass.SetScale(COMPASS_SCALE_130);
  Compass.SetOrientation(COMPASS_HORIZONTAL_X_NORTH);
  
  pinMode(XX, INPUT_PULLUP); // пин подключен напрямую, без резистора, поэтому используем внутреннюю подтяжку
  pinMode(YY, INPUT_PULLUP);
  dir = 180; // задаем уставку по умолчанию
  pinMode (ENB, OUTPUT);
  pinMode (IN3, OUTPUT);
  pinMode (IN4, OUTPUT);
}

void loop(){
  
   float heading = Compass.GetHeadingDegrees();  // вынимаем из показаний величину направление компаса
  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("Heading: \t");
   Serial.println( heading );   
   delay(1000);
  }
  
  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);
}

компилятор застревает на строчке void Output(MagnetometerRaw raw, MagnetometerScaled scaled, float heading, float headingDegrees)

 

хотя как я понял мне этот вывод данных и ненужен наверное ну или просто оставить float heading....

 

ну и опять же в куске 

float heading = Compass.GetHeadingDegrees();  // вынимаем из показаний величину направление компаса
  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

есть sensor..... откуда он и за что отвечает?

 

так то собирается компилятором-но sensor мне покоя не дает

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Слушай, ты дебил с рождения или как то экология и все такое?
вот я не могу понять есть библиотека которая возвращает шрадусы к заданому азимуту.
Есть библиотека которая крутит серву на заданый угол.

Накой ьы таскпешь это гавно от робота?
Мне пофигу на твоего робота.

ToxaRU
Offline
Зарегистрирован: 03.04.2015

Puhlyaviy пишет:
Слушай, ты дебил с рождения или как то экология и все такое? вот я не могу понять есть библиотека которая возвращает шрадусы к заданому азимуту. Есть библиотека которая крутит серву на заданый угол. Накой ьы таскпешь это гавно от робота? Мне пофигу на твоего робота.

 

Ладно спасибо и на этом-мне серва не годится только колекторный мотор через драйвер

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Да по барабану хоть кривой стартер на пидальном ходу.
взять пример от компаса и пример от драйвера мотора.
Вставить посредине пересчет градусов в количество обротов и вперед.
Накой тут это гавно от робота перепечатывать?

ToxaRU
Offline
Зарегистрирован: 03.04.2015

ладно с рейса приду денежка будет найду кого нить чтобы сделали-не мое это програмирование....

спасибо

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Типа позову помочь механику делать.
- вот мой план. У меня есть старый тостер и 2 миксера.
- так вот же у тебя новые детали на столе. Все что нужно и дел на 5 минут.
- ага детали клевые. Но вот смотри когда миксер пихаю в тостер, второй тостер искрит
- если ты возмешь на столе это и вот это и добавишь шурупчики..
- класс. Но смотри второй миксер искрит...
- дебил!
- согласен, это не моё, будут деньги, найму механика..
-Facepalm

ToxaRU
Offline
Зарегистрирован: 03.04.2015

Puhlyaviy пишет:
Типа позову помочь механику делать. - вот мой план. У меня есть старый тостер и 2 миксера. - так вот же у тебя новые детали на столе. Все что нужно и дел на 5 минут. - ага детали клевые. Но вот смотри когда миксер пихаю в тостер, второй тостер искрит - если ты возмешь на столе это и вот это и добавишь шурупчики.. - класс. Но смотри второй миксер искрит... - дебил! - согласен, это не моё, будут деньги, найму механика.. -Facepalm

 

С тостером,миксером и дизельным двигателем любого размера я бы разобрался на раз два три)) каждый должен делать то что умеет.... не умею нефиг лезть-все спаял собрал а програмиста потом искать буду-чтобы делал то что он умеет)) говорю же не мое... попробовал- не получилось  надо брать книгу и сидеть 2-3 недели разбираться-банально времени нет... в принцепе в ардуинку только из за этого проекта и влез,для связи в море надо чтобы не скакать с антеной по палубе-робот этот идеально по функционалу подходит... приду буду искать кто этот скетчь доработает, а пока не буду парить мозг ни себе ни людям... поищу на просторах инета-может найду похожего робота под мое железо, а нет так нет-отложу на пол годика....

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

ToxaRU пишет:

С тостером,миксером и дизельным двигателем любого размера я бы разобрался на раз два три)) каждый должен делать то что умеет....


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

ToxaRU
Offline
Зарегистрирован: 03.04.2015

Puhlyaviy пишет:
ToxaRU пишет:

С тостером,миксером и дизельным двигателем любого размера я бы разобрался на раз два три)) каждый должен делать то что умеет....

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

 

Для того чтобы логически мыслить в той или иной сфере сначала нужны знания-у меня их не хватает в програмировании и набрать их на данном этапе уже не успею... А в механике с избытком....благо опыт есть... 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Логика она либо есть, либо нет.
любая программа мало чем отличается от трансмиссии например.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Вся ваша программа уместится в пару десятков строчек..
но вы не хотите даже напрячь мозг и понять как работают 2 примера.
1. Компас
2. Драйвер двигателя
вы вцепились в кусоу чего не прнятного в сотню строк и носитесь как девка размахивая грязными трусами.

ToxaRU
Offline
Зарегистрирован: 03.04.2015

Puhlyaviy пишет:
Вся ваша программа уместится в пару десятков строчек.. но вы не хотите даже напрячь мозг и понять как работают 2 примера. 1. Компас 2. Драйвер двигателя вы вцепились в кусоу чего не прнятного в сотню строк и носитесь как девка размахивая грязными трусами.

как датчик и драйвер работает ясно-а вцепился потому что очень удобно вопервых фильтрация во вторых можно допуск срабатывания(чтобы не крутила туда сюда постоянно а плавно подворачивало когда отклонение и можно с пульта подкручивать меняя переменную.... алгоритм идеально подходит для целей.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Мдааа. Вот бы в мозг научиться фильтрацию некоторым устанавливать.
А если их еще научить думать при этом.. вот бы зажили тогда. . Консерваторий бы настроили... консервы бы вкусные выпускать.
Обнять и плакать. ..
Тоесть библиотека которая уже внутри имеет все эти фильтрации и тупо на выходе выдает градус отклонения от установленой цели это фигня.. главное выкорчеваное гавно из робота...

ToxaRU
Offline
Зарегистрирован: 03.04.2015

Puhlyaviy пишет:
Мдааа. Вот бы в мозг научиться фильтрацию некоторым устанавливать. А если их еще научить думать при этом.. вот бы зажили тогда. . Консерваторий бы настроили... консервы бы вкусные выпускать. Обнять и плакать. .. Тоесть библиотека которая уже внутри имеет все эти фильтрации и тупо на выходе выдает градус отклонения от установленой цели это фигня.. главное выкорчеваное гавно из робота...
 

 

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

ToxaRU
Offline
Зарегистрирован: 03.04.2015

за библиотеку  спасибо реально проще некуда сейчас поищу подобные проекты   и потом попробую подсунуть эту библиотеку

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

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