Pulsante che manda un comando alla pressione ed uno diverso al rilascio

Ciao a tutti!

Sono nuovo su questo forum e neofita nel mondo Arduino.
Ho acquistato il libro di Leonardo Milani per studiare e seguo anche i video di Paolo Aliverti.

Mi trovo nel momento dello studio dove ho tante informazioni in testa e sono un po confuso.

Mi occupo di professional Show Lighting e sto facendo un Add-on per una console luci con OSC.
Ci sono molti esempi dove sto prendendo spunto e che mi sono d'auito (ho cmq molto lavoro da fare).
Dove invece non riesco trovare spunti e/o aiuti riguarda la gestione del pulsante con pressione/rilascio;

Ovvero io vorrei che alla pressione di un pulsante venga mandato un messaggio, ed al rilascio del medesimo ne venga mandato un altro, (una sola volta).

Ho preparato un harware prevedendo l'utilizzo della resistenza di PULLUP interna di Arduino sulla cui gestione ho poca esperienza (altri esperimenti fatti con dei relè ho cablato la resistenza da 10k su ogni pulsante)
incollo il piccolo (sicuramente errato) sketch che sto iniziando a fare:

Cmq nella porta seriale ottengo la risposta (le risposte...)

void setup() {

  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);

}


void loop() {
  if (digitalRead(2) == LOW) {

    Serial.println("Vediamo se funziona A");
  }

  if (digitalRead(3) == LOW) {

    Serial.println("Vediamo se funziona B");
  }
  if (digitalRead(4) == LOW) {

    Serial.println("Vediamo se funziona C");
  }
}

grazie in aticipo a chi vorrĂ  darmi qualche aiuto/consiglio.

Giovanni

Buongiorno e benvenuto :slight_smile: ,

essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del regolamento di detta sezione (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO

... poi, in conformità al suddetto regolamento, punto 7, cortesemente edita il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone a forma di piccola matita :pencil2: che si trova in basso del tuo post), seleziona la parte di codice e premi l'icona </> nella barra degli strumenti per contrassegnarla come codice. Così com'è non è molto leggibile ... assicurati di averlo correttamente indentato nell'IDE prima di inserirlo (questo lo si fa premendo ctrlT su un PC o cmd T su un Mac, sempre all'interno del IDE). Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread e sistemato il codice come da regolamento, nel rispetto del citato regolamento nessuno ti risponderà (eventuali risposte verrebbero cancellate), quindi ti consiglio di fare il tutto al più presto. :wink:

Salve,
come da gentile richiesta è stato fatto il tutto.
Grazie e perdoni le mancanze.
Giovanni

Benvenuto, Giovanni! :slight_smile:

Devi rilevare lo stato del pulsante e invertire l'uscita ogni volta che il pulsante cambia stato.
Quindi: leggi continuamente il pulsante e lo confronti con lo stato precedente (che ogni volta scrivi in una variabile): se è diverso, cambi lo stato dell'uscita.
E' indispensabile un antirimbalzo, che nella maniera più semplice può essere costituito da un condensatore da 100nF in parallelo al pulsante.

L'inversione puoi realizzarla con una variabile che passa da 0 a 1 e viceversa, ad esempio a=1-a, oppure leggendo lo stato corrente dell'uscita con digitalRead e scrivendo l'opposto con digitalWrite.
Leggi anche qui: Toggling a pin state - #3 by Arrch

Il tuo programma è perfetto... ma rileva semplicemente la pressione di un pulsante! :slight_smile:

Ciao e grazie,
mi hai dato tante informazioni, ora le studierò con attenzione, faro dei test ed eventualmente scriverò per eventuali dubbi.
Grazie anche per il link, perchè non sapevo esattamente che cosa andare a cercare per studiare, non essendo ferratissimo sull'argomento.
Saluti
Giovanni

1 Like

Ciao e grazie per le dritte, sono andato un po' avanti ed al 70% ho otttenuto quello che volevo. per il restante 25% torno a chiedervi un aiuto, cosi poi da potervi mostrare il lavoro finito anche dal punto di vista dell'Hardware.

Ora riesco ad inviare quello che voglio con un pulsante , scegliendo COSA mandare nei due stati del pulsante(pressione e rilascio) fin qui tutto straordianriamente benissimo.

Ora sto cercando di applicare la stessa logica/procedura per gestire, attraverso dei potenziomentri, dei faders all'interno del mio software luci, e questo non mi funziona; ora esistono giĂ  degli sketch che fanno questo in maniera eccellete, ma facendo il "merge" di questi sketch con il mio, non funzionano bene.

Per cui avevo pensato di gestire questi fader digitali facendo mandare un messaggio osc dal potenziometro hardware. Ovviamente non ci sono ancora riuscito.

Se qualcuno potesse darmi qualche dritta vi sarei molto grato.
di seguito trovate lo sketch ed anche un commento sull'errore nella procedura della lettura analogRead.

/**************************************************************************************************************
   Includes
 *************************************************************************************************************/
int Pin_A7  = 54;
int Pin_A8  = 55;
int Pin_A9  = 56;
int Pin_A10 = 57;
int Pin_A11 = 58;
int Pin_A12 = 59;
int Pin_A13 = 60;
int Pin_A14 = 61;
int Pin_A15 = 62;

#include <OSCBoards.h>
//#include "Arduino.h"
#include <OSCBundle.h>
#include <OSCData.h>
#include <OSCMatch.h>
#include <OSCMessage.h>
#include <OSCTiming.h>
#ifdef BOARD_HAS_USB_SERIAL
#include <SLIPEncodedUSBSerial.h>
SLIPEncodedUSBSerial SLIPSerial(thisBoardsSerialUSB);
#else
#include <SLIPEncodedSerial.h>
SLIPEncodedSerial SLIPSerial(Serial);
#endif
#include <string.h>


/**************************************************************************************************************
   Macro e Costanti
 *************************************************************************************************************/
#define PING_AFTER_IDLE_INTERVAL    2500
#define TIMEOUT_AFTER_IDLE_INTERVAL 5000

const String HANDSHAKE_QUERY = "ETCOSC?";
const String HANDSHAKE_REPLY = "OK";

/**************************************************************************************************************
   Variabili Globali
 **************************************************************************************************************/
bool connectedToEos = false;
unsigned long lastMessageRxTime = 0;
bool timeoutPingSent = false;



/**************************************************************************************************************
   Setup Pin digitali Arduino creiamo array secondo l'ordine in cui li vogliamo, non confondere il numero del
   "pin" con il numero totale dei pin da definire
 *************************************************************************************************************/

int faderpins[7] = {
  A0, A1, A2, A3, A4, A5, A6,
};

int buttonPins[21] =
{
  2,      // SUB 751
  3,      // SUB 752
  4,      // SUB 753
  5,      // SUB 754
  6,      // SUB 755
  7,      // SUB 756
  8,      // SUB 757
  9, 22,  // Q22/1 - Q22/2
  10, 21, // Q22/9 - Q22/10
  11, 20, // Q22/4 - Q22/13
  12, 19, // Q22/1 - Q22/18
  13, 18, // 3
  14, 17, // 4
  15, 16, // 5


};

/**************************************************************************************************************
   Stato Pin (la quantitĂ  deve corrispondere al numero dei pin)
   inizializza tutti gli stati dei pulsanti come up con un array(si poteva scrivere anche true al posto di 1)
 *************************************************************************************************************/

bool faderState[7] =
{
  0, 0, 0, 0, 0, 0, 0,
};

bool buttonState[21] =
{
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  1,
};


/**************************************************************************************************************
   Scriviamo i messaggi OSC che vogliamo mandare alla pressione del pulsante, stesso ordine in cui abbiamo
   elencato i pin.
 *************************************************************************************************************/

const String faderMove[7] = {
  "eos/fader/1/1",
  "eos/fader/1/2",
  "eos/fader/1/3",
  "eos/fader/1/3",
  "eos/fader/1/4",
  "eos/fader/1/5",
  "eos/fader/1/6",
};



const String buttonDowns[21] =
{
  /*SUB 751*/"eos/sub/751/full",
  /*SUB 752*/"eos/sub/752/full",
  /*SUB 753*/"eos/sub/753/full",
  /*SUB 754*/"eos/sub/754/full",
  /*SUB 755*/"eos/sub/755/full",
  /*SUB 756*/"eos/sub/756/full",
  /*SUB 757*/"eos/sub/757/full",


  /*Q22/1 */"/eos/cue/22/1/fire",
  /*Q22/2 */"/eos/cue/22/2/fire",
  /*Q22/9 */"/eos/cue/22/9/fire",
  /*Q22/10*/"/eos/cue/22/10/fire",
  /*Q22/4 */"/eos/cue/22/4/fire",
  /*Q22/13*/"/eos/cue/22/13/fire",
  /*Q22/11*/"/eos/cue/22/11/fire",
  /*Q22/18*/"/eos/cue/22/18/fire",


  /*N*/"/eos/cue/50/9/fire",

  /*J*/"eos/sub/755/full",
  /*Q*/"eos/sub/756/full",
  /*K*/"eos/sub/757/full",

  /*s1*/"eos/macro/9101/fire", //macro in background con snapshot

  /*s2*/"eos/macro/9102/fire",


};

/**************************************************************************************************************
   Scriviamo i messaggi OSC che/se vogliamo mandare al rilascio dei pulsanti, nello stesso ordine dei pin
   per l'OUt dei submaster in time zero, impostare lo sneak a zero in setup.
 *************************************************************************************************************/

const String buttonUps[21]
{
  /*SUB 751*/"eos/sub/751/out",
  /*SUB 752*/"eos/sub/752/out",
  /*SUB 753*/"eos/sub/753/out",
  /*SUB 754*/"eos/sub/754/out",
  /*SUB 755*/"eos/sub/755/out",
  /*SUB 756*/"eos/sub/756/out",
  /*SUB 757*/"eos/sub/757/out",


  /*Q22/1 */"/eos/cue/22/0/fire",
  /*Q22/2 */"/eos/cue/22/0/fire",
  /*Q22/9 */"/eos/cue/22/0/fire",
  /*Q22/10*/"/eos/cue/22/0/fire",
  /*Q22/4 */"/eos/cue/22/0/fire",
  /*Q22/13*/"/eos/cue/22/0/fire",
  /*Q22/11*/"/eos/cue/22/0/fire",
  /*Q22/18*/"/eos/cue/22/0/fire",
  /*M*/"eos/cue/50/0/fire",
  /*N*/"eos/cue/50/0/fire",

  /*J*/"eos/sub/755/out",
  /*Q*/"eos/sub/756/out",
  /*K*/"eos/sub/757/out",

  /*s1*/"",



};

/**************************************************************************************************************
  Funzione di Handshake per fader e bottoni
**************************************************************************************************************/

void parseOSCMessage(String& msg) {
  // controlla se questa è la stringa di handshake
  if (msg.indexOf(HANDSHAKE_QUERY) != -1) {
    // String di handshake trovata!
    connectedToEos = true;
    //   initEOS();
  }
  SLIPSerial.beginPacket();
  SLIPSerial.write((const uint8_t*)HANDSHAKE_REPLY.c_str(), (size_t)HANDSHAKE_REPLY.length());
  SLIPSerial.endPacket();

}
/*******************************************************************************
   Qui ci prepariamo a comunicare OSC con Eos configurando SLIPSerial. Una volta
    abbiamo finito con setup() passiamo il controllo a loop() e non chiamiamo mai
    setup() di nuovo.
    Parametri: nessuno
    Valore di ritorno: void
 ******************************************************************************/
void setup()
{

  pinMode(Pin_A7,  OUTPUT);
  pinMode(Pin_A8,  OUTPUT);
  pinMode(Pin_A9,  OUTPUT);
  pinMode(Pin_A10, OUTPUT);
  pinMode(Pin_A11, OUTPUT);
  pinMode(Pin_A12, OUTPUT);
  pinMode(Pin_A13, OUTPUT);
  pinMode(Pin_A14, OUTPUT);
  pinMode(Pin_A15, OUTPUT);

  SLIPSerial.begin(115200);
  // This is a hack around an Arduino bug. It was taken from the OSC library
  // examples
#ifdef BOARD_HAS_USB_SERIAL
  while (!SerialUSB);
#else
  while (!Serial);
#endif

  /*questo è necessario per ricollegare un dispositivo perché richiede un po' di tempo
    per l'apertura della porta seriale, ma nel frattempo il messaggio di handshake era
    inviato da Eos*/
  SLIPSerial.beginPacket();
  SLIPSerial.write((const uint8_t*)HANDSHAKE_REPLY.c_str(), (size_t)HANDSHAKE_REPLY.length());
  SLIPSerial.endPacket();

  // Inizializzazione di tutti i pulsanti input PULLUP mode
  for (int i = 0; i < 21; i++)  pinMode(buttonPins[i], INPUT_PULLUP);
  //while (NoHandshake) HandShake();
  //initEOS();

}

/*******************************************************************************
   Main loop: manage OSC I/O. Send a ping command to Eos every second.
   Parameters: none
   Return Value: void
 ******************************************************************************/
void loop()
{
  for (int i = 0; i < 21; i++)
  {
    if (digitalRead(buttonPins[i]) != buttonState[i])
    {
      //Se cambia lo stato del pulsante invia messaggio della pressione bottone verso il basso
      if (buttonState[i]) sendOSCString(buttonDowns[i]);
      else sendOSCString(buttonUps[i]);
      buttonState[i] = !buttonState[i];//capovolge lo stato della variabile
      //buttonTimers[i] = millis(); millis/debouncing disattivato , messo condensatore  100nf
    }
    //qui mi da errore!!!
    if (analogRead(faderPins[i]) != faderState[i])
    {
      if (faderState[i]) sendOSCString (faderMove[i]);
    }

  }
  static String curMsg;
  static unsigned long lastTimeSent;
  static int32_t pingNum;
  unsigned long curTime;
  int size;
 
  // Check to see if any OSC commands have come from Eos that we need to respond to.
  size = SLIPSerial.available();
  if (size > 0)
  {
    // Fill the msg with all of the available bytes
    while (size--) curMsg += (char)(SLIPSerial.read());
  }
  if (SLIPSerial.endofPacket())
  {
    parseOSCMessage(curMsg);
    lastMessageRxTime = millis();//
    timeoutPingSent = false;//
    curMsg = String();
  }
  if (lastMessageRxTime > 0) {
    unsigned long diff = millis() - lastMessageRxTime;
  }
   



  // Send a ping every second.
  curTime = millis();
  if (curTime - lastTimeSent > 1000)
  {
    OSCMessage ping("/eos/ping");
    ping.add(pingNum++);
    SLIPSerial.beginPacket();
    ping.send(SLIPSerial);
    SLIPSerial.endPacket();
    lastTimeSent = curTime;
  }
}
void sendOSCString(String buttonMessage)
{
  OSCMessage buttonMsg(buttonMessage.c_str());//Cambia la stringa in un messaggio OSC
  SLIPSerial.beginPacket(); // Processo per iniziare un messaggio OSc
  buttonMsg.send(SLIPSerial); // invia il nostro messaggio OSC
  SLIPSerial.endPacket(); // invia il nostro messaggio OSC
  
} 
/*
void sendOSCString(String faderMessage)
{
  OSCMessage faderMsg(faderMessage.c_str());//Cambia la stringa in un messaggio OSC
  SLIPSerial.beginPacket(); // Processo per iniziare un messaggio OSc
  faderMsg.send(SLIPSerial); // invia il nostro messaggio OSC
  SLIPSerial.endPacket(); // invia il nostro messaggio OSC
}
*/

if (analogRead(faderPins[i] != faderState[i])

Qui è solo un problema di parentesi. Controlla bene dove le apri e dove le chiudi.

Si scusami, corretto ma segna errore lo stesso.. temo sia abbastanza rognosa la cosa da risolvere...
errore:

C:\Users\MLJ\Desktop\DROPBOX\Dropbox\Arduino\MLJ_POWER_BUTTONS_5.0.1\MLJ_POWER_BUTTONS_CON_FADER_5.1\MLJ_POWER_BUTTONS_CON_FADER_5.1.ino: In function 'void loop()':
MLJ_POWER_BUTTONS_CON_FADER_5.1:261:20: error: 'faderPins' was not declared in this scope
     if (analogRead(faderPins[i]) != faderState[i])
                    ^~~~~~~~~
C:\Users\MLJ\Desktop\DROPBOX\Dropbox\Arduino\MLJ_POWER_BUTTONS_5.0.1\MLJ_POWER_BUTTONS_CON_FADER_5.1\MLJ_POWER_BUTTONS_CON_FADER_5.1.ino:261:20: note: suggested alternative: 'faderpins'
     if (analogRead(faderPins[i]) != faderState[i])
                    ^~~~~~~~~
                    faderpins
exit status 1
'faderPins' was not declared in this scope

... ma per favore ... guarda come nel codice hai dichiarato la variabile (faderpins) e guarda come la usi (faderPins) ... :roll_eyes:

Il 'C' è sensibilie alle maiuscole e minuscole !!!

Guglielmo

Felicissimo di essere così somaro/distratto, appena torno davanti al pc modifico e verifico; grazie!!

Buongiorno,
ho corretto l'errore ed ora lo sketch funziona dal punto di vista del compilatore, ma questo ovviamente non significa che faccia quello che mi aspetto, infatti non lo fa..( intevo questo prevalentemente quando ipotizzavo la non facile soluzione).

Sone 3-4 mesi che "spatacco" con arduino quindi, naturalmente, non ho ben chiara la struttura del ragionamento da fare, mi sono basato su quello dei pulsanti che funziona ,ma forse manca qualcosa, provo ad illustrare la cosa in relazione al codice:

int faderPins[7] = {
  A0, A1, A2, A3, A4, A5, A6,
};

Qui ho creato un Array con tutti i pin analogici che mi servono, devo gestire 7 potenziomentri da 10k, ( a cui ho cellagto un condensatore ceramico per il rumore analogico cd.103)

bool faderState[7] =
{
  0, 0, 0, 0, 0, 0, 0,
};


Qui ho deciso lo stato dei potenziometri con una variabile booleana, impostado il tutto a 0;

const String faderMove[7] = {
  "eos/fader/1/1",
  "eos/fader/1/2",
  "eos/fader/1/3",
  "eos/fader/1/3",
  "eos/fader/1/4",
  "eos/fader/1/5",
  "eos/fader/1/6",
};

Qui ho detto, in relazione all'ordine dei pin, quale messaggio OSC voglio mandare quando muovo il potenziomentro.

Nel SETUP, non devo iniziare nulla credo, in quanto i pin analogici non vanno inizializzati giusto?

Nel LOOP ho preso spunto da quanto fatto per i pulsanti ( che funzionano alla grande) ed ho cercato di seguire il ragionamento:
x i Pulsanti:

for (int i = 0; i < 21; i++)
  {
    if (digitalRead(buttonPins[i]) != buttonState[i])
    {
      //Se cambia lo stato del pulsante invia messaggio della pressione bottone verso il basso
      if (buttonState[i]) sendOSCString(buttonDowns[i]);
      else sendOSCString(buttonUps[i]);
      buttonState[i] = !buttonState[i];//capovolge lo stato della variabile
      //buttonTimers[i] = millis(); millis/debouncing disattivato , messo condensatore  100nf
    }

questo invece l'ho fatto per i fader(potenziometri):

for (int i = 0; i < 7; i++) {
      if (analogRead(faderPins[i]) != faderState[i])
        if (faderState[i]) sendOSCString (faderMove[i]);
    }

Qui penso (????) di aver detto ad arduino di controllare in continuazione lo stato degli ingressi analogici e se rileva un valore diverso dallo variabile dell'array dello stato, deve mandare la stringa OSC che gli ho scritto nell'array delle costanti.. non sono naturalemte sicuro che sia tutto giusto...ma lo sketch non da errori di sintassi..
L'errore però si verifica quando suppongo che devo generare una funzione relegata ai fader similare a quella dei bottoni, ovvero;
funzione per i bottoni:

void sendOSCString(String buttonMessage)
{
  OSCMessage buttonMsg(buttonMessage.c_str());//Cambia la stringa in un messaggio OSC
  SLIPSerial.beginPacket(); // Processo per iniziare un messaggio OSc
  buttonMsg.send(SLIPSerial); // invia il nostro messaggio OSC
  SLIPSerial.endPacket(); // invia il nostro messaggio OSC

}

e questo come detto funziona alla grande...
Ho quidi tentato di fare una funzione uguale ma modificando le variabili in relazione alle variabili dei fader:

  void sendOSCString(String faderMessage)
  {
  OSCMessage faderMsg(faderMessage.c_str());//Cambia la stringa in un messaggio OSC
  SLIPSerial.beginPacket(); // Processo per iniziare un messaggio OSc
  faderMsg.send(SLIPSerial); // invia il nostro messaggio OSC
  SLIPSerial.endPacket(); // invia il nostro messaggio OSC
  }
 

e quindi viene fuori l' errore seguente. Ho tentato di provare a clonare questa funzionesuppongo che non ce ne sia una che invia i messaggio relativo ai fader.. (è sbagliato il ragionamento?) Senza questa funzione non ci sono errori di compilazione ma i potenziometri sono morti.. Se ovviamente attivo questa funzione si verifica il seguente errore:

C:\Users\MLJ\Desktop\DROPBOX\Dropbox\Arduino\MLJ_POWER_BUTTONS_5.0.1\MLJ_POWER_BUTTONS_CON_FADER_5.1\MLJ_POWER_BUTTONS_CON_FADER_5.1.ino: In function 'void sendOSCString(String)':
MLJ_POWER_BUTTONS_CON_FADER_5.1:314:8: error: redefinition of 'void sendOSCString(String)'
   void sendOSCString(String faderMessage)
        ^~~~~~~~~~~~~
C:\Users\MLJ\Desktop\DROPBOX\Dropbox\Arduino\MLJ_POWER_BUTTONS_5.0.1\MLJ_POWER_BUTTONS_CON_FADER_5.1\MLJ_POWER_BUTTONS_CON_FADER_5.1.ino:305:6: note: 'void sendOSCString(String)' previously defined here
 void sendOSCString(String buttonMessage)
      ^~~~~~~~~~~~~
exit status 1
redefinition of 'void sendOSCString(String)'

Se invece di 0 metto il valore di 1( nelle variabili booleane dello stato), Arduino inizia immediatamente a mandarmi valanghe di messaggio (con errore) al sistema, che quest' ultimo mi risponde in questo modo ( naturalemnte per poter fare questo ho disattivato la funzione che mi da errore).

Probabilmente avrò fatto più di un errore di ragionamento, essendo alle prime armi.. come sempre se avete consigli e "cazziatoni" sono sempre ben accetti.
Grazie a tutti e buona domenica.

L'errore dice che hai definito 2 volte la stessa funzione. Non puoi dare lo stesso nome a 2 funzioni diverse.
Quindi se vuoi percorrere la strada delle 2 funzioni devi usare 2 nomi diversi.
Però, se queste 2 funzioni fanno la stessa cosa non ha senso usarne 2. Usa sempre la stessa e cambi solo il parametro passato.

Funzione:

void sendOSCString(String message)
{
  OSCMessage Msg(message.c_str());//Cambia la stringa in un messaggio OSC
  SLIPSerial.beginPacket(); // Processo per iniziare un messaggio OSc
  Msg.send(SLIPSerial); // invia il nostro messaggio OSC
  SLIPSerial.endPacket(); // invia il nostro messaggio OSC
}

Chiamata bottoni:

sendOSCString(buttonDowns[i])

Chiamata fader:

sendOSCString(faderMove[i])

Però sei sicuro che i potenziometri vadano gestiti come i pulsanti?
La analogRead non restituisce HIGH o LOW ma un valore tra 0 e 1023. Quindi credo che l'array di stato debba essere int invece di boolean e credo che anche i messaggi da inviare vadano prametrizzati in base al valore del potenziometro.
Tutto col condizionale perché di OSC non so nulla.

Ciao,
Ovviamente hai detto delle cose giustissime!
Non devo gestire i potenziometri come pulsanti, e probabilmente ci vorrebbe anche un “map” per convertire i valori da 0-1024 a 0-255, perché è così che il mio sistema li legge;

Rifletterò su quanto mi hai detto in merito alla funzione (ho capito ma non ho ancora afferrato).

L’OSC è in realtà molto semplice, se conosci i comandi che L altro software riceve, basta separarli da uno “\”.

Quando parli di parametrizzazione intendi dovrei dirgli che ad ogni step di 1 da 0 a 255 gli devo ripetere di mandare quello specifico messaggio?(ciclo for):thinking::thinking:??

Mi mancano dei pezzi in questo “puzzle” perché teoricamente ho già quello che mi serve ma se faccio un merge dei due sketch i potenziometri non funzionano bene; la soluzione potrebbe esssere quella di utilizzare un ARDUINO nano con lo sketch dedicato ai potenziometri che da solo funzione benissimo.. con il disagio di connettere due ARDUINO al sistema( un nano ed un mega, funziona bene uguale) ed uscire con due cavi USB dallo stesso harware :smirk::smirk::smirk::smirk::thinking::thinking::thinking::thinking: che ne pensi?

Usare 2 arduino mi pare eccessivo.
In linea teorica, se ho capito tutto, dovresti:

  • leggere il potenzionetro
  • fare una map a 0-255
  • controllare il valore col precedente
  • se è diverso inviare il messaggio

Ma questo messaggio come deve essere fatto? Devi inviare il valore 0-255?

Dici che hai uno sketch funzionante per i potenziometri... prova a postarlo.

ciao ecco lo sketch funzionante per i faders;
per quanto riguarda i pulsanti relativi ai faders li ho "annullati" assegnandogli un pin comune a tutti e non collegando nulla al pin; cosi non sono andatao a modificare la libreria;

Mergiando questo sketch con il mio , i faders non funzioano bene , ovvero iniziano a muoversi quando con il potenziometro arrivo intorno al 70% e non è molto fluida come cosa. Se li utilizzo con il loro sketch vanno benissimo.
E' molto probabile che abbia commesso degli errori nel merge , oppure c'e' qualcosa di non compatibile...
Segue lo sketch funzioannte per i faders:

// libraries included

#include "Arduino.h"
#include <OSCMessage.h>
#include "eOS.h"

#ifdef BOARD_HAS_USB_SERIAL
  #include <SLIPEncodedUSBSerial.h>
  SLIPEncodedUSBSerial SLIPSerial(thisBoardsSerialUSB);
#else
  #include <SLIPEncodedSerial.h>
  SLIPEncodedSerial SLIPSerial(Serial);
#endif

// define hardware pins
#define FADER_1_LEVELER     A0
#define FADER_1_FIRE_BUTTON 2
#define FADER_1_STOP_BUTTON 3
#define FADER_2_LEVELER     A1
#define FADER_2_FIRE_BUTTON 4
#define FADER_2_STOP_BUTTON 5
#define FADER_3_LEVELER     A2
#define FADER_3_FIRE_BUTTON 6
#define FADER_3_STOP_BUTTON 7
#define FADER_4_LEVELER     A3
#define FADER_4_FIRE_BUTTON 8
#define FADER_4_STOP_BUTTON 9
#define FADER_5_LEVELER     A4
#define FADER_5_FIRE_BUTTON 10
#define FADER_5_STOP_BUTTON 11
#define FADER_6_LEVELER     A5
#define FADER_6_FIRE_BUTTON 12
#define FADER_6_STOP_BUTTON 13

// constants and macros
#define FADER_PAGE        1 // fader page on EOS / Nomad
#define NUMBER_OF_FADERS  10 // size of the faders per page on EOS / Nomad
#define FADER_BANK        1 // virtuell OSC bank

const String HANDSHAKE_QUERY = "ETCOSC?";
const String HANDSHAKE_REPLY = "OK";
const String PING_QUERY = "faderwingX_hello";

// Change these values to alter how long we wait before sending an OSC ping
// to see if Eos is still there, and then finally how long before we
// disconnect and show the splash screen
// Values are in milliseconds
#define PING_AFTER_IDLE_INTERVAL    2500
#define TIMEOUT_AFTER_IDLE_INTERVAL 5000

// Global variables
bool connectedToEos = false;
unsigned long lastMessageRxTime = 0;
bool timeoutPingSent = false;



// Hardware constructors
EOS eos;
Fader fader1(FADER_1_LEVELER, FADER_1_FIRE_BUTTON, FADER_1_STOP_BUTTON, 1, FADER_BANK);
Fader fader2(FADER_2_LEVELER, FADER_2_FIRE_BUTTON, FADER_2_STOP_BUTTON, 2, FADER_BANK);
Fader fader3(FADER_3_LEVELER, FADER_3_FIRE_BUTTON, FADER_3_STOP_BUTTON, 3, FADER_BANK);
Fader fader4(FADER_4_LEVELER, FADER_4_FIRE_BUTTON, FADER_4_STOP_BUTTON, 4, FADER_BANK);
Fader fader5(FADER_5_LEVELER, FADER_5_FIRE_BUTTON, FADER_5_STOP_BUTTON, 5, FADER_BANK);
Fader fader6(FADER_6_LEVELER, FADER_6_FIRE_BUTTON, FADER_6_STOP_BUTTON, 6, FADER_BANK);

// Local functions

/**
 * @brief Init the console, gives back a handshake reply
 * and send the filters and subscribtions.
 *
 */
void initEOS() {
  SLIPSerial.print(HANDSHAKE_REPLY);
  filter("/eos/out/ping");
  initFaders(FADER_PAGE, NUMBER_OF_FADERS, FADER_BANK);
  }

/**
 * @brief 
 * Given an unknown OSC message we check to see if it's a handshake message.
 * If it's a handshake we issue a subscribe.
 * 
 * @param msg - the OSC message of unknown importance
 *
 */
void parseOSCMessage(String& msg) {
  // check to see if this is the handshake string
  if (msg.indexOf(HANDSHAKE_QUERY) != -1) {
    // handshake string found!
    connectedToEos = true;
    initEOS();
    }

  if (msg.indexOf(PING_QUERY) != -1) {
    // handshake string found!
    connectedToEos = true;
    }
  }

/**
 * @brief 
 * Here we setup our encoder, lcd, and various input devices. We also prepare
 * to communicate OSC with Eos by setting up SLIPSerial. Once we are done with
 * setup() we pass control over to loop() and never call setup() again.
 *
 * NOTE: This function is the entry function. This is where control over the
 * Arduino is passed to us (the end user).
 * 
 */
void setup() {
  SLIPSerial.begin(115200);
  // This is a hack around an Arduino bug. It was taken from the OSC library
  //examples
  #ifdef BOARD_HAS_USB_SERIAL
    #ifndef TEENSYDUINO
      while (!SerialUSB);
    #endif
  #else
    while (!Serial);
  #endif

  initEOS(); // for hotplug with Arduinos without native USB like UNO
  }

/**
 * @brief 
 * Here we service, monitor, and otherwise control all our peripheral devices.
 * First, we retrieve the status of our encoders and buttons and update Eos.
 * Next, we check if there are any OSC messages for us.
 * Finally, we update our display (if an update is necessary)
 *
 * NOTE: This function is our main loop and thus this function will be called
 * repeatedly forever
 * 
 */
void loop() {
  static String curMsg;
  int size;

  // Check for hardware updates
  fader1.update();
  fader2.update();
  fader3.update();
  fader4.update();
  fader5.update();
  fader6.update();

  // Then we check to see if any OSC commands have come from Eos
  // and update the display accordingly.
  size = SLIPSerial.available();
  if (size > 0) {
    // Fill the msg with all of the available bytes
    while (size--) curMsg += (char)(SLIPSerial.read());
    }
  if (SLIPSerial.endofPacket()) {
    parseOSCMessage(curMsg);
    lastMessageRxTime = millis();
    // We only care about the ping if we haven't heard recently
    // Clear flag when we get any traffic
    timeoutPingSent = false;
    curMsg = String();
    }

  if (lastMessageRxTime > 0) {
    unsigned long diff = millis() - lastMessageRxTime;
    //We first check if it's been too long and we need to time out
    if (diff > TIMEOUT_AFTER_IDLE_INTERVAL) {
      connectedToEos = false;
      lastMessageRxTime = 0;
      timeoutPingSent = false;
      }
    //It could be the console is sitting idle. Send a ping once to
    // double check that it's still there, but only once after 2.5s have passed
    if (!timeoutPingSent && diff > PING_AFTER_IDLE_INTERVAL) {
      ping(PING_QUERY);
      timeoutPingSent = true;
      }
    }
  }

Grazie per i consigli!.

if (analogRead(faderPins[i]) != faderState[i])

faderState è booleana!

Intendi dire che deve essere booleana oppure che l'ho lasciata booleana e devo correggerla?

Se è booleana, non ci puoi mettere la lettura dell'analogRead!

Si ok! Deve essere un intero capito :+1:
,

Grazie

1 Like