El DVD trobat

Fa molt de temps, vaig trobar un aparell de DVD literalment tirat per terra, al carrer. Estava al costat del contenidor, com si aquesta fos manera de desprendre’s d’un aparell electrònic! Consideracions ecològiques al marge, l’aparell no tenia gaire bona pinta: li havien desmuntat la tapa, que estava deformada; faltava el cable d’alimentació i la tapa de la safata i, evidentment, no tenia el comandament a distància. Tot i això, no cal dir que el vaig agafar i me’l vaig endur a casa. Em va semblar que potser el podria arreglar, i si més no en podria treure una bona colla de peces i components, abans de portar-ne les restes a la deixalleria, tal com es mereixia.

Un cop el vaig tenir sobre la taula, me’l vaig mirar. La marca era Philips, que sempre és garantia d’una certa qualitat; semblava força vell, no dels primers DVD que es devien fabricar, però tampoc prou modern com per reproduir DivX i tota aquesta sèrie de formats comprimits. El millor de tot era que tenia un bonic VFD (pantalla fluorescent de buit) amb caràcters alfanumèrics que podria recuperar si no l’aconseguia posar en marxa.

Ara faré un salt enrere en el temps de més de dos anys, per rememorar la reparació de l’aparell. En principi no tenia pensat explicar la reparació en aquest blog, de tan fàcil com va ser, però com que després la cosa no s’ha quedat aquí, la poso per tenir una primera presa de contacte amb el subjecte.

VIATGE AL PASSAT (LA REPARACIÓ)
Aixecant la tapa, m’adono que hi ha peces soltes a dins, i està ple de porqueria. És com si haguessin intentat arreglar l’aparell, ho haguessin deixat estar, i llavors l’haguessin fet servir de paperera. El netejo a fons i li faig una ullada amb calma: li falten uns quants cargols, la unitat del DVD està solta, i hi ha alguns cables desconnectats; també li falta el cable d’alimentació.

El que hi ha a dins no sembla massa complicat, si més no l’estructura general. Al frontal de l’aparell hi ha un parell de plaques, una de molt petita a l’esquerra només pel botó d’standby, i una de més gran a la dreta on hi ha el VFD i la resta de botons. Ja a l’interior, tenim la unitat a l’esquerra, una placa mare de control on hi ha tota la part digital i de connexions d’àudio i vídeo, i una font d’alimentació a la dreta, en una placa d’una sola cara. Connectar les plaques entre elles no suposa cap problema, per sort hi ha els cables amb els connectors, i a més són tots diferents. El cable pla que va del grup del làser a la placa mare està una mica malmès, però res que no es pugui solucionar amb unes tisores i unes pinces.

Ara que està tot connectat, podria fer una primera prova de funcionament, a veure fins a quin punt està mort, aquest trasto. Però hi ha un problema, com ja he dit no hi ha cable d’alimentació. I no és que l’hagin tallat o desconnectat, és que han arrencat el connector estirant el cable, de la manera més bèstia. Per veure fins a quin punt arriben els danys, i per arreglar-ho si puc, he de separar el circuit de la font de la carcassa de l’aparell.

Vist per sota, m’adono que la brutal estirada del cable ha malmès les pistes de la placa de la font, però no és res que no es solucioni amb el soldador i un parell de minuts. Agafo un cable amb clavilla europea que tenia per aquí i el soldo directament sota la placa, a les pistes, després d’engrandir amb una broca els forats que va deixar lliures el connector (els cables no passaven pels forats del connector). Ja tinc alimentació! Una ullada ràpida a aquesta zona de la placa, on hi podria haver problemes importants, no em deixa veure cap rastre d’espurnes ni cremades; fins i tot el fusible sembla en perfecte estat (i el tester ho confirma). A punt doncs per endollar-lo.

Només d’endollar-lo, l’aparell es posa en standby, i m’ho fa saber encenent un led vermell al frontal. Prement el botó corresponent, el pacient torna a la vida. M’alegra veure que la pantalla fluorescent funciona perfectament. Toco uns quants components per palpar la temperatura (sense ficar la mà als llocs on hi ha tensions perilloses, que ja sé el que em faig!), però res sembla escalfar-se massa. Va tot bé, de moment.

El problema apareix quan toco el botó d’obrir la safata, que no respon. La pantalla em dóna un missatge ben clar, «open», però res de res, la safata no es mou. Em sembla sentir un soroll que indica que hi ha un motor que està patint. Finalment, el trasto desisteix d’obrir-se i la pantalla em diu que no hi ha cap disc inserit. Em sembla que ja sé perquè el van llençar. El problema està localitzat a la unitat del disc, o sigui que vaig per feina.

Desendollo l’aparell, desconnecto la unitat de la resta de plaques i me la miro a fons. Els eixos dels motors estan un mica bruts, i això sempre pot provocar problemes, però no sembla la causa de que no s’obri. També hi ha una peça mòbil de la safata que pot necessitar lubricant, però tampoc sembla prou important. Al final detecto que hi ha una peça de plàstic de la safata que està mal posada, i que provoca que la safata s’encalli. Un lleuger moviment des de la part de sota i es posa a lloc amb un sonor «clec». Ara puc obrir i tancar la safata amb la mà, mentre que abans no podia, s’encallava. Sembla que això és tot, però cal provar-ho. Ja que hi sóc netejo els motors de cabells i pols, però la part del lubricant me l’estalvio, ja que la safata es mou fina com la seda.

Si hagués de fer una hipòtesi, diria que la causa de que la safata no sortís era aquesta peça mal posada, que crec que va quedar així després que la safata rebés alguna mena de força externa. Possiblement l’usuari va empènyer la safata massa fort quan estava extreta, o la va moure una mica de costat, o quelcom va impedir que sortís quan l’aparell l’estava expulsant. No és una avaria rara, us ho puc assegurar. Una vegada vaig arreglar una safata d’un CD que es va encallar quan estava extreta perquè es va tancar la porta de vidre de l’equip de música. I un amic meu va espatllar fa molts anys un vídeo VHS intentant treure una pel·lícula porno més ràpid del que l’aparell la feia sortir, amb les presses de veure que els seus pares entraven per la porta…

Va, prou històries i fem la prova, a veure si està arreglat o no… Funciona! Ho he provat amb un CD i un DVD, i en tots dos casos arrenca. Els discs giren amb normalitat i l’aparell dóna senyal (he hagut de connectar un TV a l’euroconnector per comprovar-ho), o sigui que es pot dir que està funcionant a ple rendiment. Ja només falta tornar-ho a muntar tot dins la carcassa, comprar un comandament a distància universal per quatre euros a la botiga dels xinos i ja ho tindré, un DVD per la cara.

RETORN AL PRESENT
Això hauria estat la reparació, simple i insulsa com poques. Ja us he dit que no valia la pena ni publicar-la, per això no ho vaig fer al seu moment. Per què ho he fet ara, doncs? Perquè dos anys després m’he adonat que no he fet servir l’aparell ni una sola vegada (no sóc gaire de comprar pelis ni d’anar al vídeo-club), només el tinc sota la TV de l’habitació col·leccionant pols i ocupant espai… O sigui que se’n va d’aquí, fora trastos. És hora de fer-ne alguna cosa.

De tot el que em pot oferir aquest aparell, només hi ha una cosa que m’interessa, i ja he dit abans quina era: la pantalla. Aquest display VFD té molt bona pinta, i m’encantaria incloure’l en algun dels meus propers projectes. Se m’acut que el podria connectar a un port USB de l’ordinador, i així podria veure el nom de la cançó que estic escoltant (moltes vegades només faig servir l’ordinador per escoltar música; llavors apago el monitor per no gastar tant, però tinc l’inconvenient que no puc veure els títols de les cançons, ja que tinc el reproductor d’MP3 en «random» sobre una carpeta d’uns 40Gb…), o el temps, o notificacions si tinc correus, les temperatures internes, els «twits» de la gent que segueixo (si tingués twitter), o quelcom així. A la mateixa placa de la pantalla hi ha el receptor infraroig pel comandament a distància, així que també podria tirar els temes endavant o enrere, canviar el volum, o potser el mode de visualització… ja veurem.


Si no ho tinc mal entès, però, hi pot haver un problema. Aquestes pantalles fan servir una tensió força alta per activar una mena de reixa que porten a dins. Això podria suposar haver de tenir una font d’alimentació especial, no seria tan fàcil com connectar-la als 5V de l’USB i ja està. Per suposat podria utilitzar la mateixa font del DVD, però n’heu vist la mida?

Pel control de la pantalla no crec que hi hagi cap problema insuperable, dins el DVD ja hi deu haver el xip controlador que se n’encarrega, d’això. Hi hauria de posar un Arduino o un micro semblant i programar-li les funcions. Caldria veure el protocol de comunicació entre la placa mare i aquest xip, aquí hi podria haver un altre problema. Si no és estàndar i ningú no l’ha descobert tocarà fer enginyeria inversa, i això vol dir moltes hores que no tinc. Com que tot això són suposicions, el millor que puc fer és encomanar-me a sant Google i a veure què passa…

He tingut sort! Per primera vegada des que em dedico a fer aquesta mena de coses, he trobat un manual de reparació de l’aparell, amb esquemes i circuits de tot plegat. Això m’ha permès identificar una colla de components i les connexions entre les plaques, cosa que serà molt útil i m’estalviarà molta feina. Com que he trobat el datasheet del xip que controla el display, m’estalviaré haver de desxifrar el protocol que us deia abans. Us deixo la documentació, per si us interessa.

Philips DVD625
Manual de l’usuari. Manual d’instruccions per saber com funciona, el mateix que et donen imprès quan et compres l’aparell.
Manual de reparació de l’aparell. Només pels ulls privilegiats del personal dels Serveis d’Asistència Tècnica. Conté informació molt valuosa per veure les connexions entre plaques, patillatges, referències de components, etc.

Xip controlador del VFD
Datasheet del PT6312 (Princeton). És el xip controlador que porta la placa de la pantalla. El datasheet em serà molt útil per conèixer el protocol de dades i ordres, i descobrir les connexions físiques amb la pantalla.
Datasheet de l’UPD16312 (NEC). Sembla que és compatible 100% amb l’altre xip. Me l’he baixat per si hi ha algun aspecte que no queda prou clar a l’altre datasheet.

Nota: Per suposat, aquests documents pertanyen a les seves respectives companyies, jo no en sóc l’autor ni hi tinc res a veure. Els poso aquí com a referència i res més. Penseu que els podeu trobar per la xarxa igual que he fet jo.

He començat a comprovar els esquemes amb el tester i he vist que tot es correspon. Malauradament, tal com suposava, hi ha una línia de tensió de -24V de la font cap a la pantalla que pot ser un problema. Després comprovaré de quanta corrent estem parlant, si no és gaire sempre puc muntar un circuit convertidor DC per pujar la tensió (boost converter) i resoldre el tema de l’espai. Però ara he vist que hi ha un altre problema, si vull fer servir aquesta mateixa font. Quan l’aparell rep alimentació, passa a mode standby, com ja us he explicat. Doncs bé, treure l’aparell d’aquest estat és feina de la placa mare, que rep el senyal del botó del frontal o del comandament via la placa de la pantalla (que porta integrat el receptor d’infrarojos) i reacciona en conseqüència. Aquesta reacció implica passar alguna mena de senyal a la font, que fins al moment només mantenia activa una línia de 5V de tensió que suposo que deu tenir molt poca capacitat de corrent (això és l’standby, no? Aturar la font perquè l’aparell gasti poc). El més sorprenent és que el microcontrolador principal de la placa mare sempre està activat amb aquesta línia de 5V, esperant despertar-se (suposo que es deu trobar en alguna mena de mode de baix consum) rebent alguna interrupció del botó frontal o del controlador de la pantalla (que controla alhora el receptor IR i també alguns botons, ho he confirmat amb el datasheet).

Evidentment si vull fer el projecte que us he dit no conservaré pas les tres plaques, seria absurd per mides i consum, o sigui que he de trobar la manera de treure la placa mare de l’equació. La font també la vull treure, però això ho deixo per més endavant; aquesta línia de tensió de -24V em pot donar algun problema, hi he d’anar pensant. De moment seguiré amb la font original del DVD, per tant he de trobar la manera de treure-la del mode standby.

Per tant la fulla de ruta d’aquí estant és:
1. Descobrir com treure la font del mode standby sense la intervenció de la placa mare.
2. Descobrir com controlar la pantalla sense la placa mare.

Sembla que ha arribat l’hora de pensar, tot plegat s’està convertint en una «menjada d’olla». Porto massa estona mirant datasheets, esquemes i manuals, i necessito acció. També m’he adonat que porto molta lletra seguida sense fotos, i per tant m’estic fent pesat. Hem de fer una pausa. És hora de fer una autòpsia.

L’AUTÒPSIA
Com no podia ser de cap altra manera, hi ha d’haver un cos damunt el marbre, sinó això no seria el Talleret, no? En aquest cas, la unitat de disc del DVD no la necessito per res, per tant ja tenim subjecte. Fem-li una ullada superficial.

A primera vista, només hi ha molt de plàstic negre inútil, i un parell de motors. Serà qüestió d’anar desmuntant i veure què apareix. El primer que es pot fer desaparèixer és aquesta placa de PCB que ho tapa tot i no serveix per a res, i llavors anar enretirant peces de plàstic mòbils. Una vegada desmuntada la safata, que no serveix per res, arribarem als motors i al grup de la lent i el làser.

Ja tenim una mica més clar el panorama. Apareix un tercer motor (són tots tres molt semblants), i ja es veu la lent. De moment tenim el cable amb els connectors, i una colla de material mecànic. Vaig primer per la peça gran de plàstic, i allibero els dos motors que hi ha. Per desgràcia, me’n carrego un fent palanca per fer saltar la peça de plàstic inútil que porta enganxada (massa fort) a l’eix. Si és que no aguanten res!

Desmuntar el grup de la lent sempre és fascinant per mi, a part de ser laboriós. És increïble la tecnologia que hi ha ficada en tant poc espai, i com s’ha anat refinant (i abaratint) amb el pas dels anys. Ja veieu que no hi ha gran cosa com a botí: molt material mecànic (molles, cargols normals i microscòpics, un eix, un engranatge, una corretja de goma, quatre «silent-blocks» contra les vibracions, etc.), tres imants molt petits i potents, els dos motors que ja us he dit, un polsador, cables i connectors, i el material òptic: dos mirallets petits, dues lents concentradores, i un làser invisible que -si mai descobreixo com fer-lo anar- només pot ser útil per fondre’m l’altra retina. Aquesta advertència ho diu prou clar, no?

El botí no és pas molt, però no n’esperava més, de fet, d’una simple unitat de DVD. Aquí el teniu.

EL PROJECTE
Ara que ja hem passat el parèntesi de la micro-autòpsia i ja estic més tranquil, podem tornar al tema que ens ocupa. Si recordeu on ho hem deixat, tinc pendents dues coses: el tema del control del display, i el problema del mode standby de la font.

Des d’un principi he pensat fer servir un Arduino (com no!) per controlar la pantalla. És econòmic, omnipresent, i té més suport que qualsevol altre trasto d’aquest estil. Per tant vaig per feina amb la meva venerable (del 2007) Diecimila. Hora de teclejar. Fa bastant de temps que no programo, però si no recordo malament només hi ha una manera d’atacar el problema: obrir el datasheet del PT6312, absorbir-lo, i teclejar unes quantes desenes de línies de codi, tot comprovant-lo de tant en tant amb l’infal·lible mètode de la prova i l’error. Com que en aquest cas no el puc anar comprovant amb la pantalla (només amb el compilador de l’IDE), hauré de reduir al mínim les possibilitats d’error; per tant faré el codi més fàcil que pugui. Amb això n’hi hauria d’haver prou per comprovar que la pantalla funciona, llavors ja escriuré algun codi més útil. El resultat és aquest; es diu «prova_PT6312», i aquí el teniu.

// prova de la pantalla VFD controlada amb el xip PT6312 
// per SeRKeRoS 18-1-2015 

// definir els pins fisics de conexio amb l'Arduino 
#define DATA 2 
#define CLK 3 
#define CS 4 

void setup()  // codi que s'executa una sola vegada a l'inici 
{ 
  // definir els pins com a sortides 
  pinMode(DATA, OUTPUT); 
  pinMode(CLK, OUTPUT); 
  pinMode(CS, OUTPUT); 
  // posar-los tots amunt (inactius) 
  digitalWrite(DATA,HIGH); 
  digitalWrite(CLK,HIGH); 
  digitalWrite(CS,HIGH); 
  
  // cicle d'inici segons el datasheet 
  delay (200); 
  digitalWrite(CS, LOW);  // inici d'ordre 
  envia(0x40);  // set command 2: normal, incrementar, dades a pantalla 
  digitalWrite(CS, HIGH);  // fi d'ordre 
  digitalWrite(CS, LOW);  // inici d'ordre 
  envia(0xc0);  // set command 3: adreça inicial 0 
  digitalWrite(CS, HIGH);  // fi d'ordre 
  digitalWrite(CS, LOW);  // inici d'ordre 
  envia(0x05);  // set command 1: 9 digits, 13 segments 
  digitalWrite(CS, HIGH);  // fi d'ordre 
  digitalWrite(CS, LOW);  // inici d'ordre 
  envia(0x8f);  // set command 4: display on, PWM al maxim 
  // aqui no cal posar un fi d'ordre, ja que venen dades al darrere 
  // fi del cicle d'inici 
  
  // escrivim 7 caracters, calen dos bytes per cadascun 
  for (unsigned char o=0; o<14; o++) 
  {  envia(0xff);}  // FF=encendre tots els segments 
  digitalWrite(CS, HIGH);  // fi de l'enviament de dades 
} 

void loop()  // codi que s'executa continuament 
{ 
    // no fer res, ja hem fet tot el que voliem fer 
} 

void envia(byte dada)  // rutina per enviar dades al PT6312 
{ 
  for (unsigned char a=0; a<8; a++) 
  {  digitalWrite(CLK, LOW); 
      if(bitRead(dada, a) & 0x01) 
        { 
           digitalWrite(DATA, HIGH); 
        } 
      else 
        { 
           digitalWrite(DATA, LOW); 
        } 
      digitalWrite(CLK, HIGH); 
  } 
} 

Sí, ja ho sé, m’hauria de fer vergonya escriure un codi així. És rupestre, però es tracta d’anar per feina, no de fer virgueries. El cas és que ara ja tinc un mínim programa per comprovar si apareix quelcom a la pantalla, o sigui que puc tornar al hardware, que és el primer que he de fer funcionar.

Preparo les connexions entre les plaques, primer entre la del VFD i l’Arduino. Tal com podeu veure al programa, DATA és el pin 2, CLK el 3, i CS el 4. He posat els mateixos noms que hi ha a l’esquema de la placa del display. El següent pas és unir la GND de la placa del VFD amb la GND de l’Arduino, perquè les dues plaques comparteixin un nivell de tensió de referència, sinó és molt difícil que res funcioni. Tiro doncs un cable de la GND de l’Arduino al pin 5 del connector, que és la GND de la placa VFD. Veig que al connector hi ha un pin que es diu +5VSTBY, podria ser que donant-li 5V per aquí la font surti del mode de repòs? O simplement els 5V de l’Arduino alimentaran el xip controlador, de manera que no faci falta la línia de 5V de la font? És possible que sigui tan fàcil? Bé, no em costa res provar-ho: hi connecto els +5V de l’Arduino sense pensar-m’ho massa. L’Arduino anirà alimentat pel mateix port USB de l’ordinador que he fet servir per programar-lo.

A més dels que ja he esmentat, el connector de la placa té dos pins més: un que es diu «RC» i que va al receptor infraroig, i un de més misteriós que es diu «1KHZ». El del receptor no em preocupa, ja que segons l’esquema no té relació amb el controlador, només porta els codis del receptor del comandament a distància cap a la placa mare. Però l’altre senyal, el «1KHZ», va a parar a un petit circuit que el condiciona i el porta al VFD, i això em fa pensar que podria ser necessari. Com que estic molt impacient per provar el codi de l’Arduino, l’ignoro temporalment; ja tornaré a pensar en aquest pin si la prova no funciona (quina gran manera de treballar, aquesta meva, oi?).

Compilo el programa, el pujo a l’Arduino, i no passa res, pantalla en blanc. Malament. Però no tot són males notícies, he avençat una mica: el llum de l’standby s’ha apagat al moment que he connectat l’Arduino al port, per tant aquests 5V han despertat la font. Un problema resolt. Anem a veure l’altre, això que la pantalla es quedi en blanc. Crec que hi poden haver dos problemes bàsics que facin que tot plegat no funcioni:
1- El codi que he escrit és una autèntica porqueria.
2- El pin anomenat «1KHZ» i que he volgut obviar tenia la seva utilitat.

Analitzem les opcions en termes de possibilitats. La primera opció és molt possible, escriure codi en C i llegir datasheets complicats no és el millor que es pot fer a altes hores de la nit després d’un dia intens de feina, us ho ben asseguro; a més, estic força rovellat, perquè negar-ho. Com que ja estic fart de programar, de llegir el datasheet del controlador, de buscar errors al programa, i a més tots hem de tenir una mica d’orgull del que fem, concedeixo un punt a la causa número dos.

Mirem la segona opció: és molt possible que aquest senyal tingui alguna funció, sinó perquè posar-lo? Els enginyers que fan aparells de consum que han de sortir el màxim de barats no solen posar components perquè sí. A més, si heu llegit com funciona un VFD, veureu que fa falta una mena d’oscil·lació a la reixeta, cosa que es podria generar amb aquest senyal. El fet que el senyal vagi a parar a la pantalla VFD directament (pins «F1» i «F2») i no al xip que la controla em fa pensar que és bàsic pel seu funcionament. Un altre punt per aquesta darrera opció. O sigui que escullo aquest camí per seguir endavant.

Si vull descobrir què caram és aquest senyal, toca fer una mica d’enginyeria inversa. Torno a muntar les plaques del DVD en el seu estat original per mirar què és aquest senyal, què hi ha quan l’aparell funciona. Segons els esquemes del manual de reparació, hi ha un test point a la placa mare on puc «punxar» el senyal i mirar-lo a l’osciloscopi, és el «TP33». La «GND» l’agafo d’un altre test point, el «TP57», que és molt proper. Uns segons de soldador i ja hi tinc uns cables a punt per agafar amb la sonda.

Mentre la pantalla del VFD està apagada, aquest senyal no porta res. Però al moment que s’engega i comença a funcionar, just quan sortim del mode standby, apareix una ona quadrada. Ja m’esperava això, més o menys, una ona quadrada d’una freqüència d’1 KHz (ho he deduït jo sol pel nom del senyal, que llest, no?). Però resulta que la freqüència no té res a veure amb 1KHz, és d’uns 42.1KHz! O tinc l’osciloscopi fet pols, o algú m’ha intentat enganyar. L’amplitud de l’ona és de 3V, cosa molt normal tenint en compte que prové directament del microcontrolador de la placa mare, que deu funcionar a aquesta tensió tan normal per un component així. Diria a cop d’ull que el temps que està a 0V i el que està a +3V són el mateix (cicle del 50%). Mireu-ho vosaltres mateixos…

Què puc fer ara? Doncs un petit circuit per generar aquesta mateixa ona, injectar-la a la placa del VFD i veure què passa, què més podria fer? Com a tots els projectes, ha arribat aquell moment tan esperat d’agafar un venerable 555 i punxar-lo al protoboard. Som-hi! Primer dibuixo l’esquema a la pissarra (veure a continuació), i llavors el trasllado al protoboard; temps total: cinc minuts.

He comprovat el senyal de sortida d’aquest circuit a l’osciloscopi, i és pràcticament igual que el que vaig punxar de la placa mare (aquest dóna uns 36KHz i l’altre uns 42KHz); no em sembla que la petita diferència pugui ser un problema, i si ho és ja ajustaré els valors dels components. És hora d’injectar el senyal a la placa de la pantalla i enganyar-la vilment. Ho torno muntar tot com abans, però ara amb l’oscilador del 555. Aquí teniu la foto.

Per si no ho acabeu de veure, us en faig un croquis a la pissarra:

Si heu mirat l’esquema amb atenció, us deveu haver fixat que he alimentat el 555 a 5V (provinents de l’Arduino), per tant el senyal quadrat de sortida té una amplitud de 5V i no de 3V com tenia el senyal original. M’ha semblat que no hi hauria gaire diferència, ja que segons l’esquema aquest senyal es condiciona amb uns transistors que l’acaben posant a una amplitud molt més gran. A més, el primer d’aquests transistors ja porta unes resistències a l’entrada de la base que el protegeixen. Però perquè ho he fet, això? Doncs primer per estalviar-me un divisor de tensió a la sortida del 555 (pura mandra, només són dues resistències miserables!) però segon i més important perquè si a 5V funciona, en el futur aquest senyal el pot donar el mateix Arduino (interrupció de timer) i em puc estalviar tot el circuit del 555 al disseny final.

Va, prou xerrar i provem si funciona. Connecto la font a la xarxa, l’Arduino al port USB i de sobte apareixen els símbols a la pantalla, tots els segments encesos. Funciona! El programa encara no serveix per res, però ja en faré un de nou; de moment el més important és que he aconseguit engegar la pantalla.

102_0308

Ara que he aconseguit una petita victòria, és hora d’una retirada a temps. Podríeu dir que no acabo mai res (i no us faltaria raó), però és que aquest post s’està fent massa llarg, i encara es poden fer moltes coses amb aquesta pantalla. De moment ja he aconseguit el que volia: fer-vos veure que amb el que uns llencen els altres podem fer coses molt interessants. Hores d’entreteniment i aprenentatge, i perquè no diversió, sense necessitat de gastar ni un euro!

Un altre dia tornaré a agafar aquesta pantalla, i podré fer-hi més coses i explicar-les en profunditat: definir una aplicació per la pantalla, escriure un codi decent que faci quelcom útil, potser fer una font més petita i una capsa… qui sap. De moment em sembla que avui ja m’estic fent pesat, i si vosaltres no us heu cansat de llegir, jo sí que ho he fet d’escriure. De fet, si heu arribat fins aquí us mereixeu la meva absoluta devoció. No cal dir que si teniu alguna idea, dubte, o suggeriment, podeu deixar el vostre comentari, serà benvingut!

Vinga doncs, fins a la propera.

Anuncis

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!

Quincalla xinesa

Ara que estem en aquestes festes consagrades a la família, l’amor i l’alegria al consumisme més pur i dur, em sembla que és el moment més adient per fer una petita explicació de la mena de compres que fa algú com jo, i la mena de regals que li encantaria rebre enlloc de colònies, mocadors, o calçotets. No em malinterpreteu, jo faig aquestes compres durant tot l’any, i no només en aquestes dates; el Nadal només ha estat l’excusa per començar a introduir el tema d’avui.

No cal dir que quan parlo de comprar material, vull dir material electrònic, i evidentment, a través de la xarxa. L’època en que podies comprar resistències o condensadors a cada poble mitjà ha passat a la història fa temps. Jo ho havia fet, però mica en mica vaig haver de conduir més i més quilòmetres per comprar els components més habituals com resistències, condensadors, diodes i demés. Comprar la meitat dels xips va esdevenir impossible; fins i tot anant a les dues últimes botigues decents d’electrònica que subsisteixen a tot el meu país (que jo sàpiga), molt lluny de casa meva, no acabes trobant el que busques, en el millor dels casos quelcom similar que t’obliga a canviar tots els teus plans. I llavors t’adones que has perdut quasi tot un dia i 50€ de gasolina per comprar 10€ en components. Sort que sempre ens queda la xarxa.

Si us hagués de recomanar que féssiu compres de material per aquesta afició que compartim, us recomanaria llocs web que tenen productes bons, molt ben documentats, fiables, i amb una assistència al client i una logística que fan posar vermells de vergonya els directius de les millors marques del món. Aquest serà el tema d’un altre dia, perquè avui em vull endinsar en un món molt més insegur, desconegut, fosc i emocionant: el de la quincalla “made in xina”. Deixeu-me que us ho expliqui.

Quan parlo de “quincalla” em refereixo a aquests petits mòduls, eines i aparells de molt baix cost que són de gran ajuda per desenvolupar el nostre projecte a la fase de prototipatge, abans que ens plantegem fer una placa a mida i el software definitiu. Pantalles LCD, bateries lipo, “breakout boards” de xips comercials, arduinos clònics de baix cost, carregadors, reguladors, convertidors dc/dc, drivers de motors i un llarg etcètera. No entrarien en aquesta categoria eines imprescindibles com les estacions de soldadura, els oscil·loscopis, les fonts d’alimentació, ni les plaques de desenvolupament comercials; tot això és massa car per anomenar-ho “quincalla”, i jo personalment no tinc clar si m’arriscaria a comprar-ho segons on, tenint en compte la importància que té per poder treballar en condicions.

Pel que fa al “made in xina”, parlo dels llocs on podem comprar-ho directament, perquè tant si és de marca com si no, haurà estat fabricat a la Xina i/o països propers del sud-est asiàtic. I si és barat encara és més probable, però no hi haurà tants intermediaris, controls de qualitat, transportistes i duaners implicats. Parlo de comprar directament als llocs que ja deveu conèixer, com poden ser dealextreme, aliexpress, miniinthebox i semblants, però sobretot, ebay. Per mi cada dia encara és motiu de sorpresa veure el preu que et pot costar segons què, amb el transport des de l’altra banda del món inclòs. I no parlo de guanyar subhastes, sinó simplement del preu que demana el venedor per comprar-li el producte directament. És clar que el canvi de divisa ajuda molt a obtenir aquesta sensació, però tot i això, no deixa de ser sorprenent.

Com ja us he dit, he fet servir aquest sistema en moltes ocasions, amb resultats molt diversos, i tinc la intenció de seguir-ho fent. He de reconèixer, a més, que estic enganxat; buscar el mateix producte aquí i allà a veure quines diferències hi ha i qui el té més barat; obrir cada dia la bústia esperant veure el petit sobre encoixinat de paper kraft; muntar circuits de prova per saber si funciona o no; deixar comentaris al venedor, donant-li les gràcies o insultant-lo perquè ha passat un mes i mig i no he rebut res… És tot un món, i per mi, molt interessant, divertit i fins i tot emocionant.

Que m’agradi aquest sistema “arriscat” de comprar no vol dir que deixi d’utilitzar les altres fonts que us comentava al principi quan vull un producte fiable, de qualitat, i ben documentat. Simplement no sempre necessito tant, o sigui que em puc estalviar uns diners i fer servir aquest altre mètode. Avui us posaré un exemple d’això que us parlo, una de les meves últimes adquisicions.

modul i2c memoria i rtc

El mòdul del DS1307
El primer exemple d’aquesta sèrie serà un mòdul que conté un RTC (rellotge de temps real, o real time clock). Un RTC, per qui ara estigui fent una cara rara, és un xip que manté l’hora, com un rellotge. Això és important pels nostres circuits que necessiten saber l’hora i el dia que és, ja que els microcontroladors no saben a quin dia viuen. Per ells l’únic temps que coneixen és relatiu, per dir-ho d’una manera quants milisegons han passat des de l’última vegada que han rebut alimentació o han fet un reset; però no si és de dia o de nit, ni si l’any és el 1995 o el 2018. Segur que hi ha un RTC a l’ordinador que ara mateix mires, o dins el teu cotxe, per exemple. Una característica important dels RTC és que segueixen comptant, per tant mantenint l’hora, encara que no rebin corrent. És obvi que necessiten alguna energia per fer-ho, però molt poca; per això és sol fer servir una pila petita. Recordes la pila tipus rellotge que hi ha a la placa base del teu PC?

Un xip molt popular per aquest ús, i relativament fàcil de fer servir, és el DS1307. Hi ha llibreries per Arduino arreu, i es poden trobar moltes explicacions de com funciona a la xarxa. Es comunica utilitzant I2C, la qual cosa vol dir que només faran falta dos pins del nostre micro per obtenir les prestacions que ens dóna. He buscat un mòdul per aquest xip a la xarxa, i he trobat aquest.

“Arduino I2C RTC DS1307 AT24C32 Real Time Clock Module For AVR ARM PIC SMD”

Si us hi fixeu a la pròpia denominació hi ha tota la informació rellevant (tags). Adoneu-vos que la paraula “Arduino” no falla mai en aquesta mena de quincalla. És una bona paraula clau per les vostres cerques a ebay; jo la tinc com a etiqueta per descobrir nous productes, de fet.

Aquest és un dels llocs més barats que he trobat (1,15€ amb transport inclòs!), però no un dels que ofereix més informació. La descripció es redueix a les següents línies:

    Item description:

  • Brand new and high quality.
  • This is the DS1307 Real Time Clock developed by one of our designer waiman.
  • The module comes fully assembled.
  • The DS1307 is accessed via the I2C protocol.
  • Two wire I2C interface.
  • Hour : Minutes : Seconds AM/PM.
  • Day Month, Date – Year.
  • DS1307 based RTC without LIR2032 battery.
  • 1Hz output pin.
  • 56 Bytes of Non-volatile memory available to user.
  • Size: 2.9cm x 2.6cm – 1.14inch x 1.02inch.

Si heu mirat la foto amb atenció, haureu vist dos xips i no un de sol (el DS1307). L’altre és una memòria (Atmel AT24C32), o sigui que aquest mòdul és doble, és a dir, un breakout board per dos xips alhora. Em crida l’atenció que, malgrat al títol de l’article si que hi apareix, a la denominació no hi ha informació ni cap referència a l’altre integrat que hi ha a la placa, la memòria; la descripció és exclusiva pel DS1307. I no és massa informació, és clar, però en aquests casos no espereu gaire més. De fet, l’anglès no només és intel·ligible, sinó que és quasi correcte, i això ja és molt! Un lloc seriós proporcionaria l’esquema (complint un dels requisits més bàsics de l’Open Source Hardware), un manual, datasheets, i potser llibreries, exemples de muntatges i codi font… Però això és ebay i xina, no un lloc seriós de “maquinari de codi obert”, recordes? Ens haurem d’espavilar.

Com que aquests venedors d’ebay porten tots el mateix (i mai no saps qui ho fabrica, és una de les principals característiques de Xina), podem trobar informació millor en altres venedors. El risc que el producte sigui molt diferent és mínim; compareu les fotos i us n’adonareu. Feu la prova, busqueu “DS1307 RTC module” a ebay i ja em direu el què. El xip de memòria no em fa cap falta, però he trobat mòduls semblants que no la porten i valen el mateix, o sigui que agafo aquest i ja està.

modul a dx

Mireu on l’he trobat, també, i és clavat!

Ara fem un “fast-forward” en el temps de quasi un mes i ens situem quan m’arriba el paquet a casa (quasi un mes? us ho havia dit!). Està ben embolicat i ha arribat il·lès, és hora de fer les proves. Per fer-les, és clar, faré servir un Arduino. Però no faré servir la meva venerable Diecimila, ja que la tinc ocupada en una altra cosa que estic fent; ni tampoc l’Arduino Nano, que també el tinc muntat en un protoboard per un altre projecte (sí, sempre ho tinc tot a mitges, començo moltes coses i no acabo res). Faré servir un Arduino Pro Mini clònic (l’original és de Sparkfun) que vaig comprar seguint aquest mateix mètode que us he comentat, i que va arribar fa unes setmanes. Llavors li vaig soldar les tires de pins mascle, però no el vaig arribar a provar, ara serà el moment. Tot plegat ho muntaré en un protoboard molt petit que prové del mateix lloc. Us en poso la referència aquí a sota, per si us interessa. Per cert, quasi me n’oblido! Cal posar-li una pila al mòdul perquè faci la seva feina, al meu cas li he posat una CR2032 que tenia per aquí, de fer-la servir en altres projectes. I per connectar-lo al protoboard cal soldar-li uns pins mascle als forats que porta per aquest ús. És només un moment de soldador.

protoboard a ebay

Protoboards, mai no en tens prous! i si són de colors, millor!

mini arduino a ebay

Sí, tot un Arduino per 2,27€! i amb 32K de RAM, no 16K!

Per començar la prova, he de connectar el mòdul del rellotge amb l’Arduino. El GND i el VCC estan clars, com a mínim des del moment que miro el datasheet i m’adono que el DS1307 accepta els 5V de l’Arduino sense problemes; a partir d’aquí a buscar-se la vida. El primer lloc que he trobat amb una mica de documentació és Adafruit, on hi ha un tutorial, com sempre excel·lent. Segons el tutorial, la connexió l’he de fer als pins A4 i A5; molt fàcil, si no fos perquè són els dos pins que no té el petit Arduino Pro Mini! Després de mirar una bona estona la documentació de la llibreria “Wire” a la web de l’Arduino, arribo a la conclusió que no puc fer servir dos pins que no siguin aquests. Per sort, hi ha dos forats a la placa d’on puc treure l’accés a aquests dos pins. El problema és que aquests forats no estan alineats amb els forats del protoboards, o sigui que no hi puc soldar simplement uns connectors mascle com a la resta de pins; la solució és soldar dos cables, i connectar-los directament al punt desitjat del protoboard. No queda massa bonic, però és efectiu al 100%. Trigo més a escalfar el soldador que a soldar els dos cables, però un cop fet faig els ponts amb la placa del rellotge (pins SCL i SDA) tal com diu el tutorial i llestos! El hardware per a la prova està a punt, aquí teniu la foto.

muntatge modul rtc i arduino

Foto del muntatge de prova, amb l’Arduino Pro Mini, el protoboard, el mòdul que estic provant, i només 4 cables. D’aquest cable gris que creua el mòdul encara no n’he parlat, seguiu llegint.

Tot seguit és el torn del software. Per estalviar-vos una estona avorrida explicant tot el que he provat i buscat que no ha portat cap resultat positiu, aniré directament al que sí que ha funcionat i ha estat fàcil de fer anar.

El primer que he fet ha estat instal·lar la llibreria Time que hi ha a la web de l’Arduino. He fet servir un programa -o sketch- que es diu “TimeRTCSet.pde”, i que es troba entre els exemples inclosos a la mateixa llibreria. Carregar el programa al microcontrolador ha estat el procés de sempre: connectar el cable FTDI a l’USB de l’ordinador i a l’Arduino; així ja tenim una connexió sèrie entre el PC i l’Arduino. Al meu cas el port sèrie virtual es diu “/dev/ttyUSB0” (estic fent servir Ubuntu Linux), el vostre pot ser diferent. Un petit problema que he hagut de resoldre ha estat dir-li a l’IDE de l’Arduino que la placa que estava fent servir era una Duemilanove amb Atmega328, fins que no ho he trobat he anat provant una i altra, perquè el programa no pujava. Coses de fer servir Arduinos estranys… Una vegada resolt aquest detall, el programa ha pujat sense problema. He obert la consola sèrie de l’IDE a 9600 baudis i he vist el que m’estava dient el micro. Fins aquí tot va bé, ara he de posar el mòdul en hora.

Això és el que rebem pel port sèrie la primera vegada que connectem el mòdul, no està posat en hora.

Llegint alt per alt el codi del programa que he carregat al micro (no hi ha millor documentació que llegir el codi font), sembla evident que la manera de posar en hora el rellotge és enviar un comandament a través de la connexió sèrie que tinc oberta. Aquest comandament és una lletra ‘T’ majúscula, seguida de la data en format Unix, és a dir, el nombre de segons que han passat des que van començar a sonar les campanades de cap d’any del 1970 (jo no recordo com va ser aquella nit, més que tot perquè encara no havia nascut).

Per mi ha estat molt fàcil obtenir aquest nombre, (ja us he comentat que faig servir Linux?) simplement he obert un terminal i he escrit: “date +%s”, el resultat ha estat 1387631082. Ignoro com us ho fareu els que feu servir ordinadors bonics amb pomes que brillen, o ordinadors normals amb sistemes operatius que tenen finestres amb els vidres de colors. Sempre podeu calcular-ho manualment (però no feu trampes, sense calculadora!), o buscar un lloc online que ho digui o ho calculi (segur que hi és, hi ha de tot). Seguint amb l’exemple, jo he posat “T1387631082” (la T que us deia i el número que m’ha donat el terminal) i el rellotge s’ha posat automàticament en hora a les 13:04:42 del 21 de Desembre del 2013. Que fàcil!

Ha estat enviar la cadena alfanumèrica pel port i el rellotge s’ha posat en hora.

Una vegada posat en hora, podem desconnectar l’alimentació del mòdul, que seguirà mantenint l’hora, gastant molt poca energia (en algun lloc he llegit que una pila nova ens pot durar més de 10 anys!). Quan tornem a connectar l’Arduino al port sèrie de l’ordinador, ens seguirà donant l’hora correctament.

O aquesta és la teoria, perquè quan l’he tornat a connectar, el programa m’ha dit que la hora no estava posada, com si mai l’hagués posat en hora. Que estrany, no funciona. És l’hora del “troubleshooting”! Per molt senzill que sigui un mòdul, projecte, o programa, aquest moment sempre arriba. En aquests casos sempre recordo una màxima que utilitzo des que vaig començar a programar, fa molts anys: “Si funciona a la primera, és que alguna cosa no va bé”.

Em dirigeixo al primer sospitós, tester en mà; no és cap altre que el mòdul RTC, recordeu el títol del post? Després de punxar en una bona colla de llocs, tot buscant tant continuïtat com tensió, he trobat una cosa: em sorprèn que hi ha 0V entre els dos pins de la pila. És estrany, em pensava que era força nova. Culpa meva, canvio la pila i ja està. La trec del porta-piles (que no és massa fàcil, tot s’ha de dir) i la mesuro amb el tester. Ara em dóna 2,3V, això sí que és estrany. Analitzant-ho amb lògica, arribo a la conclusió que el mòdul ha de tenir un curt-circuit, per això la pila dóna tensió quan està fora del mòdul. Alhora el curt està buidant la pila a velocitats bestials. Per tant no era problema meu, la pila estava bé quan li he posat. Però ara sense la pila el tester diu que no hi ha curt-circuit. Al moment m’apareix un gran interrogant al cap, estic desconcertat. Però de nou ho miro fredament, això vol dir que la pila provoca el curt!

Un examen minuciós del porta-piles revela que hi ha una pota sota el lloc on connecta el pol positiu que es fica una mica sota la pila, on hi ha el pol negatiu. És només una punta molt petita de la peça metàl·lica que fa el contacte, però podria ser suficient. Tallo aquesta punta que sobresurt massa amb les alicates que faig servir per tallar les potes dels components després de soldar-los a les plaques, que tenen una punta molt fina. Torno a posar la pila, una de nova de fet, i mesuro la tensió a les potes del porta-piles. A la pantalla apareixen 3,1V, problema resolt! Tot havia estat culpa d’un porta-piles merdós. (Perdoneu que no hagi fet fotos d’aquesta incidència, però és que el mode “macro” de la meva càmera no dóna per tant).

Tornem, doncs, al pla inicial. Repeteixo l’operació de connectar l’Arduino a l’ordinador, posar el mòdul en hora, desconnectar-ho tot, i esperar una estona. Quan ho torno a connectar, de nou ha perdut l’hora! Torno a repassar la pila, però ara està bé. Què caram passa, ara? Pensem-ho amb calma, de nou. Si la pila té tensió i el micro no reté l’hora, o el micro està fotut o no li arriba la tensió de la pila. Anem a comprovar la segona hipòtesi, perquè la primera és molt improbable té molt mala solució. Tot mirant el datasheet del DS1307, trobo que l’entrada de tensió de la pila és al pin 3. Allà hi poso el tester i em trobo 0V. És possible que el fabricant del mòdul hagi obviat aquesta connexió? Com que no en tinc l’esquema, no tinc més remei que seguir investigant amb el tester.

Tot mirant la continuïtat dels diferents punts del circuit he trobat una cosa com a mínim rara. A la citada pota número 3 de l’integrat no hi ha connectat el positiu de la bateria (això ja ho he dit), sinó que aquesta pota va connectada a un pin de sortida que està marcat com a “BAT”. Jo d’entrada suposava que era una connexió a la pila (com puc haver deduït això?) per mesurar-la amb el micro o per carregar-la en cas que fos carregable, però no és així. He buscat per la resta del circuit i no he trobat cap altre lloc que estigui connectat a la pota 3 del xip, o sigui que aquest no rep cap tensió quan està desconnectat del port USB, per tant no pot seguir comptant el temps. Ignoro perquè hi ha una pila al mòdul, si no és per mantenir l’hora del rellotge; la memòria (l’altre xip) no se m’acut perquè la pot necessitar, una pila. Si tingués un esquema ho podria entendre, però és igual; ja tinc clar com ho he de resoldre.

La solució ha estat molt fàcil i expeditiva: he soldat un pont entre el positiu de la pila, i el citat pin de sortida anomenat “BAT”. En altres paraules, fent això he connectat la pila a la pota 3 del xip (és el cable gris de la foto que us he dit que ja explicaria). D’aquesta manera el xip hauria de ser capaç de seguir comptant el temps quan perd la tensió d’alimentació (els 5V que provenen de l’Arduino). Només cal provar-ho: li carrego de nou l’hora, el desendollo de l’ordinador, espero una estona, i el torno a endollar. Segueix donant bé l’hora, solucionat.

Funciona! Ha mantingut l’hora malgrat no rebre corrent de l’Arduino.

O sigui que ja tinc el mòdul del rellotge a temps real operatiu, i he pogut fer-vos una petita demostració de com funciona. He de dir que un dia després sense cap alimentació, he connectat el mòdul de nou i no ha perdut l’hora. Si hem de fer cas a les especificacions, no la perdrà en molts anys…

Espero que aquest exemple del mòdul RTC hagi estat prou il·lustratiu del que us explicava al principi, d’això de la “quincalla xinesa”. Ja heu pogut veure que hi ha enviaments lents, problemes, mala documentació, qualitat justa, però al final acaba funcionant i surt a molt bon preu. De pas exercitem una mica les nostres habilitats, i la matèria gris tot pensant com resoldre els inconvenients que ens van apareixent!

Només em queda dir-vos que aquest mòdul haurà de formar part d’un projecte en el que estic treballant, no l’he comprat només per escriure aquesta presa de contacte. Més endavant ja veureu de què es tracta, de moment no vull dir res més. Per als lectors habituals (si en tinc algun), aquesta vegada no he penjat les fotos al flickr, he cregut que no feia falta, de tan poques, i tan petites la majoria. Fins una altra!