Arduino UNO + Adafruit Motor shield + USB Host Shield

Hi There:

I have an Arduino UNO R3
Adafruit Motor Shield V2.3 and
a USB Host Shield rev2.0.1 from Circuits@Home

I want to connect the USB Host Shield to a PS3 controller through a Bluetooth Dongle
to control 3 DC motors connected to the Motor shield

I have successfully tested the Arduino UNO + the Motor shield alone, It works perfectly
I have successfully tested the Arduino UNO + the USB Host Shield + the PS3BT Dongle + the PS3 Controller
It works perfectly and I can check the full functionality of all bottons and triggers using the serial monitor

I have read the documentation of the Motor shield that the only PINS used on the shield are the SDA/SCL on the Arduino UNO these are also known as A4 and A5.

The documentation of the USB Host shield uses the SPI ports

On the Hardware side I have stacked the Arduino UNO then the Motor Shield and then at the very top the USB Host shield

With this SW I can still see that the motor shield works fine but I loose the BT connectivity with the USB Host shield

I will appreciate any input on this project

I have combined both examples as a test project, and the SW reads like this:

/*
This is a test sketch for the Adafruit assembled Motor Shield for Arduino v2
It won’t work with v1.x motor shields! Only for the v2’s with built in PWM
control

For use with the Adafruit Motor Shield v2
----> http://www.adafruit.com/products/1438
*/

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include “utility/Adafruit_MS_PWMServoDriver.h”

//PS3BT
#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, printAngle;
//endPS3BT

// Create the motor shield object with the default I2C address
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
// Or, create it with a different I2C address (say for stacking)
// Adafruit_MotorShield AFMS = Adafruit_MotorShield(0x61);

// Select which ‘port’ M1, M2, M3 or M4. In this case, M1
Adafruit_DCMotor *myMotor = AFMS.getMotor(1);
// You can also make another motor on port M2
//Adafruit_DCMotor *myOtherMotor = AFMS.getMotor(2);

void setup() {
//Serial.begin(9600); // set up Serial library at 9600 bps
//Serial.println(“Adafruit Motorshield v2 - DC Motor test!”);

//PS3BT
Serial.begin(9600);
#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"));
//endps3bt

AFMS.begin(); // create with the default frequency 1.6KHz
//AFMS.begin(1000); // OR with a different frequency, say 1KHz

// Set the speed to start, from 0 (off) to 255 (max speed)
myMotor->setSpeed(150);
myMotor->run(FORWARD);
// turn on motor
myMotor->run(RELEASE);
}

void loop() {
uint8_t i;

//Serial.print(“tick”);

myMotor->run(FORWARD);
for (i=0; i<255; i++) {
myMotor->setSpeed(i);
delay(10);
}
for (i=255; i!=0; i–) {
myMotor->setSpeed(i);
delay(10);
}

//Serial.print(“tock”);

myMotor->run(BACKWARD);
for (i=0; i<255; i++) {
myMotor->setSpeed(i);
delay(10);
}
for (i=255; i!=0; i–) {
myMotor->setSpeed(i);
delay(10);
}

//Serial.print(“tech”);
myMotor->run(RELEASE);
delay(1000);

//ps3bt
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"));
PS3.setRumbleOn(RumbleLow);
}
if (PS3.getButtonClick(CIRCLE)) {
Serial.print(F("\r\nCircle"));
PS3.setRumbleOn(RumbleHigh);
}
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
}

Adafruit is stubborn and usually resistant to doing the right thing: adding ICSP header to their shields. This header is a 2X3 header located near the microcontroller on your arduino. You should see that the host shield has one but the adafruit motor shield doesn’t. It’s a “big” improvement that they have added a 2x3 set of holes but they don’t seem to have provided the header with the shield. Your choices:

Place the host shield below motor shield
Get a 2X3 header like this one and solder it on the motor shield

The small one in the middle.

Hi Liudr:

Thanks for your response I'm sorry I forgot to mention on my original post that I have included a 2x3 header into the adafruit motorshield I figured that will be needed in oder to communicate to it.

Still I haven't got luck to get my project running

I will appreciate your support

Thanks jipgaston