La posibilidad de utilizar la tarjeta Raspberry Pi como inagotable fuente para realizar prácticas – tanto software como hardware – nos lleva hoy a mostraros una interesante práctica de electrónica digital que basa su operativa en la Raspberry Pi. En concreto, vamos a conectar a la misma un DISPLAY de 7 segmentos y a explicar cómo se maneja este desde la Raspi.
Queda claro que los más versados en electrónica digital ya conocerán la manera de hacerlo, pero no obstante los que están empezando a ampliar conocimientos hardware y software agradecerán seguramente estas explicaciones. Espero que a todos os sea de utilidad.
Para realizar los montajes propuestos podemos obtener los materiales precisos en cualquier comercio del ramo electrónico o bien adquirir el Kit para Prácticas disponible en la página Webtronika.
Lo que vamos a comentar a continuación puede resumirse en:
* Teoría sobre la operativa de los DISPLAY de 7 segmentos.
* Posibilidades de control del DISPLAY de 7 segmentos.
* Control del DISPLAY en modo directo (Hardware/Software)
* Control del DISPLAY vía chip BCD/7 (Hardware/Software)
Vamos allá …
Teoría sobre la operativa de los DISPLAY de 7 segmentos.
La forma en que manejamos un display de 7 segmentos es controlando los diodos LED que constituyen cada uno de ellos. Así que las cifras que en ellos aparecen responden a un conexionado interno de los 7 segmentos (8 en realidad si tenemos en cuenta el punto digital [DP]) y que – según modelo y fabricante – puede responder a un conexionado en ánodo común o en cátodo común. En nuestro montaje nos hemos decantado por un DISPLAY 7s de tipo cátodo común. Su conexionado interno sería algo como esto:
Las conexiones con un diodo LED deben incluir una resistencia limitadora. En nuestro caso hemos optado por un array de resistencias para no tener que conectar las 8 resistencias de forma independiente.
Cada resistencia utilizada tiene un valor de 330 ohmios, lo que limitará de forma adecuada el consumo de las patillas utilizadas (puerto GPIO de la Raspberry Pi). El encapsulado del array coincide con el formato (DIL) de un chip típico, aunque internamente su distribución es esta:
Posibilidades de control del DISPLAY de 7 segmentos.
Los segmentos del DISPLAY suelen responder a una nomenclatura como esta:
El DISPLAY de 7 segmentos utilizado en esta práctica responde al siguiente patillaje y distribución de segmentos (no hemos de olvidar el cátodo [K] común, el cual esta presente en las patillas 3 y 8 y que están unidas internamente) :
Cuando utilicemos las patillas del puerto GPIO de nuestra Raspberry para el control del DISPLAY 7s tenemos 2 opciones posibles, por un lado podemos utilizar 8 patillas en modo salida y gobernar los 7+1 segmentos del DISPLAY, o bien utilizar un chip decodificador BCD a 7 segmentos y ahorrarnos unas patillas, ya que el control del mismo precisa de solo 4 salidas digitales.
La primera opción añade la ventaja de que no estamos anclados a las 10 (1 .. 0) cifras tradicionales, sino que podremos incluso «crear» nuestras propias visualizaciones con tal solo activar vía software los segmentos adecuados. Además, al controlar el punto digital (DP) podemos efectuar alguna indicación alternativa mediante el mismo.
Si por el contrario usamos el chip decodificador (4511) tendremos que conformarnos estrictamente con la visualización de las 10 cifras y, además, no tendremos el control sobre el LED-DP. Pero eso si, ahorraremos patillas al puerto GPIO.
Vamos a ver las dos formas de implementar el circuito.
Control del DISPLAY en modo directo (Hardware/Software)
Los materiales utilizados para el montaje son
MATERIALES UTILIZADOS
1 2 3 4 5 |
1 Tarjeta Raspberry Pi ( con s.o. Linux Wheezy instalado). 1 Placa prototipo pequeña. 1 array de resistencias (DIL) de 330 ohmios. 1 DISPLAY LED de 7 segmentos (cátodo común). Varios cables para prácticas. |
El esquema de conexionado del DISPLAY directamente al puerto GPIO de la Raspberry ( sin olvidarnos de las consabidas resistencias limitadoras ) responde a este esquema:
Una vez conectado y revisado el circuito podemos probarlo mediante el programa Python que aquí os proponemos (y que puede descargarse al final de esta entrada). Para su puesta en marcha hemos de tener en cuenta:
Las librerías (python) para el control del puerto GPIO vienen ya pre-instaladas en el sistema operativo Raspbian. Conviene, no obstante, estar actualizado a la última versión (Wheezy).
Este programa puede copiarse tal como está y guardarse en un fichero llamado pi7segmentos.py en nuestra Raspberry
Pi.
Para ponerlo en marcha hemos de seguir cuidadosamente estos pasos:
(1) Tener el sistema operativo Raspbian Wheezy instalado en nuestra Raspberry Pi.
(2) Efectuar correctamente el conexionado del circuito a nuestra Raspberry Pi.
(3) Vamos al directorio del programa y damos al fichero pi7segmentos.py permisos de ejecución con
sudo chmod 777 pi7segmentos.py
(5) En un terminal, desde el directorio del programa, ejecutamos (IMPORTANTE : como root)
sudo python pi7segmentos.py
PROGRAMA EJEMPLO (pi7segmentos.py)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 |
# ========================================= # - Programa para manejo de DISPLAY-LED - # - (salida directa a DISPLAY) # - utiliza 8 salidas de la Raspberry Pi # ----------------------------------------- # - J.C.G.P. - (c) Webtronika 2013 - # ========================================= #!/usr/bin/python import sys import curses import time import RPi.GPIO as GPIO # --------------------------------------------------------------- # - Rutina de configuracion de puertos en GPIO ------------------ # --------------------------------------------------------------- def confiGPIO(param1): GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(14, GPIO.OUT) GPIO.setup(15, GPIO.OUT) GPIO.setup(18, GPIO.OUT) GPIO.setup(23, GPIO.OUT) GPIO.setup(24, GPIO.OUT) GPIO.setup(25, GPIO.OUT) GPIO.setup(8, GPIO.OUT) GPIO.setup(7, GPIO.OUT) return 0 # --------------------------------------------------------------- # - Rutina RESET-DISPLAY ----------------------------------------- # - param1=0 ==> DISPLAY OFF // param1=1 ==> DISPLAY ON # --------------------------------------------------------------- def RESET_DISPLAY(param1): if param1 == 0: GPIO.output(14, False) GPIO.output(15, False) GPIO.output(18, False) GPIO.output(23, False) GPIO.output(24, False) GPIO.output(25, False) GPIO.output(8, False) GPIO.output(7, False) else: GPIO.output(14, True) GPIO.output(15, True) GPIO.output(18, True) GPIO.output(23, True) GPIO.output(24, True) GPIO.output(25, True) GPIO.output(8, True) GPIO.output(7, True) return 0 # --------------------------------------------------------------- # - Rutina TEST-DISPLAY ----------------------------------------- # - param1= tiempo de retardo en ms. # --------------------------------------------------------------- def TEST_DISPLAY(param1): RESET_DISPLAY(0) GPIO.output(14, True) time.sleep(param1) GPIO.output(15, True) time.sleep(param1) GPIO.output(18, True) time.sleep(param1) GPIO.output(23, True) time.sleep(param1) GPIO.output(24, True) time.sleep(param1) GPIO.output(25, True) time.sleep(param1) GPIO.output(8, True) time.sleep(param1) GPIO.output(7, True) return 0 # --------------------------------------------------------------- # - Rutina Muestra cifra en DISPLAY ----------------------------- # - param1= cifra a mostrar # --------------------------------------------------------------- def SHOW_DISPLAY(param1): RESET_DISPLAY(0) if param1 == 48: # numero 0 GPIO.output(14, True) # segm. a GPIO.output(15, True) # segm. b GPIO.output(18, True) # segm. c GPIO.output(23, True) # segm. d GPIO.output(24, True) # segm. e GPIO.output(25, True) # segm. f elif param1 == 49: # numero 1 GPIO.output(15, True) # segm. b GPIO.output(18, True) # segm. c elif param1 == 50: # numero 2 GPIO.output(14, True) # segm. a GPIO.output(15, True) # segm. b GPIO.output(23, True) # segm. d GPIO.output(24, True) # segm. e GPIO.output(8, True) # segm. g elif param1 == 51: # numero 3 GPIO.output(14, True) # segm. a GPIO.output(15, True) # segm. b GPIO.output(18, True) # segm. c GPIO.output(23, True) # segm. d GPIO.output(8, True) # segm. g elif param1 == 52: # numero 4 GPIO.output(15, True) # segm. b GPIO.output(18, True) # segm. c GPIO.output(25, True) # segm. f GPIO.output(8, True) # segm. g elif param1 == 53: # numero 5 GPIO.output(14, True) # segm. a GPIO.output(18, True) # segm. c GPIO.output(23, True) # segm. d GPIO.output(25, True) # segm. f GPIO.output(8, True) # segm. g elif param1 == 54: # numero 6 GPIO.output(14, True) # segm. a GPIO.output(18, True) # segm. c GPIO.output(23, True) # segm. d GPIO.output(24, True) # segm. e GPIO.output(25, True) # segm. f GPIO.output(8, True) # segm. g elif param1 == 55: # numero 7 GPIO.output(14, True) # segm. a GPIO.output(15, True) # segm. b GPIO.output(18, True) # segm. c elif param1 == 56: # numero 8 GPIO.output(14, True) # segm. a GPIO.output(15, True) # segm. b GPIO.output(18, True) # segm. c GPIO.output(23, True) # segm. d GPIO.output(24, True) # segm. e GPIO.output(25, True) # segm. f GPIO.output(8, True) # segm. g elif param1 == 57: # numero 9 GPIO.output(14, True) # segm. a GPIO.output(15, True) # segm. b GPIO.output(18, True) # segm. c GPIO.output(23, True) # segm. d GPIO.output(25, True) # segm. f GPIO.output(8, True) # segm. g elif param1 == 46: # DP (punto decimal) GPIO.output(7, True) # segm. DP return 0 # --------------------------------------------------------------- # ############################################################### # - PROGRAMA PRINCIPAL ------------------------------------------ # # Utiliza curses para visualizar salida a pantalla # # ############################################################### # --------------------------------------------------------------- stdscr = curses.initscr() curses.cbreak() curses.start_color() curses.init_pair(1, curses.COLOR_WHITE, curses.COLOR_BLUE) curses.init_pair(2, curses.COLOR_YELLOW, curses.COLOR_BLACK) hsize = curses.COLS vsize = curses.LINES curses.curs_set(0) curses.noecho stdscr.border(0) stdscr.keypad(1) stdscr.nodelay(1) confiGPIO(0) RESET_DISPLAY(0) try: stdscr.bkgd(curses.color_pair(2)) while True: # Rutina principal del programa char = stdscr.getch() if (char == 81 or char == 113): # Teclas Q/q break elif (char == 84 or char == 116): # Teclas T/t TEST_DISPLAY(0.05) elif (char == 65 or char == 97): # Teclas A/a RESET_DISPLAY(1) elif (char == 68 or char == 100): # Teclas D/d RESET_DISPLAY(0) elif (char >= 48 and char <= 57) or (char == 46): # Teclas NUMERICAS y DP SHOW_DISPLAY(char) else: stdscr.addstr(vsize/6, (hsize/2)-24," ---- Test DIRECTO de DISPLAY LED ---- ") stdscr.addstr((vsize/5)+4, (hsize/2)- 22,"[T] - efectua un TEST del DISPLAY") stdscr.addstr((vsize/5)+6, (hsize/2)- 22,"[A] - pone a 1 (ACTIVA) todo el DISPLAY") stdscr.addstr((vsize/5)+8, (hsize/2)- 22,"[D] - pone a 0 (DESACTIVA) todo el DISPLAY") stdscr.addstr((vsize/5)+10, (hsize/2)- 22,"[1..0] - pulsa numero para mostrar en DISPLAY") stdscr.addstr(vsize-4, (hsize/2)- 22," Pulsa [Q] para salir ") stdscr.refresh() finally: curses.nocbreak() stdscr.keypad(0) curses.echo() curses.endwin() |
Control del DISPLAY vía chip BCD/7 (Hardware/Software)
Los materiales utilizados para el montaje son
MATERIALES UTILIZADOS
1 2 3 4 5 6 |
1 Tarjeta Raspberry Pi ( con s.o. Linux Wheezy instalado). 1 Placa prototipo pequeña. 1 array de resistencias (DIL) de 330 ohmios. 1 DISPLAY LED de 7 segmentos (cátodo común). 1 chip decodificador BCD/7 4511. Varios cables para prácticas. |
1 |
1 |
El esquema de conexionado del DISPLAY al puerto GPIO de la Raspberry vía chip BCD/7 (4511) responde a este esquema:
También, una vez conectado y revisado podremos probarlo mediante el programa Python propuesto (también disponible al final de esta entrada). La forma de ponerlo en marcha es similar a lo comentado para el software anterior.
Tendremos un fichero llamado pi4511.py un directorio de nuestra Raspberry
Pi, y para ponerlo en marcha hacemos de nuevo:
(1) Tener el sistema operativo Raspbian Wheezy instalado en nuestra Raspberry Pi.
(2) Efectuamos correctamente el conexionado del circuito a nuestra Raspberry Pi.
(3) Vamos al directorio del programa y damos al fichero pi4511.py permisos de ejecución con
sudo chmod 777 pi4511.py
(5) En un terminal, desde el directorio del programa, ejecutamos (IMPORTANTE : como root)
sudo python pi4511.py
PROGRAMA EJEMPLO (pi4511.py)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
# =================================================== # - Programa para control de DISPLAY-LED via chip - # - (control via chip 4511) # - utiliza 4 salidas de la Raspberry Pi # --------------------------------------------------- # - J.C.G.P. - (c) Webtronika 2013 - # =================================================== #!/usr/bin/python import sys import curses import time import RPi.GPIO as GPIO # --------------------------------------------------------------- # - Rutina de configuracion de puertos en GPIO ------------------ # --------------------------------------------------------------- def confiGPIO(param1): GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(14, GPIO.OUT) GPIO.setup(15, GPIO.OUT) GPIO.setup(18, GPIO.OUT) GPIO.setup(23, GPIO.OUT) return 0 # --------------------------------------------------------------- # - Rutina RESET-DISPLAY ----------------------------------------- # - valores de param1 : 0 => 0 // 8 => 8 // otro valor => Blank # --------------------------------------------------------------- def RESET_DISPLAY(param1): if param1 == 8: GPIO.output(14, False) GPIO.output(15, False) GPIO.output(18, False) GPIO.output(23, True) elif param1 == 0: GPIO.output(14, False) GPIO.output(15, False) GPIO.output(18, False) GPIO.output(23, False) else: GPIO.output(14, True) GPIO.output(15, True) GPIO.output(18, True) GPIO.output(23, True) return 0 # --------------------------------------------------------------- # - Rutina TEST-DISPLAY ----------------------------------------- # - param1= tiempo de retardo en ms. # --------------------------------------------------------------- def TEST_DISPLAY(param1): RESET_DISPLAY(1) time.sleep(param1) for i in range(10): SHOW_DISPLAY(48+i) time.sleep(param1) RESET_DISPLAY(1) return 0 # --------------------------------------------------------------- # - Rutina Muestra cifra en DISPLAY ----------------------------- # - param1= cifra a mostrar (0 ... 9) # --------------------------------------------------------------- def SHOW_DISPLAY(param1): RESET_DISPLAY(0) if param1 == 48: # numero 0 GPIO.output(14, False) GPIO.output(15, False) GPIO.output(18, False) GPIO.output(23, False) elif param1 == 49: # numero 1 GPIO.output(14, True) GPIO.output(15, False) GPIO.output(18, False) GPIO.output(23, False) elif param1 == 50: # numero 2 GPIO.output(14, False) GPIO.output(15, True) GPIO.output(18, False) GPIO.output(23, False) elif param1 == 51: # numero 3 GPIO.output(14, True) GPIO.output(15, True) GPIO.output(18, False) GPIO.output(23, False) elif param1 == 52: # numero 4 GPIO.output(14, False) GPIO.output(15, False) GPIO.output(18, True) GPIO.output(23, False) elif param1 == 53: # numero 5 GPIO.output(14, True) GPIO.output(15, False) GPIO.output(18, True) GPIO.output(23, False) elif param1 == 54: # numero 6 GPIO.output(14, False) GPIO.output(15, True) GPIO.output(18, True) GPIO.output(23, False) elif param1 == 55: # numero 7 GPIO.output(14, True) GPIO.output(15, True) GPIO.output(18, True) GPIO.output(23, False) elif param1 == 56: # numero 8 GPIO.output(14, False) GPIO.output(15, False) GPIO.output(18, False) GPIO.output(23, True) elif param1 == 57: # numero 9 GPIO.output(14, True) GPIO.output(15, False) GPIO.output(18, False) GPIO.output(23, True) return 0 # --------------------------------------------------------------- # ############################################################### # - PROGRAMA PRINCIPAL ----- Usa curses para salida a pantalla -- # ############################################################### # --------------------------------------------------------------- stdscr = curses.initscr() curses.cbreak() curses.start_color() # definicion de paletas de color curses.init_pair(1, curses.COLOR_WHITE, curses.COLOR_BLUE) curses.init_pair(2, curses.COLOR_YELLOW, curses.COLOR_BLACK) hsize = curses.COLS vsize = curses.LINES curses.curs_set(0) curses.noecho stdscr.border(0) stdscr.keypad(1) stdscr.nodelay(1) confiGPIO(0) RESET_DISPLAY(8) # (0) = 0 // (8) = 8 // (otro valor = Blank) try: stdscr.bkgd(curses.color_pair(1)) # seleccion de paleta de color (1/2) while True: # Rutina principal del programa char = stdscr.getch() if (char == 81 or char == 113): # Teclas Q/q break elif (char == 84 or char == 116): # Teclas T/t TEST_DISPLAY(0.2) elif (char >= 48 and char <= 57): # Teclas NUMERICAS SHOW_DISPLAY(char) else: stdscr.addstr(vsize/6, (hsize/2)-24," ---- Test de DISPLAY LED via chip 4511 ---- ") stdscr.addstr((vsize/5)+5, (hsize/2)- 22,"[T] - efectua un TEST del DISPLAY") stdscr.addstr((vsize/5)+7, (hsize/2)- 22,"[1..0] - pulsa numero para mostrar en DISPLAY") stdscr.addstr(vsize-4, (hsize/2)- 22," Pulsa [Q] para salir ") stdscr.refresh() finally: curses.nocbreak() stdscr.keypad(0) curses.echo() curses.endwin() |
Esperamos que el artículo os resulte de interes.
A DIVERTIRSE
Descarga de código
Pi_7_Segments