Problema L298n + Hex inverter

Salve a tutti da una settimana sto smanettando con un piccolo robot. Vado al dunque.. Ho una l298n e arduino duemilanove. Schemda dell'Hex inverter con L298N: http://img.ctrlv.in/img/14/10/19/5443f93a715f8.png come potete vedere il collegamento dell'hex inverter alla l298n. Non riesco però a capire come far girare i motori in lap mode. in teoria dovrebbe essere con:

analogWrite(motor1,127)

e il motore fermo, però non riesco a capire come regolare la velocità...

void Avanti(){
    digitalWrite(9,HIGH); // IN 2
    digitalWrite(10,HIGH); // IN 4
    analogWrite(5,127); // MOTORE 1
    analogWrite(6,127); // MOTORE 2

}

con questo codice, i motori sono fermi... potreste darmi una mano gentilmente a :

  1. Regolare la velocità.
  2. cambiare senso di marcia (indietro e avanti) penso che debba cambiare HIGH a low... ma in primis mi interessa la velocità per favore... Grazie mille

@Rox, sempre con quei motorini ?

in Lap mode AnalogWrite (pin,0) = Indietro tutta AnalogWrite (pin,64) = Indietro a meta' velocita' AnalogWrite (pin,127) = fermo AnalogWrite (pin,192) = Avanti meta' velocita' AnalogWrite (pin,255) = avanti tutta

di conseguenza altri valori intermedi lo fanno girare, in un verso o l'altro, ad altre velocita'

Sì perdonatemi ma voglio portare a termine questo progetto. Appena sono a casa provo. Intanto grazie!

  1. I collegamenti sono ok? Vedi schema
  2. E allora che ci faccio con i pin collegati ad arduino di in 2 e 4? Scusate ancora e grazie

quel collegamento e' sbagliato non devi collegare i pin 9,10 alle uscite dell'inverter e poi quello sketch non torna con i collegamenti

l'analogWrite devi farlo sui pin collegati agli ingressi dell'inverter... posta lo sketch, te lo correggo e ti faccio un collegamento di conseguenza

Uhm... come sketch diciamo che nel loop ho: Avanti() e nella funzione Avanti () ho solo analogwrite perché devo fare le prove citate su.

  1. sono fuori al momento comunque dovrei scollegare i fili dell'IN 2 e IN 4 dall inverter? E lasciare solo in 1 e 3 collegati all hex inverter?

  2. puoi farmi uno schema per favore come ho fatto io al primo post?

  3. I pin saranno solo due che andranno collegati ad arduino se non ho capito male.. (?)

Prima vorrei risolvere il giusto collegamento e poi pasdare al codice ! Grazie ancora

.

Non puoi collegare un uscita del HEX Inverter con un pin di arduio che é settato come usita.

L' entrata INx del L298 mette l' uscita correspondente a massa o al alimentazione motore (chiamto in seguito +12V). Se usi out1 e out2 per un motore il motore gira se out1 é a massa e out2 é a +12V e percui IN1 a LOW e IN2 a HIGH. Per invertire il senso di rotazione del motore si inverte il pilotaggo dei IN1 e IN2. Se si mette entrambi le uscite a massa o a +12V il motore é praticamente cortocircuitato e percui frena. Se con ENA out1 e out2 vengono spenti ( portati in una situazione dove nessuno dei transistori conduce verso massa o +12V) il motore gira libero.

Per una regolazione PWm si usa ENA e ENB

Ciao Uwe

Grazie per avermi risposto però volevo precisare che nella mia scheda L298N non ci sono dei jumper. Ho questa qui... http://www.haoyuelectronics.com/Attachment/L298N_module/2.jpg

  1. Per quanto riguarda gli EN A ed EN B quindi devo toglierli dai 5v fissi e collegarli a arduino? perchè mi era stato detto che potevo lasciarli anche ai 5v fissi.
  2. Nello schema dove c'è GND, una va all'alimentatore e l'altra?

Grazie

Grazie per avermi risposto però volevo precisare che nella mia scheda L298N non ci sono dei jumper

e quei ponticelli tra gli ENABLE e il postivo, tu come li chiami ?

  1. Per quanto riguarda gli EN A ed EN B quindi devo toglierli dai 5v fissi e collegarli a arduino? perchè mi era stato detto che potevo lasciarli anche ai 5v fissi.

Se vuoi disalimentare il ponte devi collegarli, altrimenti puoi lasciare i jumper montati, non collegarli ad Arduino e il ponte rimane sempre abilitato

Nello schema dove c'è GND, una va all'alimentatore e l'altra?

l'altro va' al GND di Arduino. Vorrai almeno mettere le masse in comune !!!

È sparito lo schema @Brunello.... puoi rimetterlo? Grazie per la pazienza

sono sparite un sacco di cose

ciao, grazie...nel frattempo che aspettavo te che postavi lo schema ho smanettato un po e diciamo che sono arrivato ai risultati finali... però l'ho collegato diversamente... ecco come:

IN 1 e IN 3 cosi: http://s15.postimg.org/aw5eyimuy/Senzanome.jpg

IN 2 pin 2 arduino IN 4 pin 4 arduino

ad EN A ed EN B ho lasciato i jumper.

utilizzando questo codice... a quanto pare funziona...

oid Avanti(){
  digitalWrite(2,LOW); // MOTORE SINISTRA
  digitalWrite(9,LOW);
  analogWrite(5,255); // MOTORE SINISTRA
  analogWrite(6,255);

}

void AvDestra(){
  
  digitalWrite(2,LOW);
   analogWrite(5,192);
}

void AvSinistra(){

  digitalWrite(9,LOW);
   analogWrite(6,192);


}

void Indietro(){
    digitalWrite(2,HIGH); // MOTORE SINISTRA
  digitalWrite(9,HIGH);
  analogWrite(5,0); // MOTORE SINISTRA
  analogWrite(6,0);
}

void InDestra(){
    digitalWrite(2,HIGH); // MOTORE SINISTRA
  analogWrite(5,64);


}

void InSinistra(){
    digitalWrite(9,HIGH); // MOTORE SINISTRA
  analogWrite(6,64);


}

void Stop(){
     digitalWrite(2,LOW);
 digitalWrite(9,LOW);

 analogWrite(5,127);
 analogWrite(6,127);


}

è normale o è solo un caso? ripeto, l'ho fatto nel frattempo che ripostavi lo schema.. Non ho esigenza di spegnere il ponte H quindi non rimuovo i jumper...

Comunque @Brunello adesso ho collegato tutto come descirtto nello schema, anche rimosso i jumper... potresti farmi un esempio di codiceriguardo lo schema?

Scusate il secondo post... ma leggendo qui non parla proprio di hex inverter...come mai? http://forum.arduino.cc/index.php?PHPSESSID=qssv8plm883ftl6c1b6iupjsc0&topic=180553.15 @Brunello appena puoi mi fai un esempio di codice da caricare, per vedere se funziona quel collegamento che mi hai postato?

Grazie mille

Ho collegato tutto come da schema ma non riesco via codice a fare girare i motorini...nel senso che: se faccio: analogWrite(motor1,0) il motore è fermo e non va indietro... ma se al posto di 0 metto 255 gira tutto avanti. Ho alzato la frequenza del PWM setPwmFrequency(motor1,1024); con questa funzione:

void setPwmFrequency(int pin, int divisor) {
  byte mode;
  if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 64: mode = 0x03; break;
      case 256: mode = 0x04; break;
      case 1024: mode = 0x05; break;
      default: return;
    }
    if(pin == 5 || pin == 6) {
      TCCR0B = TCCR0B & 0b11111000 | mode;
    } else {
      TCCR1B = TCCR1B & 0b11111000 | mode;
    }
  } else if(pin == 3 || pin == 11) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 32: mode = 0x03; break;
      case 64: mode = 0x04; break;
      case 128: mode = 0x05; break;
      case 256: mode = 0x06; break;
      case 1024: mode = 0x7; break;
      default: return;
    }
    TCCR2B = TCCR2B & 0b11111000 | mode;
  }

non mi funziona solo la modalità da 0 a 64 da 64 a 192 ecc... in poche parole non ho rimosso i jumper perchè voglio tener fissi i 5v, ma ho collegato IN1 ad arduino e all ingresso 1 dell'inverter e nella 2 uscita ho fatto uscire un filo che va a IN2, come da schema. Massa in comune... credo di aver fatto tutto giusto... qualcuno mi può illuminare? Grazie

Se hai messo gli ENA e ENB al 5V ( lasciando i ponticelli ) devi lavorare solo sui pin5 per il motore 1 e pin6 per il motore 2

void Avanti(){
  analogWrite(5,255); // motore 1 avanti
  analogWrite(6,255); // motore 2 avanti
}

void Avanti_accelerando(){
  for (int acc = 128; acc < 255; acc++)  {
    analogWrite(5,acc); // motore 1 avanti
    analogWrite(6,acc); // motore 2 avanti
    delay(100); // ritardo 
  }
}

void AvDestra(){
  analogWrite(6,127); // motore 2 fermo
  analogWrite(5,192); // motore 1 avanti mezza forza
}

void AvSinistra(){
  analogWrite(5,127); // motore 1 fermo
  analogWrite(6,192); // motore 2 avanti mezza forza


}

void Indietro(){

  analogWrite(5,1); // motore 1 indietro
  analogWrite(6,1); // motore 2 indietro
}

void InDestra(){
  analogWrite(6,127); // motore 2 fermo
  analogWrite(5,64); // motore 1 indietro mezza forza


}

void InSinistra(){
  analogWrite(5,127); // motore 1 fermo
  analogWrite(6,64); // motore 2 indietro mezza forza

}

void Stop(){
  analogWrite(5,127);
  analogWrite(6,127);
}

fai una cosa, sposta i comandi sui pin 9 e 10 ( perche’ i 5 e 6 quando cambi frequenza influenzano il timer0 )
come nel disegno.

e prova questo sketch

byte mot1=9 ;
byte mot2=10 ;


void setup(){
 setPwmFrequency(9, 8); // imposta frequenza 3906 hz
 //setPwmFrequency(9, 4); // imposta frequenza 7812 hz
 pinMode(mot1,OUTPUT);
 pinMode(mot2,OUTPUT);
}

void loop(){
 
  Avanti_accelerando();
  delay(500);
  Stop();
  Indietro_accelerando();
  delay(500);
  Stop();
  delay(500);
}



void Avanti(){
  analogWrite(mot1,255); // motore 1 avanti
  analogWrite(mot2,255); // motore 2 avanti
}

void Avanti_accelerando(){
  for (int acc = 128; acc < 255; acc++)  {
    analogWrite(mot1,acc); // motore 1 avanti
    analogWrite(mot2,acc); // motore 2 avanti
    delay(100); // ritardo 
  }
}

void AvDestra(){
  analogWrite(mot2,127); // motore 2 fermo
  analogWrite(mot1,192); // motore 1 avanti mezza forza
}

void AvSinistra(){
  analogWrite(mot1,127); // motore 1 fermo
  analogWrite(mot2,192); // motore 2 avanti mezza forza
}

void Indietro(){

  analogWrite(mot1,1); // motore 1 indietro
  analogWrite(mot2,1); // motore 2 indietro
}
void Indietro_accelerando(){
  for (int acc = 127; acc > 0; acc--)  {
    analogWrite(mot1,acc); // motore 1 indietro
    analogWrite(mot2,acc); // motore 2 indietro
    delay(100); // ritardo 
  }
}

void InDestra(){
  analogWrite(mot2,127); // motore 2 fermo
  analogWrite(mot1,64); // motore 1 indietro mezza forza
}

void InSinistra(){
  analogWrite(mot1,127); // motore 1 fermo
  analogWrite(mot2,64); // motore 2 indietro mezza forza
}

void Stop(){
  analogWrite(mot1,127);
  analogWrite(mot2,127);
}

void setPwmFrequency(int pin, int divisor) {
  byte mode;
  if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 64: mode = 0x03; break;
      case 256: mode = 0x04; break;
      case 1024: mode = 0x05; break;
      default: return;
    }
    if(pin == 5 || pin == 6) {
      TCCR0B = TCCR0B & 0b11111000 | mode;
    } else {
      TCCR1B = TCCR1B & 0b11111000 | mode;
    }
  } else if(pin == 3 || pin == 11) {
    switch(divisor) {
      case 1: mode = 0x01; break;
      case 8: mode = 0x02; break;
      case 32: mode = 0x03; break;
      case 64: mode = 0x04; break;
      case 128: mode = 0x05; break;
      case 256: mode = 0x06; break;
      case 1024: mode = 0x7; break;
      default: return;
    }
    TCCR2B = TCCR2B & 0b11111000 | mode;
  }
}

ciao

roxdragon: Ho alzato la frequenza del PWM setPwmFrequency(motor1,1024); con questa funzione:

Veramente la hai abbassata al valore minimo.

ciao pippo72

Brunello:
fai una cosa, sposta i comandi sui pin 9 e 10 ( perche’ i 5 e 6 quando cambi frequenza influenzano il timer0 )
come nel disegno.

e prova questo sketch

byte mot1=9 ;

byte mot2=10 ;

void setup(){
setPwmFrequency(9, 8); // imposta frequenza 3906 hz
//setPwmFrequency(9, 4); // imposta frequenza 7812 hz
pinMode(mot1,OUTPUT);
pinMode(mot2,OUTPUT);
}

void loop(){

Avanti_accelerando();
 delay(500);
 Stop();
 Indietro_accelerando();
 delay(500);
 Stop();
 delay(500);
}

void Avanti(){
 analogWrite(mot1,255); // motore 1 avanti
 analogWrite(mot2,255); // motore 2 avanti
}

void Avanti_accelerando(){
 for (int acc = 128; acc < 255; acc++)  {
   analogWrite(mot1,acc); // motore 1 avanti
   analogWrite(mot2,acc); // motore 2 avanti
   delay(100); // ritardo
 }
}

void AvDestra(){
 analogWrite(mot2,127); // motore 2 fermo
 analogWrite(mot1,192); // motore 1 avanti mezza forza
}

void AvSinistra(){
 analogWrite(mot1,127); // motore 1 fermo
 analogWrite(mot2,192); // motore 2 avanti mezza forza
}

void Indietro(){

analogWrite(mot1,1); // motore 1 indietro
 analogWrite(mot2,1); // motore 2 indietro
}
void Indietro_accelerando(){
 for (int acc = 127; acc > 0; acc–)  {
   analogWrite(mot1,acc); // motore 1 indietro
   analogWrite(mot2,acc); // motore 2 indietro
   delay(100); // ritardo
 }
}

void InDestra(){
 analogWrite(mot2,127); // motore 2 fermo
 analogWrite(mot1,64); // motore 1 indietro mezza forza
}

void InSinistra(){
 analogWrite(mot1,127); // motore 1 fermo
 analogWrite(mot2,64); // motore 2 indietro mezza forza
}

void Stop(){
 analogWrite(mot1,127);
 analogWrite(mot2,127);
}

void setPwmFrequency(int pin, int divisor) {
 byte mode;
 if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
   switch(divisor) {
     case 1: mode = 0x01; break;
     case 8: mode = 0x02; break;
     case 64: mode = 0x03; break;
     case 256: mode = 0x04; break;
     case 1024: mode = 0x05; break;
     default: return;
   }
   if(pin == 5 || pin == 6) {
     TCCR0B = TCCR0B & 0b11111000 | mode;
   } else {
     TCCR1B = TCCR1B & 0b11111000 | mode;
   }
 } else if(pin == 3 || pin == 11) {
   switch(divisor) {
     case 1: mode = 0x01; break;
     case 8: mode = 0x02; break;
     case 32: mode = 0x03; break;
     case 64: mode = 0x04; break;
     case 128: mode = 0x05; break;
     case 256: mode = 0x06; break;
     case 1024: mode = 0x7; break;
     default: return;
   }
   TCCR2B = TCCR2B & 0b11111000 | mode;
 }
}

Ciao e grazie mille mi funziona avanti anche in accellerazione ma indietro no…
con Indietro_accellerando() sento solo … “tiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii”
VEDI FOTO:
https://fbcdn-sphotos-c-a.akamaihd.net/hphotos-ak-xfa1/v/t1.0-9/1384067_732059750198886_6895788789365292272_n.jpg?oh=99b80ef8c6213f6d6385b3cc84821567&oe=54B2ED24&gda=1421581940_88665be9b4f1c13cf1f040dd16bb1694
i fili sono messi bene…nessun falso contatto…
Vi riporto il collegamento:

Filo arancione (IN1) esce, e a metà l’ho tagliato e messo un altro filo che va al pin di arduino 9 e l’altra punta all entrata 1 dell’ inverter…
Dalla prima uscita dell’inverter ho fatto uscire un filo che va a IN2.
Idem per in3 e 4

FOTO INVERTER:
https://scontent-a-lhr.xx.fbcdn.net/hphotos-xap1/v/t1.0-9/1382068_732067770198084_5583552790563270970_n.jpg?oh=fea212b144ae11fe02068885665c4350&oe=54B98E52

Non ho collegato ne vcc ne gnd dell’inverter
Grazie ancora…infinite grazie

Certo che se non lo alimenti l'inverter non funzionerà mai nulla.

karma++

Scusa ma l'inverter va alimentato a 5v? ...il bello che uno mi diceva che non va alimentato l'inverter.............. GND in comune e vcc 5v? il collegamento dei fili dovrebbe essere corretto no?