Interfacing UNO with USB device (nintendo controller) using Software Serial

I am trying to interface a USB original-style nintendo controller with an arduino UNO to use as a joypad for my mechanical device. I am however already using the main hardware serial/USB port for a separate communication, so I’ve been trying to setup communication using the software serial function.

I have the NES controller connected to a USB-to-Serial TTL cable, and the 4 output wires (+5V, GND, RX, TX) are connected to the UNO +5V, GND, pin10, pin9 respectively. I have tried flipping the RX/TX just in case. The program I’ve tested shown below is a very slight modification of the softwareserial example.

On the serial monitor, I get the initial “Goodnight moon!”, but nothing more, with or without pressing any of the buttons.

Here is the controller I’m using: If this is not possible, I may get one of the original 7 pin NES controllers which definitely works according to some forum posts, but would like to know first if I’m doing something wrong.

Any ideas? Thanks.


#include <SoftwareSerial.h>

SoftwareSerial mySerial(9,10); // RX, TX

void setup()  
  // Open serial communications and wait for port to open:

  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.println("Hello, world?");

void loop() // run over and over
  if (mySerial.available())

Your controller is a USB client as is your USB to serial lead, therefore it is never going to work because you need a USB host.

You could try a USB host shield but then you would need to write the software drivers.

Thanks Grumpy - unfortunately, it was a bit over my head. Basically, I don't understand what characteristics of the signal are mismatched/require that I use an additional piece of hardware. Why can't some manual serial protocol be written as is done in this example:?

Looks like this may be more trouble than it's worth. I'm gonna move forward w/hacking up an NES controller with the old 7 pin connector. Should be simpler.

Regardless, appreciate your time and explanation.

Basically, I don't understand what characteristics of the signal are mismatched/require that I use an additional piece of hardware.

USB is a very complex interface many orders of magnitude greater than simple serial data. Despite the name USB is not a bus, a bus is something that allows communication between many devices where as USB only allows communication between two.

There are two sorts of USB device a master or host as it is known, and a slave or client. Only the host can initiate data transfer, the client responds to that. Therefore host and client are two very different devices. Two clients can not talk together. Two hosts can not talk together. Most of the time the shape of the plug and socket of the lead stop two devices of the same time being connected together.

The Arduino is a client it can talk to a host and looks like a serial interface to that host. Your controller is a client, it talks to the NES which is the host. Therefore if you manage to connect your NES to your Arduino you have two clients connected together which will not work. Therefore you need an extra circuit with another processor to turn the Arduino into a host, this is known as a "Host Shield".