Go Down

Topic: Arduino Mega and Xbee serial communication (Read 10040 times) previous topic - next topic

chummer1010

Why are you using SoftwareSerial on a Mega? Correct me if I'm wrong, but doesn't that have multiple rx/tx pins?
#include <signature.h>

fordbuff39

Well, I did get my two sessions going and included the XBee-Ardunio library.  Selected the Series_2_Tx and Rx as the sketch starting point, included below.

Changed Serial to Serial1, but serial.print for debugging.

Not connecting,

The Tx uses pin5 as the payload, I just want to send strings to the Rx.

Thanks again.

Series_2_Tx:
Code: [Select]

/**
 * Copyright (c) 2009 Andrew Rapp. All rights reserved.
 *
 * This file is part of XBee-Arduino.
 *
 */

#include <XBee.h>

/*
This example is for Series 2 XBee
 Sends a ZB TX request with the value of analogRead(pin5) and checks the status response for success
*/

// create the XBee object
XBee xbee = XBee();

uint8_t payload[] = { 0, 0 };

// SH + SL Address of receiving XBee
XBeeAddress64 addr64 = XBeeAddress64(0x0013a200, 0x403e0f30);
ZBTxRequest zbTx = ZBTxRequest(addr64, payload, sizeof(payload));
ZBTxStatusResponse txStatus = ZBTxStatusResponse();

int pin5 = 0;

int statusLed = 13;
int errorLed = 13;

void flashLed(int pin, int times, int wait) {

  for (int i = 0; i < times; i++) {
    digitalWrite(pin, HIGH);
    delay(wait);
    digitalWrite(pin, LOW);

    if (i + 1 < times) {
      delay(wait);
    }
  }
}

void setup() {
  pinMode(statusLed, OUTPUT);
  pinMode(errorLed, OUTPUT);

  Serial.begin(9600);
  Serial1.begin(9600);
  xbee.setSerial(Serial1);
 
  Serial.println("Controller Starting . . . .");
 
}

void loop() {   
  // break down 10-bit reading into two bytes and place in payload
  pin5 = analogRead(5);
  payload[0] = pin5 >> 8 & 0xff;
  payload[1] = pin5 & 0xff;

  xbee.send(zbTx);

  // flash TX indicator
  flashLed(statusLed, 1, 100);

  // after sending a tx request, we expect a status response
  // wait up to half second for the status response
  if (xbee.readPacket(500)) {
    // got a response!

    // should be a znet tx status           
    if (xbee.getResponse().getApiId() == ZB_TX_STATUS_RESPONSE) {
      xbee.getResponse().getZBTxStatusResponse(txStatus);

      // get the delivery status, the fifth byte
      if (txStatus.getDeliveryStatus() == SUCCESS) {
        // success.  time to celebrate
        flashLed(statusLed, 5, 50);
      } else {
        // the remote XBee did not receive our packet. is it powered on?
        flashLed(errorLed, 3, 500);
      }
    }
  } else if (xbee.getResponse().isError()) {
    Serial.print("Error reading packet.  Error code: "); 
    Serial.println(xbee.getResponse().getErrorCode());
  } else {
    // local XBee did not provide a timely TX Status Response -- should not happen
    flashLed(errorLed, 2, 50);
  }

  delay(1000);
}






Series_2_Rx:
Code: [Select]

/**
 * Copyright (c) 2009 Andrew Rapp. All rights reserved.
 *
 * This file is part of XBee-Arduino.
 *
 */
 
#include <XBee.h>

/*
This example is for Series 2 XBee
Receives a ZB RX packet and sets a PWM value based on packet data.
Error led is flashed if an unexpected packet is received
*/

XBee xbee = XBee();
XBeeResponse response = XBeeResponse();
// create reusable response objects for responses we expect to handle
ZBRxResponse rx = ZBRxResponse();
ModemStatusResponse msr = ModemStatusResponse();

int statusLed = 13;
int errorLed = 13;
int dataLed = 13;

void flashLed(int pin, int times, int wait) {
    
    for (int i = 0; i < times; i++) {
      digitalWrite(pin, HIGH);
      delay(wait);
      digitalWrite(pin, LOW);
      
      if (i + 1 < times) {
        delay(wait);
      }
    }
}

void setup() {
  pinMode(statusLed, OUTPUT);
  pinMode(errorLed, OUTPUT);
  pinMode(dataLed,  OUTPUT);
  
  // start serial
  Serial.begin(9600);
  
  Serial1.begin(9600);
  xbee.begin(Serial1);
  
  flashLed(statusLed, 3, 50);
  
  Serial.println("Robot Starting . . . .");

}

// continuously reads packets, looking for ZB Receive or Modem Status
void loop() {
    
    xbee.readPacket();
    
    if (xbee.getResponse().isAvailable()) {
      // got something
      
      if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE) {
        // got a zb rx packet
        
        // now fill our zb rx class
        xbee.getResponse().getZBRxResponse(rx);
            
        if (rx.getOption() == ZB_PACKET_ACKNOWLEDGED) {
            // the sender got an ACK
            flashLed(statusLed, 10, 10);
        } else {
            // we got it (obviously) but sender didn't get an ACK
            flashLed(errorLed, 2, 20);
        }
        // set dataLed PWM to value of the first byte in the data
        analogWrite(dataLed, rx.getData(0));
      } else if (xbee.getResponse().getApiId() == MODEM_STATUS_RESPONSE) {
        xbee.getResponse().getModemStatusResponse(msr);
        // the local XBee sends this response on certain events, like association/dissociation
        
        if (msr.getStatus() == ASSOCIATED) {
          // yay this is great.  flash led
          flashLed(statusLed, 10, 10);
        } else if (msr.getStatus() == DISASSOCIATED) {
          // this is awful.. flash led to show our discontent
          flashLed(errorLed, 10, 10);
        } else {
          // another status
          flashLed(statusLed, 5, 10);
        }
      } else {
       // not something we were expecting
        flashLed(errorLed, 1, 25);    
      }
    } else if (xbee.getResponse().isError()) {
      Serial.print("Error reading packet.  Error code: ");  
      Serial.println(xbee.getResponse().getErrorCode());
    }
}




oscuatin

I finally get that HW serial thing, here's my code for basic com.
Code: [Select]
#define hwSerial Serial1 //Just to change the name of Serial1 so I don't get confused, it will be used to connect Xbee
 //Serial1 uses Pins 18 and 19
 // Connect DOUT to pin 19
 // Connect DIN to pin 18

void setup() {
  Serial.begin(9600);
  hwSerial.begin(9600);
  delay(500);
}

void loop() {
  if(Serial.available()) {          // Is serial data available?
    char outgoing = Serial.read();  // Read character, send to XBee
    hwSerial.print(outgoing);
  }
 
  if(hwSerail.available()) {            // Is data available from XBee?
    char incoming = Serial1.read();    // Read character,
    Serial.println(incoming);       //   send to Serial Monitor
  }

  delay(50);
}


This was tested with S1 Xbee, one connected to MEGA 2560, and the other to XCTU

govindkishor1995

hello I'm also facing the same issue with mega and xbee2, but could not solve till now. please guide me properly to view xbee+xctu message on seriel monitor of arduino.

PaulS

Quote
please guide me properly to view xbee+xctu message on seriel monitor of arduino.
1) Properly configure each XBee
2) Properly connect one XBee to the PC.
3) Properly connect the other XBee to the Arduino.
4) Write the proper code, compile, link, and upload it to the Arduino.
5) Open the Serial Monitor application.
6) Type a message in X-CTU
7) Read the message in the Serial Monitor application

Do NOT screw up a single step!
The art of getting good answers lies in asking good questions.

Go Up