В этой статье я расскажу как подключить джойстик от 8-и битной игровой приставки к USB порту компьютера используя Arduino совместимый модуль Digispark ATtiny85.
Вот как выглядит переделанный джойстик. Внешне почти ничего не изменилось, вот только кабель с разъемом стал выглядеть по другому:
Из-за небольшого размера Digispark легко расположить внутри джойстика. На самой же плате оригинального Nintendo джойстика, несмотря на то, что провода отсутствуют, все контакты подписаны.
Вот как выглядит переделанный джойстик. Внешне почти ничего не изменилось, вот только кабель с разъемом стал выглядеть по другому:
Далее нужно подключить плату микроконтроллером к контактам джойстика. Для этого 0й вывод Digisparkа соединяем с выводом DATA (на плате джойстика обозначен как "Yellow" (желтый)). Вывод 1й соединяем с выводом LATCH (Orange (Оранжевый)) и соответственно вывод 2й соединяем с выводом CLOCK (RED (красный)).
Также для питания джойстика необходимо подключить с модуля Digispark выводы +5В (к выводу White (белый) платы джойстика) и GND к выводу BROWN (коричневый).
После этого "удлиняем" порт подключения к ПК, для этого нужно припаять кабель с USB портом к USB-выходу платы Digispark.
Осталось только при помощи термоклея зафиксировать модуль Digispark и убедиться, что при сборке джойстика USB провод не будет нигде пережат.
Скетч для Digispark:
//Simple DigiSpark NES Joystick Adapter //I purposfully made the program read all NES buttons the traditional way //then store them into the Buffer so that its easy to follow what the program is doing //I could have just read the correct bits directly into the buffer but then //the functionality would be obfuscated #include <DigiJoystick.h> #define NES_Clock 2 #define NES_Latch 1 #define NES_Data 0 #define NES_RIGHT 1 #define NES_LEFT 2 #define NES_DOWN 4 #define NES_UP 8 #define NES_START 16 #define NES_SELECT 32 #define NES_B 64 #define NES_A 128 #define XAXIS 0 #define YAXIS 1 //we need someplace to store our button reads... byte NESButtons = 0; // x, y, xrot, yrot, zrot, slider, buttonLowByte, buttonHighByte char JoyBuffer[8]; void setup() { NESinit(); } void loop() { NESButtons = NESRead(); // Store our NES Button Data JoyBuffer[0] = GetAxis(XAXIS); // get the X Axis (left/right buttons) JoyBuffer[1] = GetAxis(YAXIS); // get the Y axis (up/down buttons) JoyBuffer[6] = NESButtons >> 4; //shift button bytes over by 4 so we lose the 4 directions and make the buttons show up as buttons 1-4 instead of 5-8 DigiJoystick.setValues(JoyBuffer); //DigiJoystick.update(); //Send a USB Keep Alive(only sends data on change or as needed to keep usb alive) Not Needed if using regular(every 50ms or less) interval of DigiJoystick.delay(); DigiJoystick.delay(10); //wait 10 milliseconds because whynot? :p since we use this every 10ms we dont need to call DigiJoystick.update(); as this does it for us. } void NESinit() { pinMode(NES_Clock,OUTPUT); pinMode(NES_Latch,OUTPUT); pinMode(NES_Data,INPUT); digitalWrite(NES_Latch,LOW); digitalWrite(NES_Clock,HIGH); digitalWrite(NES_Data, HIGH); // turn on pullup } byte NESRead(){ byte ret = 0; digitalWrite(NES_Latch,HIGH); delayMicroseconds(12); //seems to work without the delay but this is how NES works digitalWrite(NES_Latch,LOW); ret = shiftIn(NES_Data,NES_Clock,MSBFIRST); //shift in the button data digitalWrite(NES_Clock,HIGH); //set clock high after shift in so we catch the first bit return ~ret; //bit flip our results because the NES buttons are active low } byte GetAxis(int Axis){ byte ret = 0; switch(Axis) { case YAXIS: if (NESButtons & NES_UP) { ret = 0; } else if (NESButtons & NES_DOWN) { ret = 250; } else {ret = 127;} //center joystick break; case XAXIS: if (NESButtons & NES_LEFT) { ret = 0; } else if (NESButtons & NES_RIGHT) { ret = 250; } else {ret = 127;} //center joystick break; } return ret; }
где скачать скетч для джойстика денди
ОтветитьУдалитьВ этой статье: http://mynobook.blogspot.com/2016/02/usb-arduino-digispark.html
Удалитьздравствуйте! а для пистолета схему и скетч можно?
ОтветитьУдалить