USB Interface to Atari Classic/Modern Controllers
My Atari VCS controllers arrived today. I spent most of the day trying to decipher the classic controller's communication.
I was able to get the Pico to identify both the Classic and the Modern controller using the Pico C++ SDK along with TinyUSB.
Atari VID: 3250 3252 - 0x0cb2 - EDITTED since my first post (3250 is the HEX value)
Classic - PID: 1001 - 0x03e9 - EDITTED since my first post (1001 is the HEX value)
Modern - PID: 1002 - 0X03ea - EDITTED since my first post (1002 is the HEX value)
I found it very confusing. After a long time searching the internet I found a short barebones tutorial on how to run the Pico as a USB host for a mouse using TinyUSB.
https://www.giters.com/a-h/pico_usb_kbd_mouse
Here's what I discovered about the Classic controller.
Joystick Direction: Value Range: 0-128 ( atari_classic_report_t.cDir)
- 0 - JS is centered
- 16 - Up/North
- 32 - NE
- 48 - Right/East
- 64 - SE
- 80 - Down/South
- 96 - SW
- 112 - Left/West
- 128 - NW
Fire Buttons: Value Range: 0-3 ( atari_classic_report_t.cFire)
- 0 - Neither Button is pressed
- 1 - Thumb Button is pressed
- 2 - Side Button is pressed
- 3 - Both Buttons are pressed
Joystick Paddle Rotation: Range: 0-255 ( atari_classic_report_t.cPad) - EDITTED since my first post
- Not sure what angle 0 is considered to be, but I'll guess directly south.
-
For those who have a classic controller
- You'll notice that it rotates past 360 degs in both directions
- But the paddle rotation value range of 0-255 is across a 90 deg turn
Joystick Revolution: Range: 0-3 ( atari_classic_report_t.cRev) - EDITTED since my first post
- The revolution count starts at 0
-
The revolution count increments by 1 when the stick
-
is rotated
a complete 360 degs90 degrees in the clockwise direction
-
is rotated
-
When the Revolution count reaches 0 at the end of the 4th revolution
- (aka count 3 - a full 360 rotation)
- the Revolution count starts over at 0
-
If rotated counter-clockwise, the the Revolution count goes to 3
- when the rotation value drops below zero
- (aka, it goes from Rev count 0, Rotation 0 to Rev count 3, Rotation 255)
- As such, a full 360 revolution of the joystick in the context of a 'paddle' is 4 revolution counts (0-3) x 256 degrees of freedom (0-255). --- ADDED since my first post
Much of my Pico code today was based on the Dual Shock PS 4 gamepad code I mentioned previously. Not really knowing for sure what I was doing, I ended up reusing the "struct" - data structure - that was used by the author to map the devices USB report.
I guess... they are the same sized report... probably just by accident. Honestly, I'm not really 100% sure how it works yet.
But using the same "struct" structure, the Atari Classic joystick data maps to the DSPS4 data in the following manner:
sony_ds4_report_t atari_classic_report_t
-------------------------------------------------------------------
x cFire
y cDir
z cPad
rz cRev
Once I had this all figured out, I thought... oh yeah, this should be super easy to prototype on a breadboard... I was all psyched to record JS demos of me using the Classic controller with my 7800... but I failed miserably. It's been a long day though, and I'm probably just tired.
I was up at 4am this morning so I could drive an hour to the nearest Target that still had the Taylor Swift special edition release in stock (4 x record vinyl album)... Christmas present for my daughter.
Anyway, now it's almost midnight. I'll probably let this sit for a few days before I take another look at it.
0 Comments
Recommended Comments
There are no comments to display.