Classic arcade with all the latest technological advancements, ready for the classics. Enjoy!
To make the experience fit your profile, pick a username and tell us what interests you.
We found and based on your interests.
Joy_xinput_pulsadores_analogicos_autocalibrado.inoPrograma para configurar joy xinput con pulsadores analógicos autocalibradosino - 4.10 kB - 04/10/2026 at 20:46 |
|
|
Joy_restrictor_rotary_origen_eeprom_puerto_serie_v2_oled.inoPrograma para pro micro que controla el rotary automático y pantalla oledino - 23.93 kB - 04/10/2026 at 20:43 |
|
Modificamos el bat launch_mame_direct.bat desde la carpeta plugings que ya usamos para llamar al script del giro en el restrictor. (C:\RetroBat\plugins)
@echo off
REM RESTRICTOR (4/8/0)
python "C:\RetroBat\plugins\restrictor.py" %1
REM =========================
REM Lanza directamente MAME con la ROM que le pasa RetroBat
cd /d "C:\RetroBat\emulators\mame"
mame.exe %1
REM =========================
REM POST-LANZAMIENTO (EXIT)
REM =========================
python "C:\RetroBat\plugins\restrictor.py"Se añade la parte el EXIT, para llamar al giro de pantalla y que vuelva al horizontal cada vez que salimos del juego.
Por supuesto, también modificamos el archivo restrictor.py (misma carpeta) en el que añadimos la parte del giro de pantalla
import serial
import serial.tools.list_ports
import sys
import time
import os
# ================= CONFIG =================
COM_RESTRICTOR = "COM7" # Pro Micro restrictor
COM_ORIENTACION = "COM5" # Pro Micro giro pantalla
BAUDRATE = 115200
# -------- 4 WAY --------
lista_4 = [
"pacman", "puckman", "galaga",
"digdug", "donkeykong", "dkong",
"frogger"
]
# -------- 8 WAY --------
lista_8 = [
"sf2", "sf2ce", "sf2hf",
"ssf2", "mk", "mk2", "mk3", "umk3",
"kof94", "kof95", "kof96", "kof97",
"kof98", "kof99",
"samsho", "samsho2"
]
# -------- VERTICALES --------
lista_vertical = [
"pacman", "galaga", "dkong", "frogger",
"1942", "1943", "commando"
]
# ================= FUNCIONES =================
def contiene(lista, rom):
for item in lista:
if item in rom: # coincidencia parcial (clones incluidos)
return True
return False
def puerto_disponible(nombre):
puertos = [p.device for p in serial.tools.list_ports.comports()]
return nombre in puertos
def enviar(puerto, mensaje):
if not puerto_disponible(puerto):
return # si no está conectado, no hace nada
try:
with serial.Serial(puerto, BAUDRATE, timeout=1) as ser:
time.sleep(1.2) # necesario por reset del Pro Micro
ser.write((mensaje + "\n").encode())
except:
pass
# ================= MAIN =================
if __name__ == "__main__":
# 👉 SALIDA DEL JUEGO → HOME
if len(sys.argv) < 2 or sys.argv[1] == "":
enviar(COM_RESTRICTOR, "0") # cuadrado
enviar(COM_ORIENTACION, "H") # horizontal
sys.exit(0)
rom_path = sys.argv[1]
rom = os.path.splitext(os.path.basename(rom_path))[0].lower()
# ---------------- CONTROL (RESTRICTOR) ----------------
if contiene(lista_4, rom):
control = "4"
elif contiene(lista_8, rom):
control = "8"
else:
control = "0"
# ---------------- ORIENTACIÓN ----------------
if contiene(lista_vertical, rom):
modo = "V"
else:
modo = "H"
# ---------------- ENVÍO ----------------
enviar(COM_RESTRICTOR, control)
enviar(COM_ORIENTACION, modo)El script se modifcará con los listados que añadí en anterores logs
lista_8 = [
"64streetj", "64streetja", "64street", "aoh", "aodk", "ausfache", "alienchac",
"aliencha", "astormbl", "astormb2", "astormjd", "astormj", "astormud", "astormu",
"astorm", "astorm3d", "astorm3", "avspa", "avspd", "avsp", "avsph", "avspj",
"avspu", "kovshxas", "arabfgtj", "arabfgtu", "arabfgt", "arabianmu", "arabianmj",
"arabianm", "armwarar1", "armwara", "armwarb", "armwar1d", "armwarr1", "armwar",
"armwaru1", "armwaru", "aof", "aof2a", "aof2", "aof3k", "aof3", "asndynmt",
"asndynmto", "asterixaad", "asterixeaa", "asterixeac", "asterix", "asterixj", "astrass",
"asurabld", "asurabusj", "asurabusja", "asurabusjr", "asurabus", "avengersb", "avengersa",
"avengers", "avengersc", "avengrgsj", "avengrgs", "brapboys", "brapboyspj", "brapboyspu",
"brapboysp", "brapboysp2", "barekch", "barek2mb", "barek2ch", "barek3mba", "barek3mbc",
"barek3mb", "batmanfr", "ts2", "ts2ja", "ts2j", "ts2ua", "ts2u", "batcira",
"batcird", "batcir", "batcirj", "btlkroad", "btlkroadk", "btltryst", "battlcryp",
"battlcryc", "battlcry", "btoads", "beastrzrb", "beastrzra", "beastrzr", "bestbest",
"bkungfu", "punisherbz", "bigfight", "bigfightj", "biofreak", "sailormnoh", "sailormnoj",
"sailormnot", "sailormnnh", "sailormnnj", "sailormnnt", "sailormnh", "sailormnj", "sailormnt",
"blackt96", "bmaster", "blandia", "blandiap", "bloodstm104", "bloodstm110", "bloodstm210",
"bloodstm220", "bloodstm221", "bloodstm", "bloodwar", "bldyroar", "bldyror2a", "bldyror2j",
"bldyror2u", "bldyror2", "breakers", "breakrev", "brutforc", "buccanrs", "buccanrsa",
"buccanrsb", "buriki", "burningfh", "burningf", "burningfpa", "burningfpb", "burningfp",
"brivalj", "brival", "dinoa", "dinopic", "dinopic2", "dinopic3", "dinou",
"dino", "dinoj", "cvs2", "cvs2mf", "capsnkb", "capsnka", "capsnk",
"cvsgd", "captavena", "captaven", "captavenj", "captavene", "captavenua", "captavenuu",
"captavenu", "captcommb2", "captcommb", "captcommjr1", "captcommj", "captcommu", "captcommr1",
"captcomm", "captainx", "karatourj", "myherok", "kikaioh", "commandw", "cps3bootao",
"cps3bootao2", "cps3boota", "cps3booto2", "crimfghtj", "crimfghtu", "crimfght", "vendetta2pp",
"vendettan", "crossbld", "crsword", "crswd2bl", "cthd2003", "ct2k3sa", "ct2k3sp",
"cutefght", "cybots", "cybotsj", "cybotsjd", "cybotsud", "cybotsu", "cybstorm",
"cyclwarrb", "cyclwarra", "cyclwarr", "ddcrewbl", "ddcrewj2d", "ddcrewj2", "ddcrewjd",
"ddcrewj", "ddcrewud", "ddcrewu", "ddcrew2d", "ddcrew2", "ddcrewd", "ddcrew",
"ddcrew1d", "ddcrew1", "dankuga", "darkedgej", "darkedge", "darkseal2", "dstlka",
"dstlkb", "dstlk", "dstlkh", "dstlku1d", "dstlkur1", "dstlku", "powj",
"doaae", "doaa", "doaab", "doab", "doa", "doapp", "doappk",
"doa2", "doa2a", "doa2m", "deathbrd", "demofist", "denjinmk", "denjinmka",
"desertdn", "diehard", "dinorexj", "dinorexu", "dinorex", "dinohunt", "dinoki25",
"dinokior", "dinoking", "djboyj", "djboyja", "djboyu", "djboyua", "djboy",
"ddragon6809", "ddragon6809a", "ddragon6809b", "ddragon6809c", "ddragonbl", "ddragonbla", "ddragonbl2",
"ddragonj", "ddragonja", "doubledr", "pc_ddrgn", "ddragonu", "ddragonua", "ddragonub",
"ddragon", "ddragona", "ddragon3b", "ddragon3j", "ddragon3p", "ddragon3", "ddragon2j",
"ddragon2bl", "ddragon2u", "ddragon2", "downtownj", "downtownp", "downtown", "downtown2",
"dbza", "dbz", "dbz2", "dbz2bl", "dbzvrvs", "drgnbowl", "drgnbowla",
"drgnmst", "drgnmst2", "dragonsh", "dragoona", "dragoonj", "ddsomar1", "ddsoma",
"ddsomb", "ddsomr3", "ddsomr2", "ddsomr1", "ddsom", "ddsomh", "ddsomjr2",
"ddsomjr1", "ddsomj", "ddsomur1", "ddsomud", "ddsomu", "ddtodar1", "ddtoda",
"ddtodr1", "ddtodd", "ddtod", "ddtodhr2", "ddtodhr1", "ddtodh", "ddtodjr2",
"ddtodjr1", "ddtodj", "ddtodur1", "ddtodu", "dynamcop", "dynamcopb", "dynamcopc",
"dnmtdeka", "dyndeka2", "dyndeka2b", "dduxbl", "ddux1", "dduxjd", "dduxj",
"dduxd", "ddux", "dynwara", "dynwar", "ehrgeizja", "ehrgeizua", "ehrgeiz",
"kabukikl", "fatfury1", "fatfury2", "fatfury3", "fatfurspb", "fatfursp"...
Read more »
lista_4 = [
"005", "bowl3d", "4enraya", "500gp", "ace", "acedrive", "victlap", "advision",
"akazukin", "alibaba", "alinvade", "alphaho", "alphie", "alpinerd", "alpinr2b", "alpine",
"alpines", "amidar", "andromed", "aking", "anoworld", "anteater", "aquastge", "arlingtn",
"armwrest", "armora", "armorcar", "assault", "astrob", "astrof", "astrowar", "astropal",
"attackfc", "attckufo", "auslalom", "babypac", "bagman", "ballbomb", "banbam", "bankp",
"barrier", "tbatmana", "bzone", "btplay2k", "bestri", "bigbucks", "knascar", "birdiy",
"blkhole", "blackhol", "blasto", "block", "blockhl", "blockade", "bbmanw", "bongo",
"boonggab", "brdrline", "botanic", "bouldash", "bballs", "brkball", "brickzn", "brixian",
"bublbobl", "kbucky", "btime", "bam2", "calorie", "cane", "cannonbp", "captflag",
"carhntds", "carjmbre", "carled99", "carnival", "cassvisn", "catacomb", "tcaveman", "cmmb103",
"cmmb162", "chainrec", "challeng", "chameleo", "chanbara", "changela", "cheekyms", "chinhero",
"circusc", "combh", "commsega", "comotion", "cothello", "rad_foot", "kcontra", "cosmica",
"tccombat", "cosmicg", "cosmo", "cosmos", "crash", "crater", "ckong", "ckongpt2",
"crzrally", "crszone", "croquis", "crospang", "crgolf", "crgolfhi", "crush", "cuebrick",
"ddayjlc", "dai3wksi", "dambustr", "dncfrks", "dmx2m", "dmx2majp", "dangcurv", "ddungeon",
"darktowr", "darkwar", "redufo", "defender", "demon", "demoneye", "depthch", "drderby",
"destryer", "devzone", "diamrun", "digdug", "digdug2", "digger", "dirtdash", "disco",
"dorunrun", "dodgem", "dogfight", "dokaben", "dokaben2", "domino", "dominos", "dommy",
"bmcpokr", "dkong", "dkong3", "dkongjr", "dorodon", "downhill", "drmicro", "drtomy",
"drgnbstr", "drakton", "dremshpr", "drivfrcp", "drmnva", "drmnvj", "drmnv2a", "drmnv2j",
"drmnv3a", "drmnv3j", "dynablst", "dynamski", "ekara", "ekaramix", "epitch", "rad_madf",
"eggor", "cnfball", "efball", "cqback", "elim2", "eca", "enigma2", "evilston",
"evio", "extdwnhl", "eyes", "f1gp", "f1gp2", "fantasia", "fantsia2", "fantastc",
"fi6845", "sqbert", "fghtmn", "filetto", "finfurl", "finfurl2", "firetrap", "flicky",
"mfootb", "40love", "fourplay", "freeze", "fspiderb", "frogger", "frogs", "funquiz",
"gahaha", "gahaha2", "galactic", "galaga", "galaxia", "bgalaxn", "cgalaxn", "galaxian",
"egalaxn2", "galgame", "galaxy2", "ginv1000", "galxwars", "galsnew", "galpanic", "gnw_ball",
"gnw_bjack", "gnw_chef", "gnw_fires", "gnw_fire", "gnw_fireatk", "gnw_flagman", "gnw_helmet", "gnw_judge",
"gnw_lboat", "gnw_lion", "gnw_manholeg", "gnw_manhole", "gnw_mario", "gnw_mariotj", "gnw_mbaway", "gnw_mariocm",
"gnw_mariocmt", "gnw_mmousep", "gnw_mmouse", "gnw_octopus", "gnw_opanic", "gnw_pchute", "gnw_pinball", "gnw_popeyep",
"gnw_popeye", "gnw_sbuster", "gnw_snoopyp", "gnw_stennis", "gnw_ssparky", "gnw_tfish", "gnw_tbridge", "gnw_vermin",
"ganbare", "tgargnf", "gmgalax", "gng", "ghouls", "go2000", "jak_gtg", "golgo13",
"g13knd", "g13jnr", "kgradius", "grchamp", "granny", "gravitar", "gsword", "gticlub",
"gmissile", "guitrbus", "guitarfv", "taikeegr", "guitarstp", "guitarst", "guitarss", "gssytts",
"gundealr", "bgunf", "gunwars", "epo_guru", "guzzler", "hgokou_joystick", "hangplt", "hardhat",
"hcastle", "headon", "headon2", "h2hbaskb", "h2hfootb", "h2hhockey", "h2hsoccerc", "heiankyo",
"heuksun", "hexa", "hikara", "highroll", "holeland", "hunchbak", "hustle", "hyprdriv",
"icanpian", "icecold", "indianbt", "istellar", "istellar2", "ginv", "ginv2000", "einspace",
"invrvnge", "vinvader", "invinco", "invcarht", "invds", "invho2", "ipminvad", "ironhors",
"jetwave", "jinpaish", "jollyjgr", "journey", "joust", "joust2", "joyfulr", "jrpacman",
"jumpkun", "jjack", "jungler", "kaitei", "kamikaze", "gostop", "kaos", "kchamp",
"kchampvs", "karianx", "kartduel", "kicknkick", "kickridr", "kikstart", "bmsoccer", "kicker",
"horekid", "kingball", "tkkongq", "klax", "kngtmare", "kungfut", "ladybug", "ladyfrog",
"lvgirl94", "lasso"...
Read more »
lista_vertical = [
"005","progolf","1941","1942","1943","1943kai","1943mii","1945kiii","19xx",
"39in1","4in1","aceattac","acrobatm","ad2083","aerofgt","aerofgts","aerofgtsg",
"afighter","agallet","airass","airattck","airduel","airraid","ajax","alcon",
"alibaba","alinvade","alleymas","alphaho","alpine","altair","altair2","amidar",
"androidp","andromed","angelkds","anteater","apb","arabian","arbalest","arcadian",
"argus","arkanoid","arknoid2","armchamp","armchmp2","armedf","armorcar","ashura",
"aso","assault","astrob","astrof","astrowar","asuka","asylum","attckufo","au",
"avengers","azurian","babypac","bagman","ballbomb","baluba","bandit","barrier",
"baryon","batsugun","battlane","battlnts","bbakraid","bcruzm12","beaminv",
"beezer","bermudat","bgaregga","bigbucks","bigevglf","bikkuric","bioatack",
"bjtwin","bking","bking2","bking3","birdiy","birdtry","bitgrpha","bitgrphb",
"bj92","blackhol","blkhole","bladestl","blastoff","blazer","block","blockcar",
"blockfvr","blockgal","blokpong","bluehawk","blueprnt","bmxstunts","boggy84",
"bombbee","bombjack","bombsa","bongo","boomrang","boonggab","botanic","bowl3d",
"bowlrama","bowler","brdrline","breakout","brickzn","brubber","brvblade",
"brvbladeg","buggychl","bullfgtr","bullsdrt","btime","bwings","bwcasino",
"calibr50","calipso","cannonbp","capbowl","captflag","carhntds","carjmbre",
"carnival","catacomb","catapult","catnmous","cavelon","centiped","challeng",
"champbwl","chanbara","checkman","cheekyms","chkun","chopper","chqflag",
"circusc","citybomb","ckong","ckongpt2","cocoloco","colony7","combh",
"commando","commsega","complexx","congo","conquer","conquest","contra",
"cosmica","cosmicg","cosmo","cosmogng","cosmos","cntsteer","cowtipp",
"crbaloon","crush","crzrally","curvebal","cutieq","cybattlr","cyclshtg",
"cyvern","daifugo","dai3wksi","daikaiju","daioh","dambustr","dangseed",
"darkwar","darwin","dazzler","ddayjlc","ddonpach","ddp2","ddp3","ddpdfk",
"ddpdojt","decocass","decodark","decomult","demoneye","desertbr","desertwr",
"destryer","devilfsh","devstors","devzone","digdug","digdug2","digger",
"diggerc","dimahoo","dingo","dirtfoxj","discoboy","disco","dkong","dkong3",
"dkongjr","dockman","dogfight","dogyuun","dommy","donpachi","dorachan",
"dorodon","downtown","draco","dragnblz","driftout","drivfrcp","drmicro",
"drtoppel","dsaber","dspirit","dt7","dyger","dynadice","dynamski","dynobop",
"eeekk","eggor","eightfrc","enigma2","equites","espgal","espgal2","esprade",
"evilston","exctscc2","exctsccr","exedexes","exerion","explbrkr","extrmatn",
"eyes","f1gp","f1gp2","failgate","fambowl","fantasia","fantastc","fantasyu",
"fastdraw","fastlane","fcombat","fgoal","fghtatck","fiveside","fixeight",
"flshback","flipjack","flyboy","flytiger","fshark","fourplay","freekick",
"freeze","frogger","frontlin","fstarfrc","futflash","futspy","funkybee",
"fnkyfish","gaiapols","galactic","galaga","galaga88","galaxia","galaxian",
"galmedes","galsnew","galpanic","galpani2","galpani3","galspnbl","gaplus",
"gardia","geebee","gekiridn","gekisou","gemcrush","gemini","gigas","gigasm2",
"gmgalax","gondo","gorf","grchamp","greenber","grindstm","grobda","gseeker",
"gulfstrm","gulfwar2","gunbird","gunbird2","gundealr","gundhara","gunfront",
"gunlock","gunnail","gunsmoke","guwange","guzzler","gwar","gyrodine","gyruss",
"hal21","halleysc","hamaway","harem","headoni","heartatk","heiankyo",
"helifire","hero","highroll","hoccer","hopprobo","hotpinbl","hotshock",
"hstennis","hotdogst","hunchbak","huncholy","ibara","ibarablk","ikari",
"ikaruga","illvelo","imgfight","imago","imolagp","indianbt","indy800",
"intrepid","invinco","invds","invho2","ipminvad","ixion","jack","jackal",
"jackrabt","jammin","jollyjgr","journey","jrpacman","jumpbug","jumpcoas",
"jumpkun","jumpshot","jungler","junofrst","kageki","kaitei","kamikaze",
"kamikcab","kangaroo","kaos","kchamp","kchampvs","ket","kick","kicker",
"kikikai","kingball","kingofb","kingdmgp","kopunch","koikoi","koikoip2"...
Read more »
Para completar los listados de juegos verticales y 4 players se puede consultar en esta BBDD
https://vm.tiktok.com/ZNRpmWLoD/
https://vm.tiktok.com/ZNRpmXXyH/
Homing fiable al arrancar
H / V)#include <AccelStepper.h>
#include <TMCStepper.h>
// ================= HARDWARE =================
#define STEP_PIN 6
#define DIR_PIN 7
#define EN_PIN 8
#define HOME_PIN 4
#define BTN_PIN 9
#define DIR_CW HIGH
#define DIR_CCW LOW
#define R_SENSE 0.11f
TMC2209Stepper driver(&Serial1, R_SENSE, 0);
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
// ================= PARÁMETROS =================
#define MAX_SPEED 3000
#define ACCELERATION 2000
#define HOMING_SPEED 1200
#define STEPS_45 4144
// ================= ESTADOS =================
enum Estado {
NO_SYNC, // 👈 clave: posición no fiable
HOMING,
IDLE,
MOVIENDO
};
Estado estado = NO_SYNC;
// ================= CONTROL =================
unsigned long moveStartTime = 0;
const unsigned long MOVE_TIMEOUT = 5000;
// botón
bool lastBtn = HIGH;
bool btnLock = false;
// ================= SETUP =================
void setup() {
Serial.begin(115200);
Serial1.begin(115200);
pinMode(EN_PIN, OUTPUT);
pinMode(HOME_PIN, INPUT_PULLUP);
pinMode(BTN_PIN, INPUT_PULLUP);
pinMode(STEP_PIN, OUTPUT);
pinMode(DIR_PIN, OUTPUT);
digitalWrite(EN_PIN, HIGH); // driver OFF
digitalWrite(STEP_PIN, LOW);
digitalWrite(DIR_PIN, LOW);
delay(500); // ⚡ estabilizar 12V
driver.begin();
driver.toff(4);
driver.rms_current(900);
driver.microsteps(16);
driver.intpol(true);
driver.en_spreadCycle(false);
stepper.setMaxSpeed(MAX_SPEED);
stepper.setAcceleration(ACCELERATION);
digitalWrite(EN_PIN, LOW); // driver ON
Serial.println("INIT -> NO_SYNC");
// 👇 SIEMPRE forzar homing
startHoming();
}
// ================= LOOP =================
void loop() {
stepper.run();
handleButton();
// ---- SERIAL SOLO SI SINCRONIZADO ----
if (Serial.available() && estado == IDLE) {
char c = Serial.read();
if (c == 'V') moveTo(STEPS_45);
if (c == 'H') moveTo(0);
}
// ---- HOMING ----
if (estado == HOMING && digitalRead(HOME_PIN) == LOW) {
stepper.stop();
stepper.setCurrentPosition(0);
estado = IDLE;
Serial.println("SYNC_OK");
}
// ---- FIN MOVIMIENTO ----
if (estado == MOVIENDO && stepper.distanceToGo() == 0) {
stepper.stop();
estado = IDLE;
if (stepper.currentPosition() == 0)
Serial.println("OK_H");
else
Serial.println("OK_V");
}
// ---- TIMEOUT ----
if (estado != IDLE && millis() - moveStartTime > MOVE_TIMEOUT) {
Serial.println("ERROR_TIMEOUT");
stepper.stop();
// 👇 ante error → volver a sincronizar SIEMPRE
startHoming();
}
}
// ================= HOMING =================
void startHoming() {
Serial.println("HOMING");
digitalWrite(DIR_PIN, DIR_CCW);
stepper.setMaxSpeed(HOMING_SPEED);
stepper.moveTo(-20000);
estado = HOMING;
moveStartTime = millis();
}
// ================= MOVIMIENTO =================
void moveTo(long pos) {
if (estado != IDLE) return;
if (pos == 0)
digitalWrite(DIR_PIN, DIR_CCW);
else
digitalWrite(DIR_PIN, DIR_CW);
stepper.setMaxSpeed(MAX_SPEED);
stepper.moveTo(pos);
estado = MOVIENDO;
moveStartTime = millis();
}
// ================= BOTÓN =================
void handleButton() {
if (estado != IDLE) return;
bool reading = digitalRead(BTN_PIN);
if (reading == LOW && lastBtn == HIGH && !btnLock) {
btnLock = true;
if (stepper.currentPosition() == 0)
moveTo(STEPS_45);
else
moveTo(0);
}
if (reading == HIGH) btnLock = false;
lastBtn = reading;
}3) FINALES DE CARRERA (CLARO)
GND ───── COM PIN ───── NO
✔ Sin pulsar → HIGH
✔ Pulsado → LOW
4) COMPONENTES OBLIGATORIOS
5) COMPONENTES RECOMENDADOS
6) CONFIGURACIÓN LÓGICA
7) FLUJO DE FUNCIONAMIENTO
"V"8) CHECKLIST FINAL (ANTES DE ENCENDER)
✔ Motor conectado A1 A2 B1 B2 ✔ 12V SOLO en VMOT ✔ 5V SOLO en VIO ✔ UART cruzado (TX↔RX) ✔ GND común ✔ USB conectado ✔ Condensador VMOT
Este código está diseñado para que definas "Zonas". Los LEDs que queden en el espacio vacío entre un botón y otro se quedarán apagados (CRGB::Black), creando la ilusión de que son tramos separados.
#include <FastLED.h>
#define LED_PIN 10
#define NUM_LEDS 60
#define BRIGHTNESS 35
#define LED_TYPE WS2812B
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
// =========================
// DEFINICIÓN DE ZONAS
// =========================
// Joystick
#define JOY_START 0
#define JOY_END 11
// Botón A
#define BTN_A_START 12
#define BTN_A_END 17
// Botón B
#define BTN_B_START 18
#define BTN_B_END 23
// Botón C
#define BTN_C_START 24
#define BTN_C_END 29
// Botón D
#define BTN_D_START 30
#define BTN_D_END 35
// Trackball
#define TRK_START 36
#define TRK_END 55
// =========================
void setup() {
Serial.begin(115200);
FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
apagarTodo();
Serial.println("Sistema LED Arcade listo");
}
// =========================
void loop() {
if (Serial.available()) {
String cmd = Serial.readStringUntil('\n');
cmd.trim();
Serial.print("Comando: ");
Serial.println(cmd);
apagarTodo();
// =====================================
// JOYSTICK + 2 BOTONES
// =====================================
if (cmd == "J2") {
iluminarZona(JOY_START, JOY_END, CRGB::Blue);
iluminarZona(BTN_A_START, BTN_A_END, CRGB::Red);
iluminarZona(BTN_B_START, BTN_B_END, CRGB::Red);
}
// =====================================
// JOYSTICK + 4 BOTONES
// =====================================
else if (cmd == "J4") {
iluminarZona(JOY_START, JOY_END, CRGB::Blue);
iluminarZona(BTN_A_START, BTN_A_END, CRGB::Green);
iluminarZona(BTN_B_START, BTN_B_END, CRGB::Green);
iluminarZona(BTN_C_START, BTN_C_END, CRGB::Green);
iluminarZona(BTN_D_START, BTN_D_END, CRGB::Green);
}
// =====================================
// TRACKBALL
// =====================================
else if (cmd == "TR") {
iluminarZona(TRK_START, TRK_END, CRGB::Purple);
}
// =====================================
// APAGAR
// =====================================
else if (cmd == "OFF") {
apagarTodo();
}
FastLED.show();
}
}
// =========================
// FUNCIONES
// =========================
void iluminarZona(int inicio, int fin, CRGB color) {
for (int i = inicio; i <= fin; i++) {
leds[i] = color;
}
}
// =========================
void apagarTodo() {
FastLED.clear();
FastLED.show();
}
5. Resumen de Instalación y Detalles de Éxito
Un último detalle técnico: Dado que vas a usar una tira de alta densidad (160 LED/m), asegúrate de usar cables de alimentación de buen grosor (AWG20) para llevar la corriente de la fuente a la tira, así evitarás caídas de tensión.
La idea es que al elegir el juego en el panel se ilumine sutilmente los mandos a utilizar: Joy, trackball, spinner, pulsadores arcade..etc.
Para 15 elementos (Joystick, 10 botones, Trackball, Spinner, Spinner Joy e Interruptor), vamos a estimar el recorrido:
Como la tira es de solo 2,7 mm, el diseño en 3D cambia. Tienes dos opciones para que sea sutil:
Para 15 secciones en una tira continua de 2,5 metros, la conexión es así:
Actualización 12/05/26:
Haciendo pruebas con el mismo arduino que usaba para el giro del restrictor y el rotaty he tenido problemas con la memoria usada. Por lo que he decidido añadir un nuevo pro micro. También tengo la ventaja de seguir un trabajo modular y poder implementar el proyecto por pasos.
[ PANTALLA ]
│
┌───────────┐
│ HUB │ ← pieza que diseñarás (gira)
└────┬──────┘
│ (prisionero M4)
│
║██████║ ← eje motor (Ø8 mm, gira)
║ ║
║ ║
┌─╨──────╨─┐
│ 608ZZ │ ← rodamiento
└─┬──────┬─┘
│ │
│ │ ← alojamiento Ø21.8 mm
┌────┴──────┴────┐
│ SOPORTE FIJO │ ← NO gira (atornillado a chasis)
└────────────────┘
│
[ MOTOR + REDUCTORA ]
Create an account to leave a comment. Already have an account? Log In.
Become a member to follow this project and never miss any updates
surfingsteve
Gee Bartlett
You’re welcome