Problema: Coche controlado por mando PS3 Bluetooth

Hola!

Estoy desarrollando un pequeño proyecto en el que quiero controlar un coche con un mando de PS3 mediante un dongle conectado a la USB Host shield.

Mientras hacía pruebas con el código, todo funcionaba bien, pero cuando he querido probarlo de forma autónoma, me he dado cuenta de que la conexión entre dongle y mando no es posible si desconecto el usb entre arduino y PC.

He probado a iniciarlo sin el cable, o desconectarlo una vez el mando y el dongle están emparejados, pero nada funciona. ¿Alguien puede ayudarme? La verdad es que sospecho que se debe a algún comando de la librería que uso (Host Shield 2.0) que no llego a entender.

Pongo aquí el código que uso en una Leonardo:

/ Coche RC

// Librerias del USH Host
#include <PS3BT.h>
//#include <usbhub.h>
// El compilador necesita incluir esta librería.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#include <SPI.h>
#endif

// uint8_t state = 0;

USB Usb;

BTD Btd(&Usb);
// PS3BT PS3(&Btd);
PS3BT PS3(&Btd, 0x00, 0x15, 0x83, 0x3D, 0x0A, 0x57);

//Variables de almacenamiento de Entrada
byte JoyIzX = 127, JoyDeX = 127, JoyIzY = 127, JoyDeY = 127;
boolean Equis = 0, Circulo = 0, Triangulo = 0, Cuadrado = 0;
boolean Start = 0, Select = 0;
boolean Arriba = 0, Izquierda = 0, Abajo = 0, Derecha = 0;

const byte V1 = 130, V2 = 170, V3 = 210, V4 = 250;

//const int ENA = 8, ENB = 13;
//const int IN1 = 9, IN2 = 10, IN3 = 11, IN4 = 12;
const int ENA = 2, ENB = 7;
const int IN1 = 3, IN2 = 4, IN3 = 5, IN4 = 6;
char Lectura = 'P', Estado = 'P', Valor = '1';
byte Velocidad = V1;

void setup() {
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);

//while (!Serial); // Espera hasta la conexión del puerto serial
if (Usb.Init() == -1) {

while (1); //halt
}

}

void loop() {

void Recepcion_BT_PS3()
{
Usb.Task();
// -----------------------------
// Parte en la que se lee del mando
if (PS3.PS3Connected)
{
if (PS3.getAnalogHat(LeftHatX) > 147 || PS3.getAnalogHat(LeftHatX) < 107 || PS3.getAnalogHat(LeftHatY) > 147 || PS3.getAnalogHat(LeftHatY) < 107)
{

JoyIzX = PS3.getAnalogHat(LeftHatX);

JoyIzY = PS3.getAnalogHat(LeftHatY);
}
else
{
JoyIzX = 127, JoyIzY = 127;
}
if (PS3.getAnalogHat(RightHatX) > 147 || PS3.getAnalogHat(RightHatX) < 107 || PS3.getAnalogHat(RightHatY) > 147 || PS3.getAnalogHat(RightHatY) < 107)
{

JoyDeX = PS3.getAnalogHat(RightHatX);

JoyDeY = PS3.getAnalogHat(RightHatY);
}
else
{
JoyDeX = 127, JoyDeY = 127;
}

if (PS3.getButtonClick(UP))
{

Arriba = 1;
}
else
{
Arriba = 0;
}
if (PS3.getButtonClick(DOWN))
{

Abajo = 1;
}
else
{
Abajo = 0;
}
if (PS3.getButtonClick(RIGHT))
{

Derecha = 1;
}
else
{
Derecha = 0;
}
if (PS3.getButtonClick(LEFT))
{

Izquierda = 1;
}
else
{
Izquierda = 0;
}
}
// -----------------------------
// Parte en la que se determina modo y velocidad

if (Equis == 1) {
Estado = 'P';
Velocidad = V1;
}
else if (Arriba == 1) {
Estado = 'A';
Velocidad = V4;
}
else if (Abajo == 1) {
Estado = 'R';
Velocidad = V4;
}
else if (Derecha == 1) {
Estado = 'D';
Velocidad = V4;
}
else if (Izquierda == 1) {
Estado = 'I';
Velocidad = V4;
}

else if ( JoyIzX > 147 || JoyIzX < 107) {
if (JoyIzX > 147 ) { // Derecha
Estado = 'D';
Velocidad = map(JoyIzX, 147, 255, 0, 255);
}
else if (JoyIzX < 107 ) { // Izquierda
Estado = 'I';
Velocidad = map(JoyIzX, 107, 0, 0, 255);
}
}

else if ( JoyDeY > 147 || JoyDeY < 107) {
if (JoyDeY > 147 ) { // Avance
Estado = 'R';
Velocidad = map(JoyDeY, 147, 255, 0, 255);
}
else if (JoyDeY < 107 ) { // Retroceso
Estado = 'A';
Velocidad = map(JoyDeY, 107, 0, 0, 255);
}
}
else { // si no se pulsa nada, se para
Estado = 'P';
Velocidad = V1;
}

Modo(Estado,Velocidad);
delay(50);
}

/*
Esta función es donde se cambia el estado de los pines en función del modo guardado
a partir de los comandos de entrada
*/
void Modo(char Comando, byte Velocidad) {
// Determina y activa el modo de funcionamiento elegido
switch (Comando) {
case 'P': // Modo: Parado

digitalWrite(ENA, LOW);
digitalWrite(ENB, LOW);
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
break;
case 'A': // Modo: Avanzando

digitalWrite(ENA, HIGH);
digitalWrite(ENB, HIGH);
digitalWrite(IN1, LOW);
analogWrite(IN2, Velocidad);
analogWrite(IN3, Velocidad);
digitalWrite(IN4, LOW);
break;
case 'R': // Modo: Retrocediendo

digitalWrite(ENA, HIGH);
digitalWrite(ENB, HIGH);
analogWrite(IN1, Velocidad);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
analogWrite(IN4, Velocidad);
break;
case 'D': // Modo: Ratacion a Derecha
// Serial.println(" Entrando en D");
digitalWrite(ENA, HIGH);
digitalWrite(ENB, HIGH);
digitalWrite(IN1, LOW);
analogWrite(IN2, Velocidad);
digitalWrite(IN3, LOW);
analogWrite(IN4, Velocidad);
break;
case 'I': // Modo: Rotacion a Izquierda

digitalWrite(ENA, HIGH);
digitalWrite(ENB, HIGH);
analogWrite(IN1, Velocidad);
digitalWrite(IN2, LOW);
analogWrite(IN3, Velocidad);
digitalWrite(IN4, LOW);
break;
}
}

}

Saludos!

Con que alimentas el arduino y el USB Host Shield? Estas seguro de que usas la tensión apropiada?