Сегодня я расскажу как изготовить универсальный джойстик на обычной ардуино. С помощью такого джойстика можно играть в различные компьютерные игры, симуляторы и эмуляторы.
Я его изготовил для игры в ретро игрушки на различных эмуляторах ZX Spectrum, Dendy, PS1, PS2 и PSP, Sega и Java Mobille Game.
В качестве основы, взята плата Arduino Pro Micro с микроконтроллером Atmega32u4, которая позволяет эмулировать клавиатуру и мышь. По сути изготовленный джойстик представляет урезанную версию клавиатуры с заранее запрограммированными кнопками, подключающийся к компьютеру через кабель micro USB.
Выше представлена схема Э3 джойстика, которая состоит из 14 кнопок, каждая из которых подтянута через резисторы к земле. Также в схеме подключен к плате через резистор светодиод (на плате не запаян). Плата разведена на стеклотекстолите, резисторы использовались SMD, для уменьшения габаритов джойстика, а также тактовые кнопки.
Ниже представлен код прошивки, написанный в среде разработки Arduino IDE:
#include <Keyboard.h>
void setup() {
Keyboard.begin();
Serial.begin(9600);
pinMode(6, INPUT);
pinMode(9, INPUT);
pinMode(5, INPUT);
pinMode(8, INPUT);
pinMode(7, INPUT);
pinMode(2, INPUT);
pinMode(3, INPUT);
pinMode(15, INPUT);
pinMode(10, INPUT);
pinMode(18, INPUT);
pinMode(16, INPUT);
pinMode(14, INPUT);
pinMode(21, INPUT);
pinMode(20, INPUT);
delay(500);
}
void loop() {
if(digitalRead(6) == HIGH){
Keyboard.press('8');
}
if(digitalRead(6) == LOW){
Keyboard.release('8');
}
if(digitalRead(9) == HIGH){
Keyboard.press('2');
}
if(digitalRead(9) == LOW){
Keyboard.release('2');
}
if(digitalRead(5) == HIGH){
Keyboard.press('4');
}
if(digitalRead(5) == LOW){
Keyboard.release('4');
}
if(digitalRead(8) == HIGH){
Keyboard.press('6');
}
if(digitalRead(8) == LOW){
Keyboard.release('6');
}
if(digitalRead(7) == HIGH){
Keyboard.press('5');
}
if(digitalRead(7) == LOW){
Keyboard.release('5');
}
if(digitalRead(2) == HIGH){
Keyboard.press(KEY_F1);
}
if(digitalRead(2) == LOW){
Keyboard.release(KEY_F1);
}
if(digitalRead(3) == HIGH){
Keyboard.press('`');
}
if(digitalRead(3) == LOW){
Keyboard.release('`');
}
if(digitalRead(15) == HIGH){
Keyboard.press('9');
}
if(digitalRead(15) == LOW){
Keyboard.release('9');
}
if(digitalRead(10) == HIGH){
Keyboard.press('1');
}
if(digitalRead(10) == LOW){
Keyboard.release('1');
}
if(digitalRead(18) == HIGH){
Keyboard.press('7');
}
if(digitalRead(18) == LOW){
Keyboard.release('7');
}
if(digitalRead(16) == HIGH){
Keyboard.press('3');
}
if(digitalRead(16) == LOW){
Keyboard.release('3');
}
if(digitalRead(14) == HIGH){
Keyboard.press('0');
}
if(digitalRead(14) == LOW){
Keyboard.release('0');
}
if(digitalRead(21) == HIGH){
Keyboard.press(KEY_F2);
}
if(digitalRead(21) == LOW){
Keyboard.release(KEY_F2);
}
if(digitalRead(20) == HIGH){
Keyboard.press('/');
}
if(digitalRead(20) == LOW){
Keyboard.release('/');
}
}
Данный программный код позволяет эмулировать плате ардуино клавиатуру. Функция Keyboard.press('символ'); эмулирует нажатие кнопки клавиатуры, где в скобках указывается обозначение кнопки (при желании можно поменять). Функция Keyboard.release('символ'); эмулирует, наоборот, разжатие соответствующей кнопки. В начале программного кода указывается библиотека для эмуляции клавиатуры Keyboard.h, а в setup указывается процедура из библиотеки для запуска процесса эмуляции Keyboard.begin();. В остальном, стандартный программный код для ардуино, который напишет любой школьник.
В итоге, получился хороший универсальный джойстик для ретро гейминга, которым мне приятно пользоваться. Корпус делать для него не буду (нравится мне этот колхозный стиль), и так удобно.
PS, плата дорабатывалась, на фото платы с обратной стороны и в программном коде указаны выводы ардуино, на которые переподключены некоторые кнопки.
До новых встреч!