Помогите пожалуйста найти ошибку в скетче..

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

Склепал 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);
}