Help w/ Camera Control + FTDI Host Controller

I’ve got a VDIP1 USB Host Controller communicating with an Arduino Duemilanova. The VDIP1 is plugged into a Canon 7D DSLR with a usb cable. I’m using the NewSoftSerial library based on recommendations from people who use it to communicate with a usb stick.

I query the usb port for the camera and receive $40 $00 in the serial monitor which means the VD1P1 doesn’t recognize the device. I then query the port and get a bunch of 0s (i guess to be expected). I then set the port as the current device. Then I attempt to communicate with the device, in this case the Canon 7D.

My whole issue is really not understanding how the 7D wants to communicate.

mySerial.print(“DSD 15”); // send data to the USB device (DSD) where the size of the data is 15 bytes
mySerial.print(13,BYTE); // carriage return
delay(100);
mySerial.print(“0x01 0x11 0x202”);
//print initilization command to the USB device

I found a bunch of USB commands for Canon cameras on the gphoto website including “0x23 0x12 0x201” => “Get EOS Body ID (new)”, I figured this would be the “Hello World” of this project. I’m assuming that this command 0x23 0x12 0x201 is 15 bytes. The 7D responds with what looks like jibberish.

$40 s§ £9È$9ȧ®8ä 00 9æ sÈ$9ä$ 9É 00 9æsÈ$9ä$00

This doesnt seem like real ascii values. I’m new to all this ascii and hex, but figured Id be able to translate the data so that it would say something like “Canon EOS 7D”.

What am I doing wrong? I know this is probably a longshot seeing as there is very little to no documentation of what I am trying to do. I know it is possible. I am trying to make a remote controller for my camera via USB and will share my findings with the Arduino community when I am finished.

Thank you for any help you can give.

This is my current program:

#include <NewSoftSerial.h> // include the NewSoftSerial library

NewSoftSerial mySerial(3, 4); // open digital pins 3, 4 on Arduino for serial communication

long time = millis();
long previousMillis = 0;
long interval = 500;

void setup() {

Serial.begin(9600); // start serial communication between Arduino and Monitor

mySerial.begin(9600); // start serial comm from FTDI Host to Arduino
mySerial.print(“IPA”); // send the command IPA to the FTDI
mySerial.print(13, BYTE); // send the command RETURN, BYTE

}

void loop() {

// send commands to the FTDI

int incoming = 0;

if (Serial.available()) { // if there is serial communication

incoming = Serial.read(); // make incoming equal what is typed in the monitor

}

if (incoming == ‘1’) { // if the user types in the monitor then…

mySerial.print(“QP2”); // query USB port 2
mySerial.print(13,BYTE); // carriage return
incoming = 0; // reset incoming to 0
}

if (incoming == ‘2’) { // if the user types in the monitor then…

mySerial.print(“QD 2”); // query usb device on port 2
mySerial.print(13,BYTE); // carriage return

}

if (incoming == ‘3’) { // if the user types in the monitor then…

mySerial.print(“SC 2”); // set the device on port 2 as the current device
mySerial.print(13,BYTE); // carriage return

delay(10);

mySerial.print(“DRD”); // read back from the usb device
mySerial.print(13,BYTE); // carriage return
incoming = 0; // reset incoming to 0

}

if (incoming == ‘9’) { // if the user types in the monitor then…

mySerial.print(“DSD 15”); // send data to the USB device (DSD) where the size of the data is 15 bytes
mySerial.print(13,BYTE); // carriage return
delay(100);
mySerial.print(“0x01 0x11 0x202”);
//print initilization command to the USB device

delay(100);

mySerial.print(“DRD”); // recieve data from usb device
mySerial.print(13,BYTE); // carriage return
incoming = 0; // reset incoming to 0

}

if (incoming == ‘8’) { // if the user types in the monitor then…

mySerial.print(“DRD”); // recieve data from usb device
mySerial.print(13,BYTE); // carriage return
incoming = 0; // reset incoming to 0
}

// read return info from the FTDI

if (mySerial.available()) {

unsigned long currentMillis = millis();

//so that a line break happens after every return of info from VDIP1
if(currentMillis - previousMillis > interval) {

previousMillis = currentMillis;
Serial.println(" ");

}

// print whatever comes back from the VDIP1
Serial.print((char)mySerial.read());
Serial.print(13,BYTE);

}

}