Finecorsa e classi per due motori dc

Salve, non ho conoscenze di programmazione e chiedo il vostro aiuto. Il mio progetto prevede di far muovere due motori dc con arduino e una scheda drive L298N. Fino a qui tutto ok, ho qualche problema con i finecorsa, mi hanno consigliato di creare delle classi per i motori. Come si fa?

int TV = 13;         // segnale da uscita USB TV
int F1.1 = 12;       // finecorsa Motore1 posizione avanti 
int F1.2 = 11;       // finecorsa Motore1 posizione indietro
int F2.1 = 10;       // finecorsa Motore2 posizione avanti
int F2.2 = 9;        // finecorsa Motore2 posizione indietro
int M1on/off = 8;    // Motore1 acceso-spento
int M1o/a = 7;       // Motore1 senso orario-antiorario
int M2on/off = 6;     // Motore2 acceso-spento
int M2o/a = 5;       // Motore2 senso orario-antiorario

                    // I Motori 1 e 2 verranno pilotati da 
                    // integrato L298N 

                      
void setup() {
 pinMode(F1.1,INPUT)
 pinMode(F1.2,INPUT)
 pinMode(F2.1,INPUT) 
 pinMode(F2.2,INPUT)
 pinMode(TV,INPUT)
 pinMode(M1o/a,OUTPUT)
 pinMode(M2on/off,OUTPUT)
 pinMode(M1on/off,OUTPUT)
 pinMode(M2o/a,OUTPUT)
}

void loop() {
 if (TV == HIGH){
  digitalWrite(M1on/off,HIGH)  // Accendi Motore1
  digitalWrite(M1o/a,HIGH)     // Motore1 gira in senso orario
}

Praticamente segnale tv alto, arduino accende il motore1 in senso orario arriva al finecorsa “F1.1” e si arresta.
Attendi 1sec.(questo lo so fare :smiley: )
Accendi motore2 in senso orario arriva a finecorsa “F2.1” e stop.
Segnale tv basso, accendi motore2 arriva fino a finecorsa “F2.2” si arresta.
Attendi 1sec.
Accendi motore1 arriva fino a finecorsa “F1.2” e stop.
Grazie…

> Alexander044: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra). Grazie,

Guglielmo

ciao Alexander,

prima di tutto fai come “suggerito” da Guglielmo e modifica il tuo primo post mettendo il codice tra i tag code.
sicuramente devi cambiare modo di “chiamare” le tue variabili; le varibili non possono iniziare con un numero…esempio int 1var non si può; è da evitare l’uso di simboli che hanno significati specifici quali il “.” o “/” o “(” o “)” etc…ed è da evitare la nominazione di varibili con nome già presente nel namespace di Arduino tipo “blink” o “time” etc…te ne accorgi perchè assumono in automatico colore diverso dal nero.
poi…non è obbligatorio, ma se possibile il nome deve iniziare con una lettera minuscola…con lettera maiuscola, di solito, si nominano le classi.
due modi diffusi per chiamare una variabile sono: myFirstVar o my_first_var.

detto questo…per classe s’intende un tipo di dati astratti che hanno, se presenti, metodi ed attributi in comune; in Arduino ci sono già delle classi disponibili di “base” come la String e Serial etc.

quelle che si chiamano “librerie” di solito, ma non sempre, rendono disponibili delle classi; per inserirle nel tuo sketch devi scrivere, all’inizo, #include <UnaLibreria.h> …mettiamo che esista una libreria che si chiami Math; questa, molto probabilmente, ti mette a disposizione come metodo un Math.pow(a,n) che elevera il valore “a” alla “n” potenza; sempre questa classe ti avrà come attributo un Math.PI che ti ritornerà il valore di 3,14…

spero di aver un po’ chiarito e non confuso…

per quanto riguarda il tuo progetto non so se esistano librerie che mettono già a disposizione metodi per il controllo di motori, penso di si comunque, ma un errore che vedo nel tuo sketch sta nel loop()…tu fai un confronto:

 if (TV == HIGH)

ma dov’è che vai a leggere lo stato di TV?

 if (digitalRead(TV) == HIGH)

Come ti hanno suggerito dovresti dare nomi diversi alle variabili, se non solo per un fatto di leggibilità,
potresti usare la lettera maiuscola per separare una variabile, Esempio M1onOff.

Essendo la funzione loop() ripetuta continuamente è come se fosse lei stessa un ciclo infinito, e la maggior parte degli utenti evita di creare altri cicli ma cerca di utilizzare la funzione loop() per risolvere
ogni problema. A me viene più facile risolvere alcuni problemi creandomi altri cicli all'interno di altre funzioni, e per questo ti propongo una soluzione che ne fa uso.
Creare una classe per il compito che vuoi svolgere non mi sembra necessario :wink:

void loop() {
  if (digitalRead(TV )== HIGH){
    funzioneUno();

  }else {
    funzioneDue();
  }

}
/*
Praticamente segnale tv alto, arduino accende il motore1 in senso orario arriva al finecorsa "F1.1" e si arresta.
Attendi 1sec.(questo lo so fare :D )
Accendi motore2 in senso orario arriva a finecorsa "F2.1" e stop.*/

void funzioneUno(){// Esegue la prima serie di operazioni
   digitalWrite(M1on/off,HIGH)  // Accendi Motore1
   digitalWrite(M1o/a,HIGH)     // Motore1 gira in senso orario
   while(digitalRead(F1.1)!=HIGH); // Attende di arrivare al finecorsa
   digitalWrite(M1on/off,LOW); //Spegne il motore
   delay(1000);
   digitalWrite(M2on/off,HIGH)  // Accendi Motore1
   digitalWrite(M2o/a,HIGH)     // Motore1 gira in senso orario
   while(digitalRead(F2.1)!=HIGH); // Attende di arrivare al finecorsa
   digitalWrite(M2on/off,LOW); //Spegne il motore

}

/*

Segnale tv basso, accendi motore2 arriva fino a finecorsa "F2.2" si arresta.
Attendi 1sec.
Accendi motore1 arriva fino a finecorsa "F1.2" e stop. */

void funzioneDue(){// Esegue la seconda serie di operazioni
   digitalWrite(M2on/off,HIGH)  // Accendi Motore1
   digitalWrite(M2o/a,HIGH)     // Motore1 gira in senso orario O ANTIORARIO ?
   while(digitalRead(F2.2)!=HIGH); // Attende di arrivare al finecorsa
   digitalWrite(M2on/off,LOW); //Spegne il motore
   delay(1000);
   digitalWrite(M1on/off,HIGH)  // Accendi Motore1
   digitalWrite(M1o/a,HIGH)     // Motore1 gira in senso orario O ANTIORARIO ?
   while(digitalRead(F1.2)!=HIGH); // Attende di arrivare al fine 
   digitalWrite(M1on/off,LOW); //Spegne il motore

}

Il codice potrebbe presentare errori logici o di altro tipo, quindi potrebbe essere necessario correggerlo e modificarlo, ma il principio è quello :slight_smile:

Grazie a tutti per i chiarimenti! Oggi mi sono arrivati tutti i pezzi, presto vi aggiorno. Intanto vi chiedo.. Come si alimenta un arduino pro mini? Io lo vorrei alimentare direttamente dal drive L298N da GND+5 che eroga esattamente 5.34v e collegarli al VCC e GND del pro mini. A quali collegarli? quelli sul lato del RAW?
Per alimentare i finecorsa cosa devo prendere vcc o gnd? posso attingere a quelli opposti al raw?
Grazie...