Найти в Дзене
Shema_Tehnik

Подключение джойстика от приставки Денди к компьютеру через USB при помощи (Digispark)

Джойстик от 8-битной игровой приставки Денди, валялся он у меня дома лет 10 и считался нерабочим, т.к. был поврежден шнур. Шнур прозвонил, обрывы по соединял. Вот такой джойстик Dendy Junior: У джойстиков денди бывают разъёмы 15 pin и 9 pin , вот так они выглядят: Джойстик Dendy Junior был с 15 pin разъёмом (устаревший разъём), который пришлось обрезать и припаять 9pin от Com port. Распиновка разъёмов приведена на рисунке ниже: Расположение и распайка на плате джойстиков обычно стандартна : 1 +5 Вольт 2 - GND 3 Latch 4 Clock 5 Data Далее можно соединить плату джойстика с модулем DigiSpark: Можно это всё оставить внутри джойстика и для удлинения USB разъема DigiSparka используется любой провод USB хоть от мышки, клавиатуры и прочего. Например как на фото ниже : Но я сделал по другому, чтоб можно было подключать другие любые джойстики Денди с разъёмом 9 pin Сделал в виде переходника, далее планирую сделать корпус какой нибудь. 1) Скачиваем и устанавливаем на ПК драйвера для платы D

Джойстик от 8-битной игровой приставки Денди, валялся он у меня дома лет 10 и считался нерабочим, т.к. был поврежден шнур. Шнур прозвонил, обрывы по соединял. Вот такой джойстик Dendy Junior:

У джойстиков денди бывают разъёмы 15 pin и 9 pin , вот так они выглядят:

-2
-3

Джойстик Dendy Junior был с 15 pin разъёмом (устаревший разъём), который пришлось обрезать и припаять 9pin от Com port.

-4

Распиновка разъёмов приведена на рисунке ниже:

-5

Расположение и распайка на плате джойстиков обычно стандартна :

-6

1 +5 Вольт

2 - GND

3 Latch

4 Clock

5 Data

Далее можно соединить плату джойстика с модулем DigiSpark:

-7

Можно это всё оставить внутри джойстика и для удлинения USB разъема DigiSparka используется любой провод USB хоть от мышки, клавиатуры и прочего. Например как на фото ниже :

-8

Но я сделал по другому, чтоб можно было подключать другие любые джойстики Денди с разъёмом 9 pin

-9
-10
-11
-12

Сделал в виде переходника, далее планирую сделать корпус какой нибудь.

Переходим к заливке программы в Digispark:

1) Скачиваем и устанавливаем на ПК драйвера для платы Digispark.
2) Скачиваем последнюю версию Arduino c
официального сайта www.arduino.cc

Подойдет любая сборка Arduino.

3) Устанавливаем и запускаем.

4) Выбираем 
Файл-Параметры:

5) В поле "Дополнительные ссылки для Менеджера плат" вписываем строку
http://digistump.com/package_digistump_index.json и нажимаю ОК

-13

6) Далее в меню “Инструменты” выбираем  Плата: и далее пункт “Менеджер плат

-14

7) В открывшемся менеджере плат вводим поиск Digistump и нажимаем установка ( у меня он установлен )

-15

8) Заходим Инструменты Плата Digistump AVR board и выбираем тип своей платы (у меня Digispark Pro (default 16Mhz)

-16

9) Вставляем в Arduino следующий скетч:

//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 1
#define NES_Latch 0
#define NES_Data 2
#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;
}

10) При отключенном модуля DigiSpark (отключенном джойстике) в программе Arduino нажимаем на кнопку "Загрузить на плату". Происходит компиляция скетча и программа в течение 60 секунд ожидает подключения модуля DigiSpark.

-17

11) Подключаем наш собранный джойстик к USB порту компьютера. После заливки скетча в модуль DigiSpark джойстиком можно пользоваться. Драйвера не нужны!

Я подключил к ПК и скачивал разные эмуляторы Dendy, Sega, Sony PlayStation, Nintendo 64, и в настройках он обозначался как DigiKey и я назначал кнопки и всё работает. Понятно , что для некоторых эмуляторов не хватает кнопок джойстика, но можно кнопку Select ( например для Сеги ) использовать как А, тогда у нас получатся кнопки ABC

Кнопки TURBO работают!