El puerto analógico situado en la parte trasera se usa usualmente para conectar un par de joysticks (analógicos también), pero puede servir para medir otras tensiones por cualquiera de los cuatro canales de los que consta su conversor A/D. El ejemplo usual de conexión lo podemos ver en la "Advanced User Guide":
La tensión de referencia VREF es de 1.8 voltios, el máximo voltaje que podemos leer a través de los pines CH0..CH3. En el caso de un joystick analógico tenemos un potenciómetro en cada eje que actúa como divisor de esta tensión de referencia, leyendo en los pines de entrada valores entre 0 y 1.8 voltios según la posición de la palanca. En el ejemplo del termómetro la idea es similar, sustituyendo el potencíometro por el conjunto termistor + resistencia, que harán variar la tensión según cambie la temperatura.
El termistor que tenía por aquí es un NTC (su resistencia disminuye cuando la temperatura aumenta) cuya resistencia a 25ºC es de 4700 ohmios. Creo que me vino en uno de esos kits de iniciación de arduino, y no le había dado uso hasta ahora.
El esquema de conexión al ordenador es bien sencillo, creando un divisor de tensión con otra resistencia. La elegí también de 4.7K para que a temperatura ambiente dieran mas o menos la mitad de VREF en la conexión al canal 0 y poder verificar fácilmente con el polímetro que el circuito era correcto:
Sobre la protoboard queda un circuito de lo mas simple. El termistor lo soldé al final de un tramo de cable para mayor comodidad a la hora de hacer las pruebas:
Con la parte hardware ya montada faltaba la parte mas divertida: leer el valor de tensión en voltios y convertirlo a su correspondiente valor en grados Celsius. Lo primero era lo mas sencillo, ya que la instrucción ADVAL del BASIC te permite consultar el valor de cada uno de los cuatro canales, devolviendo un entero entre 0 y 65520 proporcional al rango de tensiones de 0 a 1.8 voltios.
Lo mas difícil para mi fue la conversión a grados Celsius que se consigue aplicando la ecuación de Steinhart-Hart, una total desconocida para mi. Afortunadamente encontré el estupendo artículo Como utilizar un termistor o sensor de temperatura con Arduino: Código para los NTC/PTC donde se explica todo eso perfectamente. Gracias a él pude obtener la beta del termistor (ya que no tenía su datasheet) y de hecho toda la conversión a grados centígrados es una adaptación tal cual del código que aparece en esa página. Todo mi agradecimiento y reconocimiento para su autor.
El programa en BASIC simplemente lee constantemente el canal 0, convierte el valor de tensión en grados centrígrados y lo muestra en pantalla, tanto en formato numérico como en una sencilla barra lateral que simula un termómetro clásico. También va guardando las temperaturas máximas y mínimas que ha ido leyendo, a modo informativo. Usa el modo 7 "teletexto", para aprovechar ese formato de letra de doble altura que permite.
Código: Seleccionar todo
10 REM LECTURA DE VARIABLES ANALOGICAS
20 REM EJEMPLO USANDO UN TERMISTOR
30 MODE 7
31 REM OCULTAR CURSOR
32 VDU 23,1,0;0;0;0;
35 REM FORMATO DE LOS VALORES NUMERICOS DEL TERMOMETRO (SIN DECIMALES)
40 @%=&90A
45 REM CABECERA Y ETIQUETAS ESTATICAS
50 PRINT TAB(4,3);"BBC MICRO TERMOMETRO"
60 PRINT TAB(1,2);CHR$(130);"************************"
70 PRINT TAB(1,4);CHR$(130);"************************"
80 PRINT TAB(1,9);CHR$(141);"TEMPERATURA: "
90 PRINT TAB(1,10);CHR$(141);"TEMPERATURA: "
100 PRINT TAB(2,14);"T. MAXIMA: "
110 PRINT TAB(2,17);"T. MINIMA: "
120 REM TERMOMETRO
130 PRINT TAB(30,1);"100 -"
140 PRINT TAB(32,21);"0 -"
150 PRINT TAB(30,23);"-10 -"
160 ESCALA = 90
170 FOR I=3 TO 19 STEP 2
180 PRINT TAB(29,I);CHR$(135);CHR$(140);ESCALA;" -"
190 ESCALA = ESCALA - 10
200 NEXT I
1000 REM DEFINICION DE CONSTANTES
1010 REM BETA DEL TERMISTOR
1020 B = 3950
1030 REM RESISTENCIA DEL DIVISOR
1040 RESISTOR = 4700
1050 REM VOLTAJE DE REFERENCIA
1060 VOLTAGE = 1.8
1070 REM CONVERSION A GRADOS KELVIN
1080 K = 273.15
1090 REM CONSTANTE E
1100 E = 2.718281828459045
1110 UNODIVR = 1/(RESISTOR*(E^(B*(-1)/298.15)))
1120 REM VARIABLE TEMPERATURA MAXIMA
1130 TEMPMAX = 0
1140 REM VARIABLE TEMPERATURA MINIMA
1150 TEMPMIN = 1000
1160 REM FORMATO DE LOS VALORES NUMERICOS (2 DECIMALES)
1170 @%=&20209
2000 REM LECTURA DEL PUERTO ANALOGICO
2010 T = ADVAL(1)
2020 REM CALCULO DEL VOLTAJE EN CANAL 1
2030 V2 = (VOLTAGE*T)/65520
2040 REM CALCULO DE LA RESISTENCIA DEL TERMISTOR
2050 R1A = (VOLTAGE*RESISTOR)/V2
2060 R1 = R1A - RESISTOR
2070 REM CALCULO DE LA TEMPERATURA EN GRADOS KELVIN
2080 TEMPK = B/LN(R1*UNODIVR)
2090 REM CONVERSION A CELSIUS
2100 TEMPC = TEMPK - K
2110 REM GUARDAR TEMPERATURA MAXIMA
2120 IF TEMPC > TEMPMAX THEN TEMPMAX = TEMPC
2130 REM GUARDAR TEMPERATURA MINIMA
2140 IF TEMPC < TEMPMIN THEN TEMPMIN = TEMPC
3000 REM REPINTAR TEMPERATURAS
3010 PRINT TAB(13,9);CHR$(141);CHR$(131);TEMPC;" "
3020 PRINT TAB(13,10);CHR$(141);CHR$(131);TEMPC;" "
3030 PRINT TAB(12,14);CHR$(129);TEMPMAX;" "
3040 PRINT TAB(12,17);CHR$(132);TEMPMIN;" "
4000 REM PINTAR BARRA TERMOMETRO
4010 INDICADOR=22-(TEMPC/5)
4020 FOR I=1 TO 23
4030 IF I=INT(INDICADOR) AND (I+0.5)<INDICADOR THEN PRINT TAB(35,I);CHR$(145);CHR$(252)
4040 IF I=INT(INDICADOR) AND (I+0.5)>INDICADOR THEN PRINT TAB(35,I);CHR$(145);CHR$(255)
4050 IF I>INT(INDICADOR) THEN PRINT TAB(35,I);CHR$(145);CHR$(255)
4060 IF I<INT(INDICADOR) THEN PRINT TAB(35,I);CHR$(145);CHR$(160)
4070 NEXT I
4080 GOTO 2000
La primera prueba fue prometedora, comparando con el valor que me daba la sonda del polímetro a temperatura ambiente:
Probando a meter la sonda en agua a distintas temperaturas (previamente envuelta en film transparente) los valores se mantenían siempre parejos a la lectura del polímetro, con menos de un grado de diferencia, así que el invento parecía funcionar razonablemente bien
Para el test definitivo eché mano de mi ingeniero de pruebas, que le encanta ayudar a su padre en estos fregaos. Luego le cuenta a su profe lo que hace con su papi en casa y la pobre se debe quedar con una cara...
https://www.youtube.com/watch?v=6xXVY598kvw
Cada día me tiene mas enamorao esta maquinita. Entre lo de las EEPROMs del otro día y esto, es el sistema que mas estoy usando desde que llegó a casa estas navidades. Su BASIC me parece una auténtica maravilla, con cosas tan tremendas como poder incluir código ensamblador en mitad de un listado. Y desde luego el hecho de elegirlo como el ordenador educativo de toda una generación me parece un acierto total. No solo en el aula de informática sino también en el laboratorio, con esa capacidad para monitorizar variables de un experimento sin necesidad de recurrir a hardware externo.
Ahora tengo ganas de mirar también ese puerto de usuario con entrada/salida digital, aunque sea para encender y apagar unos cuantos leds desde el BASIC. Cualquier excusa es buena para enchufar un rato este cacharrín