Adquisición de valores analógicos con el BBC Micro

Avatar de Usuario
Gatuso
Mensajes: 145
Registrado: 06 Ene 2014 11:55
Agradecido : 1 vez
Agradecimiento recibido: 15 veces

Adquisición de valores analógicos con el BBC Micro

Mensajepor Gatuso » 15 Mar 2015 00:12

Este es uno de esos miniproyectos de fin de semana que tenía muchas ganas de hacer, desde antes incluso de tener un BBC Micro cuando leía sobre sus capacidades de expansión e interfaces con el exterior. Es un pequeño ejemplo de como usar el conversor analógico/digital integrado en estas máquinas, conectando un termistor al puerto analógico para conseguir leer temperaturas y mostrarlas en pantalla mediante un sencillo interfaz. El propósito de todo esto no era mas que aprender mas sobre este fantástico micro, escribir mi primer programilla en su BASIC y sobre todo pasármelo pipa cacharreando, que de eso se trata al fin y al cabo -thumbup

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":

Imagen

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.

Imagen

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:

Imagen

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:

Imagen

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.

Imagen

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:

Imagen

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 -thumbup

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... -grin

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 -biggrin

Avatar de Usuario
ron
Mensajes: 17666
Registrado: 28 Oct 2010 14:20
Ubicación: retrocrypta
Agradecido : 757 veces
Agradecimiento recibido: 803 veces

Re: Adquisición de valores analógicos con el BBC Micro

Mensajepor ron » 15 Mar 2015 01:02

Gatuso, me encanta el post, me ha gustado muchisimo.

Recuerdo del manual del Spectrum la formula para convertir fahrenheit a celsius, siendo el valor de fahrenheit de 95.

celsius = ( 5 / 9 ) * ( fahrenheit - 32 )

Ademas haber tenido la inicitativa de probar la entrada analogica con el BBC Micro le da al post un plus muy valorable.

Gracias por compartirlo, estupendo trabajo. Ya ves, yo tambien creo que el BBC Micro es un gran cacharro

Avatar de Usuario
minter
Mensajes: 1678
Registrado: 22 Jul 2014 18:51
Agradecido : 937 veces
Agradecimiento recibido: 426 veces

Re: Adquisición de valores analógicos con el BBC Micro

Mensajepor minter » 15 Mar 2015 11:52

¿Pero en que provincia vives, para tener la temperatura de casa a 24º y al guaje lo llevas con cuello de cisne?????
Esta temperatura la ve el exministro de industria (el de las bombillas) y le da un sincope!!! :D

Avatar de Usuario
Gatuso
Mensajes: 145
Registrado: 06 Ene 2014 11:55
Agradecido : 1 vez
Agradecimiento recibido: 15 veces

Re: Adquisición de valores analógicos con el BBC Micro

Mensajepor Gatuso » 15 Mar 2015 16:01

¡Jajaja! Yo soy de la sección parleña del foro, y como el salón da a la estepa madrileña siempre tenemos un solecito bien rico calentándonos la casa. De todas formas tenía todo encima del ordenador y el propio calor que desprendía debía subir la temperatura un poco, porque el termostato de la calefacción debía marcar a lo sumo 21 grados.

BlackHole
Mensajes: 808
Registrado: 03 Ago 2011 23:07
Ubicación: Aluche, Madrid
Agradecido : 4 veces
Agradecimiento recibido: 66 veces

Re: Adquisición de valores analógicos con el BBC Micro

Mensajepor BlackHole » 15 Mar 2015 20:12

Al menos tienes calefacción... yo aquí en Aluche tengo ahora la habitación a 17 y bajando estrepitosamente. -kenny_h4h_sp


Volver a “BBC Micro & Electron”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado