ошибка в скетче помогите пожалуйста разобраьься
- Войдите на сайт для отправки комментариев
Сб, 04/07/2015 - 21:18
Собрал поворотную системку на ардуино нано с магнитометром 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); }
перед этим heading объявлен как float
что то не выходит-уже пытался и как flot декларировать
что то не выходит-уже пытался и как flot декларировать
FLOT это когда там корабли всякие кучей собираются...
а вот floAt это уже как то ближе к типа переменных :)
FLOT это когда там корабли всякие кучей собираются...
а вот floAt это уже как то ближе к типа переменных :)
Пухлявый, хотел узнать твоё мнение как лингвиста в области программирования, а скетчь - это шо за нах?
Пухлявый, хотел узнать
угу, как с таким количеством ошибок, опечаток и прочего можно вообще написать хоть что то работающее?
впечатление, что имеем дело с тем самым пресловутым миллионом обезьян которым выдали клавиатуры.
Ну я как раз с флота))) и для флота делаю)))) должно антену крутить по магнитометру)))
Не спорю в ардуине я еще как обезьяна-тыкаю куда получится))))) склепывал это произведение из разных скетчей и спотыкаюсь как раз на магнитометре.... и так и сяк тыкаю-а толку как от козла молока))
Ну я как раз с флота))) и для флота делаю)))) должно антену крутить по магнитометру)))
шото у меня сомнения, что оно будет стабильно работать без системы магнитного экранирования локальных магнитных источников магнитного поля лазящего по пасудине.
Вот именно, попробуйте, зная где Север, поискать его с помощью сотовика.....
Может указывать куда угодно
Или софтом типа SatFinder найти куда направить тарелку.
На мобильнике компас работает хорошо в любой точке судна...думаю что и ардуинка сбоить не будет...
ты как определял критерий "хорошо" - есть дефолтный компАс, что бы стравнить или, по каким звёздам сейчас навигация происходит?
мне в принцепе не нужно вообще определять правильные координаты, а нужно чтобы точно было позиционирование относительно палубы... тоесть начинает крутить палубу относительно магнитного поля земли а ардуинка компенсирует с помощью разворота это смещение.... так что юг там или север пофиг главное чтобы могло определить что есть смещение. А компас на моем мобильнике стабильно показывал не хуже старого механического-так что проблем быть не должно
проблема только скетчь доделать я уже и в метале все собрал и плату спаял
качьку сделал компенсацию с помощью мультивия-таместь для подвеса конфигурацию(работает отлично) а вот с направлением пока запара а это основное(вот и ищу кто бы помог с магнитометром разобраться
весь день ковыряюсь вот такое наковырял
но оно один фиг не работает.... с магнитометра данные идут это до строчки return heading* RAD_TO_DEG; // переводим радианы в градусы
а вот далее идет из другого скетча где магнитометр был другой и как я понимаю там алгоритм другой какой то... плюс непонятная переменная sensor.... короче мрак....
В общем, тут вот сначала про войну а дальше я надрал страницы из комиксов и Капитала от Карл Маркса. И чет сюжет замылился.
Примерно так))) концовка тожея про войну сам про моторчик писал)) а вот серединка точно из комиксов.... Может что подскажете?)))
Примерно так))) концовка тожея про войну сам про моторчик писал)) а вот серединка точно из комиксов.... Может что подскажете?)))
Примерно так))) концовка тожея про войну сам про моторчик писал)) а вот серединка точно из комиксов.... Может что подскажете?)))
Подсказываю.
берете другую библиотеку
или берете учебник математики и учитесь как при помощи карандаша и бумаги пересчитать радианы в градусы. Потом пишите формулу в скече.
Примерно так))) концовка тожея про войну сам про моторчик писал)) а вот серединка точно из комиксов.... Может что подскажете?)))
УУУУУУУУУ))))) Аж страшно))))))) Так там вроде с градусами все ок?.... я запускал до строчки return heading* RAD_TO_DEG; // переводим радианы в градусы
в частности откуда брать SENSOR и что это.... heading-как я понял это как раз то что мы с магнитометра получим
вообще я это все выковырял из скетча робота удерживающего напрвление-но беда в том что у меня магнитометры HMC5883L...... Вот и пытаюсь ковыряться пока безрезультатно... Может хотябы про sensor и heading подскажете? а то мозг кипит а толку нет, а скоро в море, а устройство хотелось бы иметь-на рейдах позволит на связь выходить
Может для начала взять библиотеки для своих компасов и там есть примеры. А не пытаться впихнуть невпихуемое
ну так я взял и впихнул-данные с магнитометра идут
а проблемма где то тут
Почему тут а не там?
ну так я взял и впихнул-данные с магнитометра идут
а проблемма где то тут
ну во первых если залить до этого места то скетчь работает и данные идут
во вторых подсвечивает желтым float heading = heading();
ну и в третих не понятно только это место и в частности sensor
тут как раз обрабатываются данные с компаса, а за этим куском уже к мотору и кнопкам поворота относится с приращением к переменной поворота
И чего тут понимать то?
heading(); функция которая осталась там откуда вырвали строчку.вот и всё.
я в свой перенес-она должна по идее оттуда брать данные-получается с магнитометра.... Или я неправ? и что там за sensor
Гыыыы. . Тоесть если к дизельному двигателю приклеить наклейку от бензинового. То все должно работать? Вы вообще впиливаете что датчики разные и читать их нужно поразному. Даже если они ездят одинаково.
понятно ---как я понял sensor и есть данные а функция не заработает(((((( И значит все пропало с моей проектиной так необходимой.... надо искать скетчь такого же робота с моим GY-273..... Стлько времени пилил и все зря((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((
А если я Вас очень попрошу мне помочь, Вы мне конечно же откажете? Не осилю за 2 недели до моря, а сейчас просто некогда заниматься, жена не в том положении чтобы днями за ардуиной сидеть))) да и жалко все бросать, уже собрал в алюминии огромную фигулину спаял Poe пассивный на 34V и плата спаяна, вся и стабилизацию по гераскопу полностью сделана на мультивие(работает отлично), USB удленитель по витой паре 13 метров с доп питанием спаял, осталось только скетчь залить этот а тут запара такая...
Я откажу? Я вообще никому не отказываю вроде. Просто если я это сделаю за вас, то зачем оно мне? А если вы сами будете разбираться при помощи пинков , то видимо это займет время. Ибо вам уже все написали. Просто нужно брать родную датчикам библиотеку и пользоваться ее методами. В примерах к библиотекам все показано.
Да я ее крутил уже и так и сяк сам по профессии механик и электрик судовой... но электроника и програмирование не мой конек.... вроде начало и концовка там понятно-даже что то сам дописал а вот с датчиком что то я не совсем вкурил(точнее совсем не вкурил) там в принцепе весь пример в начале скетча.... Как я понял там как раз и должна где то храниться переменная которая в продолжении(от другого датчика) имеет название sensor , но даже если ее найти гипотетически, остается функция...которая тоже не совсем понятно...
как я понял вывод ее в монитор
Serial
.println(heading); как раз выдает показания с сенсора-значит
heading как раз и содержит в моем магнитометре данные которые в том скетче в sensor записаны..... а с другой стороны там есть строка heading = compass.heading(); значит heading присваивается значение с compass.heading а в моем есть просто compass...... короче манная каша из ушей течет а в голове уже пригорает....поменял на getHeading(); если копаться в библиотеке кажется что там данные магнитометра-в компиляторе проскочило, но что то мне подсказывает что не все так просто и работать не будет, потому как что делать с sensor я так и не вкурил.. ну и дальше начинает на токены ругаться
фиг с ним я сдался!!!!
https://github.com/sleemanj/HMC5883L_Simple
Библиотека и простой пример
Посмотрю сейчас))) хотя я был уже там))
Что там смотреть?
Старую библиотеку удаляем в топку.
качаем эту. Ставим.
открываем пример от нее
там весь пример 5 строчек. Остальные очень подробное обьяснение что каждая строчка делает.
профит
Спасибо)))) буду мучать сейчас)))
библиотека и правда простая совсем все всунул но опять засада
компилятор застревает на строчке void Output(MagnetometerRaw raw, MagnetometerScaled scaled, float heading, float headingDegrees)
хотя как я понял мне этот вывод данных и ненужен наверное ну или просто оставить float heading....
ну и опять же в куске
есть sensor..... откуда он и за что отвечает?
так то собирается компилятором-но sensor мне покоя не дает
Слушай, ты дебил с рождения или как то экология и все такое?
вот я не могу понять есть библиотека которая возвращает шрадусы к заданому азимуту.
Есть библиотека которая крутит серву на заданый угол.
Накой ьы таскпешь это гавно от робота?
Мне пофигу на твоего робота.
Ладно спасибо и на этом-мне серва не годится только колекторный мотор через драйвер
Да по барабану хоть кривой стартер на пидальном ходу.
взять пример от компаса и пример от драйвера мотора.
Вставить посредине пересчет градусов в количество обротов и вперед.
Накой тут это гавно от робота перепечатывать?
ладно с рейса приду денежка будет найду кого нить чтобы сделали-не мое это програмирование....
спасибо
Типа позову помочь механику делать.
- вот мой план. У меня есть старый тостер и 2 миксера.
- так вот же у тебя новые детали на столе. Все что нужно и дел на 5 минут.
- ага детали клевые. Но вот смотри когда миксер пихаю в тостер, второй тостер искрит
- если ты возмешь на столе это и вот это и добавишь шурупчики..
- класс. Но смотри второй миксер искрит...
- дебил!
- согласен, это не моё, будут деньги, найму механика..
-Facepalm
С тостером,миксером и дизельным двигателем любого размера я бы разобрался на раз два три)) каждый должен делать то что умеет.... не умею нефиг лезть-все спаял собрал а програмиста потом искать буду-чтобы делал то что он умеет)) говорю же не мое... попробовал- не получилось надо брать книгу и сидеть 2-3 недели разбираться-банально времени нет... в принцепе в ардуинку только из за этого проекта и влез,для связи в море надо чтобы не скакать с антеной по палубе-робот этот идеально по функционалу подходит... приду буду искать кто этот скетчь доработает, а пока не буду парить мозг ни себе ни людям... поищу на просторах инета-может найду похожего робота под мое железо, а нет так нет-отложу на пол годика....
С тостером,миксером и дизельным двигателем любого размера я бы разобрался на раз два три)) каждый должен делать то что умеет....
Утер скупую мужскую слезу.
отличное оправдание своей лени и не желанию напрягать мозг.
механик без логического мышления, очень плохой механик.
я если что вообще водитель 45 метровых машин.
С тостером,миксером и дизельным двигателем любого размера я бы разобрался на раз два три)) каждый должен делать то что умеет....
Для того чтобы логически мыслить в той или иной сфере сначала нужны знания-у меня их не хватает в програмировании и набрать их на данном этапе уже не успею... А в механике с избытком....благо опыт есть...
Логика она либо есть, либо нет.
любая программа мало чем отличается от трансмиссии например.
Вся ваша программа уместится в пару десятков строчек..
но вы не хотите даже напрячь мозг и понять как работают 2 примера.
1. Компас
2. Драйвер двигателя
вы вцепились в кусоу чего не прнятного в сотню строк и носитесь как девка размахивая грязными трусами.
как датчик и драйвер работает ясно-а вцепился потому что очень удобно вопервых фильтрация во вторых можно допуск срабатывания(чтобы не крутила туда сюда постоянно а плавно подворачивало когда отклонение и можно с пульта подкручивать меняя переменную.... алгоритм идеально подходит для целей.
Мдааа. Вот бы в мозг научиться фильтрацию некоторым устанавливать.
А если их еще научить думать при этом.. вот бы зажили тогда. . Консерваторий бы настроили... консервы бы вкусные выпускать.
Обнять и плакать. ..
Тоесть библиотека которая уже внутри имеет все эти фильтрации и тупо на выходе выдает градус отклонения от установленой цели это фигня.. главное выкорчеваное гавно из робота...
ну фильтрация ладно а допуски по любому нужны-когда судно на рейсе крутит оно не поступательно двигается а туда сюда при этом сюда больше чем туда за счет этого медленно вращается и если плата отрабатывать будет все подряд мотор долго не проживет ну и крутить с пульта нужно значит нужна именно следящая система за переменной
за библиотеку спасибо реально проще некуда сейчас поищу подобные проекты и потом попробую подсунуть эту библиотеку
Маразм крепчает.
В общем я пасс. Можете дальше заниматься фигней, заместо того что бы просто освоить элементарное програмирование и сляпать элементарный скеч из пары десятков строк.