Electrónica y Programación en Personal
«Si no se soluciona con un script en Python entonces no es viable»

por Yeison Cardona el 26 de marzo del 2014 a las 11:43 pm UTC

Pynguino

Sólo para aclarar un poco las cosas, con Pynguino me refiero a un paquete de herramientas de código fuente para desarrollar interfaces, cuenta con unos códigos para Pinguino, (8 bits, 32 bits, CDC, USB) y un módulo Python (en el futuro espero contar con mas bibliotecas para otros lenguajes).

En esta ocasión voy a hablar del módulo Python, y nada mas.

Módulo Python

El módulo Python lo he llamado Pynguino está disponible sólo para Python2, en la página del link están las instrucciones de cómo instalarlo, en esta entrada sólo mostraré algunos ejemplos.

CDC

Para interfazar mediante CDC debemos tener ejecutándose en Pinguino uno de estos códigos
Para 8 bits

Para 32 bits

Ahora concedemos permisos a los puertos serie, recomiendo para esto agregar nuestro usuario al grupo uucp.

Importamos el módulo y creamos el objeto pinguino
>>> from pynguino import PynguinoCDC
>>> pinguino = PynguinoCDC()

Ahora con sobre objeto pinguino podemos ejecutar ordenes de administración de pines,
por ejemplo para una entrada digital
>>> pinguino.pinMode(0, "INPUT")
>>> pinguino.pinMode(0, "1")
>>> pinguino.pinMode(0, 1)
>>> pinguino.pinMode(0, True)
>>> 
>>> pinguino.digitalRead(0)
'1'
>>> pinguino.digitalRead(0, int)
1
>>> pinguino.digitalRead(0, float)
1.0
>>> 

para una entrada análoga
>>> pinguino.pinMode(13, "INPUT")
>>> 
>>> pinguino.analogRead(13)
'976'
>>> pinguino.analogRead(13, int)
942
>>> pinguino.analogRead(13, float)
954.0
>>> 

para una salida digital o análoga
>>> pinguino.pinMode(11, "OUTPUT")
>>> pinguino.pinMode(2, "OUTPUT")
>>> 
>>> pinguino.analogWrite(11, 512)
>>> pinguino.analogWrite(11, 1024)
>>> pinguino.analogWrite(11, 100)
>>> 
>>> pinguino.digitalWrite(2, "HIGH")
>>> pinguino.digitalWrite(2, 1)
>>> pinguino.digitalWrite(2, True)
>>> pinguino.digitalWrite(2, "LOW")
>>> pinguino.digitalWrite(2, 0)
>>> pinguino.digitalWrite(2, False)
>>> 

USB

El código que debe compilarse en Pinguino es el siguiente (sólo 8 bits)

Para usar USB sólo se debe cambiar la forma cómo se inicia el objeto pinguino y claro, el módulo a importar:
>>>from pynguino import PynguinoUSB
>>>pinguino = PynguinoUSB(vboot="v2")

o así, si se está usando el bootloader versión 4
>>>from pynguino import PynguinoUSB
>>>pinguino = PynguinoUSB(vboot="v4")
>>>#pinguino = PynguinoUSB()

Los demás comandos son exactamente igual a cómo se definieron para CDC

Métodos

Todos los métodos disponibles son:
pinguino.allHigh       
pinguino.allInput      
pinguino.allLow        
pinguino.allOutput     
pinguino.analogRead    
pinguino.analogWrite   
pinguino.check_response
pinguino.close         
pinguino.delay #time.sleep
pinguino.delayMicroseconds
pinguino.digitalRead
pinguino.digitalWrite
pinguino.eepromRead
pinguino.eepromWrite
pinguino.pinMode
pinguino.read
pinguino.reset
pinguino.write

Algunos scripts

Blink led
Conectando un LED al pin 0
#CDC
from pynguino import PynguinoCDC
pinguino = PynguinoCDC()

##USB
#from pynguino import PynguinoUSB
#pinguino = PynguinoUSB(timeout="v4")  #Bootloader v4
#pinguino = PynguinoUSB(timeout="v2")  #Bootloader v2

pinguino.pinMode(0, "OUTPUT")

while True:
    pinguino.digitalWrite(0, "HIGH")
    pinguino.delay(200)
    pinguino.digitalWrite(0, "LOW")
    pinguino.delay(200)

Pulsador
Conectando un pulsador al pin 1 y un LED al pin 0.
#CDC
from pynguino import PynguinoCDC
pinguino = PynguinoCDC()

##USB
#from pynguino import PynguinoUSB
#pinguino = PynguinoUSB(timeout="v4")  #Bootloader v4
#pinguino = PynguinoUSB(timeout="v2")  #Bootloader v2

LED = 0
PULSADOR = 1

pinguino.pinMode(LED, "INPUT")
pinguino.pinMode(PULSADOR, "OUTPUT")

while True:
    #Normalmente abierto
    if pinguino.digitalRead(PULSADOR, int):
        while pinguino.digitalRead(PULSADOR, int): pass
        pinguino.toggle(LED)
        
    ##Normalmente cerrado
    #if not pinguino.digitalRead(PULSADOR, int):
        #while not pinguino.digitalRead(PULSADOR, int): pass
        #pinguino.toggle(LED)

PWM
Conectando un LED al pin 11
#CDC
from pynguino import PynguinoCDC
pinguino = PynguinoCDC()

##USB 
#from pynguino import PynguinoUSB
#pinguino = PynguinoUSB(timeout="v4")  #Bootloader v4
#pinguino = PynguinoUSB(timeout="v2")  #Bootloader v2

PWM = 11
pinguino.pinMode(PWM, "OUTPUT")

while True:
    for value in range(1024):
        pinguino.analogWrite(PWM, value)
        pinguino.delay(10)
        
    for value in range(1024):
        pinguino.analogWrite(PWM, 1024 - value)
        pinguino.delay(10)

Visualización de una entrada análoga
Conectando un potenciómetro al pin 13 y haciéndolo variar
#CDC
from pynguino import PynguinoCDC
pinguino = PynguinoCDC()

##USB
#from pynguino import PynguinoUSB
#pinguino = PynguinoUSB(timeout="v4")  #Bootloader v4
#pinguino = PynguinoUSB(timeout="v2")  #Bootloader v2

READ = 11
pinguino.pinMode(READ, "INPUT")

while True:
    value = pinguino.analogRead(READ, int)
    print "#" * (value / 10)
    pinguino.delay(10)

Conclusiones

De momento sólo se puede administrar pines digitales y análogos debido a que la memoria del microcontrolador (8 bits) no permite mas, para otras cosas como controlar displays LCD se debería de escribir la librería en Python y no hacer uso de la de Pinguino (¿quien se anima a hacerlo?), para el futuro he planeado agregar otro módulo que se encargue de programar tarjetas Pinguino directamente desde el script en Python, a partir de cadenas de texto con el código fuente, así, no será necesario programar la tarjeta manualmente cada que se quiera crear la interfaz.

También podría interesarte:

Añadir un comentario:
Si desean una respuesta para su comentario sólo deben agregarme en G+ y hacer una mención a Yeison Cardona, así les podré responder lo antes posible.