Как добавить потенциометр и дополнительные кнопки к пользовательскому игровому контроллеру?

Я новичок в использовании 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 (того же типа, что официальная герой гитары контроллеров используют для своих сглаз бар) и, возможно, еще несколько кнопок входов (я мог бы добавить, датчик наклона и, возможно, в крестовину в будущей версии)

, 👍0


2 ответа


0

Похоже, контакты 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; есть множество примеров, как это использовать.

,

Разве вы не имеете в виду "digitalRead(input_pins[индекс])` вместо просто" digitalRead(индекс)"?, @chrisl

@chrisl Конечно, спасибо за исправление (я обновил свой ответ)., @Michel Keijzers

> Я предлагаю вам немного изучить кодирование, чтобы, по крайней мере, понять, что вы меняете, это значительно облегчит вашу жизнь по мере вашего прогресса В конечном итоге я действительно хочу научиться программировать, но это просто не то, что мне интересно делать (или для чего у меня есть время) в ближайшем будущем. Сейчас я просто хочу, чтобы это работало, поэтому у меня больше времени для других проектов 3D-печати, над которыми я работаю > В случае, если вам нужно больше контактов, чем реально существующие контакты Это не будет проблемой для этого проекта. Самое большее, мне нужно 15 входных контактов из 18 доступных, @taj1994

@taj1994 Все ясно для обоих. Что касается количества пинов, то, конечно, вам не следует добавлять что-то сложное, когда вы заранее знаете, что это никогда не понадобится. Удачи вам в вашем проекте., @Michel Keijzers


1

Прекрасная работа с 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! Вы будете любить его!

Фрэнк

,