• Modificación de scripts y bat para RETROBAT añadiendo Giro Pantalla

    SrRubio05/08/2026 at 18:05 0 comments

    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 

  • LISTADO 8 DIRECCIONES

    SrRubio05/06/2026 at 09:52 0 comments

    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 »

  • LISTADO 4 DIRECCIONES

    SrRubio05/06/2026 at 08:45 0 comments

    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 »

  • Juegos Verticales en script

    SrRubio05/06/2026 at 08:36 0 comments

    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 »

  • BASE DE DATOS ARCADE

    SrRubio05/06/2026 at 06:45 0 comments

    Para completar los listados de juegos verticales y 4 players se puede consultar en esta BBDD

    https://adb.arcadeitalia.net/

  • Programa Arduino Giro Pantalla

    SrRubio05/05/2026 at 10:01 0 comments

      https://vm.tiktok.com/ZNRpmWLoD/

      https://vm.tiktok.com/ZNRpmXXyH/

       Homing fiable al arrancar

    •  Movimiento estable
    •  Control por serie listo (H / V)
    • 1 solo switch posición H/Home; 1 Pulsador para movimiento manual
    • #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;
      }

  • Giro de pantalla Esquema eléctrico (Pruebas III)

    SrRubio05/05/2026 at 09:29 0 comments

    3) FINALES DE CARRERA (CLARO)

    GND ───── COM
    PIN ───── NO

    ✔ Sin pulsar → HIGH

    ✔ Pulsado → LOW

    4) COMPONENTES OBLIGATORIOS

    🔋 Condensador VMOT

    • 100–220 µF / 25V
    • entre VMOT y GND

    🔧 Resistencia UART

    • 1kΩ entre Pin 1 (TX) y RX del TMC 

    5) COMPONENTES RECOMENDADOS

    • 10–47 µF en 5V
    • 100nF cerca del Pro Micro
    • cable corto motor

    6) CONFIGURACIÓN LÓGICA

    7) FLUJO DE FUNCIONAMIENTO

    1. PC → envía "V"
    2. Pro Micro → mueve motor
    3. Detecta final 90°
    4. Para

    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

  • Iluminación de Elementos en Panel de juego II

    SrRubio05/05/2026 at 09:17 0 comments

    4. Código Maestro (Explicado en el propio código)

    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

    1. Cuidado Térmico: Aunque la tira COB es eficiente, 320 LEDs generan algo de calor. No la pegues con pegamento instantáneo (cianocrilato), usa su propia cinta 3M y, si es necesario, refuerza con clips impresos en 3D.
    2. Mapeo de Píxeles: Una vez pegada la tira, carga un código de "test" que encienda los LEDs de 10 en 10 para identificar visualmente en qué número de LED empieza y acaba cada botón. Es más fácil que medir con regla.
    3. Radio de Giro: La tira COB ultra estrecha es muy flexible lateralmente (puedes hacer círculos planos), pero no intentes doblarla "de canto" bruscamente.
    4. Difusión: Si la luz te parece demasiado puntual incluso siendo COB, imprime una pequeña "tapa" de 1mm de grosor en PLA Blanco sobre el canal de la tira; eso hará que la luz se vea como un neón sólido.

    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.

    Resumen de Conexiones con el Pro Micro

    • Data de la tira LED: Va al Pin 10 del Pro Micro (recuerda poner la resistencia de 330 Ohmios ...
    Read more »

  • Iluminación de Elementos en Panel de juego

    SrRubio04/21/2026 at 08:40 0 comments

    La idea es que al elegir el juego en el panel se ilumine sutilmente los mandos a utilizar: Joy, trackball, spinner, pulsadores arcade..etc.

    1. Cálculo de Materiales y Energía

    Para 15 elementos (Joystick, 10 botones, Trackball, Spinner, Spinner Joy e Interruptor), vamos a estimar el recorrido:

    • Perímetro por botón: Un botón estándar de 28 mm tiene un perímetro de unos 9 cm. Si rodeas cada uno, usarás mucha tira. Si solo pasas un "segmento" por debajo o por un lado, usarás menos.
    • Estimación de longitud: Si calculamos unos 10-15 cm de tira por cada uno de los 15 elementos (contando el recorrido entre ellos), necesitarás unos 2 a 2,5 metros de tira.
    • Cálculo de Amperaje: * 160 LEDs/metro $\times$ 2 metros = 320 LEDs.
      • Consumo máximo (Blanco, brillo 100%): $\approx 15\text{A}$ (¡Muchísimo!).
      • Consumo Real (Sutil): Al 15% de brillo y colores simples, el consumo bajará a unos 1.5A - 2A.
    • Fuente recomendada: 5V / 4A (o 5A para ir sobrado).

    2. Diseño del Panel y Montaje (Sin Fibra)

    Como la tira es de solo 2,7 mm, el diseño en 3D cambia. Tienes dos opciones para que sea sutil:

    • Opción A (Halo visto): Diseñas un surco de 3 mm de ancho alrededor de cada botón donde encajas la tira COB mirando hacia arriba. La tira se ve directamente como un anillo de luz de neón.
    • Opción B (Retroiluminación): La tira va por debajo del panel, y dejas una pared de plástico muy fina (0.6mm - 0.8mm) de filamento traslúcido o natural. La luz COB atravesará el plástico creando un brillo difuso y suave. Dejar unos 3mm desde la tira al plástico para que difumine la luz. También se puede crear el hueco de color blanco para que rebote la luz.

    3. Esquema Eléctrico Detallado

    Para 15 secciones en una tira continua de 2,5 metros, la conexión es así:

    1. Arduino Pro Micro
    2. Resistencia: 330ohmios entre el pin D6 y el cable de datos de la tira.
    3. Condensador: 1000microF entre el +5V y el GND de la fuente para evitar que el primer LED se queme al encender.
    4. Alimentación Doble (Power Injection): Debido a que la tira es muy fina (2.7mm), las pistas de cobre internas son delgadas. Si conectas solo por un extremo, el final de la tira se verá más tenue o rojizo. Conecta los 5V y GND de la fuente tanto al principio como al final de la tira.

    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.

  • Montaje Giro de Pantalla

    SrRubio04/16/2026 at 08:28 0 comments

       [ 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 ]