Собрал поворотную системку на ардуино нано с магнитометром 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; все работает-показания с магнитометра идут.... а вот далее идет часть из другого скетча где был другой магнитометр.... и тут все колом...
немного не понятно что у вас тут Код (Text): int dir; // переменная, хранящая направлени //int dir = 180;
это при старте переменной присваивается-чтобы стартовало с позиции 180 градусов, но я закоментировал так как в принцепе без разници что там... просто скетчь склепывал из нескольких вот так сказать остатки у меня проблемма с магнитометром разобраться