Problema con scheda L298N usata per il controllo del voltaggio in uscita

Salve, sono nuovo e sto cercando di approcciarmi ad arduino.
Sto utilizzando la board Arduino UNO e sto seguendo uno schema trovato online per variare la tensione in uscita dalla board L298N con un potenziometro, il mio intento è ottenere 0-12V.

Il mio problema è che se imposto il valore dell'uscita PWM a cui ho collegarto l'ENA (nello script si tratta della variabile "potenza") ad 1 la tensione schizza a circa 6V dopo di che inizia ad essere progressivo.

Ho usato uno schema trovato online (ma lo stesso problema lo da anche con altri schemi e codici) e per testare il tutto ho lasciato tutto invariato rispetto allo schema che allego.

Il codice che sto usando è sempre preso dallo stesso schema ed è il seguente :

/*
 * L298N pilotare un motore DC con Arduino
 * Programmino per imparare il funzionamento del Modulo L298N e del suo utilizzo con Arduino
 *
 * Autore  : Andrea Lombardo
 * Web     : http://www.lombardoandrea.com
 * Post    : http://bit.ly/L298N-ARDUINO-MOTOREDC
 * Git     : https://github.com/AndreaLombardo/Arduino-L298N-Motore-DC
 */ 

//definizione dei pin
static int pinAcceleratore = A0; //pin analogico deputato a leggere i valori del potenziometro
static int mA = 12; //pin digitale per determinare gli stati logici da inviare al modulo
static int mB = 13; //pin digitale per determinare gli stati logici da inviare al modulo
static int pinPotenza = 11; //pin digitale tramite il quale inviare un segnale di tipo PWM tramite la funzione analgWrite()

/*
 * static int pinAcceleratore1 = A1
 * static int mC = 
 * static int mD =
 * static int pinPotenza1 =
 */

//variabili usate per gestire e mostrare i valori di operaizone
int accelerazione;  //valore letto dal pin A0
int potenza;  //valore in uscita dal pin 11

void setup() {
  //inizializzo la comunicazione seriale cosi da mostrare i valori nel Mointor Seriale
  Serial.begin(9600);

  //inizializzo variabili
  accelerazione = 0;
  potenza = 0;

  //definisco tipologia pin
  pinMode(pinAcceleratore, INPUT); //input in quanto legge il valore analogico del pin A0
  pinMode(mA, OUTPUT); //output perche' definisce lo stato logico del pin IN1 del modulo L298N
  pinMode(mB, OUTPUT); //output perche' definisce lo stato logico del pin IN2 del modulo L298N
  pinMode(pinPotenza, OUTPUT);  //output perche' definisce il valore PWM del pin EN1 del modulo L298N

  //pullDown sensore pinAcceleratore
  digitalWrite(pinAcceleratore, LOW);

  //Definisco il senso di marcia del motore
  /*
    mA |   mB  | Evento
  -----|-------|----------------------
  LOW  | LOW   | fermo
  LOW  | HIGH  | Movimento in un senso
  HIGH | LOW   | Movimento senso opposto
  HIGH | HIGH  | Fermo
  */
  
  digitalWrite(mA, LOW);
  digitalWrite(mB, HIGH);

}


void loop() {
  
  //leggo il valore analogico del potenziometro sul pin A0.
  accelerazione = analogRead(pinAcceleratore);
  
  /*
  Il range dei valori analogici e' da 0 a 1024 mentre il range dei valori PWM  e' da 0 a 255
  per mantenere questa proporzionalita' eseguo la mappatura dei valori
  */
  potenza = map(accelerazione, 0, 1024, 0, 255);

  //Invio i dati letti al Monitro seriale, cosi da poterli vedere a video
  Serial.print("Accelerazione = ");
  Serial.print(accelerazione);
  Serial.print(" - potenza = ");
  Serial.println(potenza);
  
  //invio costantemente il valore PWM della potenza in modo da far variare la velocita' del motore in base alla posizione del potenziometro
  analogWrite(pinPotenza, potenza);
}

Giusto per dare tutte le informazioni la board L298N è di Kkmoon

Spero possiate essermi d'aiuto.
Grazie

Buongiorno e benvenuto, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… 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 ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:
P.P.S.: e, cortesemente, dai una letta anche QUI ... per un noto problemino del forum. Questa volta ho sistemato io l'immagine :wink: :smiley:

Non riesco a trovare il link alla scheda che indichi ... "board L298N è di Kkmoon" ... puoi cortesemente darcelo così possiamo leggere le specifiche? Grazie.

Guglielmo

Purtroppo sul sito kkmoon.com non danno alcuna specifica, in realtà la board non risulta proprio, le uniche informazioni che ho vengono da amazon :

L298N

Vincenzo

Dalla foto NON si legge ... indica il nome dei 6 pin a cui ti colleghi, partendo da sinistra (ENABLE A) e finendo a destra (ENABLE B) ... perché, secondo me, tu stai cercando di usare l'ENABLE come regolatore e questo NON si deve fare ... ::slight_smile:

Purtroppo, il 90% dei tutorial su internet sono un "emerita monnezza" e, quando si parla del L298N, questa percentuale sale oltre 95% :confused:

Guglielmo

Attualmente sono collegato in questo modo :

ENA -> 11
IN1 -> 12
IN2 -> 13

Vincenzo

Se fai un po' di ricerche qui sul forum, trovi una marea di dicussioni su come correttamente controllare il L298N ...
... riporto le parole di Astrobeed (uno degli utenti più preparati che ha avuto questo forum, che oggi, purtroppo, NON partecipa più):

astrobeed:
ENA e ENB sono gli enable del ponte, non ingressi per il controllo della velocità, IN 1-4 sono gli ingressi per decidere la direzione di marcia e/o regolare la velocità.

Tutti i ponti della serie L29x vanno usati in modo LAP per il controllo della velocità tramite PWM, ovvero si applica il segnale a IN1 e IN2 per un motore e a IN3 e IN4 per l'altro motore, il PWM su i due ingessi deve essere di tipo complementare e si ottiene usando una porta NOT su un segnale PWM di Arduino, su IN1, o 3, entri diretto su IN2, o 4, entri tramite la porta NOT.

In Alternativa puoi collegare due PWM a IN1 e IN3 e metti IN2 e IN4 fissi a 0 o 1 a seconda del verso di rotazione che desideri, metodo poco efficiente ma semplice da mettere in pratica.

Guglielmo

Grazie, stasera torno a casa e cerco di studiare e capire come risolvere ... ad ora è ovvio che veniva usato proprio ENA per variare la tensione quindi ricomincio da capo :slight_smile:

Se ho capito bene come procedere dovrei fare una cosa del genere

int nob = A1;
int IN1 = 10;
int IN2 = 11;
int ENA = 12;

void setup() {
  pinMode(nob, INPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(ENA, OUTPUT);
  Serial.begin(9600);
  digitalWrite(ENA, HIGH);
  //pot = analogRead(nob);
}

void loop() {
  int vel = 120;
  Serial.print(pot);
  Serial.print(" - ");
  Serial.println(vel);
  analogWrite(IN1, vel);
}

Facendo così la tensione in uscita è lineare rispetto al valore "vel" che gli imposto.

Io però vorrei variare la tensione in uscita con un potenziometro, come si evince dal codice, ma o sono troppo stanco e mi sfugge qualcosa o proprio non ho capito perché ottengo tensione in uscita soltanto se commento pot = analogRead(nob); anche se i valori del potenziometro vengono letti correttamente dal monitor seriale.

Vincenzo

La variabile pot non è dichiarata!
Poi non è usata... Comunque, pot va da 0 a 1023, mentre analogWrite accetta da 0 a 255.

Ok, dichiarata la variabile pot

int nob = A1;
int IN1 = 10;
int IN2 = 11;
int ENA = 12;
int pot = 0;

void setup() {
  pinMode(nob, INPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(ENA, OUTPUT);
  Serial.begin(9600);
  digitalWrite(nob, LOW);
  digitalWrite(ENA, HIGH);
  //pot = analogRead(nob);
}

void loop() {
  //pot = analogRead(nob);
  int vel = 120;
  Serial.print(pot);
  Serial.print(" - ");
  Serial.println(vel);
  analogWrite(IN1, vel);
}

Sto procedendo per passi essendo alle prime armi e quindi sto soltanto leggendo il valore di pot e visualizzandolo nel monitor seriale ma il problema rimane, se elimino il commento ad analogRead(pot) smetto di avere output anche se analogWrite prende il suo valore dalla variabile vel.
Dal codice si vede anche che ho provato ad abilitare analogRead sia nel setup che nel loop con risultati identici : non ho alcun voltaggio in output nel momento in cui è abilitata.

Poi userò map per portare i valori di pot nel range 0-255 ma per ora sto cercando di capire dove sia che si blocca il tutto.

Poi userò map

No, basta dividere per 4! :slight_smile:

digitalWrite(nob, LOW);
Questo non ha senso.

Così funziona?

byte NOB = A1;
byte OUT1 = 10;
byte OUT2 = 11;
byte ENA = 12;
int pot = 0;

void setup() {
  pinMode(OUT1, OUTPUT);
  pinMode(OUT2, OUTPUT);
  pinMode(ENA, OUTPUT);
  Serial.begin(9600);
  digitalWrite(ENA, HIGH);
}

void loop() {
  pot = analogRead(NOB);
  byte vel = pot/4;
  analogWrite(OUT1, vel);
  Serial.print(pot);
  Serial.print(" - ");
  Serial.println(vel);
  }

Più correttamente:

#define  NOB A1
#define OUT1 10
#define OUT2 11
#define  ENA 12
int pot = 0;

Si, così funziona ma così leggo soltanto il potenziometro e riporto i valori nel corretto range di funzionamento.

In sostanza se leggo il potenziometro non ho problemi neanche con il mio script, idem se vario il valore di vel e quindi vario soltanto la tensione, il problema sorge quando metto insieme le due cose.

Anche in questo script se aggiungo un analogWrite(OUT1, vel) non ho alcuna tensione in output.

#define  NOB A1
#define OUT1 10
#define OUT2 11
#define  ENA 12
int pot = 0;

void setup() {
  pinMode(OUT1, OUTPUT);
  pinMode(OUT2, OUTPUT);
  pinMode(ENA, OUTPUT);
  Serial.begin(9600);
  digitalWrite(ENA, HIGH);
}

void loop() {
  pot = analogRead(NOB);
  byte vel = pot / 4;
  analogWrite(OUT1, vel);
  Serial.print(pot);
  Serial.print(" - ");
  Serial.println(vel);
  analogWrite(OUT1, vel);
}

annzo:
Anche in questo script se aggiungo un analogWrite(OUT1, vel) non ho alcuna tensione in output.

Non avevo notato che c'era già un analogWrite e comunque non funziona :frowning:

Proverò di nuovo a ricominciare da capo, è per me una cosa che non ha senso

Ma i pin in1 e in2 non dovrebbero essere comandati entrambi?

Altrimenti in2 cosa è lì a fare?

Si, ok d'accordo
Se si usa un solo senso...

Ma in questo caso non ho bisogno di un ponte H, mi basta un singolo mosfet

... leggi attentamente quanto da me quotato al post #6 ... certo che andrebbero usati, ma occorre una NOT, oppure ... c'è il sistema meno efficiente per il cambio di direzione ... ::slight_smile:

E' chiaro che, se occorre SOLO far girare il motore in una direzione, regolandone la verlocità ...
... un MOSFET basta e avanza :smiley:

Guglielmo

In effetti si, avevo visto soluzioni con mosfet ma il mio obiettivo è ottenere un -12V/0/+12V con un potenziometro con scatto centrale (uso attualmente un 50 kohm).
Cambiando board arduino ho risolto i problemi che avevo ergo o si trattava di un problema di qualche collegamento un po’ballerino o è la board che era difettosa.

Posto il codice per sapere se secondo voi così può andare.

E comunque grazie per le dritte che mi avete dato finora.

#define  NOB A1
#define OUT1 10
#define OUT2 11
#define  ENA 12
int pot = 0;
int ffwd = 0;
int rwd = 0;

void setup() {
  pinMode(OUT1, OUTPUT);
  pinMode(OUT2, OUTPUT);
  pinMode(ENA, OUTPUT);
  Serial.begin(9600);
  digitalWrite(ENA, HIGH);
}

void loop() {
  pot = analogRead(NOB);
  byte vel = pot / 4;
  
  Serial.print(pot);
  Serial.print(" - ");
  Serial.println(vel);
  
  if (vel < 124) {
    rwd = map(vel, 0, 123, 255, 0);
    analogWrite(OUT2, rwd);
  } else if (vel > 124) {
    ffwd = map(vel, 124, 255, 0, 255);
    analogWrite(OUT1, ffwd);
  } else if (vel = 124) {
    analogWrite(OUT1, 0);
    analogWrite(OUT2, 0);
  }
}

Non male,
Io vedo solo due possibili problemi

1
Quando attivi in1 devi anche disattivare in2, altrimenti la sua analogwrite continua a lavorare
E naturalmente viceversa

2
Non è detto che il valore di inversione di 124 sia facile da 'raggiungere' col potenziometro
Magari mano malferma, giochi del potenziometro, piccole non linearità dello stesso, ti fanno 'saltare' il valore

Metti magari una piccola 'banda morta'
Minore di 120
Maggiore di 130
E tra 120 e 130 fermo