Помогите пожалуйста найти ошибку в скетче..
- Войдите на сайт для отправки комментариев
Сб, 10/10/2015 - 23:48
Склепал 2 скетча один передает 2 координаты а второй принимает эти координаты... отдельно все работает.... А дальше ту часть которая принимает попытался скрестить с основной частью проекта и вот после этого засада монитор молчит... помогите плиз разобраться...
рабочий скетчь приемника..
#include <RCSwitch.h> RCSwitch mySwitch = RCSwitch(); #define key1 300000 #define key2 303000 int q; // с передатчика int z; // с передатчика void setup() { Serial.begin(9600); mySwitch.enableReceive(0); // Receiver on inerrupt 0 => that is pin #2 // иницилизация.Используется вывод м/к с прерыванием под номером 0. } void loop() { if (mySwitch.available()) { while (!Serial); unsigned long receivedCode= mySwitch.getReceivedValue(); if (receivedCode == 0) { // обработка:не верный формат данных } else { if (key1<=receivedCode && key1+999>receivedCode) q=(int)(receivedCode-key1); else if (key2<=receivedCode && key2+999>receivedCode) z=(int)(receivedCode-key2); } mySwitch.resetAvailable(); // сброс данных. } // end available // тут могут выводится данные tempout и tempin на лсд экран или отправлятся через езернет. Serial.print("peremennaya---"); Serial.print(q); delay(500); Serial.print("vtoraya---"); Serial.print(z); }
А это код после того как скрестил с основным вышеразмещенный приемник
#include <Wire.h> #include <HMC5883L.h> #include <MPU6050.h> #include <I2Cdev.h> #include <Servo.h> #include <EEPROM.h> #include <RCSwitch.h> Servo myservo; RCSwitch mySwitch = RCSwitch(); HMC5883L compass; MPU6050 mpu; #define key1 300000 #define key2 303000 int q; // с передатчика int z; // с передатчика int addr = 0;//адрес старта памяти 0-512 int addr1 = 1;//адрес старта памяти 0-512 int error = 0; float heading1; // компасс без компенсации с дробью float heading2; //компасс с компенсацией с дробью int headingx; //Компасс целое число компенсацией рабочая лошадь+++++++++ int headingy; //Компасс целое число без компенсации const int max = 360; // максимум const int max2 = 170; // максимум для сервы с датчиками const int min = 0; // минимум const int min2 = 10; // минимум int dir = EEPROM.read(addr1); // переменная, хранящая направлени (не забыть ниже прописать!!!!!!) int IN3 = 5; int IN4 = 4; int ENB = 3; int tol = 6; // допустимая точность удерживания направления int pos2 = EEPROM.read(addr); //серва для вращения датчиков старт 90 градусов long previousMillis = 0; // храним время последнего считывания long interval = 120000; //интервал 2 для записи pos2 и dir в память //---------------------------------------------------------------------------------------------------------- void setup() { Serial.begin(9600); Wire.begin(); myservo.attach(9); mySwitch.enableReceive(0); // Receiver on inerrupt 0 => that is pin #2 // иницилизация.Используется вывод м/к с прерыванием под номером 0. pinMode(13, OUTPUT); pinMode (ENB, OUTPUT); pinMode (IN3, OUTPUT); pinMode (IN4, OUTPUT); //---------------------------------------------------------------- // Initialize MPU6050 while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G)) { delay(500); } // Enable bypass mode mpu.setI2CMasterModeEnabled(false); mpu.setI2CBypassEnabled(true) ; mpu.setSleepEnabled(false); // Initialize Initialize HMC5883L while (!compass.begin()) { delay(500); } // Set measurement range compass.setRange(HMC5883L_RANGE_1_3GA); // Set measurement mode compass.setMeasurementMode(HMC5883L_CONTINOUS); // Set data rate compass.setDataRate(HMC5883L_DATARATE_30HZ); // Set number of samples averaged compass.setSamples(HMC5883L_SAMPLES_8); // Set calibration offset. See HMC5883L_calibration.ino compass.setOffset(0, 0); } // No tilt compensation float noTiltCompensate(Vector mag) { float heading = atan2(mag.YAxis, mag.XAxis); return heading; } // Tilt compensation float tiltCompensate(Vector mag, Vector normAccel) { // Pitch & Roll float roll; float pitch; roll = asin(normAccel.YAxis); pitch = asin(-normAccel.XAxis); if (roll > 0.78 || roll < -0.78 || pitch > 0.78 || pitch < -0.78) { return -1000; } // Some of these are used twice, so rather than computing them twice in the algorithem we precompute them before hand. float cosRoll = cos(roll); float sinRoll = sin(roll); float cosPitch = cos(pitch); float sinPitch = sin(pitch); // Tilt compensation float Xh = mag.XAxis * cosPitch + mag.ZAxis * sinPitch; float Yh = mag.XAxis * sinRoll * sinPitch + mag.YAxis * cosRoll - mag.ZAxis * sinRoll * cosPitch; float heading = atan2(Yh, Xh); return heading; } // Correct angle float correctAngle(float heading) { if (heading < 0) { heading += 2 * PI; } if (heading > 2 * PI) { heading -= 2 * PI; } return heading; } //------------------------------------------------------------------------------------------- void loop(){ //----------------------------------------------------------------------------------------- unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) {////проверяем не прошел ли нужный интервал, если прошел то previousMillis = currentMillis; //// сохраняем время последнего переключения EEPROM.write(addr, pos2); EEPROM.write(addr1, dir); delay(10); } //------------------------------------------------------------------------------------------- if (mySwitch.available()) { while (!Serial);// без этого на леонардо не показывает монитор unsigned long receivedCode= mySwitch.getReceivedValue(); if (receivedCode == 0) { // обработка:не верный формат данных } else { if (key1<=receivedCode && key1+999>receivedCode) q=(int)(receivedCode-key1); else if (key2<=receivedCode && key2+999>receivedCode) z=(int)(receivedCode-key2); } mySwitch.resetAvailable(); // сброс данных. } // end available dir = map(q, 0, 120, 0, 360); // Конвертируем значения для вывода в монитор и на экран pos2 = map(z, 0, 120, 0, 180); // Конвертируем значения для вывода в монитор и на экран delay(50); //---------------------------------------------------------------------------------------------------- // Read vectors Vector mag = compass.readNormalize(); Vector acc = mpu.readScaledAccel(); // Calculate headings heading1 = noTiltCompensate(mag); heading2 = tiltCompensate(mag, acc); if (heading2 == -1000) { heading2 = heading1; } // Set declination angle on your location and fix heading // You can find your declination on: http://magnetic-declination.com/ // (+) Positive or (-) for negative // For Bytom / Poland declination angle is 4'26E (positive) // Formula: (deg + (min / 60.0)) / (180 / M_PI); float declinationAngle = (4.0 + (26.0 / 60.0)) / (180 / M_PI); heading1 += declinationAngle; heading2 += declinationAngle; // Correct for heading < 0deg and heading > 360deg heading1 = correctAngle(heading1); heading2 = correctAngle(heading2); // Convert to degrees heading1 = heading1 * 180/M_PI; heading2 = heading2 * 180/M_PI; int headingx = (int)heading2; int headingy = (int)heading1; ///////////////////////////////////////////////////////////////////////// int dif = headingx - dir; // вычисляем разницу между реальным направлением и заданным int absdif = abs(dif); if (absdif <= tol) Stop(); // если разница меньше допустимой погрешности, то останавливаемся else if (((absdif > 180) && (dif != absdif)) || ((absdif < 180) && (dif == absdif))) TurnLeft(); // иначе определяем кратчайшее направление поворота else TurnRight(); if(dir > max) // проверяем выход за пределы верхней границы { dir = dir - max; } if(dir < min) // проверяем выход за пределы нижней границы { dir = max - dir; } if(pos2 > max2) // проверяем выход за пределы верхней границы { pos2 = max2; } if(pos2 < min2) // проверяем выход за пределы нижней границы { pos2 = min2; } myservo.write(pos2); delay(25); // waits 15ms for the servo to reach the position //------------------------------------------------------------------------- Serial.print(dir); Serial.print("-dir : "); Serial.print(headingx); Serial.print("- headingx : "); Serial.print(pos2); Serial.print("-pos2 : "); Serial.print(q); Serial.print("q : "); Serial.print(z); Serial.print("z : "); //------------------------------------------------------------------------- } // конец основной программы, начинаем все сначала 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(100); } void TurnLeft(){ // подпрограмма Поворот налево digitalWrite (IN3, LOW); digitalWrite (IN4, HIGH); analogWrite(ENB,255); delay(100); }