Помогите пожалуйста найти ошибку в скетче..
- Войдите на сайт для отправки комментариев
Сб, 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);
}