вопрос по xbee s2

Protez1999
Offline
Зарегистрирован: 08.07.2012

они могут и передавать и принимать??? сделал пульт на 1 модули принимаю вторым передаю а в обратку не моу пустит сигнал 

maksim
Offline
Зарегистрирован: 12.02.2012

Да, они работают в обе стороны. 

Protez1999
Offline
Зарегистрирован: 08.07.2012

по очереди??? сразу в одну потом в другую??? 

axill
Offline
Зарегистрирован: 05.09.2011

Насколько я понимаю основной интерфейс XBee это Serial. В Serial можно как писать так и читать из него.

У меня проблем не возникало

Protez1999
Offline
Зарегистрирован: 08.07.2012

если я посылаю и принамаю на 1 плате то виснет 

maksim
Offline
Зарегистрирован: 12.02.2012

Что значит посылаю и принимаю на одной плате??? Какой плате? что виснет? 

Protez1999
Offline
Зарегистрирован: 08.07.2012

мега с xbee у меня как передатчик в пульте. uno как приемник. Захотел  с uno отправить на мегу 1 и по этой единице включать диод чтоб видеть что платы соеденены. Первые пару сек все работает потом порт виснет. Вроде как нарыл что одновременно и посылать и принимать нельзя надо прекратить посылать и принять . 

maksim
Offline
Зарегистрирован: 12.02.2012

А код целиком можете выложить?

Protez1999
Offline
Зарегистрирован: 08.07.2012
//int krytPin8 = 8;// серва аналог 0

int potPin = 0; //аналог вход 4 кнопи
int potPin2 = 1;
//int ledPin13 = 13; // контроль подключения приемника к базе проверяет сигнал
//int potPin10 = 10;
//int potPin11 = 11;
void setup()
{
  //Create Serial Object (9600 Baud)
  Serial.begin(9600);
  pinMode(potPin, INPUT);
  pinMode(potPin2, INPUT);
 // pinMode(ledPin13,OUTPUT);
}

void loop()
{
   
int valS = analogRead(potPin);
int val2 = analogRead(potPin2);



if((valS>1019)&&(valS<1024)){Serial.print(2);} // верх

if((valS>335)&&(valS<340)){Serial.print(3);} // низ

if((valS>250)&&(valS<255)){Serial.print(4);} // лево

if((valS>509)&&(valS<514)){Serial.print(5);} // право
//////////////////////////////////////////////
if((val2>1019)&&(val2<1024)){Serial.print(6);} // 1

if((val2>335)&&(val2<340)){Serial.print(7);} // 2

if((val2>250)&&(val2<255)){Serial.print(8);} // 3

if((val2>509)&&(val2<514)){Serial.print(9);} // 4

if ((valS<1)and(val2<2)){Serial.print(0);}// чтоб и второй был 0 надо оба подрубить
  delay(50); 
 // Serial.println(valS);
}

код передатчика

Protez1999
Offline
Зарегистрирован: 08.07.2012
#include <Servo.h>
Servo servaProverka;
Servo servaProverka2;

int servoPin2 = 11;
int servoPin = 12;
//////////////////////////
int ledPin1 = 10; //7
int ledPin2 = 9;  //8
int ledPin3 = 8;  //9
int ledPin4 = 7;  //10 ? контакты вкл-выкл

boolean lastButton = 1;
boolean lastButton2 = 1;
boolean lastButton3 = 1;
boolean lastButton4 = 1;
boolean ledOn = 0;
boolean ledOn2 = 0;
boolean ledOn3 = 0;
boolean ledOn4 = 0;
///////////////////////////////////

int ledLevel = 90;
int ledLevel2 = 90;


void setup()
{
  Serial.begin(9600); 
  servaProverka.attach(servoPin);
   servaProverka2.attach(servoPin2);
 pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
  
  pinMode(servoPin2, OUTPUT);
  pinMode(servoPin, OUTPUT);

}

void loop()
{ 
  while( Serial.available() == 0);
   byte data= Serial.read() - '0';
  
  int val = byte(data);
Serial.print(5);

  if((val>1)&&(val<3)){maax();} //2 верх
  
if((val>2)&&(val<4)){miin();} // 3 низ

if((val>3)&&(val<5)){miin2();} // 4 лево

if((val>4)&&(val<6)){maax2();} // 5 право

//////////////////////////  6-1 пин led

{
  if(byte((data>5)&&(data<7)) == 1 &&lastButton == 0)
{
  ledOn = !ledOn;
  lastButton = 1;
}
else
{
lastButton = byte(data);
}
  digitalWrite(ledPin1,ledOn);
} 
////////////////////////////////// 7-2 пин led
 {
  if(byte((data>6)&&(data<8)) == 1 &&lastButton2 == 0)
{
  ledOn2 = !ledOn2;
  lastButton2 = 1;
}
else
{
lastButton2 = byte(data);
}
  digitalWrite(ledPin2,ledOn2);
} 
 ///////////////////////// 8-3
 {
  if(byte((data>7)&&(data<9)) == 1 &&lastButton3 == 0)
{
  ledOn3 = !ledOn3;
  lastButton3 = 1;
}
else
{
lastButton3 = byte(data);
}
  digitalWrite(ledPin3,ledOn3);
} 

/////////////////////////////// 9-4
{
 if(byte((data>8)&&(data<10)) == 1 &&lastButton4 == 0)
{
  ledOn4 = !ledOn4;
  lastButton4 = 1;
}
else
{
lastButton4 = byte(data);
}
  digitalWrite(ledPin4,ledOn4);
} 

Serial.print(val);

}




void maax()
{
//ledLevel = map(ledLevel, 0, 255, 0, 360);
    ledLevel = ledLevel + 10;
    delay(100);
if(ledLevel > 180) ledLevel = 180;
servaProverka.write(ledLevel);
}

void miin()
{
 // ledLevel = map(ledLevel, 0, 255, 0, 360);
    ledLevel = ledLevel - 10;
    delay(100);
    if(ledLevel < 0) ledLevel = 0;
   servaProverka.write(ledLevel);
  }
  ////////////////////////
  
  void maax2()
{
//ledLevel = map(ledLevel, 0, 255, 0, 360);
    ledLevel2 = ledLevel2 + 10;
    delay(100);
if(ledLevel2 > 180) ledLevel2 = 180;
servaProverka2.write(ledLevel2);
}

void miin2()
{
 // ledLevel = map(ledLevel, 0, 255, 0, 360);
    ledLevel2 = ledLevel2 - 10;
    delay(100);
    if(ledLevel2 < 0) ledLevel2 = 0;
   servaProverka2.write(ledLevel2);
  }

код приемника . в приемнике добавил Serial.print(1); чтоб отсылал 1.  передатчике добавил while( Serial.available() == 0);
byte data= Serial.read() - '0';
  в void loop и строку если data >1 то загорится диод.

maksim
Offline
Зарегистрирован: 12.02.2012

Очень много мусора в коде, чуть меньше ошибок, в общем скорее свего у вас просто переполнялся буфер UART, из-за того что даже когда ничего не было нажато в порт отправлялся 0.

Попробуйте так:

//int krytPin8 = 8;// серва аналог 0

int potPin = 0; //аналог вход 4 кнопи
int potPin2 = 1;

boolean lastButton1, lastButton2, lastButton3, lastButton4 = 0;

//int ledPin13 = 13; // контроль подключения приемника к базе проверяет сигнал
//int potPin10 = 10;
//int potPin11 = 11;
void setup()
{
  //Create Serial Object (9600 Baud)
  Serial.begin(9600);
  pinMode(potPin, INPUT);
  pinMode(potPin2, INPUT);
  // pinMode(ledPin13,OUTPUT);
}

void loop()
{

  int valS = analogRead(potPin);
  int val2 = analogRead(potPin2);

  if(valS > 1019 && valS < 1024){
    Serial.print(2);
  } // верх

  if(valS > 335 && valS < 340){
    Serial.print(3);
  } // низ

  if(valS > 250 && valS < 255){
    Serial.print(4);
  } // лево

  if(valS > 509 && valS < 514 ){
    Serial.print(5);
  } // право
  
  //////////////////////////////////////////////
  
  if(val2 > 1019 && val2 < 1024 && !lastButton1){
    Serial.print(6);
    lastButton1 = 1;
  } // 1

  if(val2 > 335 && val2 < 340 && !lastButton2){
    Serial.print(7);
    lastButton2 = 1;
  } // 2

  if(val2 > 250 && val2 < 255 && !lastButton3){
    Serial.print(8);
    lastButton3 = 1;
  } // 3

  if(val2 > 509 && val2 < 514 && !lastButton4){
    Serial.print(9);
    lastButton4 = 1;
  } // 4

  if (val2 < 2){
  lastButton1 = 0;
  lastButton2 = 0;
  lastButton3 = 0;
  lastButton4 = 0;
  }
  delay(50); 
  // Serial.println(valS);
}
#include <Servo.h>
Servo servaProverka;
Servo servaProverka2;

int servoPin2 = 11;
int servoPin = 12;
//////////////////////////
int ledPin1 = 10; //7
int ledPin2 = 9;  //8
int ledPin3 = 8;  //9
int ledPin4 = 7;  //10 ? контакты вкл-выкл

boolean ledOn, ledOn2, ledOn3, ledOn4 = 0;

///////////////////////////////////

int ledLevel = 90;
int ledLevel2 = 90;


void setup()
{
  Serial.begin(9600); 
  servaProverka.attach(servoPin);
  servaProverka2.attach(servoPin2);
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  pinMode(ledPin3, OUTPUT);
  pinMode(ledPin4, OUTPUT);
}

void loop()
{ 
  while(Serial.available()){
    delay(2);
    int val = Serial.read() - '0';
    //Serial.print(5);
    switch(val){
    case 2:  //2 верх
      maax();
      break;

    case 3:  // 3 низ
      miin();
      break;

    case 4: // 4 лево
      miin2();
      break;

    case 5: // 5 право
      maax2();
      break;

    case 6: //  6-1 пин led
      ledOn = !ledOn;
      digitalWrite(ledPin1,ledOn);
      break;

    case 7: // 7-2 пин led
      ledOn2 = !ledOn2;
      digitalWrite(ledPin2,ledOn2);
      break;

    case 8: // 8-3
      ledOn3 = !ledOn3;
      digitalWrite(ledPin3,ledOn3);
      break;

    case 9: // 9-4
      ledOn4 = !ledOn4;
      digitalWrite(ledPin4,ledOn4);
      break;
    }

    //Serial.print(val);
  }
}


void maax()
{
  //ledLevel = map(ledLevel, 0, 255, 0, 360);
  ledLevel += 10;
  ledLevel = min(ledLevel, 180);
  servaProverka.write(ledLevel);
  delay(100);
}

void miin()
{
  // ledLevel = map(ledLevel, 0, 255, 0, 360);
  ledLevel -= 10;  
  ledLevel = max(ledLevel, 0);
  servaProverka.write(ledLevel);
  delay(100);
}
////////////////////////

void maax2()
{
  //ledLevel = map(ledLevel, 0, 255, 0, 360);
  ledLevel2 += 10; 
  ledLevel2 = min(ledLevel2, 180);
  servaProverka2.write(ledLevel2);
  delay(100);
}

void miin2()
{
  // ledLevel = map(ledLevel, 0, 255, 0, 360);
  ledLevel2 -= 10;  
  ledLevel2 = max(ledLevel2, 0);
  servaProverka2.write(ledLevel2);
  delay(100);
}

По анлогии делаете передачу и прием в принимающем и передающем кодах соответственно. 

Постарайтесь не делать так, что бы в порт постоянно что то летело когда этого не нужно.

Protez1999
Offline
Зарегистрирован: 08.07.2012

дело в том что это все происходили первые пару сек. 0 специально пустил чтоб приемник был активным и не теряял связь. если не трогаю одновременно прием передачу все работает тока пытаюсь читать на передатчике он умирает.

буду пробовать ваш.

maksim
Offline
Зарегистрирован: 12.02.2012

А почему он должен терять связь? 

Protez1999
Offline
Зарегистрирован: 08.07.2012

у меня потерял я подумал из-за того что ничего не шло. уберу 0 

Protez1999
Offline
Зарегистрирован: 08.07.2012

просто вроде кто то говорил что он может или принимать или передавать. тоесть когда я хочу принять на передатчик я должен прекратить передачу