Petros Kyriakou
Petros Kyriakou

Reputation: 5343

Arduino + Ultimate GPS Shield + Xbee Shield + Xbee

I wanna make a project using an Arduino UNO R3 + Ultimate GPS Shield (with built in gps) from Adafruit + Xbee Shield + Xbee S2 and another Arduino MEGA with just Xbee Shield + Xbee module

The following code is the library from adafruit to output gps data in the console using a baud rate of 115200. MY problem is that the xbee becomes unrecongisable (using XCTU) with this kind of code thus i cant configure it.

My question is does my xbee still work even though its not recognisable or i have a problem with the softwareSerial pins or something?

Note that the gps works and outputs data okay.

#include <Adafruit_GPS.h>
#include <SoftwareSerial.h>


SoftwareSerial mySerial(8, 7);
SoftwareSerial xbeeSerial(2,3);

Adafruit_GPS GPS(&mySerial);

#define GPSECHO  false

boolean usingInterrupt = false;
void useInterrupt(boolean); // Func prototype keeps Arduino 0023 happy

void setup()  
{

 Serial.begin(115200);
 xbeeSerial.begin(9600);
 Serial.println("Adafruit GPS library basic test!");


 GPS.begin(9600);


 GPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCGGA);
 GPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);   // 1 Hz update rate
 GPS.sendCommand(PGCMD_ANTENNA);
 useInterrupt(true);

 delay(1000);
 mySerial.println(PMTK_Q_RELEASE);
}


SIGNAL(TIMER0_COMPA_vect) {
 char c = GPS.read();

#ifdef UDR0
 if (GPSECHO)
   if (c) UDR0 = c;  

#endif
}

void useInterrupt(boolean v) {
 if (v) {

   OCR0A = 0xAF;
   TIMSK0 |= _BV(OCIE0A);
   usingInterrupt = true;
 } else {

   TIMSK0 &= ~_BV(OCIE0A);
   usingInterrupt = false;
 }
}

uint32_t timer = millis();
void loop()                     // run over and over again
{

 if (! usingInterrupt) {

   char c = GPS.read();

   if (GPSECHO)
     if (c) Serial.print(c);
 }


 if (GPS.newNMEAreceived()) {


   if (!GPS.parse(GPS.lastNMEA()))   // this also sets the newNMEAreceived() flag to false
     return;  // we can fail to parse a sentence in which case we should just wait for another
 }


 if (timer > millis())  timer = millis();


 if (millis() - timer > 2000) { 
   timer = millis(); // reset the timer

   Serial.print("\nTime: ");
   Serial.print(GPS.hour, DEC); Serial.print(':');
   Serial.print(GPS.minute, DEC); Serial.print(':');
   Serial.print(GPS.seconds, DEC); Serial.print('.');
   Serial.println(GPS.milliseconds);
   Serial.print("Date: ");
   Serial.print(GPS.day, DEC); Serial.print('/');
   Serial.print(GPS.month, DEC); Serial.print("/20");
   Serial.println(GPS.year, DEC);
   Serial.print("Fix: "); Serial.print((int)GPS.fix);
   Serial.print(" quality: "); Serial.println((int)GPS.fixquality); 
   if (GPS.fix) {
     Serial.print("Location: ");
     Serial.print(GPS.latitude, 4); Serial.print(GPS.lat);
     Serial.print(", "); 
     Serial.print(GPS.longitude, 4); Serial.println(GPS.lon);
     Serial.print("Location (in degrees, works with Google Maps): ");
     Serial.print(GPS.latitudeDegrees, 4);
     Serial.print(", "); 
     Serial.println(GPS.longitudeDegrees, 4);

     Serial.print("Speed (knots): "); Serial.println(GPS.speed);
     Serial.print("Angle: "); Serial.println(GPS.angle);
     Serial.print("Altitude: "); Serial.println(GPS.altitude);
     Serial.print("Satellites: "); Serial.println((int)GPS.satellites);
   }
 }
}

Upvotes: 0

Views: 1388

Answers (1)

tomlogic
tomlogic

Reputation: 11694

The documentation for the XBee shield seems to imply that that's expected behavior:

With the jumpers in the USB position (i.e. on the two pins nearest the edge of the board), the DOUT pin the Xbee module is connected to the RX pin of the FTDI chip, and DIN on the Xbee module is connected to the TX pin of the FTDI chip. This means that the Xbee module can communicate directly with the computer - however, this only works if the microcontroller has been removed from the Arduino board. If the microcontroller is left in the Arduino board, it will be able to talk to the computer normally via USB, but neither the computer nor the microcontroller will be able to talk to the Xbee module.

If the XBee shield has its jumper in the "USB" position so you can communicate with X-CTU, you can't make use of that serial port in your running Arduino program.

Upvotes: 1

Related Questions