USB Host shield e Xbee shield, conflitto?

Salve a tutti,
Rilevo un problema anomalo sul mio Arduino UNO dove ho montato la USB Host shield con un dongle bluetooth che funziona molto bene, nel Serial Monitor ricevo tutti i tasti premuti dal controller via bluetooth.
Il problema però si presenta nel momento in cui aggiunta la Xbee shield (dove ovviamente è montato un modulo Xbee che precedentemente avevo già configurato collengandolo da solo al Arduino UNO e ricevevo i dati dall altro modulo xbee) il controller non sembra più volersi connettere al arduino UNO tramite la dongle inserita nel USB Host shield.
Rimuovendo la Xbee shield tutto torna a funzionare…

Questo è il semplice sketch in uso presente nella cartella esempi della USB host shield:

/*
 Example sketch for the PS3 Bluetooth library - developed by Kristian Lauszus
 For more information visit my blog: http://blog.tkjelectronics.dk/ or
 send me an e-mail:  kristianl@tkjelectronics.com
 */

#include <PS3BT.h>
#include <usbhub.h>

// Satisfy the IDE, which needs to see the include statment in the ino too.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#include <SPI.h>
#endif

USB Usb;
//USBHub Hub1(&Usb); // Some dongles have a hub inside

BTD Btd(&Usb); // You have to create the Bluetooth Dongle instance like so
/* You can create the instance of the class in two ways */
PS3BT PS3(&Btd); // This will just create the instance
//PS3BT PS3(&Btd, 0x00, 0x15, 0x83, 0x3D, 0x0A, 0x57); // This will also store the bluetooth address - this can be obtained from the dongle when running the sketch

bool printTemperature;
bool printAngle;

void setup() {
  Serial.begin(115200);
#if !defined(__MIPSEL__)
  while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
#endif
  if (Usb.Init() == -1) {
    Serial.print(F("\r\nOSC did not start"));
    while (1); //halt
  }
  Serial.print(F("\r\nPS3 Bluetooth Library Started"));
}
void loop() {
  Usb.Task();

  if (PS3.PS3Connected || PS3.PS3NavigationConnected) {
    if (PS3.getAnalogHat(LeftHatX) > 137 || PS3.getAnalogHat(LeftHatX) < 117 || PS3.getAnalogHat(LeftHatY) > 137 || PS3.getAnalogHat(LeftHatY) < 117 || PS3.getAnalogHat(RightHatX) > 137 || PS3.getAnalogHat(RightHatX) < 117 || PS3.getAnalogHat(RightHatY) > 137 || PS3.getAnalogHat(RightHatY) < 117) {
      Serial.print(F("\r\nLeftHatX: "));
      Serial.print(PS3.getAnalogHat(LeftHatX));
      Serial.print(F("\tLeftHatY: "));
      Serial.print(PS3.getAnalogHat(LeftHatY));
      if (PS3.PS3Connected) { // The Navigation controller only have one joystick
        Serial.print(F("\tRightHatX: "));
        Serial.print(PS3.getAnalogHat(RightHatX));
        Serial.print(F("\tRightHatY: "));
        Serial.print(PS3.getAnalogHat(RightHatY));
      }
    }

    // Analog button values can be read from almost all buttons
    if (PS3.getAnalogButton(L2) || PS3.getAnalogButton(R2)) {
      Serial.print(F("\r\nL2: "));
      Serial.print(PS3.getAnalogButton(L2));
      if (PS3.PS3Connected) {
        Serial.print(F("\tR2: "));
        Serial.print(PS3.getAnalogButton(R2));
      }
    }
    if (PS3.getButtonClick(PS)) {
      Serial.print(F("\r\nPS"));
      PS3.disconnect();
    }
    else {
      if (PS3.getButtonClick(TRIANGLE))
        Serial.print(F("\r\nTraingle"));
      if (PS3.getButtonClick(CIRCLE))
        Serial.print(F("\r\nCircle"));
      if (PS3.getButtonClick(CROSS))
        Serial.print(F("\r\nCross"));
      if (PS3.getButtonClick(SQUARE))
        Serial.print(F("\r\nSquare"));

      if (PS3.getButtonClick(UP)) {
        Serial.print(F("\r\nUp"));
        if (PS3.PS3Connected) {
          PS3.setLedOff();
          PS3.setLedOn(LED4);
        }
      }
      if (PS3.getButtonClick(RIGHT)) {
        Serial.print(F("\r\nRight"));
        if (PS3.PS3Connected) {
          PS3.setLedOff();
          PS3.setLedOn(LED1);
        }
      }
      if (PS3.getButtonClick(DOWN)) {
        Serial.print(F("\r\nDown"));
        if (PS3.PS3Connected) {
          PS3.setLedOff();
          PS3.setLedOn(LED2);
        }
      }
      if (PS3.getButtonClick(LEFT)) {
        Serial.print(F("\r\nLeft"));
        if (PS3.PS3Connected) {
          PS3.setLedOff();
          PS3.setLedOn(LED3);
        }
      }

      if (PS3.getButtonClick(L1))
        Serial.print(F("\r\nL1"));
      if (PS3.getButtonClick(L3))
        Serial.print(F("\r\nL3"));
      if (PS3.getButtonClick(R1))
        Serial.print(F("\r\nR1"));
      if (PS3.getButtonClick(R3))
        Serial.print(F("\r\nR3"));

      if (PS3.getButtonClick(SELECT)) {
        Serial.print(F("\r\nSelect - "));
        PS3.printStatusString();
      }
      if (PS3.getButtonClick(START)) {
        Serial.print(F("\r\nStart"));
        printAngle = !printAngle;
      }
    }
#if 0 // Set this to 1 in order to see the angle of the controller
    if (printAngle) {
      Serial.print(F("\r\nPitch: "));
      Serial.print(PS3.getAngle(Pitch));
      Serial.print(F("\tRoll: "));
      Serial.print(PS3.getAngle(Roll));
    }
#endif
  }
#if 0 // Set this to 1 in order to enable support for the Playstation Move controller
  else if (PS3.PS3MoveConnected) {
    if (PS3.getAnalogButton(T)) {
      Serial.print(F("\r\nT: "));
      Serial.print(PS3.getAnalogButton(T));
    }
    if (PS3.getButtonClick(PS)) {
      Serial.print(F("\r\nPS"));
      PS3.disconnect();
    }
    else {
      if (PS3.getButtonClick(SELECT)) {
        Serial.print(F("\r\nSelect"));
        printTemperature = !printTemperature;
      }
      if (PS3.getButtonClick(START)) {
        Serial.print(F("\r\nStart"));
        printAngle = !printAngle;
      }
      if (PS3.getButtonClick(TRIANGLE)) {
        Serial.print(F("\r\nTriangle"));
        PS3.moveSetBulb(Red);
      }
      if (PS3.getButtonClick(CIRCLE)) {
        Serial.print(F("\r\nCircle"));
        PS3.moveSetBulb(Green);
      }
      if (PS3.getButtonClick(SQUARE)) {
        Serial.print(F("\r\nSquare"));
        PS3.moveSetBulb(Blue);
      }
      if (PS3.getButtonClick(CROSS)) {
        Serial.print(F("\r\nCross"));
        PS3.moveSetBulb(Yellow);
      }
      if (PS3.getButtonClick(MOVE)) {
        PS3.moveSetBulb(Off);
        Serial.print(F("\r\nMove"));
        Serial.print(F(" - "));
        PS3.printStatusString();
      }
    }
    if (printAngle) {
      Serial.print(F("\r\nPitch: "));
      Serial.print(PS3.getAngle(Pitch));
      Serial.print(F("\tRoll: "));
      Serial.print(PS3.getAngle(Roll));
    }
    else if (printTemperature) {
      Serial.print(F("\r\nTemperature: "));
      Serial.print(PS3.getTemperature());
    }
  }
#endif
}

Hai verificato i pin e le risorse usate ? Probabilmente c'è qualche conflitto !

Quindi ... prendi le specifiche del USB Host Shield (e se metti un link e dici anche a noi quale è ... è meglio) e guarda COSA usa sia come pin che come risorse SW, poi prendi lo shield XBee (e, anche qui, se ci metti il link ci fai un favore) e fai la stessa cosa ... quindi ... confronti e vedi i conflitti.

Guglielmo

P.S.: metti anche un link alle librerie che stai usando perché non sappiamo QUALI stai usando tu !

Il problema è che siccome è un piccolo primo progetto sperimentale per hobby le 2 shield non le ho prese originali ma su ebay da un venditore italiano e quindi senza neppure nessuna documentazione.

la libreria è la seguente:

La USB Host Shield viene chiamata: USB HOST Shield Android V2.0

facendo delle ricerche sembra che usi questi pin:
Digital Pin 7 used for MAX_RESET
Digital Pin 8 used for GPX

Digital Pin 9/PWM used for INT
Digital Pin 10/PWM used for SS

Digital Pin 11/PWM used for MOSI
Digital Pin 12 used for MISO
Digital Pin 13/LED used for SCK

La Xbee Shield invece: XBEE SHIELD V03
è questa: http://www.ebay.it/itm/ZIGBEE-XBEE-SHIELD-V03-x-Moduli-WIRELESS-BLUETOOTH-BEE-ecc-x-ARDUINO-/112012877664?

Però non riesco a trovare i pin usati da quest ultima.

dato che gli SPI pin possono essere condivisi può darsi che il problema possa essere nei pin 9 e 10 quindi SS e INT, questi ho letto che è possibile riallocarli però bisognerebbe tagliare e fare un piccolo collegamento quindi se probabilmente questi 2 sono usati pure sulla xbee shield sono quasi sicuremente loro, giusto?


Sono riuscito a trovare queste specifiche su un altro sito:
http://elecfreaks.com/store/download/datasheet/breakout/UART_Bee.pdf

Problema risolto!

Dopo aver escluso il problema dei pin in conflitto usati dalle due shield, sono passato, tenendo la shield staccata dal Arduino, al testare ogni singolo pin con dei fili, e ho trovato che il problema si presenta con il pin RESET, quindi avendo ristretto il campo e facendo qualche ricerca se ci fossero dei problemi già noti con tale pin e il componente/shield, ho trovato questo articolo:

che parla esattamente dell'opzione che mi dava il suddetto problema.
infatti suggerisce di disabilitare l'opzione "CTS Flow Control" nei settaggi della XBee, che altrimenti infatti generava questo problema:

D7=0 (CTS on XBee is hardwired to reset pin of Arduino. When XBee sleeps, Arduino resets.)

simply set IOD7=0 (or use ATD7=0, same thing). The XBee will no longer reset your Arduino simply because it wants to sleep.

Tutto qua, spero questo possa servire a qualcun altro in caso di bisogno.

Grazie @gpb01 per la dritta iniziale!