Joystick clásico al adaptador del USB (3 / 5 paso)

Paso 3: Software

El siguiente Arduino Sketch archivo debe ser compilado y cargado en el Arduino Leonardo o el Arduino Micro: JoystickToKeyboard.ino

 // ColecoVision / ADAM Joystick to PC Keyboard Converter// for the Arduino Leonardo // 2014-08-24 //-----------------------------------------------------------------------------// Joystick Pins const byte gcFirePin = 2; const byte gcUpPin = 3; const byte gcDownPin = 4; const byte gcLeftPin = 5; const byte gcRightPin = 6; const byte gcModeAPin = 7; const byte gcModeBPin = 8; const byte gcFireMonitorPin = 13; const byte gcBit0Pin = 3; const byte gcBit2Pin = 4; const byte gcBit3Pin = 5; const byte gcBit1Pin = 6;// Keyboard Keys const char gcUpKey = KEY_UP_ARROW; const char gcDownKey = KEY_DOWN_ARROW; const char gcLeftKey = KEY_LEFT_ARROW; const char gcRightKey = KEY_RIGHT_ARROW; const char gcLeftFireKey = KEY_LEFT_ALT; const char gcRightFireKey = KEY_LEFT_CTRL; const char gcPurpleButtonKey = KEY_LEFT_SHIFT; const char gcBlueButtonKey = 'z'; const char gcAsteriskKey = '-'; const char gcPoundKey = '=';// Current Frame Joystick Status byte gLeftFireButton = 0; byte gRightFireButton = 0; byte gUp = 0; byte gDown = 0; byte gLeft = 0; byte gRight = 0; char gNumPadValue = ' '; byte gPurpleButton = 0; byte gBlueButton = 0; byte gBit0 = 0; byte gBit1 = 0; byte gBit2 = 0; byte gBit3 = 0;// Last Frame Joystick Status byte gLastLeftFireButton = 0; byte gLastRightFireButton = 0; byte gLastUp = 0; byte gLastDown = 0; byte gLastLeft = 0; byte gLastRight = 0; char gLastNumPadValue = ' '; byte gLastPurpleButton = 0; byte gLastBlueButton = 0;// Line Read Variables const unsigned int gcThreashold = 4; unsigned int gLeftFireCount = 0; unsigned int gRightFireCount = 0; unsigned int gUpCount = 0; unsigned int gDownCount = 0; unsigned int gLeftCount = 0; unsigned int gRightCount = 0; unsigned int gBit0Count = 0; unsigned int gBit1Count = 0; unsigned int gBit2Count = 0; unsigned int gBit3Count = 0;// Frame Variables const int gcFrameLength = 10; unsigned int gLoopsPerFrame = 0; unsigned long gLastFrameStart = 0;// Shows the status of the joystick. void ShowJoystickStatus() { // Debug Information // Serial.println(gLoopsPerFrame); digitalWrite(gcFireMonitorPin, gLeftFireButton | gRightFireButton); }void SendKeyboardStateToPc() { if ((gLastNumPadValue != ' ') && (gLastNumPadValue != gNumPadValue)) { Keyboard.release(gLastNumPadValue); } if ((gNumPadValue != ' ') && (gLastNumPadValue != gNumPadValue)) { Keyboard.press(gNumPadValue); } SendLineStateToPc(gLastLeftFireButton, gLeftFireButton, gcLeftFireKey); SendLineStateToPc(gLastRightFireButton, gRightFireButton, gcRightFireKey); SendLineStateToPc(gLastUp, gUp, gcUpKey); SendLineStateToPc(gLastDown, gDown, gcDownKey); SendLineStateToPc(gLastLeft, gLeft, gcLeftKey); SendLineStateToPc(gLastRight, gRight, gcRightKey); SendLineStateToPc(gLastPurpleButton, gPurpleButton, gcPurpleButtonKey); SendLineStateToPc(gLastBlueButton, gBlueButton, gcBlueButtonKey); }void SendLineStateToPc(byte lastState, byte currentState, char keyUsedForLine) { if ((lastState == 1) && (currentState == 0)) { Keyboard.release(keyUsedForLine); } if ((lastState == 0) && (currentState == 1)) { Keyboard.press(keyUsedForLine); } }unsigned int CheckJoystickLine(byte pin) { return (digitalRead(pin) == LOW); }void CheckJoystickLines() { const int cLineDelay = 50; // Put Joystick in Direction Mode digitalWrite(gcModeAPin, HIGH); digitalWrite(gcModeBPin, LOW); delayMicroseconds(cLineDelay); gLeftFireCount += CheckJoystickLine(gcFirePin); gUpCount += CheckJoystickLine(gcUpPin); gDownCount += CheckJoystickLine(gcDownPin); gLeftCount += CheckJoystickLine(gcLeftPin); gRightCount += CheckJoystickLine(gcRightPin); // Put Joystick in Keypad Mode digitalWrite(gcModeAPin, LOW); digitalWrite(gcModeBPin, HIGH); delayMicroseconds(cLineDelay); gRightFireCount += CheckJoystickLine(gcFirePin); gBit0Count += CheckJoystickLine(gcBit0Pin); gBit1Count += CheckJoystickLine(gcBit1Pin); gBit2Count += CheckJoystickLine(gcBit2Pin); gBit3Count += CheckJoystickLine(gcBit3Pin); }void ResetFrameVariables() { // Copy Current Frame to Last Frame gLastNumPadValue = gNumPadValue; gLastLeftFireButton = gLeftFireButton; gLastRightFireButton = gRightFireButton; gLastUp = gUp; gLastDown = gDown; gLastLeft = gLeft; gLastRight = gRight; gLastPurpleButton = gPurpleButton; gLastBlueButton = gBlueButton; // Reset Frame Loop Counter gLoopsPerFrame = 0; // Reset Joysick State gLeftFireCount = 0; gLeftFireButton = 0; gRightFireCount = 0; gRightFireButton = 0; gUpCount = 0; gUp = 0; gDownCount = 0; gDown = 0; gLeftCount = 0; gLeft = 0; gRightCount = 0; gRight = 0; gBit0Count = 0; gBit0 = 0; gBit1Count = 0; gBit1 = 0; gBit2Count = 0; gBit2 = 0; gBit3Count = 0; gBit3 = 0; gNumPadValue = ' '; gPurpleButton = 0; gBlueButton = 0; }byte DetermineJoystickLineValue(unsigned int pressCount) { return (pressCount >= gcThreashold); }void DetermineJoystickValues() { const char cKeypadValueLookup[16] = { ' ', '6', '1', '3', '9', '0', gcAsteriskKey, ' ', '2', gcPoundKey, '7', ' ', '5', '4', '8', ' '}; gLeftFireButton = DetermineJoystickLineValue(gLeftFireCount); gRightFireButton = DetermineJoystickLineValue(gRightFireCount); gUp = DetermineJoystickLineValue(gUpCount); gDown = DetermineJoystickLineValue(gDownCount); gLeft = DetermineJoystickLineValue(gLeftCount); gRight = DetermineJoystickLineValue(gRightCount); gBit0 = DetermineJoystickLineValue(gBit0Count); gBit1 = DetermineJoystickLineValue(gBit1Count); gBit2 = DetermineJoystickLineValue(gBit2Count); gBit3 = DetermineJoystickLineValue(gBit3Count); int keypadCode = (gBit3 << 3) + (gBit2 << 2) + (gBit1 << 1) + gBit0; gNumPadValue = cKeypadValueLookup[keypadCode]; // Check for SuperAction Controller Buttons. if (keypadCode == 7) { gPurpleButton = 1; } if (keypadCode == 11) { gBlueButton = 1; } }void setup() { // Setup Serial Monitor // Serial.begin(19200); // Setup Joystick Pins pinMode(gcFirePin, INPUT_PULLUP); pinMode(gcUpPin, INPUT_PULLUP); pinMode(gcDownPin, INPUT_PULLUP); pinMode(gcLeftPin, INPUT_PULLUP); pinMode(gcRightPin, INPUT_PULLUP); pinMode(gcModeAPin, OUTPUT); pinMode(gcModeBPin, OUTPUT); pinMode(gcFireMonitorPin, OUTPUT); }void loop() { unsigned long currentTime; currentTime = millis(); if (currentTime >= (gLastFrameStart + gcFrameLength)) { // Do Joystick Value Commit Logic DetermineJoystickValues(); // Send Values to Monitor ShowJoystickStatus(); // Send Keyboad State to the PC SendKeyboardStateToPc(); // Reset Frame Variables ResetFrameVariables(); // Time to start next frame gLastFrameStart = currentTime; } else { // Check the value of the input lines and make note of them. gLoopsPerFrame++; CheckJoystickLines(); } } 

Artículos Relacionados

SATA al adaptador del USB con cable de transferencia datos Xbox

SATA al adaptador del USB con cable de transferencia datos Xbox

este instructable le mostrará cómo transformar un cable de transferencia de datos de Xbox normal en un completo SATA al cable del USB.Valor añadido: que todavía funciona como un cable de transferencia de datos Xbox después estamos a través de!Paso 1:
DIY USB micro al adaptador del cable lightning

DIY USB micro al adaptador del cable lightning

Parece que estaba fijando a mis amigas cargador de ipod día y al no fijarlo fue a comprar uno nuevo que viviría una vida corta. La razón por la que iba a través de muchos cables fue porque ella compró los más baratos y más tensas les. Cables usb bara
Agregar USB(charging) al adaptador del VGA del iPad

Agregar USB(charging) al adaptador del VGA del iPad

es mi primer instructivo, y quería compartir con el mundo qué hawe he hecho esta vez. Vez en cuando que jugar con muchas de las cosas mejora su funcionalidad. Pero con esto me gustaría compartir. Por cierto, lo siento si mi idioma es malo, pero allí,
Más barato I2C (I cuadrado C) adaptador del mundo

Más barato I2C (I cuadrado C) adaptador del mundo

hacer una interfaz de sensor para el equipo de debajo de un dólar!Actualización 09/06/08: después de explorar varias vías He concluido no hay ninguna manera práctica de aplicar esta técnica en Microsoft Windows. No es mezquino OS ataques, realmente h
Hacer una joya de impulsión del flash del USB de millefiori

Hacer una joya de impulsión del flash del USB de millefiori

esta impulsión del flash del USB millefiori hace un gran regalo para los amigos (o usted mismo). Con una arcilla polimérica cubierta te puede dar la memory stick un aspecto muy individual. Cada uno es diferente y puede personalizar mediante el uso de
Impulsión del flash del USB de doble

Impulsión del flash del USB de doble

no quiero tener a mano un pendrive, quiero dos. Y si voy a llevar dos unidades alrededor me gustaría mantenerlos juntos para que no se pierde. Así lo dos extremos USB unidad flash. Guarda mis archivos juntos y se ve mejor que un par de unidades calie
Lápiz ergonómico con impulsión del Flash del USB!

Lápiz ergonómico con impulsión del Flash del USB!

En este Instructable le mostraré cómo crear tu propio lápiz ergonómico modificado para requisitos particulares con un USB de la impulsión del flash. Formado ergonómicamente para adaptarse a su estilo de escritura personal. Este es un proyecto que hag
Probador de Fedtro del tubo de vacío a la conversión del USB

Probador de Fedtro del tubo de vacío a la conversión del USB

Bueno, básicamente cogí el probador y retirar los espaciadores de batería fuera que eran obsoletosDebido al tamaño de la batería que fue ligeramente menor en un 5 º de la misma. Luego tomó un viejo teléfono usb y adaptador usb cargador y recorta la c
Adaptador del Monitor de vista abajo ergonmic

Adaptador del Monitor de vista abajo ergonmic

una estación de trabajo de monitor para ver hacia abajo es un método de colocación un monitor de computadora por debajo del nivel de los ojos por razones ergonómicas.Escritorio vista abajo comercial, previamente construido y adaptadores están disponi
Cargador Solar portable del USB

Cargador Solar portable del USB

Cargadores USB portátiles son muy útiles para aventuras al aire libre, festivales, viajar, o si usted está hacia fuera y sobre todo el día. Adición de un panel solar proporciona una fuente adicional de energía móvil utilizable casi por todas partes.E
Adaptador del trípode de smartphone--DIY para libre

Adaptador del trípode de smartphone--DIY para libre

A veces realmente somos demasiado duros con nosotros mismos.Yo estaba tensa mi cerebro tratando de averiguar cómo podía hacer un adaptador del trípode fácil y asequible para mi iPod. Teniendo una merienda en la cocina, inspiración pulsó.Mantenerlo si
Adaptador del trípode de smartphone

Adaptador del trípode de smartphone

Sesión de la mayoría de mis videos con mi iPhone. Yo había estado usando un adaptador del trípode de plástico barato y finalmente consiguió harto con él. Fueron mis dos quejas más grande con él: Si no se coloca correctamente, la cuna inferior activar
DIY: Impulsión del Flash del USB de vidrio

DIY: Impulsión del Flash del USB de vidrio

Cumpleaños, aniversario, día de San Valentín o simplemente un día normal. Es bueno sorprender a tus seres queridos con un regalo personalizado.En este Instructable, veremos una manera de hacer un impulsión del flash del USB del cristal.Lo que se nece
Impulsión del USB de un cable usb

Impulsión del USB de un cable usb

tengo una pequeña memoria USB que guardo en mi cartera, por si acaso. Obviamente no soporte la prueba del tiempo. Una mañana de sábado, en busca de algo nuevo que hacer, he recordaba alguien conseguir un USB dentro de un enchufe usb roto. Este es mi