Здравствуйте! Помогите решить проблему. Написан скетч для мидиконтроллера на Teensy4.0. К ней подключено 18 фэйдеров, 4 энкодера и матрица кнопок. Скетч состоит из файлов .ino .cpp .h. Фэйдеры и энкодеры находятся в файле .ino , и выходят в usbmidi нормально, а кнопки находятся в файле .cpp и в usbmidi никак не хотят выходить. Хотя они работают и в serial monitore их видно. Скорее всего недостаток какой то строки в файле .срр. Спасибо($) откликнувшимся!
что бы это значило?
и что, даже это предположение не навело вас на мысль, что надо показывать код???
Здравствуйте! На форуме впервые! Конечно я понял ошибку. Но код на домашнем компе. Выложу только вечером, сейчас на работе. Спасибо за отклик!
После загрузки кода, на выходе Usbmidi (смотрю в Midi View) сообщения от потенциометров и энкодеров приходят. От кнопок нет, хотя , в Serial Monitor видно, что срабатывают. Извините, что своими словами
тогда вечером и надо было тему создавать.
Без кода обсуждать нечего.
Прошу прощения за слова “Скорее всего недостаток какой то строки в файле .срр.” Сделал вывод за Вас. Ведь совершенно не уверен, что дело в этом
sketch_jan28a.ino
#include <Encoder.h>
#include <MIDI.h>
#include "matrix_buttons.h"
#include <MIDIUSB.h>
// === Распределение пинов ===
const int muxSelectPins[] = {14, 15, 16, 17}; // Пины для селекторов мультиплексора
const int muxOutputPin = 18; // Аналоговый выход мультиплексора
Encoder encoders[] = {
Encoder(10, 11),
Encoder(0, 1),
Encoder(22, 23),
Encoder(24, 25)
};
const int additionalPotPins[] = {34, 35}; // Новые потенциометры
int additionalPotValues[2] = {0}; // Значения потенциометров
int lastAdditionalPotValues[2] = {0};
// === Переменные ===
int potentiometerValues[16] = {0}; // Изменено на 16
int lastPotentiometerValues[16] = {0}; // Изменено на 16
long encoderValues[4] = {0};
long lastEncoderValues[4] = {0};
// === Настройки ===
const int potentiometerThreshold = 2; // Гистерезис для потенциометров
const int encoderStep = 4; // Шаг для энкодеров
void setup() {
// Настройка пинов селекторов мультиплексора
for (int i = 0; i < 4; i++) {
pinMode(muxSelectPins[i], OUTPUT);
}
// Настройка пинов для дополнительных потенциометров
for (int i = 0; i < 2; i++) {
pinMode(additionalPotPins[i], INPUT);
}
// Инициализация Serial для отладки
Serial.begin(9600);
// Инициализация матрицы кнопок
setupMatrixButtons();
// Инициализация MIDI
usbMIDI.begin();
}
void loop() {
// --- Потенциометры (через мультиплексор) ---
for (int i = 0; i < 16; i++) {
// Устанавливаем селекторы для мультиплексора
for (int j = 0; j < 4; j++) {
digitalWrite(muxSelectPins[j], (i >> j) & 1);
}
// Читаем значение с выходного пина мультиплексора
int value = analogRead(muxOutputPin) / 8; // Приводим к диапазону 0-127
if (abs(value - lastPotentiometerValues[i]) > potentiometerThreshold) { // Проверяем порог
usbMIDI.sendControlChange(46 + i, value, 1); // CC №1-16 для потенциометров
lastPotentiometerValues[i] = value;
}
}
// --- Новые потенциометры (прямое подключение) ---
for (int i = 0; i < 2; i++) {
int value = analogRead(additionalPotPins[i]) / 8; // Приводим к диапазону 0-127
if (abs(value - lastAdditionalPotValues[i]) > potentiometerThreshold) { // Проверяем порог
usbMIDI.sendControlChange(62 + i, value, 1); // CC №17-18 для новых потенциометров
lastAdditionalPotValues[i] = value;
}
}
// --- Матрица кнопок ---
readMatrixButtons();
// printMatrixButtons(); // Для отладки (убрать в финальной версии)
// --- Энкодеры ---
for (int i = 0; i < 4; i++) {
long value = encoders[i].read();
if (abs(value - lastEncoderValues[i]) >= encoderStep) { // Проверяем шаг
if (value > lastEncoderValues[i]) {
usbMIDI.sendControlChange(20 + i, 1, 1); // Увеличение CC №9-12
} else {
usbMIDI.sendControlChange(20 + i, 127, 1); // Уменьшение CC №9-12
}
lastEncoderValues[i] = value;
}
}
// Убери `delay(100)` в финальной версии, если хочешь быструю реакцию.
delay(10); // Пауза для отладки
}
matrix_buttons.cpp
#include "matrix_buttons.h"
#include <Arduino.h>
#include <MIDIUSB.h>
// Определяем константы и глобальные переменные
const int numRows = 3; // Количество строк
const int numCols = 4; // Количество столбцов
const int rowPins[numRows] = {19, 20, 21}; // Пины строк
const int colPins[numCols] = {2, 3, 4, 5}; // Пины столбцов
bool matrixButtons[3][4] = {{false}}; // Состояние кнопок (изначально false)
// Определяем функции
void setupMatrixButtons() {
Serial.println("Инициализация матрицы кнопок с переключением INPUT/OUTPUT...");
// Настраиваем строки и столбцы как входы с подтяжкой
for (int i = 0; i < numRows; i++) {
pinMode(rowPins[i], INPUT_PULLUP);
}
for (int j = 0; j < numCols; j++) {
pinMode(colPins[j], INPUT_PULLUP);
}
Serial.println("Матрица кнопок инициализирована.");
}
void readMatrixButtons() {
// Считываем состояние кнопок в матрице
for (int i = 0; i < numRows; i++) {
// Активируем строку: переводим её в OUTPUT и ставим LOW
pinMode(rowPins[i], OUTPUT);
digitalWrite(rowPins[i], LOW);
delayMicroseconds(5); // Даем сигналу стабилизироваться
for (int j = 0; j < numCols; j++) {
// Читаем состояние столбца
bool currentState = !digitalRead(colPins[j]);
// Проверяем состояние кнопки
if (currentState && !matrixButtons[i][j]) {
matrixButtons[i][j] = true;
Serial.print("Нажата кнопка: строка ");
Serial.print(i);
Serial.print(", столбец ");
Serial.println(j);
} else if (!currentState && matrixButtons[i][j]) {
matrixButtons[i][j] = false;
}
}
// Возвращаем строку в режим INPUT
pinMode(rowPins[i], INPUT_PULLUP);
}
}
void printMatrixButtons() {
// Выводим состояние кнопок в Serial
Serial.println("Состояние кнопок:");
for (int i = 0; i < numRows; i++) {
for (int j = 0; j < numCols; j++) {
Serial.print(matrixButtons[i][j]);
Serial.print(" ");
}
Serial.println();
}
}
// Отправка MIDI Note On
void sendNoteOn(byte pitch, byte velocity) {
midiEventPacket_t noteOn = {0x09, 0x90, pitch, velocity};
MidiUSB.sendMIDI(noteOn);
MidiUSB.flush();
}
// Отправка MIDI Note Off
void sendNoteOff(byte pitch, byte velocity) {
midiEventPacket_t noteOff = {0x08, 0x80, pitch, velocity};
MidiUSB.sendMIDI(noteOff);
MidiUSB.flush();
}
matrix_buttons.h
#ifndef MATRIXBUTTONSH // Начало защиты от повторного включения
#define MATRIXBUTTONSH
#include <Arduino.h> // Подключаем Arduino.h для byte и других типов
// Объявляем константы и глобальные переменные
extern const int numRows;
extern const int numCols;
extern const int rowPins[];
extern const int colPins[];
extern bool matrixButtons[3][4]; // Пример для матрицы 6x9
// Объявляем функции
void setupMatrixButtons();
void readMatrixButtons();
void printMatrixButtons();
#endif // MATRIXBUTTONSH
Потенциометры 16 шт подключены через мультиплексор 74hc4067 S0, S1, S2, S3 - 14, 15, 16, 17. SIG- 18. EN-GND. Два потенциометра подключены напрямую на пины 34, 35. Энкодеры и матрица кнопок подключены напрямую на пины, в коде видно
Похоже вы совсем совсем не понимаете работу программы, если это так, то советы скорее всего не помогут.
По существу.
Кнопки у вас и не пытаются ничего отправлять в MIDI.
Не знаю, какая команда нужна при нажатии отпускании, но скорее всего надо добавить после
matrixButtons[i][j] = true;
вызов
sendNoteOn(byte pitch, byte velocity); где pitch определяется нажатой кнопкой
а после
matrixButtons[i][j] = false;
вызов
sendNoteOff(byte pitch, byte velocity);
Да! Не сильно разбираюсь еще. И написал в соответствующей ветке. Есть желание разбираться дальше и спрашивать буду если что, но в других ветках. А пока прошу помощь в исправлении скетча. То что Вы предложили не сработало, компилятор выдал много ошибок
Покажите новую версию кода, которая у вас получилась после исправления по совету @Upper .
Если компилятор дает ошибки - приведите их полностью (текстом)
PS Вы, похожеЮ так и не разобрались, как общаться на этом форуме. Любые вопросы по программе - только с кодом!