Замена магнитометра HMC5883L на QMC5883L в скетче

Sergey_21
Offline
Зарегистрирован: 08.08.2022

Прошу помощи в замене библиотеки магнитометра HMC5883L на QMC5883L в скетче

Необходимая библиотека: https://github.com/mprograms/QMC5883LCompass

//self driving car 



#include "HMC5883L.h"


#include <I2Cdev.h>

#include <Wire.h>

#include <SoftwareSerial.h>
#include <TinyGPS.h>



#include <Servo.h>
#include <NewPing.h>
int mo1 = 2, mo2 = 3, mo3 = 4, mo4 = 5;
int vcc = 13;
#define trig1  9
#define echo1  8
#define MAX_DISTANCE 200
//int trig2 = 11;
//int echo2 = 10;
//int gnd = 4;
long cm1;//,cm2;
int i = 0;
NewPing sonar(trig1, echo1, MAX_DISTANCE);
//NewPing sonar2(trig2,echo2,250);
int f1 = 0;
float heading;
TinyGPS gps;
SoftwareSerial ss(11, 12);
void gpshead();
void stopp();
void rightturn();
void gostraight();
void leftturn();
void turn();
//Servo myservo;
float x2lon = radians(00000000), x2lat = radians(000000000); //enter ur final location here as lon and lat
HMC5883L mag;
int16_t mx, my, mz;
float head, distance = 0.0;
void setup() {
  Wire.begin();
  mag.initialize();
  ss.begin(9600);
  Serial.begin(9600);
  pinMode (vcc, OUTPUT);
  // pinMode (gnd,OUTPUT);
  pinMode(mo1, OUTPUT);
  pinMode(mo2, OUTPUT);
  pinMode(mo3, OUTPUT);
  pinMode(mo4, OUTPUT);
  //myservo.attach(7);
}
void loop() {
  digitalWrite(vcc, HIGH);
  if (f1 != 0)
    gostraight();
  cm1 = sonar.ping_cm();
  delay(50);
  cm1 = sonar.ping_cm();
  Serial.print("cm");
  Serial.print(cm1);
  if (cm1 < 20 && cm1 > 0)
  {
    mag.getHeading(&mx, &my, &mz);
    heading = atan2(my, mx);
    if (heading < 0)
      heading += 2 * M_PI;
    heading = heading * 180 / M_PI;
    if ((i % 2) == 0)
    { head = heading + 100;
      if (head > 360)
        head = head - 360;
      leftturn();
      /*myservo.write(180);
        delay(2000);*/
      //myservo.write(180);
      //i++;
    }
    else
    { head = heading - 100;
      if (head < 0)
        head = head + 360;
      rightturn();
      /*myservo.write(0);
        delay(1000);*/
      // myservo.write(0);
      //i++;
    }
    while ((heading > head + 8) || (heading < head - 8)) // this loop turns the bot till its facing (head)degrees east of north
    {
      turn();
      delay(5);
      mag.getHeading(&mx, &my, &mz);
      heading = atan2(my, mx);
      if (heading < 0)
        heading += 2 * M_PI;
      heading = heading * 180 / M_PI;
    }
    stopp();
    delay(100);
  }
  else {
    /*cm2=sonar2.ping_cm();
      delay(50);
      cm2+=sonar2.ping_cm();
      cm2=cm2/2;*/
    //while((cm1<50)&&(cm1>0))
    gostraight();
    delay(50);
    //cm2=sonar2.ping_cm();
    //delay(50);
    //cm2+=sonar2.ping_cm();
    //cm2=cm2/2;}
    delay(500);
    stopp();

    do {
      gpshead();
    } while (distance == 0.0);
    if (distance < 15)
      while (1)
        stopp();
    if (f1 == 0)
    { mag.getHeading(&mx, &my, &mz);
      heading = atan2(my, mx);
      if (heading < 0)
        heading += 2 * M_PI;
      heading = heading * 180 / M_PI;


      while ((heading > head + 8) || (heading < head - 8))
      {
        turn();
        delay(5);
        mag.getHeading(&mx, &my, &mz);
        heading = atan2(my, mx);
        if (heading < 0)
          heading += 2 * M_PI;
        heading = heading * 180 / M_PI;
      }
      f1 = 4;
    }
    f1--;
  }
}
void turn()
{ float tur = heading - head;
  //if (tur < 0.0 && tur > -180 )
  // { //if (tur > -180.0)
  //rightturn();
  // }
  //  else {

  //leftturn();

  if (tur < 0.0)
  { if (tur > -180.0)
      rightturn();
    else
      leftturn();
  }
  else
  { if (tur < 180.0)
      leftturn();
    else rightturn();
  }
}
void leftturn()
{ digitalWrite(mo1, LOW);
  digitalWrite(mo2, LOW);
  digitalWrite(mo3, HIGH);
  digitalWrite(mo4, LOW);
  delay(10);
}
void stopp()
{
  digitalWrite(mo1, LOW);
  digitalWrite(mo2, LOW);
  digitalWrite(mo3, LOW);
  digitalWrite(mo4, LOW);
}

void rightturn()
{ digitalWrite(mo1, LOW);
  digitalWrite(mo2, HIGH);
  digitalWrite(mo3, LOW);
  digitalWrite(mo4, LOW);
}
void gostraight()
{ digitalWrite(mo1, LOW);
  digitalWrite(mo2, HIGH);
  digitalWrite(mo3, HIGH);
  digitalWrite(mo4, LOW);
}
void gpshead()
{
  bool newData = false;
  for (unsigned long start = millis(); millis() - start < 1000;)
  {
    while (ss.available())
    {
      char c = ss.read();
      // Serial.write(c); // uncomment this line if you want to see the GPS data flowing
      if (gps.encode(c)) // Did a new valid sentence come in?
        newData = true;
    }
  }
  if (newData)
  {
    float flat1, flon1;
    unsigned long age;
    gps.f_get_position(&flat1, &flon1, &age);
    flon1 = radians(flon1);  //also must be done in radians
    flat1 = radians(flat1);  //also must be done in radians
    head = atan2(sin(x2lon - flon1) * cos(x2lat), cos(flat1) * sin(x2lat) - sin(flat1) * cos(x2lat) * cos(x2lon - flon1));
    head = head * 180 / 3.1415926535; // convert from radians to degrees
    float dist_calc = 0;
    float diflat = 0;
    float diflon = 0;
    diflat = x2lat - flat1; //notice it must be done in radians
    diflon = (x2lon) - (flon1); //subtract and convert longitudes to radians
    distance = (sin(diflat / 2.0) * sin(diflat / 2.0));
    dist_calc = cos(flat1);
    dist_calc *= cos(x2lat);
    dist_calc *= sin(diflon / 2.0);
    dist_calc *= sin(diflon / 2.0);
    distance += dist_calc;
    distance = (2 * atan2(sqrt(distance), sqrt(1.0 - distance)));
    distance *= 6371000.0; //Converting to meters
    if (head < 0) {
      head += 360; //if the heading is negative then add 360 to make it positive
    }
  }
  else
  {
    head = 0.0;
    distance = 0.0;
  }
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

3000р

man9913
Offline
Зарегистрирован: 19.03.2016

2500р

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

интересно, заработает ли?
 

Используем библиотеку QMC5883LCompass-master версии 1.1.1 /libraries/QMC5883LCompass-master 
Используем библиотеку Wire версии 1.0 из папки: /packages/MiniCore/hardware/avr/2.1.3/libraries/Wire 
Используем библиотеку I2Cdev в папке:/libraries/I2Cdev (legacy)
Используем библиотеку SoftwareSerial версии 1.1 из папки: /libraries/SoftwareSerial 
Используем библиотеку TinyGPS-master в папке:  /libraries/TinyGPS-master (legacy)
Используем библиотеку Servo версии 1.1.8 из папки: /libraries/Servo 
Используем библиотеку NewPing-master в папке: /libraries/NewPing-master (legacy)
/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-size -A /tmp/arduino_build_699637/QMC5883L_V01.ino.elf
Скетч использует 16176 байт (50%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 1068 байт (52%) динамической памяти, оставляя 980 байт для локальных переменных. Максимум: 2048 байт.

 

b707
Offline
Зарегистрирован: 26.05.2017

я так понял, автор даже не пробовал делать это сам. А денег жалко...

хотя на такой код и правда денег жалко... писал какой-то школьник, четыре одинаковых куска кода просто скопировано один в другой

man9913
Offline
Зарегистрирован: 19.03.2016

вот тебе фотка, сам суди школьник он или нет https://github.com/sijah

как по мне, далеко уже не

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

man9913 пишет:

вот тебе фотка, сам суди школьник он или нет https://github.com/sijah

как по мне, далеко уже не

В эти дни я работаю в Markaz Group Of Schools в Кожикоде, Керала, в качестве ИТ-координатора и Фасилитатора!....

b707
Offline
Зарегистрирован: 26.05.2017

материальное воплощение понятия "индийский код" :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

материальное воплощение понятия "индийский код" :)

а какая разница, можно разговаривать о  живописи Моне или Ренуара, а код он или выпоняет возложенные на него функции или нет )))

rst
Offline
Зарегистрирован: 25.06.2018

ua6em пишет:
а какая разница, можно разговаривать о  живописи Моне или Ренуара, а код он или выпоняет возложенные на него функции или нет )))
Если работает корректно, то разницы может и нет.... до тех пор, пока не потребуется его модифицировать. А здесь как раз такой случай.

За редактирование индусского кода нужно требовать молока за вредность... или хотя-бы удвоения гонорара.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

rst пишет:

ua6em пишет:
а какая разница, можно разговаривать о  живописи Моне или Ренуара, а код он или выпоняет возложенные на него функции или нет )))
Если работает корректно, то разницы может и нет.... до тех пор, пока не потребуется его модифицировать. А здесь как раз такой случай.

За редактирование индусского кода нужно требовать молока за вредность... или хотя-бы удвоения гонорара.

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

b707 пишет:

материальное воплощение понятия "индийский код" :)

а какая разница, можно разговаривать о  живописи Моне или Ренуара, а код он или выпоняет возложенные на него функции или нет )))

Ну, этих функций на самом деле достаточно много.

Кроме того, что код должен работать, он должен работать стабильно.

Кроме того, правильный код должен адекватно реагировать на неправильные входные данные (применительно к МК - правильно вести себя при неисправности оборудования).

Код должен допускать поддержку. Т.е. его при необходимости должно быть легко понять другому программисту.

Ну и еще: код должен делать именно то, что задумал программист, а не просто "выполнять какие-то функции".

rst
Offline
Зарегистрирован: 25.06.2018

b707 пишет:
материальное воплощение понятия "индийский код" :)
Индийский - это чай. А код - индусский.

Бармалей
Бармалей аватар
Offline
Зарегистрирован: 23.09.2019

1260 р

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Бармалей пишет:

1260 р

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

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

Бармалей пишет:

1260 р

откуда такая экзотическая цифра сложилась?

думаю это половина от последнего предложения (2500/2)

А потом Бармалею стало жалко, что он продешевил и он решил накинуть 10 рублей :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

ua6em пишет:

Бармалей пишет:

1260 р

откуда такая экзотическая цифра сложилась?

думаю это половина от последнего предложения (2500/2)

А потом Бармалею стало жалко, что он продешевил и он решил накинуть 10 рублей :)

тогда встречное предложение - за 1000 дам код как получилось, если не взлетит закажешь у Бармалея, всё одно сэкономишь (1000 + 1260) или 260 рублей меньше чем у Бармалея (если взлетит) )))

Sergey_21
Offline
Зарегистрирован: 08.08.2022

Уже взлетело, разобрался сам))
Всем спасибо.
 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Sergey_21 пишет:

Уже взлетело, разобрался сам))
Всем спасибо.

даже на пивасик никто не заработал )))