dimarts, 13 de març de 2018

Projecte: Tacòmetre (mesurador d'RPM) d'un motor DC amb sensor òptic IR reflexiu

Descripció del projecte

El projecte consisteix en el disseny, construcció i programació d'un tacòmetre, és a dir, un mesurador de les Revolucions Per Minut (RPM) d'un motor o de qualsevol element que gire.
Per la captació de la velocitat de gir, el dispositiu utilitza un sensor sense contacte, basat en un opto-switch (o sensor òptic d'infra-roig) de tipus reflexiu.
Ací teniu un vídeo del projecte en funcionament:


Maquinari

Sensor IR reflexiu

Per detectar el moviment de l'eix i comptar les revolucions utilitzarem un sensor sense contacte, del tipus opto-switch reflexiu. La constitució i funcionament d'aquests sensors consisteix en un LED d'infra-rojos (IR) que emet un feix d'aquest tipus de llum. Aquest feix d'IR al topar amb un objecte situat davant serà reflectit de tornada cap el sensor. Aquesta llum IR reflexada la captem amb un fototransistor IR, que conduirà de manera proporcional a aquesta llum reflexada.

Així, si el feix IR dona contra una superfície altament reflectant (per exemple, pintada de color blanc), el fototransistor conduirà molt; per contra, si la superfície és poc reflectant (negra), el fototransistor no conduirà.
El que farem es posar a l'eix un disc que tinga una part reflectant i altra no, per a que cada vegada que passe per davant del sensor, aquest vaja canviant d'estat:


El sensor utilitzat al nostre projecte està basat en l'opto-switch reflexiu TCRT5000, del qual podeu vore una imatge, el seu esquema intern i el circuit de connexionat a la imatge següent:


Com la R de polarització del foto-transistor l'hem posada a l'emissor, el senyal d'eixida SIGNAL serà:
  • Sobre blanc: el fototransistor conduirà i el senyal serà ALT (més a prop dels 5V quanta major reflexió) ---> 1.
  • Sobre negre: foto-transistor no condueix, senyal BAIX ---> 0.
Degut a que, com vorem més endavant a l'apartat de la programació, pel comptatge de les revolucions hem utilitzat una tècnica basada en les interrupcions, aquest senyal (que serà la que interromprà) s'ha de connectar a l'entrada digital 2 de l'Arduino, ja que aquest només admet interrupcions per aquesta entrada o per la 3.

Display de 4 dígits de 7 segments

Per mostrar les RPM mesurades i calculades, ho haguerem pogut fer simplement enviant-les pel port sèrie, però això haguera requerit que sempre per utilitzar el tacòmetre deuríem haver de disposar d'un ordinador. Per això anem a utilitzar un display.
Com a display també s'hauria pogut utilitzar un mòdul ja prefabricat com aquest, però com estem aprenent a programar i electrònica, hem utilitzat 4 displays de 7 segments per poder mostrar 4 dígits:


Més endavant, a l'apartat del programari veurem el control d'aquests displays des de l'arduino sense haver d'utilitzat 28 (7 segments * 4 displays = 28) pins digitals d'eixida que caldrien!
La interconnexió de tots els elements del sistema la podeu vore ací:


També podeu descarregar el fitxer Fritzing amb el circuit.

Xasis-Suport

Aprofitant que al centre tenim una impressora 3D de nova donació, un altre grup ens va ajudar i va dissenyar (amb TinkerCAD) un xasis on muntar tots els elements: les peces verd clar de la imatge de sota. La idea que el sensor IR anara sobre un suport movible per poder ajustar-lo a l'alçada de l'eix a medir, però no va eixir massa bé, és la peça verda fosca.


Programa

Funcionament general del programa

El programa creiem queestà bastant documentat als seus comentaris, però una visió general podria ser aquesta:
  • Primer definim una sèrie de variables, arrays i constants de les quals explicarem la funcionalitat més avall.
  • Definim les funcions treuXifra() i treuValor(), pel control del display. Les explicarem després.
  • Al setup() definim els pins de segment i els de dígit com eixides, obrim les comunicacions sèrie (per la depuració, després no s'utilitza) i definim el pin del sensor com a entrada i li definim les interrupcions per hardware.
  • El loop() el que està fent constantment és cridar a la funció treuValor() per mostrar pel display el valor de les RPM calculades.
  • Quan passen refreshRate mili-segons (com està ara definit són 2 segons), re-calculem les RPM basant-nos en el número de revolucions donades en eixos 2 segons.
  • A banda, cada revolució, quan el sensor passa de blanc a negre, l'arduino deixa tot el que estiga fent, va a la subrutina d'interrupció (ací anomenada subrutinaInater() que incrementarà en 1 la variable revs que compta les revolucions donades.

Control del display

Pel control del display sense haver d'utilitzar 28 pins d'eixida, s'utilitza una tècnica anomenada multiplexing (multiplexació) que a la figura següent es veu molt bé en què consisteix:


Com es pot observar, tots els segments del mateix nom (a, b, c... g) van interconnectats entre si i controlats per un pin d'eixida de l'Arduino. Aquestes eixides s'anomenen Pins de segment (a la imatge, són els de l'esquerra). Per altra banda els comuns dels leds de cada dígit (que en aquest cas són els ànodes, els displays utilitzats són d'ànode comú) van cadascun a un altre pin d'eixida de l'arduino, i s'anomenen pins de dígit (a la imatge són els de la part inferior).
Per tant el multiplex consisteix en que l'arduino activa (posa a HIGH) el pin de dígit del primer display (els altres pins de dígit s'han de posar a LOW!) i posa a LOW els pins de segments que s'han d'il·luminar per mostrar la xifra que corresponga a eixe dígit, després d'un temps curt (uns 5 ms) passa al següent dígit. Quan acaba el 4t dígit torna a començar pel primer. Com el temps que està encés cada dígit és tant curt i degut a la persistència de la visió, els nostres ulls sempre veuen com si estigueren les 4 xifres:


Al programa, les variables importants pel control del display són:
  • Array pinsSegments[]: Un array que conté a quins pins de l'arduino estan connectats cada segment. És a dir, el primer element de l'array pinSegment[0] ens diu a quin pin (en aques cas al D3) va el segment a; quan aquest pin es pose a LOW, s'encendrà el segment corresponent.
  • Array pinsDigits[]: Un array que conté a quin pin de l'Arduino està connectat l'ànode comú de cada dígit. El pin d'aquests que estiga HIGH diu quin és el dígit actiu.
  • Array valorSegment[][]: Aquest és un array bidimensional de 10 files amb 7 elements cada fila. És una espècie de mapa: cada fila ens diu quins segments (a~g) s'han de posar a LOW per a que aparega la xifra corresponent. La primera fila és el mapa del 0, la segona de l'1, etc...

Funció treuXifra()
Aquesta funció pren com a paràmetres quina xifra (de 0 a 9) s'ha de mostrar i per quin dígit (de 0 a 3). Activa a HIGH el pin de dígit corresponent i basant-se en el mapa de l'array valorSegment, activa a LOW els pins de segment adequats. Aquesta funció només serveix per estructurar una mica el programa, sols és cridada per la funció treuValor().
Funció treuValor()
Aquesta funció és l'encarregada de fer el multiplexing. Pren com a paràmetre quin valor s'ha de mostrar pels 4 dígits (el valor calculat de les RPM) i, ajudant-se de treuXifra() va traient cada xifra pel dígit corresponent, s'espera un temps tempsMultiplex i passa a la següent xifra.

Resta del programa

Detecció del gir
Quan el sensor passa d'estar sobre blanc (donant HIGH) a estar sobre negre (LOW), es provoca una interrupció, l'arduino deixa tot el que estiga fent i passa a la funció subrutinaInter(), que incrementa en 1 el comptatge de les revolucions donades, variable revs.
Càlcul de les RPM
Cada refreshRate mili-segons (2 segons) re-calculem les RPM i tornem a començar un altre cicle posant a zero revs.

Programa sencer

Ací podeu vore el programa sencer o si preferiu podeu veure'l a Arduino Create:


Variació

Hi ha una altra versió del programa que fa servir una variant pel còmput de les RPM: en lloc de comptar el número de revs donades en 2 segons, el que fem és comptar quant es tarda en fer una revolució, és a dir el període T.
Per més exactitud el que fem és anar sumant el temps trigat en cada revolució, comptat en micro-segons i després dividirem pel número de revolucions, és com treure una mitjana.

Cap comentari:

Publica un comentari a l'entrada