Arduino web tutorijali

L298

Osnovni priključci integriranog kruga L298 slični onima na L293: 

  • INPUT 1, INPUT2, INPUT3, INPUT4 - TTL ulazi H mosta
  • OUT1, OUT2, OUT3 i OUT4 - priključci za motore
  • ENABLE A, ENABLE B - pinovi za pulsno širinsku modulaciju
  • GND - negativni priključak (masa)
  • Vss - Napajanje logike (5V)
  • Vs - Napajanje motora  (7-35V)

Jedinu razliku u odnosu na L293 imamo u dodatna dva priključka:

  • SENSE A,SENSE B - priključci senzorskog otpornika na kojem se mjeri struja

 

Shema tipičnog upravljačkog modula baziranog na čipu L298:

L298 shema

Tablica stanja:

 

Stanje IN1 (IN3)

Stanje IN2 (IN4)

Motor

HIGH LOW Vrti se u jednom smjeru
LOW HIGH Vrti se u drugom smjeru
HIGH HIGH Kočenje (aktivno kočenje - brake
LOW LOW Zaustavljanje (pasivno kočenje - coast)

 

Gotovi moduli - povezivanje i programiranje

Izgled tipičnog modula i njegovo povezivanje možete vidjeti na slijedećoj slici:

L298 MODUL

Kod za upravljanje sklopom:

 

int EN1 = 10;
int IN1 = 9;
int IN2 = 8;
int IN3 = 7;
int IN4 = 6;
int EN2 = 5;
boolean smjer1, smjer2, smjer3, smjer4;

void setup()
{
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(EN1, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode(EN2, OUTPUT);
}

void loop()
{
  motori (200,200, 3000); // vrti motore u jednom smjeru 3 sekunde
  motori (0, 0, 2000); // stajanje 2 sekunde
  motori (-100,-100, 3000); // vrti motore u drugom smjeru 3 sekunde
  motori (0, 0, 2000); // stajanje 2 sekunde
  motori (150,-150, 3000); // vrti svaki motor u različitom smjeru 3 sekunde
  motori (0, 0, 2000); // stajanje 2 sekunde
  motori (-150,150, 3000); // vrti svaki motor u različitom smjeru 3 sekunde
  motori (0, 0, 2000); // stajanje 2 sekunde
}

void motori (int motor1, int motor2, int pauza)
{
  if (motor1 > 0) {
    smjer1 = true;
    smjer2 = ! smjer1;
    }
  if (motor1 < 0) {
    smjer1 = false;
    smjer2 = ! smjer1;
    }
  if (motor1 == 0) {
    smjer1 = false;
    smjer2 = false;
    }
  if (motor2 > 0) {
    smjer3 = true;
    smjer4 = ! smjer3;
    }
  if (motor2 < 0) {
    smjer3 = false;
    smjer4 = ! smjer3;
    }
  if (motor2 == 0) {
    smjer3 = false;
    smjer4 = false;
    }

  digitalWrite(IN1, smjer1);
  digitalWrite(IN2, smjer2);
  digitalWrite(IN3, smjer3);
  digitalWrite(IN4, smjer4);
  analogWrite(EN1, abs(motor1));
  analogWrite(EN2, abs(motor2));
  delay(pauza);
}

 

ARDUMOTO shield - povezivanje i programiranje

Mada na tržištu ima dosta kopija, Ardumoto je izvorno proizvod Sparkfun Electronics Inc. <Ardumoto na Sparkfun-u>

Ovaj modul je baziran na čipu L298P (SMD inačica) i pločica je dimenzijama i rasporedom elemenata kompatibilna s Arduino UNO mikrokontrolerom.

Ono što dodatno razlikuje ovaj modul je građa gdje je na drugi INPUT ulaz u paru dodan logički inverter tako da je samo jedan pin dovoljan za selekciju smjera vrtnje motora, što po motoru smanjuje broj potrebnih pinova na 2 (1 digitalni za smjer + 1 PWM pin) umjesto 3 kod prethodno obrađenih modula.

 

Izgled i spajanje Ardumoto shielda

Ardumoto shield 

Na slici vidimo da su digitalni pinovi broj 3, 11, 12 i 13 rezervirani za upravljanje što znači da te pinove u našem sklopu ne možemo koristiti za druge namjene.

 

Kod za upraljanje Ardumoto shieldom:

 

int PWMA = 3;
int DIRA = 12;
int PWMB = 11;
int DIRB = 13;
boolean smjer1, smjer2;

void setup()
{
  pinMode(PWMA, OUTPUT);
  pinMode(DIRA, OUTPUT);
  pinMode(PWMB, OUTPUT);
  pinMode(DIRB, OUTPUT);
}

void loop()
{
  motori (200,200, 3000); // vrti motore u jednom smjeru 3 sekunde
  motori (0, 0, 2000); // stajanje 2 sekunde
  motori (-100,-100, 3000); // vrti motore u drugom smjeru 3 sekunde
  motori (0, 0, 2000); // stajanje 2 sekunde
  motori (150,-150, 3000); // vrti svaki motor u različitom smjeru 3 sekunde
  motori (0, 0, 2000); // stajanje 2 sekunde
  motori (-150,150, 3000); // vrti svaki motor u različitom smjeru 3 sekunde
  motori (0, 0, 2000); // stajanje 2 sekunde
}

void motori (int motor1, int motor2, int pauza)
{
  if (motor1 > 0) {
    smjer1 = true;
    }
  if (motor1 < 0) {
    smjer1 = false;
    }
  if (motor2 > 0) {
    smjer2 = true;
    }
  if (motor2 < 0) {
    smjer2 = false;
    }

  digitalWrite(DIRA, smjer1);
  digitalWrite(DIRB, smjer2);
  analogWrite(PWMA, abs(motor1));
  analogWrite(PWMB, abs(motor2));
  delay(pauza);
}