Как добавить потенциометр и дополнительные кнопки к пользовательскому игровому контроллеру?
Я новичок в использовании Arduino и почти ничего не знаю о программировании. В настоящее время я пытаюсь добавить потенциометр и, возможно, еще несколько кнопочных входов в мой проект 3D-печатного контроллера гитары
Он использует Arduino Pro Micro, код-это просто пример файла из этой библиотеки джойстиков, с которой я в основном просто играл с помощью проб и ошибок , и эта схема распиновки от Sparkfun, и это то, что я получил:
#include <Joystick.h>
Joystick_ Joystick;
void setup() {
// Initialize Button Pins
pinMode(0, INPUT_PULLUP);
pinMode(1, INPUT_PULLUP);
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT_PULLUP);
pinMode(5, INPUT_PULLUP);
pinMode(6, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
pinMode(10, INPUT_PULLUP);
// Инициализация Библиотеки Джойстиков
Joystick.begin();
}
// Константа, которая сопоставляет физический штифт с кнопкой джойстика.
const int pinToButtonMap = 0;
// Последнее состояние кнопки
int lastButtonState[11] = {0,0,0,0,0,0,0,0,0,0,0};
void loop() {
// Read pin values
for (int index = 0; index <= 10; index++)
{
int currentButtonState = !digitalRead(index + pinToButtonMap);
if (currentButtonState != lastButtonState[index])
{
Joystick.setButton(index, currentButtonState);
lastButtonState[index] = currentButtonState;
}
}
delay(10);
}
Это исходный пример кода, который я использовал:
// Simple example application that shows how to read four Arduino
// digital pins and map them to the USB Joystick library.
//
// Ground digital pins 9, 10, 11, and 12 to press the joystick
// buttons 0, 1, 2, and 3.
//
// NOTE: This sketch file is for use with Arduino Leonardo and
// Arduino Micro only.
//
// by Matthew Heironimus
// 2015-11-20
//--------------------------------------------------------------------
#include <Joystick.h>
Joystick_ Joystick;
void setup() {
// Initialize Button Pins
pinMode(9, INPUT_PULLUP);
pinMode(10, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
pinMode(12, INPUT_PULLUP);
// Initialize Joystick Library
Joystick.begin();
}
// Constant that maps the phyical pin to the joystick button.
const int pinToButtonMap = 9;
// Last state of the button
int lastButtonState[4] = {0,0,0,0};
void loop() {
// Read pin values
for (int index = 0; index < 4; index++)
{
int currentButtonState = !digitalRead(index + pinToButtonMap);
if (currentButtonState != lastButtonState[index])
{
Joystick.setButton(index, currentButtonState);
lastButtonState[index] = currentButtonState;
}
}
delay(50);
}
Я начал этот проект в конце февраля-начале марта, но добрался до части Arduino только недавно. Мой v1 работает чуть больше месяца, используя этот код, и с тех пор я работаю над дизайном v2 (добавляю полосу удара и меняю положение кнопок start и select). Я только на прошлой неделе дошел до того, что мне нужно было изменить код.
Из комментариев в пример и некоторые проб и ошибок, я выяснил, что "константный инт pinToButtonMap = 9" является наименьшим номером контакта, который он будет использовать, и "для (int индекс = 0; индекс < 4; индекс++)", кажется, для определения остальных штифтов, так что я сменил 9 до 0, и "< 4" в "< 18" (количество используемых шпилек), и это вроде бы сработало. Контакты 0-10 и 14-16 теперь работали как кнопочные входы, но кнопка 14 (которая была бы на выводе 13, которого нет на Pro Micro) считывается как постоянно нажатая, а контакты A0-A3 (цифровые контакты 18-21) ничего не читают. Если вместо этого я изменю его на "< 19", " Он просто полностью перестает работать, и если я изменю его на "< 11" или "<= 10" (мой текущий код), то все контакты от 0 до 10 будут работать, и никаких фантомных нажатий кнопок не будет
Кроме того, честно говоря, я не планирую в ближайшее время изучать какое-либо реальное программирование. Возможно, в будущем, но сейчас, мне просто нужно, достаточно это сделать с помощью потенциометра 10k (того же типа, что официальная герой гитары контроллеров используют для своих сглаз бар) и, возможно, еще несколько кнопок входов (я мог бы добавить, датчик наклона и, возможно, в крестовину в будущей версии)
@taj1994, 👍0
2 ответа
Похоже, контакты 11, 12 и 13 не существуют в качестве входных контактов, а контакты 0 и 1 используются для RX/TX, которые вы, вероятно, тоже не хотите использовать.
Поэтому вместо использования цикла for, перебирающего индексы, вам следует создать массив с номерами выводов и использовать его вместо этого, что-то вроде:
Создавайте глобально:
int input_pins = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 14, 15, 16, ... };
Использование в цикле
:
for (int index = 0; index < sizeof(input_pins) / sizeof(int); index++)
{
int currentButtonState = digitalRead(input_pins[index]);
Вы можете использовать то же самое для
настройки режимов ввода в настройках
:
for (int index = 0; index < sizeof(input_pins) / sizeof(int); index++)
{
pinMode(input_pins[index], INPUT_PULLUP);
}
sizeof(input_pins) / sizeof(int)
даст количество элементов в массиве. Теперь вы можете легко изменить его в зависимости от контакта.
Я предлагаю вам немного изучить кодирование, чтобы, по крайней мере, понять, что вы меняете, это значительно облегчит вашу жизнь по мере вашего прогресса.
В случае, если вам нужно больше выводов, чем реально существующих, вам нужно использовать мультиплексор, такой как 74HC595; есть множество примеров, как это использовать.
Прекрасная работа с 3D-печатной гитарой! Вы уже потратили много времени и усилий на физический дизайн и конструкцию контроллера, поэтому я рекомендую вам потратить некоторое время на базовое программирование на Arduino, включая базовую компоновку контактов для Pro Micro и основы программирования на языке Arduino (в основном на C++)
Вы можете найти все, что вам нужно знать, в примерах программ, которые поставляются с Arduino IDE (Файл -> Примеры - 01.Основы), а также во многих доступных учебных пособиях (поиск учебника по Arduino). Вот один из них, который, кажется, довольно ясен https://www.youtube.com/watch?v=QO_Jlz1qpDw
Вам также нужно будет взглянуть на одну из многочисленных схем распиновки Arduino для Pro Micro, например эту https://learn.sparkfun.com/tutorials/pro-micro--fio-v3-hookup-guide/hardware-overview-pro-micro
Из диаграммы видно, что вы можете использовать контакты 2-10 и 16-21 для цифрового ввода/вывода (для ваших кнопок), но вам нужно будет использовать один из 10, 18-21 для ввода потенциометра. Итак, как уже отмечал один другой плакат, вы должны использовать массив номеров контактов, а затем считывать каждый контакт, индексируя его в массиве.
Для интерфейса потенциометра одним из примеров, приведенных в разделе "01.Основы", является программа "AnalogReadSerial", с которой вы должны начать. Чтобы использовать эту программу, подключите центральный вывод потенциометра к контакту 18(A0), а два других-к VCC и GND. Загрузите программу в Pro Micro, и вы должны получить некоторые распечатки консоли, которые будут меняться при изменении настроек потенциометра.
Для начала сделайте свои программы очень маленькими - думайте о них как о одноразовых фрагментах, которые позже будут включены в окончательную программу. Один фрагмент только для потенциометра, а другой фрагмент только для, скажем, 4 кнопок, которые подключаются к контактам 2, 9, 16 и 21, просто чтобы убедиться, что ваша схема индексирования массива работает. Затем, когда все заработает, фрагменты можно объединить в "окончательный" (в мире Arduino никогда ничего по-настоящему окончательного не бывает).
И, наконец, щедро используйте последовательные инструкции "печать" для тестирования и отладки; они избавят вас от множества проблем и разочарований. Вы можете прокомментировать их после того, как все тестирование будет проведено, или просто оставить их. В большинстве проектов операторы Serial.print не занимают достаточно времени или памяти, чтобы иметь значение.
Добро пожаловать в мир Arduino! Вы будете любить его!
Фрэнк
- Управлять яркостью светодиода с помощью потенциометра без кода, а также считывать значение потенциометра?
- DHT11 аналоговый или цифровой?
- Управление цифровым потенциометром MCP41HV31
- RGB LED с помощью потенциометра и кнопки
- ШИМ-управление, как остановить мерцание светодиода?
- Arduino Pro Micro не распознает INPUT или INPUT_PULLUP
- Подключить аналоговый датчик к цифровому контакту
- Замените несколько потенциометров кнопками и одиночными потенциометрами.
Разве вы не имеете в виду "digitalRead(input_pins[индекс])` вместо просто" digitalRead(индекс)"?, @chrisl
@chrisl Конечно, спасибо за исправление (я обновил свой ответ)., @Michel Keijzers
> Я предлагаю вам немного изучить кодирование, чтобы, по крайней мере, понять, что вы меняете, это значительно облегчит вашу жизнь по мере вашего прогресса В конечном итоге я действительно хочу научиться программировать, но это просто не то, что мне интересно делать (или для чего у меня есть время) в ближайшем будущем. Сейчас я просто хочу, чтобы это работало, поэтому у меня больше времени для других проектов 3D-печати, над которыми я работаю > В случае, если вам нужно больше контактов, чем реально существующие контакты Это не будет проблемой для этого проекта. Самое большее, мне нужно 15 входных контактов из 18 доступных, @taj1994
@taj1994 Все ясно для обоих. Что касается количества пинов, то, конечно, вам не следует добавлять что-то сложное, когда вы заранее знаете, что это никогда не понадобится. Удачи вам в вашем проекте., @Michel Keijzers