вторник, 26 января 2016 г.

Подключение оригинального джойстика Nintendo NES к USB при помощи DigiSPARK

       В этой статье я расскажу как подключить джойстик от 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;  
 }  


Литература:

3 комментария:

  1. где скачать скетч для джойстика денди

    ОтветитьУдалить
    Ответы
    1. В этой статье: http://mynobook.blogspot.com/2016/02/usb-arduino-digispark.html

      Удалить
  2. здравствуйте! а для пистолета схему и скетч можно?

    ОтветитьУдалить