Hola voy a intentar hacer un controlador midi y mi pregunta es con Arduino Mega tengo que añadir mas pines, porque necesito 44 pines digitales y 22 analógicos, me recomendáis un multiplexsor?
Aquí dejo una imagen para que se vea lo que quiero hacer, y según vaya teniendo dudas que serán muchas ya las iré poniendo por si me podéis ayudar. Gracias
Si claramente necesitas un multiplexor al menos para los analógicos.
Coincido, yo usaría un CD4051 (8 canales a 1).
Tienes 16 entradas analógicas, 15 las usas directamente y la restante para los canales multiplexados (serían 7 los 8 que maneja el 4051) que controlarías con 4 pines digitales y todavía te quedarían 6 disponibles para algún otro uso.
Saludos
Muchas gracias, voy a empezar a investigar.
Un saludo
Qué tal si nos ayudas indicando el código del módulo?
EDITADO 1 min después de la descarga:
Ya he podido, bajando el archivo y girándolo.
Es un 74HC4067 multiplexor analógico/digital de 16 canales.
Si, este te servirá.
Para reducir la cantidad de pulsadores podría poner uno para que si lo pulso una vez haga un "mute" en esa pista, si lo pulso dos veces la deje en "solo" y si hago una pulsación larga los deje en el estado normal, sin nada, que suene con las demás pistas?
Solo voy a usar leds, pulsadores y potenciometros
int leds []={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29}; // Define los pin donde van los leds
int pulsador[]={30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52}; // Define los pin donde van los pulsadores
int pote []={0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15}; // Define los pin donde van los potenciometros
void setup() {
Serial.begin(9600);
for (int l=0;l<30;l++)
{
pinMode(leds[l],OUTPUT);
}
for (int p=0;p<23;p++)
{
pinMode(pulsador[p],INPUT);
}
for (int q=0;q<16;q++)
{
pinMode(pote[q],INPUT);
}
}
void loop() {
}
Una pregunta, no podría definir los pines en vez de variable como constante, y en vez de usar el tipo int, no podría usar mejor byte?
Pregunto desde la ignorancia.
Totalmente. Muy buena deducción.
A la preguna anterior, si puedes hacer que un botón desencadene varias acciones, hay librerías que te van a facilitar la la tarea, una de ellas es OneButton.h.
Saludos
Hola, estoy intentando hacer un código para que si hago una pulsación se encienda un led (ponga una pista en solo), si hago dos pulsaciones, se encienda otro (ponga la pista en mute) y si hago una pulsación larga, que todo vuelva a su estado anterior, (se apague el led que esté encendido y afecte nada a esa pista)
Ahora mismo estoy intentando entender las pulsaciones de los botones, estoy haciendo otra cosa para entender el código que es si pulso una vez que se encienda un led, si pulso dos veces que no haga nada, y si hago pulsación larga que se apague, pero al hacer pulsación larga la detecta como una pulsación, ahora he intentado que al hacer una pulsación larga se encienda el led, pero me es imposible.
Aquí dejo el código, igual necesitaría otra librería, es para una especie de mesa de mezclas.
#include "Button2.h"
/////////////////////////////////////////////////////////////////
#define BUTTON_PIN 2
/////////////////////////////////////////////////////////////////
Button2 button;
/////////////////////////////////////////////////////////////////
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600);
delay(50);
button.begin(BUTTON_PIN);
button.setClickHandler(handler);
button.setLongClickHandler(handler);
button.setDoubleClickHandler(handler);
}
/////////////////////////////////////////////////////////////////
void loop() {
button.loop();
}
/////////////////////////////////////////////////////////////////
void handler(Button2& btn) {
switch (btn.getClickType()) {
case SINGLE_CLICK:
break;
case DOUBLE_CLICK:
break;
case LONG_CLICK:
break;
}
int clicks;
clicks = (btn.getNumberOfClicks());
Serial.println(clicks);
if (clicks == LONG_CLICK) {
delay(100);
digitalWrite(13, HIGH);
} else {
delay(100);
digitalWrite(13, LOW);
}
}
puede intentar estructurar su código de esta manera:
#include "Button2.h"
const byte buttonPin = 2;
Button2 button;
void soloClick(Button2& btn) {
Serial.println("soloClick");
}
void dobleClick(Button2& btn) {
Serial.println("dobleClick");
}
void largoClick(Button2& btn) {
Serial.println("largoClick");
}
void setup() {
pinMode(13, OUTPUT);
Serial.begin(115200); // 9600 fue utilizado durante el siglo pasado...
button.begin(buttonPin);
button.setClickHandler(soloClick);
button.setDoubleClickHandler(dobleClick);
button.setLongClickHandler(largoClick);
}
void loop() {
button.loop();
}
(no olvide configurar la velocidad de transmisión del monitor serie en 115200)
Como bien sabes estoy aprendiendo y en todos los tutoriales que estoy mirando por Youtube, ponen la velocidad a 9600 baudios
Algo estoy haciendo mal porque tampoco me funciona, me imprime largoClick en el monitor de serie, pero no se enciende el led.
/////////////////////////////////////////////////////////////////
#include "Button2.h"
const byte buttonPin = 2;
Button2 button;
int leds [] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29}; // Define los pin donde van los leds
int pulsador[] = {30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52}; // Define los pin donde van los pulsadores
//int pote [] = {0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15}; // Define los pin donde van los potenciometros
void soloClick(Button2& btn) {
Serial.println("soloClick");
}
void dobleClick(Button2& btn) {
Serial.println("dobleClick");
}
void largoClick(Button2& btn) {
Serial.println("largoClick");
}
void setup() {
Serial.begin(115200);
for (int l = 0; l < 30; l++)
{
pinMode(leds[l], OUTPUT);
}
for (int p = 0; p < 23; p++)
{
pinMode(pulsador[p], INPUT);
}
for (int q = 0; q < 16; q++)
/* pinMode(pote[q], INPUT);
}
pinMode(13, OUTPUT);
*/
Serial.begin(115200); // 9600 fue utilizado durante el siglo pasado...
button.begin(buttonPin);
button.setClickHandler(soloClick);
button.setDoubleClickHandler(dobleClick);
button.setLongClickHandler(largoClick);
}
void loop() {
if (buttonPin == largoClick) {
delay(100);
digitalWrite(13, HIGH);
}
else {
delay(100);
digitalWrite(13, LOW);
}
button.loop();
}
/////////////////////////////////////////////////////////////////
sí, los ejemplos usan estúpidamente 9600 baudios.
El código que te di no modifica el estado del led, depende de ti agregar eso
if (buttonPin == largoClick) {
➜ buttonPin es 2 y largoClick es un puntero a una función... ¿cómo pueden ser iguales?
necesitas poner el codigo para el manejo de los leds en las 3 funciones. por ejemplo
void largoClick(Button2& btn) {
Serial.println("largoClick");
if (digitalRead(13) == LOW) {
digitalWrite(13, HIGH);
} else {
digitalWrite(13, LOW);
}
}
➜ un clic largo encenderá o apagará el LED en el pin 13
PS: tienes dos veces Serial.begin(115200);
Vuelvo a molestar, esto no lo entiendo
Button2 button;
me imagino que tiene que ver con la libreria pero no lo entiendo,
he cambiado todos los pines de los led y los pulsadores a constantes y en vez de entero los he puesto byte, crees que estará bien
const byte leds [] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29}; // Define los pin donde van los leds
const byte pulsador[] = {30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52}; // Define los pin donde van los pulsadores
esta línea de código crea una instancia de la clase Button2, que se llama button
Eso depende de lo que quieras hacer ![]()
Voy a hacer una especie de mezcladora de audio, tengo 11 potenciomentros de volumen y otros 11 de panoramica para 11 canales, luego un 1 boton (que es en lo que estoy liado ahora) que si pulsas una vez se activa el mute y su led, si pulsas dos veces se activa el "solo"(de ese canal) y si mantienes pulsado se vuelve a la situacion original y se apagan los led (esto en cada pista, o sea 11 pulsadores y 22 led) y luego los tipicos pulsadores de play, rebobinar, avance, etc.
Tengo que modificar, si logro hacer los de 1 boton para los dos led, los botones que van del 33 al 54 serian la mitad e irian en medio de los dos led debajo de ellos
que arduino piensas usar?



