Помогите в скетче магнитометр поменять..... Или хотябы наведите на мысль.....

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

Помогите поменять в скетче магнитометр ни как не соображу  

Вот оригинал

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

В нем я поменял шильд на драйвер мотора-пока один мотор, но мне надо еще LSM303 поменять на hmc5883L(GY-273)

 

вот мои пытания(но помоему шляпа полная)..... направте,подскажите плиз

// 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 библиотеки
  setup 'HMC5883L'();       // инициализация 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);
}
 

 

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

гыыы

навожу...

я так понимаю, что гениальность решения заключается в том что бы заменить LSM303 на hmc5883L(GY-273) в тексте программы?

а если на лисапед приклеить надпись РАКЕТА, полетит?