[RISOLTO] Problema con ARDUINO MEGA e L298N

Ciao a tutti,

sto costruendo una macchina che, tramite 3 pompe peristaltiche, produce un bel negroni, aspirando i 3 ingredienti dalle rispettive bottiglie e versandole in un bicchiere.

Per far si che non sgoccioli quando ha terminato il drink, vorrei che i motori che regolano le pome vengano mandati al contrario dal modulo L298N, svuotando così il tubo di nuovo nella bottiglia.

Scrivo allora questo codice, che all’immissione della letter ‘p’ nel monitor seriale accende i tre motori (collegati a un solo L298N) nella direzione bottiglia>bicchiere, e funziona bene come immaginato.

#define enNeg 11
#define inNeg1 12
#define inNeg2 13

char ch;  //variabile che registra l'input del monitor seriale

void setup() {


  // pinMode setup per i motori
  pinMode(enNeg, OUTPUT);
  pinMode(inNeg1, OUTPUT);
  pinMode(inNeg2, OUTPUT);
  // avvio del monitor seriale
  Serial.begin(9600);
}

void loop() {

   if (Serial.available())
  { char ch = Serial.read();
  
  // se il monitor riceve l'input 'p', i motori si accendono tutti, nella direzione di versamento
  
  if (ch == 'p') { 
     digitalWrite(inNeg1, LOW);
     digitalWrite(inNeg2, HIGH);
     analogWrite(enNeg, 250);

  // dura 10 secondi e poi si spegne
  
     delay(10000);
     analogWrite(enNeg, 0);
  }

}

delay(1000);


}

Fino a qui tutto bene, decido quindi di provare la funzione di svuotamento del tubo, scrivendo quindi che all’immissione della lettera ‘r’ nel seriale i motori si accendano al contrario, invertendo HIGH e LOW

#define enNeg 11
#define inNeg1 12
#define inNeg2 13

char ch;  //variabile che registra l'input del monitor seriale

void setup() {


  // pinMode setup per i motori
  pinMode(enNeg, OUTPUT);
  pinMode(inNeg1, OUTPUT);
  pinMode(inNeg2, OUTPUT);
  // avvio del monitor seriale
  Serial.begin(9600);
}

void loop() {

   if (Serial.available())
  { char ch = Serial.read();
  
  // se il monitor riceve l'input 'p', i motori si accendono tutti, nella direzione di versamento
  
  if (ch == 'p') { 
     digitalWrite(inNeg1, LOW);
     digitalWrite(inNeg2, HIGH);
     analogWrite(enNeg, 250);

  // dura 10 secondi e poi si spegne
  
     delay(10000);
     analogWrite(enNeg, 0);
  }

}

delay(1000);


}

E anche questo funziona perfettamente, esattamente come mi aspettavo.
Decido quindi per terminare il tutto integrando le due funzioni in questo modo:

#define enNeg 11
#define inNeg1 12
#define inNeg2 13

char ch;   //variabile che registra l'input del monitor seriale

void setup() {


  // pinMode setup per i motori
  pinMode(enNeg, OUTPUT);
  pinMode(inNeg1, OUTPUT);
  pinMode(inNeg2, OUTPUT);
  // avvio del monitor seriale
  Serial.begin(9600);
}

void loop() {

   if (Serial.available())
  { char ch = Serial.read();


  // se il monitor riceve l'input 'p', i motori si dovrebbero accendere tutti, nella direzione di versamento

  if (ch == 'p') { 
     digitalWrite(inNeg1, LOW);
     digitalWrite(inNeg2, HIGH);
     analogWrite(enNeg, 250);

  // dura 10 secondi e poi si spegne
     
     delay(10000);
     analogWrite(enNeg, 0);
  }

 // se il monitor riceve l'input 'r', i motori si dovrebbero accendere tutti, nella direzione opposta al versamento
  
  if (ch == 'r') { 
     digitalWrite(inNeg1, HIGH);
     digitalWrite(inNeg2, LOW);
     analogWrite(enNeg, 250);

  // dura 10 secondi e poi si spegne
     
     delay(10000);
     analogWrite(enNeg, 0);
    }
  }
delay(1000);
}

Ma questa volta non va, non reagisce a nessun input e non sembra voler fare nulla.
Provo a mettere tutti e due i comandi i sequenza, separati da un delay, e continua a non fare nulla, ma i programmi singoli vanno ancora bene, come se non andasse bene la lunghezza del codice e il fatto che le opzioni siano due e non una, non capisco quale possa essere il problema.

Qualcuno saprebbe darmi una mano? Grazie!

Strano,

Visto qui dal furbofono il programma sembra ben impostato, a parte qualche indecisione nella formattazione, e una variabile globale inutilizzata

Non lo hai formattato in automatico, vero?

Quindi bravo, significa che scrivi i programma formattato bene già a mano

Però dobbiamo trovare il problema....

Raccontaci qualcosa in più chessò cablaggi, esito della compilazione, alimentazioni...

Dunque, non mi da errori nella compilazione, sembrerebbe tutto corretto.
L’alimentazione è a 12V con un trasformatore collegato alla presa di casa e inserito, come si vede nella immagine allegata, in una breadboard che alimenta tutto (nell’immagine allegata il disegno è di una batteria, ma è il trasformatore).
Il circuito è anche quello nell’allegato, fa un po’ schifo ma non sapevo come altro disegnarlo.

(edit: nell’immagine l’arduino non è un mega, ma non penso cambi molto)

Alla fine hai messo un delay(1000): in stato di inattività, ogni secondo viene controllato se arriva qualcosa dalla seriale e poi resta tutto fermo per un secondo!

Sarebbe un problema se non fosse che il seriale salva gli input nel buffer e quindi a prescindere da quando l'ho inserito dovrebbe andare in ordine coi comandi ricevuti, difatti nel programma con il versamento in una sola direzione in delay c'è, e se inserisco due volte 'p', il secondo p resta nel buffer e parte subito dopo il delay di un secondo

Avevo il dubbio... :slight_smile:

Ho riscritto il programma in modo identico, cambiando solo il char ch; iniziale e ora funziona.
Non so bene cosa sia cambiato ma non mi lamento del risultato, grazie a tutti

:slight_smile:

La famosa variabile globale inutilizzata

Te lo avevo detto...

Non dovrebbe interferire con l'omonima locale... O no?

Piccole zone d'ombra

Ombrelloni.