Джойстик от 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
Сделал в виде переходника, далее планирую сделать корпус какой нибудь.
Переходим к заливке программы в Digispark:
1) Скачиваем и устанавливаем на ПК драйвера для платы Digispark.
2) Скачиваем последнюю версию Arduino c официального сайта www.arduino.cc
Подойдет любая сборка Arduino.
3) Устанавливаем и запускаем.
4) Выбираем Файл-Параметры:
5) В поле "Дополнительные ссылки для Менеджера плат" вписываем строку
http://digistump.com/package_digistump_index.json и нажимаю ОК
6) Далее в меню “Инструменты” выбираем Плата: и далее пункт “Менеджер плат”
7) В открывшемся менеджере плат вводим поиск Digistump и нажимаем установка ( у меня он установлен )
8) Заходим Инструменты Плата Digistump AVR board и выбираем тип своей платы (у меня Digispark Pro (default 16Mhz)
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.
11) Подключаем наш собранный джойстик к USB порту компьютера. После заливки скетча в модуль DigiSpark джойстиком можно пользоваться. Драйвера не нужны!
Я подключил к ПК и скачивал разные эмуляторы Dendy, Sega, Sony PlayStation, Nintendo 64, и в настройках он обозначался как DigiKey и я назначал кнопки и всё работает. Понятно , что для некоторых эмуляторов не хватает кнопок джойстика, но можно кнопку Select ( например для Сеги ) использовать как А, тогда у нас получатся кнопки ABC
Кнопки TURBO работают!