Final Fantasy Theatrhythm arcade panel interface using Arduino Leonardo
This panel contains an RFID reader with what appears to be an USB connection. This is NOT USB and is actually meant for JVS I/O.
DO NOT plug the RFID reader into a computer USB port.
This firmware is basically a fork of my GrooveCoasterIO firmware, and thus it uses Arduino-LUFA as well.
Thanks to pikpop for testing and providing pinout.
Thanks to progmem for his work on reversing the pokken controller for Nintendo Switch.
FASTIO mode uses digitalWriteFast library by NicksonYap.
Button debouncing is done with Bounce2 library by Thomas O Fredericks.
https://www.instagram.com/p/CSCh5MRosdg/
- Install
Bounce2from the Arduino IDE Library manager - Install
Arduino-LUFA boardsfrom the Arduino IDE board manager following the instructions from https://github.com/CrazyRedMachine/Arduino-LUFA - Select
Arduino Leonardo (LUFA)as your board type and click upload
This firmware will make your panel recognized as a DirectInput controller, compatible with Nintendo Switch.
Additionally, a second interface will appear on PC for HID lights control.
It is possible to make the panel send keyboard inputs in parallel to the gamepad although not recommended.
config.h contains configurable user options.
The controller supports HID and two reactive modes.
Also it will display a light animation when idling (the idle animation fallback delay can be configured in config.h).
Controller will automatically switch to HID upon receiving hid messages (and will fallback to reactive mode after 3 seconds without communication).
Joysticks RGB, RFID RGB and individual button leds can be controlled this way, and all outputs are named.
Note: Joysticks RGB is for both sticks at once (the panel connectors don't expose individual joysticks)
When no HID messages are received, reactive lighting mode behaves according to 4 user-configurable colors as shown in the following color table :
| Component | Joysticks moved | Button pressed | Nothing pressed |
|---|---|---|---|
| RFID | RFID_COLOR |
RFID_COLOR |
RFID_COLOR |
| Joysticks | REACTIVE_PRIMARY |
REACTIVE_SECONDARY |
REACTIVE_TERNARY |
| Button | BUTTON_LIGHT_RELEASED_STATE |
BUTTON_LIGHT_PRESSED_STATE |
BUTTON_LIGHT_RELEASED_STATE |
When REACTIVE_FADE is set to 1, there is a fade transition when releasing buttons instead of an immediate one.
Transition speed can be adjusted with the REACTIVE_FADERATE option.
The color palette can be changed in config.h, for example
#define REACTIVE_TERNARY ((color_t) { 0xFF, 0xFF, 0x00 })
or #define REACTIVE_TERNARY YELLOW would work too here since some colors are defined in RGB.h
A rainbow wave idle animation (also used as startup animation) will be displayed before touching a button on the controller, or after not touching anything for a while (10 seconds by default).
The delay can be configured in config.h :
#define IDLE_ANIMATION_DELAY 10
Setting this value to 0 will disable the idle animation
Inside the panel are 5 connectors, labeled N, V, U, K and K2.
N and V take care of lights. K and K2 take care of inputs. V takes care of the headphone jack and volume pot (irrelevant to this firmware)
This is a 3x3 9 pin connector.
This one takes care of RGB lights for the panel.
RGB leds are common anode.
| Pin number | Wire color | Role | Arduino GPIO |
|---|---|---|---|
| 1 | Pink | Joysticks RGB Red - | 5 |
| 2 | Brown | Joysticks RGB Green - | 6 |
| 3 | Purple | Joysticks RGB Blue - | 3 |
| 4 | White/Red | RFID RGB Red - | 9 |
| 5 | White/Green | RFID RGB Green - | 10 |
| 6 | White/Blue | RFID RGB Blue - | 11 |
| 7 | |||
| 8 | Black | GND | GND |
| 9 | Red | +5V | +5V |
This is a 2x4 8 pin connector.
This one takes care of the two button leds.
Beware: They are 24v leds. You have to replace them with 5v leds for this firmware.
| Pin number | Wire color | Role | Arduino GPIO |
|---|---|---|---|
| 1 | Brown | Left button led - | 8 |
| 2 | Pink | Right button led - | 2 |
| 3 | |||
| 4 | |||
| 5 | |||
| 6 | |||
| 7 | Orange | Button leds + | +5V |
| 8 |
This is a 3*5 15 pin connector.
This one takes care of the inputs.
| Pin number | Wire color | Role | Arduino GPIO |
|---|---|---|---|
| 1 | White/Pink | Left button | 7 |
| 2 | White/Brown | Left joy UP | 4 |
| 3 | White/Red | Left joy DOWN | A3 |
| 4 | White/Orange | Left joy LEFT | 12 |
| 5 | White/Yellow | Left joy RIGHT | A2 |
| 6 | White/Green | Right joy UP | 0 |
| 7 | White/Blue | Right joy DOWN | A5 |
| 8 | White/Purple | Right joy LEFT | 1 |
| 9 | White/Grey | Right joy RIGHT | A4 |
| 10 | |||
| 11 | |||
| 12 | Black | GND | GND |
| 13 | |||
| 14 | |||
| 15 |
This is a single pin connector.
This one takes care of the lonely forgotten input.
| Pin number | Wire color | Role | Arduino GPIO |
|---|---|---|---|
| 1 | Blue | Right button | 13 |
If this project helps you and you want to give back, you can help me with my future projects.
While not necessary, donations are much appreciated and will only go towards funding future github projects (arcade hardware ain't cheap :( ).
Of course you'll also receive my gratitude and I'll remember you if you post a feature request ;)
