Accionar varias condiciones a la vez en arduino

Hola comunidad,
estoy intentando un proyecto para que una serie de servos accionen un piano mediante la interfaz midi todo ese logré que funcione, pero al accionar 2 teclas solo 1 de los servos se mueve investigue un poco pero lo unico que encontré fue lo de las tareas paralelas que me parece complejo y creo que hay una manera más simple de hacerlo funcionar a continuación dejo el código.

#include <Servo.h>
#include <MIDI.h>
MIDI_CREATE_DEFAULT_INSTANCE();
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
void setup() {
  servo1.attach(2);
  servo1.write(0);
  servo2.attach(3);
  servo2.write(0);
  servo3.attach(4);
  servo3.write(0);
  servo4.attach(5);
  servo5.attach(6);
  servo5.write(0);

  MIDI.begin(); 
  Serial.begin(115200);
}

void loop()
{
  if (MIDI.read()) // Comprueba si hay mensajes
  {
    int tipo = MIDI.getType();
    int nota = MIDI.getData1();


    if (tipo == 0x90 && nota == 64) {

       servo1.write(20);
    }
    else {
     
      servo1.write(0);
    }

    if (tipo == 0x90 && nota == 65) {

      servo2.write(20);
    }
    else {
      
       servo2.write(0);
    }
    if (tipo == 0x90 && nota == 62)
    {
    servo3.write(20);
    }
    else {
      servo3.write(0);
    }
    if (tipo == 0x90 && nota == 60)
    {
      servo4.write(20);
    }
    else {
      servo4.write(0);
    }
    if (tipo == 0x90 && nota == 67) {
      servo5.write(20);
    }


    else {
     servo5.write(0);
    }
  }

}

Tambien intente este otro codigo pero obteniendo el mismo resultado:

#include <Servo.h>
#include <MIDI.h>
MIDI_CREATE_DEFAULT_INSTANCE();
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
int Servo1 = 0;
int Servo2 = 0;
int Servo3 = 0;
int Servo4 = 0;
int Servo5 = 0;
void setup() {
  servo1.attach(2);
  servo1.write(0);
  servo2.attach(3);
  servo2.write(0);
  servo3.attach(4);
  servo3.write(0);
  servo4.attach(5);
  servo5.attach(6);
  servo5.write(0);

  MIDI.begin(); 
  Serial.begin(115200);
}

void loop()
{
  if (MIDI.read()) // Comprueba si hay mensajes
  {
    int tipo = MIDI.getType();
    int nota = MIDI.getData1();


    if (tipo == 0x90 && nota == 60) {

Servo1 = 20;
    }
    else {
     
      Servo1 = 0;
    }

    if (tipo == 0x90 && nota == 62) {

      Servo2 = 20;
    }
    else {
      
       Servo2 = 0;
    }
    if (tipo == 0x90 && nota == 64)
    {
    Servo3 = 20;
    }
    else {
      Servo3 = 0;
    }
    if (tipo == 0x90 && nota == 65)
    {
    Servo4 = 20;
    }
    else {
    Servo4 = 0;
    }
    if (tipo == 0x90 && nota == 67) {
    Servo4 = 20;
    }


    else {
    Servo5 = 0;
    }
           servo1.write(Servo1);
           servo2.write(Servo2);
           servo3.write(Servo3);
           servo4.write(Servo4);
           servo5.write(Servo5);
    
  }

}

Adicional a esto hay una laternativa más barata y fácil de conseguir que los servos ya que el piano tiene 81 teclas y los servomotores son un poco caros como un actudor o algo así perop ara arduino.
Un saludo desde Argentina.

Creo que no tiene sentido programar servos en paralelo si realizan acciones de una sola vez. Que yo sepa, las señales MIDI, además de los números de nota, también tienen una duración. Si gira los servos no solo en el momento en que llega la nota, sino que también los mantiene presionados durante un tiempo, será posible reproducir melodías.
Está programado por autómatas finitos.

podría ser voy a intentarlo y comento de nuevo gracias por la respuesta.

Hola, intente lo que me dijiste, pero no funcionó , según tengo entendido la velocidad de la nota aplica únicamente en pianos acusticos segun con que fuerza golpeas la tecla y en los teclas de un teclado electronico no aplica aún asi lo inente y dejo el codigo a continuación:

#include <Servo.h>
#include <MIDI.h>
MIDI_CREATE_DEFAULT_INSTANCE();
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
void setup() {
  servo1.attach(2);
  servo1.write(0);
  servo2.attach(3);
  servo2.write(0);
  servo3.attach(4);
  servo3.write(0);
  servo4.attach(5);
  servo5.attach(6);
  servo5.write(0);

  MIDI.begin(); 
  Serial.begin(115200);
}

void loop()
{
  if (MIDI.read()) // Comprueba si hay mensajes
  {
    int tipo = MIDI.getType();
    int nota = MIDI.getData1();
    int velo = MIDI.getData2();


    if (tipo == 0x90 && nota == 64) {

       servo1.write(20);
       delay(velo);
    }
    else {
     
      servo1.write(0);
    }

    if (tipo == 0x90 && nota == 65) {

      servo2.write(20);
      delay(velo);
    }
    else {
      
       servo2.write(0);
              
    }
    if (tipo == 0x90 && nota == 62)
    {
    servo3.write(20);
    delay(velo);
    }
    else {
      servo3.write(0);
    }
    if (tipo == 0x90 && nota == 60)
    {
      servo4.write(20);
      delay(velo);
    }
    else {
      servo4.write(0);
    }
    if (tipo == 0x90 && nota == 67) {
      servo5.write(20);
      delay(velo);
    }


    else {
     servo5.write(0);
    }
  }

}

Podrías usar soneloides pero no podrás hacer pulsaciones más rápidas o más lentas como puedes hacerlas con un servo. Si esto no es un problema, míralos.
La ventaja de un soneloide respecto a un servomotor es la simplicidad del mismo (soneloide hace on/off respecto a mover a cierta dirección, aceleracion, etc) así como el precio.

Ejemplo soneloide barato y pequeño:

https://es.aliexpress.com/item/1005003358210920.html?pdp_npi=2%40dis%21EUR%21%E2%82%AC%201%2C29%210%2C98%20%E2%82%AC%21%21%21%21%21%400b0a24a616711845175457054e0338%2112000025385864564%21btf&_t=pvid%3Aa2e8eec7-657b-48b2-a6ac-045c6a643c59&afTraceInfo=1005003358210920__pc__pcBridgePPC__xxxxxx__1671184517&spm=a2g0o.ppclist.product.mainProduct&gatewayAdapt=glo2esp

Tendrás que hacerte circuitería para excitarlo.
Saludos.

Se me pasó comentarte lo de la circuitería, aquí tienes un esquema de ejemplo (hay muchas y dependerá de las características del soneloide)

Puedes también excitarla con un relé pero no te lo aconsejo.
Saludos

Si no es una mala idea pero en donde vivo (Argentina) traer cosas de afuera es el equivalente a perder mucha plata en impuestos ademas los transistores que recomiendan son muy caros para comprar 81 y los solenoides me matan con el envio (como tres veces más caro que los servos) aún así muchas gracias por la respuesta.

Aún así viendo que es un proyecto que se me va de las manos en temas de programación y dinero para los servos tal vez lo pateo para el año que viene que tengo programación y puedo preguntar del tema Gracias a todos los que respondieron por su tiempo.

Un soneloide es relativamente simple de realizar con materiales muy básicos (tubo de plástico, resorte, eje y bobinado cobre)
Saludos.

Hola de nuevo vengo anunciar que encontre la solucion la tema de accionar los servos.

#include <Servo.h>
#include <MIDI.h>
MIDI_CREATE_DEFAULT_INSTANCE();
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
void setup() {
  servo1.attach(2);
  servo1.write(0);
  servo2.attach(3);
  servo2.write(0);
  servo3.attach(4);
  servo3.write(0);
  servo4.attach(5);
  servo5.attach(6);
  servo5.write(0);

  MIDI.begin(); 
  Serial.begin(115200);
}

void loop()
{
  
  if (MIDI.read()) // Comprueba si hay mensajes
  {
    int tipo = MIDI.getType();
    int nota = MIDI.getData1();
    int vel = MIDI.getData2();


    if (tipo == 0x90 && nota == 64) {

       servo1.write(20);
       
    }
    else if(tipo == 0x80 && nota == 64) {
     
      servo1.write(0);
    }

    if (tipo == 0x90 && nota == 65) {

      servo2.write(20);
    }
    else if(tipo == 0x80 && nota == 65) {
     
      servo2.write(0);
    }
    if (tipo == 0x90 && nota == 62)
    {
    servo3.write(20);
    }
   else if(tipo == 0x80 && nota == 62) {
     
      servo3.write(0);
    }
    if (tipo == 0x90 && nota == 60)
    {
      servo4.write(20);
    }
    else if(tipo == 0x80 && nota == 60) {
     
      servo4.write(0);
    }
    if (tipo == 0x90 && nota == 67) {
      servo5.write(20);
    }


   else if(tipo == 0x80 && nota == 67) {
     
      servo5.write(0);
    }
  }

}

Lo de los solenoides lo tengo en cuenta cuando logra accionar las teclas en un teclado con los servos voy a ver cual opción comviene más talvez me lo fabrico yo muchas gracias por la idea.
Un saludo.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.