Оглавление:
Видео: Кнопки аркад Plug and Play: 7 шагов (с изображениями)
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-13 06:58
Недавно я начал использовать Arduino для своих проектов. Как дизайнер я люблю создавать индивидуальные интерфейсы для своих игр / интерактивных проектов.
Одна проблема, с которой я столкнулся, заключалась в том, что использование последовательной связи довольно сложно и подвержено проблемам и ошибкам, и мне нужно было быстрое и простое решение, которое позволило бы мне использовать внешние кнопки для управления моими играми.
Поскольку мне нужно было устройство plug and play, которое можно было бы мгновенно использовать с любым компьютером, я купил Arduino Leonardo. Он почти идентичен Uno, но с некоторыми отличиями. Основное отличие, которое я буду использовать в своих интересах в этом проекте, - это способность действовать как HID. HID или устройство интерфейса пользователя - это протокол USB, который позволяет вашему компьютеру распознавать и принимать ввод с клавиатуры и компьютерной мыши без необходимости установки специальных драйверов для каждого устройства.
Примечание: вы также можете использовать Uno, если обновляете прошивку, как показано здесь.
Шаг 1: материалы
Для этого проекта вам понадобятся:
1x HID-совместимый микроконтроллер (есть несколько, например, Arduino micro, Due & leonardo, я буду использовать Arduino Leonardo)
1x USB-кабель для Arduino (для Леонардо это USB-микро)
3x аркадные кнопки (я купил их)
1x беспаечный макет
3 резистора по 10 кОм
3 резистора 220 Ом
Провода перемычки
Вы, конечно, можете добавить больше кнопок или припаять все к макетной плате, чтобы сделать вещи более прочными.
Шаг 2: прототипирование
Итак, прежде чем я купил аркадные кнопки, которые я хотел использовать, я протестировал их со стандартными кнопками. Подключите кнопки стандартным способом, кажется, я использовал резисторы на 10 кОм.
Программирование, благодаря Леонардо, довольно простое. Вы должны включить библиотеку клавиатуры. Я использовал стандартный пример Arduino «Сообщение клавиатуры» в качестве основы для своего кода.
Теперь вопрос в том, как вы хотите, чтобы ваши кнопки работали. По сути, у вас есть два варианта: одно нажатие кнопки и непрерывный поток букв при нажатии. То, что вы хотите, действительно зависит от вашего проекта.
Если вы хотите, чтобы при нажатии клавиши происходило одно событие, например прыжок или переключатель включения / выключения, вы должны выбрать метод однократного нажатия. С помощью этого метода вы смотрите на состояние кнопки, вверх или вниз? Затем вы сравниваете его с предыдущим состоянием, оно уже было вверху или внизу? Если предыдущее состояние кнопки совпадает с текущим состоянием кнопки, ничего не происходит. Но если состояние кнопки изменяется, например, когда вы нажимаете или отпускаете кнопку, что-то происходит. В моем коде он набирает букву только при нажатии кнопки, а не при отпускании, но вы можете это изменить.
#include "Keyboard.h"
const int buttonLeft = A0; // входной контакт для кнопки
const int buttonRight = A1; const int buttonUp = A2;
int previousButtonStateLeft = HIGH; // для проверки состояния pushButton
int previousButtonStateRight = HIGH; int previousButtonStateUp = HIGH;
void setup () {
// сделать вывод кнопки input: pinMode (buttonLeft, INPUT); pinMode (buttonRight, ВВОД); pinMode (buttonUp, ВВОД); // инициализируем управление клавиатурой: Keyboard.begin (); }
void loop () {
// считываем кнопку: int buttonStateLeft = digitalRead (buttonLeft); // если состояние кнопки изменилось, if ((buttonStateLeft! = previousButtonStateLeft) // и она в данный момент нажата: && (buttonStateLeft == HIGH)) {// напечатайте сообщение Keyboard.print ("a"); } // сохраняем текущее состояние кнопки для сравнения в следующий раз: previousButtonStateLeft = buttonStateLeft;
// читаем кнопку:
int buttonStateRight = digitalRead (buttonRight); // если состояние кнопки изменилось, if ((buttonStateRight! = previousButtonStateRight) // и она в данный момент нажата: && (buttonStateRight == HIGH)) {// напечатайте сообщение Keyboard.print ("w"); } // сохраняем текущее состояние кнопки для сравнения в следующий раз: previousButtonStateRight = buttonStateRight;
// читаем кнопку:
int buttonStateUp = digitalRead (buttonUp); // если состояние кнопки изменилось, if ((buttonStateUp! = previousButtonStateUp) // и она в данный момент нажата: && (buttonStateUp == HIGH)) {// напечатайте сообщение Keyboard.print ("d"); } // сохраняем текущее состояние кнопки для сравнения в следующий раз: previousButtonStateUp = buttonStateUp; }
Если вы хотите, чтобы что-то происходило постоянно, пока кнопка нажата, как вы хотели бы, чтобы вы двигались влево или вправо, просто позвольте ему написать букву, не проверяя предыдущее состояние кнопки. Не забудьте добавить небольшую задержку, чтобы она не сходила с ума и противодействовала любому отскоку ваших кнопок. Есть более элегантные способы решения этой проблемы, но они простые и быстрые.
#include "Keyboard.h"
const int buttonLeft = A0; // входной контакт для кнопки
const int buttonRight = A1; const int buttonUp = A2;
void setup () {
// сделать вывод кнопки input: pinMode (buttonLeft, INPUT); pinMode (buttonRight, ВВОД); pinMode (buttonUp, ВВОД); // инициализируем управление клавиатурой: Keyboard.begin (); }
void loop () {
// считываем кнопку: int buttonStateLeft = digitalRead (buttonLeft); if (buttonStateLeft == HIGH) // если кнопка нажата {// напечатайте сообщение Keyboard.print ("a"); задержка (50); // Задержка для отскока и чтобы компьютер догнал}
// читаем кнопку:
int buttonStateRight = digitalRead (buttonRight); if (buttonStateRight == HIGH) // если кнопка нажата {// напечатайте сообщение Keyboard.print ("w"); задержка (50); // Задержка на отскок и компьютер наверстают упущенное}
// читаем кнопку:
int buttonStateUp = digitalRead (buttonUp); if (buttonStateUp == HIGH) // если кнопка нажата {// напечатайте сообщение Keyboard.print ("d"); задержка (50); // Задержка для отскока и чтобы компьютер мог наверстать упущенное}}
Вы всегда можете использовать сочетание обоих методов, в зависимости от того, что лучше всего соответствует вашим потребностям.
Шаг 3: лазерная резка корпуса
Для корпуса я использовал МДФ 3 мм со вставкой из оргстекла 2 мм. Я добавил вставку, так как хочу добавить несколько светодиодов на внутренней стороне корпуса на более позднем этапе, чтобы сделать его красивым и сияющим.
Я ввел свои размеры в makercase и загрузил файл svg. Я открыл его в Illustrator и добавил отверстия там, где хотел. Если у вас нет Illustrator, вы можете использовать Inkscape для этого шага.
Конечно, вам не нужно использовать лазерный резак, так как это простая коробка с несколькими отверстиями. Его должно быть достаточно легко создать с помощью более традиционных электроинструментов (или даже ручных инструментов!). Просто я был очень ленив и имел доступ к лазерному резаку.
Шаг 4: Пайка аркадных кнопок
Кнопка аркады (или, по крайней мере, моя) состоит из трех частей. Пластиковый корпус, держатель светодиода (со светодиодом внутри) и микровыключатель. Микропереключатель - это фактически кнопочная часть кнопки, и это то, что вам нужно для подключения к Arduino. На микровыключателе есть три клеммы (торчащие металлические кусочки, куда вы будете паять провода). Тот, что находится сверху (или внизу, как вы хотите), и есть земля. Двумя другими клеммами являются нормально разомкнутые (NO) и нормально замкнутые (NC). НЕТ означает, что при нажатии переключателя происходит соединение. NC означает, что нажатие кнопки разрывает соединение. Мы будем использовать НЕТ для этого проекта. Я пометил заземление, NO и NC на микровыключателе на фотографиях.
Мои кнопки подсвечиваются, поэтому я припаял провода к держателю светодиода. Обязательно укажите цвета проводов, чтобы знать, какая сторона является анодом, а какая - катодом (положительная и отрицательная стороны светодиода).
Я припаял контакты разъема к своим проводам, чтобы облегчить их использование с макетной платой без пайки. Я просто припаял провод к штырю и надел термоусадочную трубку, чтобы сделать их более упругими.
Шаг 5: сложите кнопки и подключите их к доске
Пришло время сложить аркадные кнопки в кейсе. Снимите стопорное кольцо с пластикового корпуса и проденьте его в отверстие в корпусе. Закрутите стопорное кольцо с другой стороны, чтобы зафиксировать кнопку на месте. Вставьте держатель светодиода и поверните его, чтобы зафиксировать на месте. Покачивайте микровыключатели (есть маленькие выступы и отверстия, которые совпадают друг с другом, чтобы удерживать его на месте).
Чтобы подключить переключатели к плате, удалите кнопки, которые вы могли добавить, а могли и не добавить. Подключите провод, идущий от земли микропереключателя к земле Arduino и резистора (там, где была ножка кнопки). Подключите провод, ведущий от NO микропереключателя к 5 В на Arduino.
Для светодиодных проводов подключите отрицательный провод к земле, а положительный через резистор 220 Ом к 5 В. Если вы подключите их вот так, они будут всегда включены. Вы можете добавить их в код и заставить их включаться и выключаться синхронно с кнопками, если хотите.
Шаг 6. Адское кодирование
Итак, теперь вы прикрепили свои причудливые новые кнопки к старому коду, и внезапно он больше не работает так, как должен. Буквы появляются по две или три за раз, и это не работает так, как должно, с простыми играми HTML5. Добро пожаловать в ад.
Перво-наперво. Код, который мы написали при прототипировании? он отлично работает и прост, но не элегантен. Если вы хотите добавить больше кнопок, вам нужно скопировать и вставить фрагменты кода и изменить все значения внутри них. Если вы забудете один из них, вы попадете в ад исправления ошибок. Обнаружили здесь тему? Кодирование - это ад, но ад для решения проблем.
Нам нужен красивый, короткий код. Поэтому мы заменим все целые числа отдельных кнопок на массивы. Таким образом, если вы хотите добавить больше кнопок, вам нужно только изменить количество кнопок, контакты, на которых они расположены, и их вывод. Мы также меняем ключевые входные данные на ASCII, потому что… он работает лучше?
Теперь, если вы похожи на меня, вы напишете простой и легкий способ использования кнопок, и он не будет работать так хорошо, как вам хотелось бы. Таким образом, вы создаете новые версии (помните детей, инкрементные резервные копии!), Пробуете разные вещи, пишете постоянно более сложный код, который все еще не работает должным образом, и в конечном итоге возвращаетесь к простому коду, который вы написали несколько часов назад, И замечаете небольшую ошибку, которая мгновенно все исправляет.
Позвольте мне избавить вас от этого путешествия, вот рабочий код:
Отказ от ответственности: этот текст был написан после нескольких часов написания и исправления ошибок в очень простом коде. Пожалуйста, не обращайте внимания на любые признаки разочарования и сосредоточьтесь на рабочем коде, опубликованном ниже;)
#include "Keyboard.h" #define buttonAmount 3
int buttonPin = {
A0, A1, A2}; // Где кнопки? int asciiLetter = {97, 100, 119}; // Буквы в ASCII, здесь: a, d, w int buttonState [buttonAmount]; // Нажата кнопка или нет?
void setup () {
for (int i = 0; i <buttonAmount; i ++) {// цикл по массиву pinMode (buttonPin , INPUT); // устанавливаем все контакты на вход}}
void loop () {
for (int i = 0; i <buttonAmount; i ++) // цикл по массиву {buttonState = digitalRead (buttonPin ); // Что делают кнопки? if (buttonState == HIGH) {// Если кнопка нажата Keyboard.press (asciiLetter ); // отправляем соответствующее письмо} else // если кнопка не нажата {Keyboard.release (asciiLetter ); // отпускаем письмо}}
}
Шаг 7: Все работает
Наслаждайтесь своим настраиваемым контроллером Plug & Play!
Если вам понравилось это наставление, пожалуйста, проголосуйте за меня в конкурсе!