Hardware

24/12/2021

# Introducción

En la unidad didáctica dedicada a Thumby API se ha podido ver cómo acceder a la pantalla, las teclas y el buzzer. Esos son los elementos comunes entre Thumby y PiConsole, por lo que al programar en MicroPython nos convendrá aprovechar esta API. Pero PiConsole tiene varios dispositivos adicionales respecto a Thumby. Estos dispositivos los manejaremos haciendo uso de la API general de Raspberry Pi Pico para manejar las entradas y salidas de propósito general o GPIO.

# Dispositivos Thumby

Al utilizar la Thumby API, queda oculto a nuestra vista qué pines utilizan pantalla, teclas y buzzer. Vamos a indicar a continuación la asignación y configuración de pines GPIO de Pico para estos elementos como referencia por si se quieren utilizar directamente en lugar de emplear la API. También nos hará falta esta información si programamos con un entorno distinto de MicroPython como Arduino IDE o VS Code. Las teclas como se puede ver en la tabla, hay que configurarlas con PULL_UP, ya que cuando se pulsan, conectan la entrada correspondiente a GND (consultar esquemático al final de este documento).

Inmediatamente tras ellos (desde potenciómetro incluido hacia abajo) se indican también los pines GPIO del resto de dispositivos de PiConsole. Aunque los veremos más tarde por separado, se hace así para que sirva a la vez como referencia completa del conexionado del hardware de PiConsole:

Dispositivo Pin Pico Sentido Pico Pin dispositivo
Pantalla OLED GP16 OUT DC
Pantalla OLED GP17 OUT CS
Pantalla OLED GP18 OUT SCL (SCK)
Pantalla OLED GP19 OUT SDA (MOSI)
Pantalla OLED GP20 OUT RES
Teclas GP11 IN PULL_UP A
Teclas GP7 IN PULL_UP B
Teclas GP12 IN PULL_UP Derecha
Teclas GP13 IN PULL_UP Izquierda
Teclas GP14 IN PULL_UP Abajo
Teclas GP15 IN PULL_UP Arriba
Buzzer GP10 OUT +
Potenciómetro ADC1 IN Terminal central
Fotorresistencia LDR ADC2 IN
LEDs GP8 OUT Amarillo
LEDs GP9 OUT Rojo
LEDs GP21 OUT Verde
LEDs GP22 OUT IR
Conector GPIO PiConsole GND Power Pin #1
Conector GPIO PiConsole 3.3V Power Pin #2
Conector GPIO PiConsole ADC0 IN Pin #3
Conector GPIO PiConsole GP0 IN/OUT Pin #4
Conector GPIO PiConsole GP6 IN/OUT Pin #5
Conector GPIO PiConsole GP1 IN/OUT Pin #6
Conector GPIO PiConsole GP5 IN/OUT Pin #7
Conector GPIO PiConsole GP2 IN/OUT Pin #8
Conector GPIO PiConsole GP4 IN/OUT Pin #9
Conector GPIO PiConsole GP3 IN/OUT Pin #10
Conector GPIO PiConsole GND Power Pin #11
Conector GPIO PiConsole VSYS Power Pin #12

# LEDs

Para utilizar los LEDs, definiremos un objeto de tipo Pin digital de salida sobre el GPIO correspondiente. Por ejemplo para manejar el LED rojo lo haremos de la siguiente forma:

from machine import Pin
led_rojo = Pin(9, Pin.OUT)
1
2

A partir de entonces, si queremos encenderlo sólo tendremos que invocar los métodos high() o low() del objeto Pin, por ejemplo:

led_rojo.high()   # Enciende el LED rojo
led_rojo.low()    # Apaga el LED rojo
1
2

El LED de Infrarrojos se puede manejar de la misma manera, pero hay que recordar que no emite luz visible. La mayoría de las cámaras de móvil registran su actividad, por lo que nos pueden servir para comprobar si funciona. Este tipo de LED se suele utilizar para enviar información codificada a aparatos con un receptor de infrarrojos. Para ello lo habitual será utilizar una librería que implemente el protocolo que soporta el aparato con que queramos comunicarnos, como las que se encuentran en este listado (opens new window).

# Potenciómetro

El potenciómetro es uno de los dos componentes analógicos incorporados a PiConsole. Está montado en modo divisor de tensión (opens new window), de manera que independientemente de su valor (el instalado en PiConsole es de 10kΩ) la tensión que se medirá en su terminal central, será siempre un valor intermedio entre 0V y 3,3V proporcional a la posición del cursor.

Si nos fijamos en los pines que tiene el potenciómetro veremos que son tres. Los dos pines de los extremos están conectados a ambos lados de una resistencia con forma de pista curvada. Sobre la pista descansa un patín o cursor que hace contacto en algún punto del recorrido de la pista. El cursor está conectado al pin central. Dependiendo de la posición del mismo, que podemos desplazar con el vástago, la medida de la resistencia entre el pin central y cualquiera de los laterales, variará. Si abriéramos el potenciómetro veríamos algo así:

Si conectamos los pines de los extremos (A y B en la figura anterior) a la masa (0V) y tensión de referencia de Pico (3,3V) respectivamente, conseguiremos que el pin central (W en la figura) "lea" una tensión intermedia entre ambas, más o menos alta en función de la posición del cursor. El esquema eléctrico equivalente sería el siguiente:

R1+R2R_1 + R_2 será la resistencia total de la pista del potenciómetro, que recibe la tensión completa de 3,3V entre sus extremos A y B. W medirá una tensión intermedia dada por la siguiente fórmula:

Vout=VinR2(R1+R2)V_{out} = V_{in} \cdot \frac {R_2} {(R_1 + R_2)}

Si VinV_{in} es 3,3V, en un extremo del giro del potenciómetro, R1R_1 valdrá 0Ω y por tanto VoutV_{out} será igual a VinV_{in}, es decir 3,3V. En el otro extremo del giro del potenciómetro, R2R_2 valdrá 0 y por tanto VoutV_{out} resultará 0V. En cualquier otro punto del giro del potenciómetro, VoutV_{out} tendrá un valor intermedio. El circuito anterior es muy utilizado en electrónica y por eso tiene el nombre divisor de tensión (opens new window) que habíamos mencionado antes. Se denomina así porque consigue dividir una tensión dada en dos tensiones más pequeñas.

Como comentábamos al principio, los terminales extremos del potenciómetro (A y B en las figuras anteriores) están conectados a 0V y 3,3V. El central está conectado a uno de los tres pines de Pico conectados a conversores analógico-digitales (opens new window) (ADC). En realidad en Pico hay 5 ADCs, pero sólo tres están disponibles en los pines exteriores de la placa. Son los pines GP26, GP27 y GP28 que también se designan a veces como GP26_ADC0, GP27_ADC1 y GP28_ADC2. El cuarto canal (ADC3) está conectado al pin VSYS donde se aplica la tensión de alimentación principal de la placa (cuando no alimentamos por USB). El quinto canal (ADC4) está internamente conectado a un sensor de temperatura dentro del microcontrolador, por lo que sólo puede ser usado para esta función. El terminal central del potenciómetro instalado en PiConsole está conectado al pin GP27_ADC1 de Pico.

Al igual que con los pines digitales, los analógicos se manejan con la librería machine. El sencillo código siguiente configura el pin GP27_ADC1 para el ADC y luego entra en un bucle donde lo lee e imprime su valor por consola cada 2 segundos:

import machine
import utime

pot_adc = machine.ADC(1)

while True:
    print(pot_adc.read_u16())
    utime.sleep(2)
1
2
3
4
5
6
7
8

Al ejecutar el código veremos como aparecen en la consola números enteros entre 0 y 65535 que varían si giramos el potenciómetro. En realidad se supone que estamos midiendo una tensión analógica entre 0 y 3,3V pero en cambio estamos leyendo números enteros entre 0 y 65535 (de 16 bit, aunque internamente el ADC de Pico es de 12 bit, MicroPython lo interpola a 16 bit por compatibilidad con otras placas con ADCs más precisos). Esto se explica porque el microcontrolador sólo es capaz de manejar datos digitales y el ADC lo que hace es precisamente convertir los valores analógicos en digitales. Es responsabilidad nuestra, sabiendo la magnitud física del mundo real que el ADC está muestreando digitalmente, el convertir estos valores digitales a los analógicos correspondientes.

En este caso, como hemos dicho sabemos que la correspondencia es:

Digital Analógico
0 0V
65535 3,3V

Por tanto nos corresponde hacer la adaptación en el código del valor entero leído por el ADC. Se trata de una conversión lineal sencilla con origen en 0 (una regla de tres):

Vout=3,3lecturaADC65535V_{out} = 3,3 \cdot \frac {lectura_{ADC}} {65535}

import machine
import utime

pot_adc = machine.ADC(1)

while True:
    v_analog = 3.3 * pot_adc.read_u16() / 65535
    print(v_analog)
    utime.sleep(2)
1
2
3
4
5
6
7
8
9

Si ejecutamos el programa anterior, esta vez veremos por consola los valores esperados. Merece la pena comentar como curiosidad que seguramente los valores que estaremos viendo en la consola cambian continuamente a pesar de no estar girando el potenciómetro. Bienvenidos al mundo analógico.

# Fotorresistencia LDR

La fotorresistencia es el segundo componente analógico que hay instalado en PiConsole. De forma parecida al potenciómetro, se ha configurado en forma de divisor de tensión (opens new window) apoyándose en una resistencia constante para evitar cortocircuitos cuando baja mucho su resistencia al incidir mucha luz (de hecho se acerca a 0Ω cuando la luz es muy intensa). El circuito utilizado en PiConsole es el siguiente que como podemos ver está conectado al pin GP28_ADC2 de Pico:

VDDA es la tensión de referencia del conversor analógico digital de Pico que como se ha mencionado antes es 3,3V. GNDA es la masa o tierra de referencia del mismo circuito que es de 0V. Según el circuito anterior, la tensión medida en ADC2 será intermedia entre estos dos valores, más cercana a uno o a otro en función de la resistencia variable que ofrece la fotorresistencia en función de la luz que recibe que varía entre 0Ω (mucha luz) y aproximadamente 100kΩ (poca luz). Esto en la tensión medida en ADC2 se traducirá respectivamente en 0V y muy cerca de 3,3V.

El programa para leer la fotorresistencia en Python será el mismo que hemos visto en el caso del potenciómetro, sin más que cambiar el canal ADC a leer por el 2 (machine.ADC(2)).

# GPIO

Raspberry Pi Pico tiene 26 entradas/salidas de propósito general (General Purpose Input Output ~ GPIO). Todas las que no han sido conectadas a los componentes que hemos descrito en este documento, se han hecho disponibles a través de la tira de pines hembra de 2x6 que hay en el lateral izquierdo de PiConsole. La correspondencia de cada pin de este particular GPIO de PiConsole se puede encontrar en la tabla del apartado Dispositivos Thumby. El pin #1 está marcado en la carcasa de plástico de PiConsole con un punto.

Lo siguiente es un esquema más explícito de la correspondencia de pines, siendo el pin #1 el GND que hay arriba a la derecha.

Esquemas

Se adjunta a continuación el esquemático completo de PiConsole para ofrecer una referencia más precisa sobre cómo están conectados los distintos dispositivos:

Esquemático PiConsole

También un PDF que contiene el esquema del GPIO con la escala correcta para que tenga las mismas dimensiones que el conector GPIO de PiConsole. Si se imprime en una pegatina y se recorta, se puede pegar junto al conector en la mitad inferior de la carcasa para tener más a mano la referencia de la correspondencia de pines:

Esquema GPIO PiConsole

Última actualización: 4/1/2022, 10:28:06