ACTUALIZACION: Esta tarjeta ha aparecido en el blog de Adafruit. Estoy muy contento, para mi es un gran reconocimiento y solo puedo decir gracias!!
Continuo trabajando con Juan Brito y Danny Macancela, del blog Desafio Ecuador, desarrollando nuevas tarjetas para acercar la tecnología y los lenguajes de programación a l mayor número de gente posible. Nuestro último trabajo ha sido el desarrollo de una tarjeta para utilizarla con la Raspberry Pi y enfocada a aprender el lenguaje Python. La tarjeta contiene los elementos básicos para poder comenzar a desarrollar programas con este lenguaje de programación. Además, cone le desarrollo de la PCB se han eliminado todos los cableados externos, evitando así problemas de conexiones, inversiones de polaridad, cables sueltos,…Asi, con esta tarjeta la única preocupación es centrarse en el lenguaje de programación, porque la parte hardware funcionará!
El Hardware
La tarjeta RPi está orientada hacia un entorno educacional, por lo que el hardware es sencillo y contiene elos elementos básicos para comenzar a trabajar con Python. Hemos desarrollado esta tarjeta para que se ajuste a la Raspberry Pi y utilizar los pines de E/S de ésta para manejar los diferentes elementos. ¿Por qué Raspberry Pi? Porque, en estos momentos, es de las tarjetas más baratas y con mayor soporte a nivel mundial. Existe multitud de documentación y soporte detrás de ella. En un post futuro, hablaré más profundamente acerca de esta tarjeta. Si quieres más información acerca de la Raspberry Pi, puedes consultar aqui, aqui o aqui (los dos últimos enlaces son en ingés).
El esquema de la tarjeta se puede descargar desde aqui: RPI PYTHON BOARD SCHEMATIC
Como se puede ver, los elementos que incluye la tarjeta son los siguientes:
- Cuatro led difusos de 10mm:
Estos leds son los mismos que utilicé anteriormente en la tarjeta teclado para Arduino K4S. Estos leds están conectados a pines generales de E/S de la RAspberry Pi (ver esquema) a través de un transistor Mosfeet FDV301N. Estos transistores no son estrictamente necesarios, porque la corriente por los led’s es pequeña, pero he preferido ponerlos para proteger los pines E/S de la Raspberry. Para activar los leds, hay que poner el correspondiente pin a nivel alto, y para apagarlo, hay que poner el pin a nivel bajo.
- Dos pulsadores:
Los pulsadores permiten interactuar con la Raspberry, y se tratan como entradas. De esta forma, leyendo su valor se puede saber si están o no pulsados, y actuar en consecuencia en función de su estado. Por defecto, cuando un pulsador no está pulsado, se lee un nivel alto, y cuando se pulsa, se leerá un nivel bajo.
- Un zumbador:
El zumbador permite obtener señales acústicas. Se puede programar un tono contínuo o pitidos de una duración variable, depende de lo que se programe. Al igual que con los leds, he puesto un transistor Mosfet para proteger el pin de la Raspberry. Para activar el zumbador, hay que enviar un nivel alto al pin. Y para apagarlo, simplemente hay que mandar un nivel bajo!
- Un conector para un LCD 2×16
Este conector permite montar un display estándar LCD de 2×16, para enviar mensajes y mostrar información. Se puede poner un display LCD estándar o uno OLED, en función de los elementos que se monten. He decidido montar displays OLED porque son realmente interesantes y proporcionan un aspecto más moderno que los módulos LCD tradicionales. Además, como los displays OLED generan su propia luz, no se requiere backlight. Esto reduce el consumo necesario para que funcione el display OLED, y además es lo que hace que estos displays tengan un contraste tan alto. He elegido dos colores para el prototipo, rojo y azul, del fabricante Raystar, que además proporciona una nota de aplicación para trabajar con estos módulos. Desde aqui, dar las gracias a Jorge Galán de RC Microelectrónica por su ayuda y soporte para conseguirlos.
- Conector para el bus I2C
He previsto un conector de 4×1 y paso 2,54mm con las señales del bus I2C, para poder conectar periféricos externos a la Raspberry. En el futuro, seguro que los uso!!
- Led’s de alimentación
No hay mucho que decir aqui, dos led’s verdes para indicar que las alimentaciones de 5V y 3V3 provenientes de la Raspberry están OK:
Esta vez he utilizado los servicios de Hackvana para fabricar las placas. Quería comprobar si las placas eran tan buenas como la gente suele decir por internet. Y si, es cierto, la calidad de las tarjetas es excelente!. Aqui un par de fotos de las PCB’s sin componentes:
Como siempre, he montado las tarjetas a mano. He utilizado componentes SMD en formato 1206 y solo por la cara superior, porque no hay problemas de espacio y los componentes 1206 son fáciles de montar a mano. Después de montar los prototipos, el siguiente paso es montar la tarjeta sobre la Raspberry , para comprobar que todas las dimensiones son correctas. He utilizado los dos agujeros de la Raspberry Pi para fijar la tarjeta, utilizando dos espaciadores de M2.5×18 de Harwin. Para el display, he utilizado tres separadores de M2.5×11, también de Harwin. El resultado ha sido muy satisfactorio:
[metaslider id=1027]
Programando en Python
Una vez comprobado que todo está Ok, es hora de comenzar a programar. Hay muchisimos manuales y referencias en internet acerca de como comenzar a programar en Python. Aqui trataré unos ejemplos básicos para comenzar a trabajar con la tarjeta. Asumo que dispones de una Raspberry Pi con una distribución instalada. Yo he utilizado la distribución Raspbian para trabajar con la tarjeta. Esta distribución incluye por defecto el interprete de Python y la versión de Scratch S4A, que permite trabajar con la tarjeta teclado K4S que desarrollé anteriormente. A continuación hay unos ejemplos básicos para comenzar a trabajar con la tarjeta y con Python:
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 |
#!/usr/bin/env pyth # # RPi Board - Sample 01: Turn on the green led # # Author : jechavarria # Site : www.jechavarria.com # : www.desafioecuador.org # # Date : 01/10/2014</p> # Library to use the GPIO pins on Raspberry Pi import RPi.GPIO as GPIO # Define GPIO for led mapping (USES BCM MODE NUMBERING scheme) GREEN_LED = 25 # Define main routine def main(): GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(GREEN_LED,GPIO.OUT) GPIO.output(GREEN_LED,False) while 1: GPIO.output(GREEN_LED, True) # =================================================================== # Ensure that the GPIO is cleaned up whichever way the program exits # This avoids all those annoying "channel already in use" errors if __name__ == '__main__': try: main() finally: GPIO.cleanup() # =================================================================== |
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 |
#!/usr/bin/env pyth # # RPi Board - Sample 02: Makes blink the green led # # Author : jechavarria # Site : www.jechavarria.com # : www.desafioecuador.org # # Date : 01/10/2014 # Library to use the GPIO pins on Raspberry Pi import RPi.GPIO as GPIO import time # Define GPIO for led mapping (USES BCM MODE NUMBERING scheme) GREEN_LED = 25 # Define main routine def main(): GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(GREEN_LED,GPIO.OUT) GPIO.output(GREEN_LED,False) while 1: GPIO.output(GREEN_LED, True) time.sleep(1) GPIO.output(GREEN_LED, False) time.sleep(1) # =================================================================== # Ensure that the GPIO is cleaned up whichever way the program exits # This avoids all those annoying "channel already in use" errors if __name__ == '__main__': try: main() finally: GPIO.cleanup() # =================================================================== |
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 |
#!/usr/bin/env pyth # # RPi Board - Sample 03: Makes a beep of 0,5 secs # # Author : jechavarria # Site : www.jechavarria.com # : www.desafioecuador.org # # Date : 01/10/2014 # Library to use the GPIO pins on Raspberry Pi import RPi.GPIO as GPIO import time # Define GPIO for led mapping (USES BCM MODE NUMBERING scheme) GREEN_LED = 25 BUZZER = 27 # Define main routine def main(): GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.setup(GREEN_LED,GPIO.OUT) GPIO.setup(BUZZER,GPIO.OUT) GPIO.output(GREEN_LED,False) GPIO.output(BUZZER,True) time.sleep(0.5) GPIO.output(BUZZER,False) while 1: # Do nothing time.sleep(1) # =================================================================== # Ensure that the GPIO is cleaned up whichever way the program exits # This avoids all those annoying "channel already in use" errors if __name__ == '__main__': try: main() finally: GPIO.cleanup() # =================================================================== |
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 |
#!/usr/bin/env pyth # # RPi Board - Sample 04: Reading pushbuttons # When left button is pressed, the blue led turns on # and when releases, the blue led turns off! # # Author : jechavarria # Site : www.jechavarria.com # : www.desafioecuador.org # # Date : 01/10/2014 # Library to use the GPIO pins on Raspberry Pi import RPi.GPIO as GPIO import time # Define GPIO for led mapping (USES BCM MODE NUMBERING scheme) GREEN_LED = 25 BLUE_LED = 8 BUZZER = 27 LEFT_PUSH = 4 RIGHT_PUSH = 7 # Define main routine def main(): GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) # Configure the outputs GPIO.setup(GREEN_LED,GPIO.OUT) GPIO.setup(BLUE_LED,GPIO.OUT) GPIO.setup(BUZZER,GPIO.OUT) # Configure the inputs GPIO.setup(LEFT_PUSH,GPIO.IN) GPIO.setup(RIGHT_PUSH,GPIO.IN) # Initialize the outputs GPIO.output(GREEN_LED,False) GPIO.output(BLUE_LED,False) GPIO.output(BUZZER,False) # Initial beep (100ms beep) GPIO.output(BUZZER,True) time.sleep(0.1) GPIO.output(BUZZER,False) while 1: if (GPIO.input(LEFT_PUSH) == False): GPIO.output(BLUE_LED,True) else: GPIO.output(BLUE_LED,False) # =================================================================== # Ensure that the GPIO is cleaned up whichever way the program exits # This avoids all those annoying "channel already in use" errors if __name__ == '__main__': try: main() finally: GPIO.cleanup() # =================================================================== |
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 |
#!/usr/bin/env pyth # # RPi Board - Sample 05: Shifting leds # When left button is pressed, the leds turn on and # off from left to right every 0.5 secs. # When right button is pressed, the leds turn on and # off from right to left every 0.5 secs. # # Author : jechavarria # Site : www.jechavarria.com # : www.desafioecuador.org # # Date : 01/10/2014 # Library to use the GPIO pins on Raspberry Pi import RPi.GPIO as GPIO import time # Define GPIO for led mapping (USES BCM MODE NUMBERING scheme) GREEN_LED = 25 BLUE_LED = 8 RED_LED = 18 YELLOW_LED = 17 BUZZER = 27 LEFT_PUSH = 4 RIGHT_PUSH = 7 # Define main routine def main(): GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) # Configure the outputs GPIO.setup(GREEN_LED,GPIO.OUT) GPIO.setup(BLUE_LED,GPIO.OUT) GPIO.setup(RED_LED,GPIO.OUT) GPIO.setup(YELLOW_LED,GPIO.OUT) GPIO.setup(BUZZER,GPIO.OUT) # Configure the inputs GPIO.setup(LEFT_PUSH,GPIO.IN) GPIO.setup(RIGHT_PUSH,GPIO.IN) # Initialize the outputs GPIO.output(GREEN_LED,False) GPIO.output(BLUE_LED,False) GPIO.output(RED_LED,False) GPIO.output(YELLOW_LED,False) GPIO.output(BUZZER,False) # Initial beep (100ms beep) GPIO.output(BUZZER,True) time.sleep(0.1) GPIO.output(BUZZER,False) while 1: if (GPIO.input(LEFT_PUSH) == False): GPIO.output(RED_LED,True) time.sleep(0.5) GPIO.output(RED_LED,False) GPIO.output(YELLOW_LED,True) time.sleep(0.5) GPIO.output(YELLOW_LED,False) GPIO.output(GREEN_LED,True) time.sleep(0.5) GPIO.output(GREEN_LED,False) GPIO.output(BLUE_LED,True) time.sleep(0.5) GPIO.output(BLUE_LED,False) if (GPIO.input(RIGHT_PUSH) == False): GPIO.output(BLUE_LED,True) time.sleep(0.5) GPIO.output(BLUE_LED,False) GPIO.output(GREEN_LED,True) time.sleep(0.5) GPIO.output(GREEN_LED,False) GPIO.output(YELLOW_LED,True) time.sleep(0.5) GPIO.output(YELLOW_LED,False) GPIO.output(RED_LED,True) time.sleep(0.5) GPIO.output(RED_LED,False) # =================================================================== # Ensure that the GPIO is cleaned up whichever way the program exits # This avoids all those annoying "channel already in use" errors if __name__ == '__main__': try: main() finally: GPIO.cleanup() # =================================================================== |
En una posterior entrada, comentaré el código en Python para mostrar mensajes en el display OLED, porque es un código más complejo y requiere conocimientos más técncos.
Feliz programación y depuración!!
This post is also available in: Inglés