El mòdul del xip L298

Si voleu controlar motors de corrent contínua de baixa potència des d’un microcontrolador o circuit lògic, us farà falta un transistor potent, un mosfet, un darlington, o uns quants de cada. Si el que voleu és que aquests motors vagin endavant i enrere, com per exemple per controlar el moviment d’un cotxe ràdio-controlat o un robot, necessitareu muntar un circuit que es diu “pont en H”. I si el que voleu és tenir tot això integrat en un sol xip que ho té tot controlat, tard o d’hora anireu a parar a l’L298. Aquest integrat és un clàssic entre els constructors de robots d’arreu del món des de fa molt de temps, i no per res, sinó perquè és senzill, barat, robust, i fiable. I a més es troba en format “thru-hole”, el preferit dels aficionats!

dibuix L298N

Anem a veure què fa aquest xip, i com ho fa. El títol del datasheet és “Dual full-bridge driver”, que vindria a voler dir que hi ha dos ponts en H que subministren corrent, si fa no fa. Només cal veure l’esquema intern (“block diagram”) per identificar de seguida els dos ponts, tal com els heu vist a l’enllaç que us he posat de la viquipèdia (Com? Que no ho heu llegit?). A partir d’aquí es tracta de veure quina és la capacitat màxima de l’integrat, sobretot quant a tensió i corrent, ja que els motors, per petits que siguin, s’enfilen de seguida en aquests paràmetres.

Diu la fulla de dades que la tensió màxima que pot controlar l’L298 són 46V, que no és pas poc. La corrent pot arribar a 4A, de manera que amb aquest animalet podem moure motors força importants. Però això no vol dir que podem fer el que volem per sota d’aquests màxims, hi ha altres coses que hem de tenir en compte. Si llegim una mica més avall, veiem que els 4 ampers que dèiem fa uns moments són en realitat 2 per canal, que podem sobrepassar només durant períodes molt curts de temps. I també hem de tenir en compte la potència màxima que dissiparà el xip, 25W. Però aquesta dada porta implícita una condició, la temperatura no pot superar un cert valor. Per això és important que aquests xips portin als nostres muntatges radiadors per mantenir-se freds. Ara no entraré en càlculs ni en teories perquè no és el propòsit d’aquest post ni d’aquest blog, però feu-me cas, quan feu muntatges amb molta potència, tingueu en compte que la temperatura sempre és un factor limitant: és el que al final acaba fregint els components!

Des del punt de vista de l’ús que li podem donar a l’L298, aquests dos ponts H que hi ha integrats al xip es poden fer servir per diverses coses. La més evident és controlar dos motors alhora, però també es poden controlar solenoides, motors pas a pas, i tot el que se’ns acudeixi.

Suposem que us ha agradat aquest xip i el voleu provar, quina seria la manera més senzilla? Doncs comprant un mòdul, és clar! Que no recordeu el meu post al respecte? Us ho recordaré, doncs: es tracta de buscar “L298N module” a l’ebay o l’aliexpress, cercar per tot el món, ordenar per preu i transport, i finalment trobar una cosa com aquesta:

pantalla mòdul L298N ebay

En veureu molts, però no us espanteu que quasi tots són idèntics. Jo per posar la foto aquí n’he triat un a l’atzar; com podeu veure, per menys de tres dòlars ja el tens (2,18€ al canvi d’ara mateix), i a més te l’envien a casa des de l’altra banda del món. He mirat als distribuïdors habituals què em costaria només el xip, aquests són els resultats. Digikey: 3,77€. Farnell: 4,95€. Mouser: 3,74€. Cap d’ells inclou el transport, és clar. Quincalla xinesa, recordeu?

Al final jo en vaig comprar un altre, d’un proveïdor que ja li he comprat altres coses i és ràpid i fiable. Us poso un PDF amb totes les característiques que hi havia a la pàgina de l’article. Si us ho mireu, veureu que l’esquema d’aquest mòdul no deixa de ser el que recomana el datasheet del xip (figura 6, només es representa la meitat del circuit) amb alguns afegits. La part fonamental és el xip L298N en un encapsulat “multiwatt” (que és el que dóna la “N” al final del nom) que dissipa molta potència, junt amb el seu radiador d’alumini negre reglamentari; els vuit diodes recomanats, i connexions per les entrades i sortides. Com a extres hi ha un regulador a 5V amb els seus condensadors i un led indicador, per si volem alimentar el circuit lògic aprofitant la tensió que farem servir pels motors. Hi ha dos “jumpers” o ponts per connectar o desconnectar les potes que permeten els moviments de cada motor, això no cal ni tocar-ho. L’entrada d’alimentació dels motors, que són dos borns (massa i positiu), i un de sortida pels 5V del regulador que ja he esmentat (la massa o GND és comú a l’alimentació dels motors). La resta són dos borns de dos pols cadascun, un per a cada motor, que es troben a cada banda de la placa del mòdul. Tot seguit us explico com ho he cablejat tot plegat, mireu-vos primer les fotos.

tot el conjunt

el boarduino al protoboard el cablejat del mòdul

Com podeu veure, he posat un motor DC a cada born de sortida del mòdul, que podré controlar individualment. Aquests motors provenen de dues impressores de tinta HP que vaig tenir al marbre d’autòpsies fa un temps. Com que no en tinc les característiques, els he provat abans. Sembla que poden anar bé fins a 24V, però no cal forçar-los tant, a més la meva font d’alimentació casolana no puja tan amunt. Els he provat a 12V, que a més de ser un valor molt habitual sembla una tensió segura pels motors. En buit (deixant-los rodar lliurement sense cap càrrega a l’eix) consumeixen uns 60mA. Si intento frenar l’eix amb els dits, provocant fregament, aquesta corrent puja de seguida a uns quants centenars de miliampers. Si freno completament l’eix del motor, la corrent que demana a la font és d’uns 900mA, quasi un amper. Sembla que en tot moment ens trobarem dins els límits segurs del mòdul i de la font (bé, si freno els dos motors alhora no, la font dóna 1,5A com a molt).

Els 12V que surten de la font d’alimentació van directament al mòdul dels motors. A la sortida del regulador del mòdul, que dóna 5V, hi he penjat el meu fidel Boarduino, que faré servir per aquesta prova. Entre l’Arduino i el mòdul de l’L298N hi he posat un cable amb quatre pins, un per cada entrada, que he hagut de fer a mida: una mica de cable pla multifilar que no recordo d’on va sortir, un connector femella tallat a mida (i ben llimat, que l’espai al mòdul és molt just per culpa dels jumpers) i una mica d’estany i tub retràctil. La connexió al protoboard ha estat un moment: els pins que controlaran els motors seran del 8 a l’11, la sortida del regulador del mòdul va al pin “5V” de l’Arduino, i he unit les masses (GND). Finalment és hora de fer un petit programa amb l’IDE de l’Arduino per a provar-ho.

// dosmotors.ino
// escrit per serkeros (serkeros.wordpress.com)
// febrer 2014
// llicencia -> creativecommons.org/licenses/by-nc/3.0

void setup()
{
  pinMode (8,  OUTPUT);     // establir els pins com a sortida
  pinMode (9,  OUTPUT);
  pinMode (10, OUTPUT);
  pinMode (11, OUTPUT);

  digitalWrite (8,  LOW);   // començar amb els dos motors parats
  digitalWrite (9,  LOW);
  digitalWrite (10, LOW);
  digitalWrite (11, LOW);
}

void loop()
{
  digitalWrite (8,  HIGH);  // engegar motor esquerre
  delay(1000);              // esperar un segon
  digitalWrite (8,  LOW);   // parar motor esquerre
  digitalWrite (10, HIGH);  // engegar motor dret
  delay(1000);
  digitalWrite (10, LOW);   // parar motor dret
  delay(1000);
  digitalWrite (9,  HIGH);  // engegar motor esquerre al reves
  delay(1000);
  digitalWrite (9,  LOW);   // parar motor esquerre
  digitalWrite (11, HIGH);  // engegar motor dret al reves
  delay(1000);
  digitalWrite (11, LOW);   // parar motor dret
  delay(1000);
  digitalWrite (8, HIGH);   // engegar tots dos motors alhora
  digitalWrite (10, HIGH);
  delay(1000);
  digitalWrite (8, LOW);    // parar els dos motors
  digitalWrite (10, LOW);
  delay(1000);
  digitalWrite (9, HIGH);   // engegar tots dos motors al reves alhora
  digitalWrite (11, HIGH);
  delay(1000);
  digitalWrite (9, LOW);    // parar els dos motors
  digitalWrite (11, LOW);
  delay(1000);
}

Si llegiu el codi font us adonareu que no m’hi he trencat el cap: engegar un motor endavant, després l’altre, després al revés, els dos alhora… Ben senzill, però ja veieu que funciona. Ara imagineu una roda a cada motor i ja teniu el sistema locomotor del vostre primer robot. Fàcil, oi?

Una altra cosa seria que volguéssim controlar la velocitat de gir dels motors, això ja és una mica més complicat, tot i que amb l’Arduino no us penseu que gaire. La manera més fàcil de fer-ho, contra el que pugui semblar, no és regular la tensió als motors; és fer servir impulsos d’amplada controlada, o PWM en anglès. Si no sabeu de què va això del PWM millor que us llegiu l’article de la viquipèdia, però si us fa mandra us en faig un resum ràpid. Es tracta d’un senyal digital (uns i zeros) a una freqüència fixa (ara mateix no importa massa quina, però prou ràpida), dins la qual la proporció de temps de 0 i 1 es pot variar. D’aquesta manera, si és tot zero (0%) el motor està parat; i si és tot 1 (100%) el motor funciona al màxim. La gràcia però és que podem triar qualsevol estat intermig (per exemple, el 50%, en la que hi hauria la mateixa estona de 1 i de 0, o el 75% on hi hauria tres temps d’1 per cada temps de 0). En l’entorn Arduino és molt fàcil implementar el PWM, com ja he dit, només heu de llegir el funcionament de l’ordre “analogWrite”. En essència, el nostre PWM té 8 bits de resolució (podem donar valors de 0 a 255, més precisió que 0,5%). Mireu-vos aquest codi que he escrit i el resultat que ha tingut als motors. Adoneu-vos que hi ha hagut un petit canvi al hardware; com que no tots els pins de l’Arduino poden donar una sortida PWM, he canviat les connexions. Ara un motor es controla pels pins 5 i 6 (abans el feia anar amb el 8 i el 9), mentre que l’altre segueix amb els pins 10 i 11.

canvis al cablejat

// dosmotors_pwm.ino
// escrit per serkeros (serkeros.wordpress.com)
// febrer 2014
// llicencia -> creativecommons.org/licenses/by-nc/3.0

void setup()
{
  pinMode (5,  OUTPUT);              // establir els pins com a sortida
  pinMode (6,  OUTPUT);
  pinMode (10, OUTPUT);
  pinMode (11, OUTPUT);

  digitalWrite (5,  LOW);            // començar amb els dos motors parats
  digitalWrite (6,  LOW);
  digitalWrite (10, LOW);
  digitalWrite (11, LOW);
}

void loop()
{ int gas;                           // variable on posarem el valor del PWM

  for (gas = 255 ; gas > 0 ; gas--)  // motor esquerre de gas a fons a parat
    {  analogWrite (5, gas);
       delay(20);
    }
  digitalWrite (5,  LOW);            // parar del tot el motor esquerre
  delay(2000);                       // espera dos segons
  for (gas = 255 ; gas > 0 ; gas--)  // ara el mateix en sentit contrari
    {  analogWrite (6, gas);
       delay(20);
    }
  digitalWrite (6, LOW);             // parar del tot el motor esquerre  
  delay(2000);
  
  for (gas = 255 ; gas > 0 ; gas--)  // ara el mateix amb el motor dret
    {  analogWrite (10, gas);
       delay(20);
    }
  digitalWrite (10,  LOW);
  delay(2000);
  for (gas = 255 ; gas > 0 ; gas--)
    {  analogWrite (11, gas);
       delay(20);
    }
  digitalWrite (11, LOW); 
  delay(2000); 
}

Bé, ja veieu que és ben útil, aquest xip; i amb aquest mòdul, resulta molt fàcil incorporar-lo als vostres invents. Jo per part meva en penso encarregar algun més, ja que són molt útils i ràpids d’aplicar. Em faltaria explicar-vos com utilitzar-lo per a controlar un motor pas a pas, però aquestes bestioles ja són figues d’un altre paner i ara no em vull enrotllar més. Ho deixem per un altre dia, d’acord? De moment podeu trobar totes les fotos penjades al flickr, com sempre. A reveure!