Помогите в скетче магнитометр поменять..... Или хотябы наведите на мысль.....
- Войдите на сайт для отправки комментариев
Чт, 14/05/2015 - 22:37
Помогите поменять в скетче магнитометр ни как не соображу
Вот оригинал
// 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); }
гыыы
навожу...
я так понимаю, что гениальность решения заключается в том что бы заменить LSM303 на hmc5883L(GY-273) в тексте программы?
а если на лисапед приклеить надпись РАКЕТА, полетит?