05 - Les entrades analògiques
Objectius
- Conèixer els potenciòmetres.
- Comprendre la conversió analògica a digital.
- Aprendre a usar les portes analògiques d’Arduino.
Material requerit
Imatge | Descripció |
---|---|
![]() |
Arduino Uno o compatible |
![]() |
Una protoboard |
![]() |
Cables de connexió |
![]() |
Un díode led |
![]() |
Una resistència 330 Ohms |
![]() |
Un potenciòmetre |
Els potenciòmetres
Fins ara hem usat sempre resistències fixes, d’un valor donat. Però a vegades és convenient disposar d’un senyal variable per controlar el circuit que ens interessa. Imagina el volum d’un equip de música, o el dial que sintonitza una emissora en una ràdio FM.
Un potenciòmetre és, simplement, un mecanisme per proporcionar una resistència variable.
Hi ha potenciòmetres de tantes grandàries, formes i colors com pugueu imaginar, però al final són una resistència fixa d’un valor donat (10 kΩ en el nostre cas actual) i un mecanisme que permet desllisar un dial conductor sobre aquesta resistència, que ens permet prendre una part d’aquest valor.
Per això un potenciòmetre sempre té 3 pins en fila. Els de l’extrem es comporten com una resistència del valor de fons d’escala del potenciòmetre, i un pin central que va prenent valors de resistència en funció del moviment que fem amb l’ajust.
Muntarem un circuit com aquest (en el qual el potenciòmetre està etiquetat Pot1):
La idea és connectar 5V i GND als extrems del Potenciòmetre (no importa quin és un i l’altre) i després connectar el pin central al positiu d’un LED i el negatiu a GND directe, passant per una resistència de limitació.
D’aquesta manera quan girem el potenciòmetre estarem modificant la tensió que apliquem a l’entrada del LED, que variarà entre 0 i 5V (Encara que ara sembli estrany és molt senzill) i haurem aconseguit un regulador d’intensitat del LED.
- Amb una resistència de 10k la intensitat en el circuit serà de: 5V / 10.000Ω = 0,5 mA. Molt poc per aconseguir il·luminar el LED que requereix uns 20 mA. Així que durant la major part del gir del potenciòmetre el LED estarà apagat.
- Important: No oblidis la resistència R1. Encara que el potenciòmetre limiti la intensitat, hi ha un moment en què arribarà a zero i aquí el teu LED morirà en acte de servei.
Circuit per protoboard
El muntatge en la protoboard seria similar a això ja que utilitzarem l’Arduino simplement per donar tensió al circuit i res més. Veureu que la intensitat de la llum varia de manera contínua al girar el potenciòmetre.
- Recorda que a causa de l’excés de resistència del potenciòmetre de prova, durant la major part del gir de l’ajust el LED estarà apagat.
- Nota’s que en aquest cas utilitzem el nostre Arduino simplement com a font d’alimentació per donar tensió al circuit.
Arduino i les entrades analògiques
Amb Arduino hem vist que podem influir en el món exterior aplicant sortides tot/res en els pins digitals i també que usant PWM podem simular bastant satisfactòriament senyals analògiques en alguns d’aquests pins.
També hem vist com detectar pulsacions de botons, definint com a entrades els pins digitals. Però en moltes ocasions els sensors que usem per supervisar el món exterior, ens lliuren un senyal analògic. És el cas dels sensors de temperatura o distància, de pressió, d’intensitat de corrent en un circuit o de cabal d’aigua en una canonada.
Per llegir aquest tipus de senyals contínues necessitem un convertidor analògic a digital (o ADC per les seves sigles en anglès) que ens permeti llegir el valor d’un senyal analògic en un moment donat.
Aquests convertidors prenen una mostra del valor actual del senyal i ens lliuren el seu valor instantani, mesurat en Volts.
Mitjançant la lectura repetida de mostres al llarg del temps podem reconstruir el senyal original amb major o menor precisió, depenent de l’exactitud de la nostra mesura i de la velocitat a la qual pugui prendre aquestes mostres.
Arduino UNO disposa de sis convertidors analògic a digital, anomenats d’A0 fins a A5, etiquetats com a ANALOG IN:
Veiem com usar les entrades analògiques amb un circuit com aquest, en el qual donem tensió als extrems d’un potenciòmetre i connectem el pin central (el variable) a l’entrada de la porta A5 d’Arduino:
- Sembla bon moment per destacar que els convertidors ADC llegeixen valors de tensió i no resistència, per tant, el que llegirem és la caiguda de tensió en el potenciòmetre a mesura que girem l’ajust.
La primera curiositat és que no necessitem declarar en el setup() que usarem una porta analògica. I la segona és que per prendre una mostra (llegir) del pin A5, utilitzarem la instrucció:
int Val = analogRead(A5) ;
- Els convertidors d’Arduino UNO i Mega són de 10 bits de resolució per la qual cosa ens retornarà valors entre 0 i 2^10 = 1.024 per tensions entre 0 i 5V. En canvi l’Arduino DUE disposa de convertidors de 12 bits per la qual cosa el valor de les seves lectures estarà entre 0 i 2^12 o sigui 4.096, és a dir té millor resolució (però només pot llegir fins a 3,3V).
- Assegura’t de no usar sensors que puguin donar més de 5V màxim (amb Arduino UNO i Mega), ja que danyaries el xip principal d’Arduino.
Escriurem un programa que llegeixi el valor del pin A5 i l’envii a la consola perquè puguem visualitzar-lo.
Usant les portes analògiques
Prova aquest programa:
//Codi: ARD_05_01
void setup()
{
Serial.begin(9600); // Iniciem la porta sèrie
}
void loop()
{
int Lectura = analogRead(A5) ;
Serial.println( Lectura);
delay(200) ;
}
Quan el pugis, arranca la consola i veuràs que a mesura que gires l’ajust les lectures varien de manera contínua reflectint la posició del potenciòmetre, les lectures reflecteixen la caiguda en volts.
No puc resistir-me a proposar-vos aquesta prova: Desconnecta el potenciòmetre de la porta A5 i observa els resultats que Arduino envia a la consola. Per què surten aquests valors?
- Al no estar l’A5 connectat a cap referència vàlida, està flotant i els valors que captura són mostra d’aquesta incoherència. En realitat el que està fent el teu Arduino és captar soroll aleatori de radiofreqüència i intentar donar-li sentit, però ho té malament, com podeu veure.
- No obstant en condicions normals els valors que llegirà seran relativament baixos. Vols que les oscil·lacions creixin en valor? Fàcil. Posa-li una antena. Val un simple cable de protoboard connectat des de l’A5 a res (O si agafes l’altre extrem entre els dits, tu mateix faràs d’antena).
Un últim comentari
Dèiem en una lliçó anterior, que la fidelitat amb què podem mostrejar un senyal analògic depenia, bàsicament, de la resolució de la mostra i de la velocitat a la qual podíem mostrejar el senyal (Sample Rate en anglès).
Ja vam dir que la família Arduino, disposa de convertidors de 10 bits per la qual cosa la nostra resolució és de 2^10 = 1.024 i en el cas del DUE de 2^12 = 4.096. Però fins ara no hem vist a quina velocitat podem prendre mostres amb el nostre Arduino. Ho comprovarem, amb aquest mateix circuit.
Tenim una funció anomenada millis() que ens indica en mil·lisegons el temps transcorregut des que vam iniciar Arduino i la podem usar per veure quantes mostres podem prendre per segon.
//Codi: ARD_05_02}
void setup()
{
Serial.begin(9600);
}
void loop()
{
unsigned long T ;
int n = 0 ;
T = millis();
while (millis() <= T + 1000) // Mentre no passi un Segon = 1000 ms
{
analogRead( A5) ;
n++ ; // Comptem cada vegada que llegim
}
Serial.println(n);
}
- Hem usat un unsigned long per guardar millis perquè és el tipus que Arduino usa internament per al seu rellotge. Seria un error manejar millis amb un int perquè el seu valor màxim és 32.767 i mesurant mil·lisegons el comptador desbordaria en poc més de 32 segons.
Si executa aquest programa en un Arduino UNO et donarà, més o menys, un resultat de 8.940 mostres o lectures per segon. No està malament.
És adequat per mostrejar senyals que no varien massa ràpid amb el temps, com són gairebé tots els sensors habituals en la indústria, però que es quedarà curt si voleu mostrejar senyals d’àudio.
- Per jugar amb àudio és millor usar un Arduino DUE. Té una velocitat de rellotge 4 vegades més ràpida (us farà falta), capacitat de mostreig a velocitat d’àudio (40 Khz) i autèntics convertidors DAC (digital to analog converters).
- De fet no és complicat augmentar la velocitat de mostreig fins a unes 20.000 mostres per segon amb un Arduino UNO, però per això hem de pontar Arduino i saltar a programar el xip interior Atmega 328. No és moment per això, però hi ha formes.
Resum de la lliçó
- Ja coneixem l’ús del potenciòmetre.
- Hem presentat els conceptes bàsics en la conversió analògica a digital.
- Vam aprendre a llegir les portes analògiques d’Arduino.
- Sabem que podem llegir les portes analògiques unes 8.900 vegades per segon amb una resolució de 10 bits, és a dir entre 0 i 1.024.
- Hem conegut la funció millis().