Main > Main Forum
I Created a pretty realistic 720 Controller
CKebz:
--- Quote from: Howard_Casto on September 14, 2018, 08:06:32 pm ---An optical gate could do that job... just have a little tab of plastic or something at 12:00 to break the beam as it spins by.
--- End quote ---
Hey Howard_Casto,
I hope you're still reading these posts 8 years later.... I've been searching the internet for a solution and THIS sounds like an awesome idea! I would love to do it. I have 720 running great on MAME thanks to DarthMario. I have a pretty legit 720 stick I found on ebay. I attached it to an X-Arcade Tank-stick Max spinner. I have the same issue though. Like DarthMario's video, the skater goes out of sync after about 10 spins. Instead of tapping the center button and holding the stick up when the skater is facing north to recalibrate, I want to create a "button click" when the spinner is in the 12 o'clock position. You mentioned an optical gate. Can you point me in the direction of what this is, or where to get it, or how it would emulate a button click when the plastic passes through the optical gate. Any info would be greatly appreciated.
-Chris
PL1:
--- Quote from: CKebz on March 13, 2025, 01:11:50 am ---X-Arcade Tank-stick Max spinner.
--- End quote ---
I'm not sure which spinner that is. :dunno
Is yours like this one where there's no shaft sticking out the bottom, just wiring connectors. . .
. . . or this one with an encoder wheel (or shaft) on the bottom?
If your spinner is like the first one, you won't be able to add an encoder wheel to signal when the spinner is at the 12 o'clock position.
It might theoretically be possible to mod the second one, but it would be a lot easier to mod a TT2 or SpinTrak.
A 1/4" flange shaft coupler like this one should be a good way to attach a 3d printed encoder wheel to the shaft of a TT2. IIRC, the SpinTrak would need a 6mm I.D. version of this part.
--- Quote from: CKebz on March 13, 2025, 01:11:50 am ---I want to create a "button click" when the spinner is in the 12 o'clock position. You mentioned an optical gate. Can you point me in the direction of what this is, or where to get it, or how it would emulate a button click when the plastic passes through the optical gate.
--- End quote ---
A basic optical gate/optical circuit a.k.a. an "opto" has an LED and a photo transistor.
A spinner or trackball will have two optos per axis.
- The good spacing image shows the encoder wheel at the left edge of Phase 1.
- Data line A is transitioning from HIGH (not blocked) to LOW (blocked) and data line B is in the middle of being blocked.
- As you rotate the encoder wheel clockwise, the blocking and un-blocking of the optos will produce the quadrature waveforms shown.
For the centering "button press" on 720, you should only need one opto/data line since you don't need to determine the direction of rotation, but rather when the spinner is at the 12 o'clock position.
- The encoder wheel would only need one tab for blocking the opto.
- This design can jam/break if the encoder wheel tab and opto get out of mechanical alignment.
- To avoid this problem, you must design the sensor holder so it is adjustable and partly overlaps the body of the encoder wheel.
If I wanted to build an updated 720 controller, I would probably use the Adafruit 2167 beam break sensor mentioned in my previous post along with a custom 3d printed mount for the LED and sensor modules. If you don't go that route, you could use a Happ "Red Board" with a custom mount.
To translate the data line signal from the opto into a button press, here are some options you could try:
- Use an "active low" gamepad encoder -- data line is HIGH until the tab blocks the LED so the phototransistor can't see it which sends the data line LOW which triggers the input to output a button press.
- Use an "active high" gamepad encoder and add a 74LS04 Hex Inverter or similar circuit to invert the logic level between the opto and the encoder.
- Make an Arduino "active low" gamepad encoder firmware and connect the data line to an interrupt pin for the fastest response.
Figuring out the correct combination of sensor/LED spacing, 3d printed mount design, encoder wheel diameter, tab width, encoder, and MAME settings is more work than I'm willing to invest.
Scott
CKebz:
Thanks for the explanation, I am an extreme novice at this. The spinner I have is like the second one where there is a shaft and an encoder. The guy I got the 720 stick from said X-Arcade uses GRS spinners and it's an 8mm bore. Is there some kind of part I can attach to the bottom of the shaft that would hold the optic sensor and disc? I'm guessing the disc would only need one hole, correct?
PL1:
--- Quote from: CKebz on March 13, 2025, 11:52:11 pm ---Is there some kind of part I can attach to the bottom of the shaft that would hold the optic sensor and disc?
--- End quote ---
If you can replace the screw on the end with a longer one, it should be easy to attach a 3d printed encoder wheel for orientation -- you shouldn't even need the flange shaft coupler.
The more difficult part of the mod will be to make a mount for the LED and sensor that attaches to the clip-on spinner opto assembly.
- Maybe attach the mount using the two screws that connect the spinner opto assembly PCB to the black plastic clip-on assembly. You might need slightly longer screws for this.
It should be easy to remix the 3D printable mount available here on Thingiverse.
- That mount was designed for using Adafruit 2167 3mm beam break sensors in skee-ball machines.
--- Quote from: CKebz on March 13, 2025, 11:52:11 pm ---I'm guessing the disc would only need one hole, correct?
--- End quote ---
Almost right. You need an encoder wheel with one tooth.
When the spinner is pointed at 12 o'clock, the opto is blocked so the data line is at logic LOW.
- With an "active low" encoder, that LOW is seen as a button being pressed -- same as pressing a button connects ground to the encoder input.
When the spinner is not pointed at 12 o'clock, the opto isn't blocked so the data line is at logic HIGH.
- With an "active low" encoder, that HIGH is seen as a button not being pressed.
Here's the code to generate a one-tooth orientation encoder wheel in OpenSCAD.
- Adjust the variables as desired, render it, and export it as an .STL to make a custom 3d printable model.
--- Code: ---// 720 Mod Orientation Encoder Wheel
// - WIP
/////////////////////////////
// Define variables
/////////////////////////////
WheelThick = 2.4; // Encoder wheel thickness
WheelDia = 40; // Encoder wheel diameter
SpacerThick = 8; // Spacer thickness
SpacerDia = 10; // Spacer diameter
ToothWidth = 4; // Encoder wheel tooth diameter
ToothLength = 6; // How far the tooth sticks out past the wheel.
InnerDia = 5; // Center hole diameter
// The inner diameter value may need to be *very slightly* larger to account for the 180-sided polygon used to render circles -- see "undersized holes" at https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Primitive_Solids#cylinder
$fn=180; // Number of fragments (polygon sides) used to render a circle
/////////////////////////////
// Make the part
/////////////////////////////
difference() { // Wheel, spacer, and tooth minus center hole
union(){ // Wheel, spacer, and tooth
color("red")
translate([0,0,WheelThick/2])
cylinder(WheelThick, d=WheelDia, center=true); // Wheel
color("gray")
translate([0,0,WheelThick + (SpacerThick/2)])
cylinder(SpacerThick, d=SpacerDia, center=true); // Spacer
color("blue")
translate([0,-WheelDia/2,WheelThick/2])
cube([ToothWidth,ToothLength*2,WheelThick], center=true); // Tooth
} // End wheel, spacer, and tooth
translate([0,0,(WheelThick + SpacerThick)/2])
cylinder(WheelThick + SpacerThick + 0.1, d=InnerDia, center=true); // Center hole
} // End wheel, spacer, and tooth minus center hole
//
--- End code ---
Scott
Xiaou2:
If you can extend the base, to have a 2nd wheel... you could use a single Magnet... and to Track it,
a Magnetic Reed Switch, that would be mounted to the Control Panel, on a Riser.
I used a Magnetic Reed switch for a different specialty Controller. It worked like a Charm.
Navigation
[0] Message Index
[#] Next page
[*] Previous page
Go to full version