banner

3.2 Salidas Digitales (outputs) ¶

Tenemos que dar las indicaciones para mandar a nivel alto las salidas del microcontrolador; es decir, mandar a un nivel lógico 1 o alto o True , esto lo que hará será que a la salida del pin tenga un nivel de voltaje de 5V , en caso de mandarlo a 0 o bajo o False , es equivalente a 0V .

Programacion Nivel lógico Digital Voltaje
False 0 Low 0V
True 1 High 5V

3.2.1.1 Retardos sleep() ¶

Para indicar en python un tiempo en donde no haga nada y una vez este termine continuar realizando lo indicado; se utiliza la función sleep() de la libreria time . El modulo time es una libreria estandar de python.

Paso 1. importar la libreria time

Paso 2. Invocar la funcion sleep()

Sintaxis:

import time

    time.sleep(segundo)

Documentación time .

3.2.1.2 Configuracion básica para conectarnos a la Tarjeta ¶

Tenemos que mandar las indicaciones al microcontrolador para que active sus salidas digitales.

Primero instalar la libreria pyFirmata , tenemos que abrir la terminal y escribir el siguiente comando:

pip install pyFirmata # este comando es a nivel de sistema

En caso de fallar, usar el flag --user para instalarlo a nivel de usuario

pip install pyFirmata --user

En todo script de python debemos realizar lo siguiente cuando queremos utilizar el protocolo.

#importamos la libreria que nos permite conectarnos por el protocolo de firmata y Python hacia la placa
from pyfirmata import Arduino

# declaro una variable donde coloco el puerto donde esta conectado
PORT = 'COM#' # El hash indica el numero del puerto

# Declaramos una variable llamada "board" donde queda indicado que esta la placa conectada
board = Arduino(PORT)

3.2.1.2 Accionando las Salidas ¶

Tenemos que mandar las indicaciones al microcontrolador para que active sus salidas digitales.

Nota: Nunca utilices los pines 0 y 1, porque son para la comunicación serial UART - USB

board.digital[NUMERO_PIN].write(1|0)

Ejemplo: Aquí solo encendemos el pin 3 y despues de 4 segundos se debe apagar

from pyfirmata import Arduino    #importamos la libreria que nos permite conectarnos por el protocolo de firmata
import time         # importamos la libreria de retardos

# Indicamos el puerto donde se encuentra conectada la tarjeta electronica
PORT = '/tmp/ttyS1'
board = Arduino(PORT) #es la conexion con la placa
print('Placa conectada')

PIN = 3 # defino el pin donde estara el LED

#se manda un nivel 1 a la salida del pin 3
board.digital[PIN].write(1)
print(f'Enciendo el pin {PIN}')
time.sleep(4)
board.digital[PIN].write(0)
print(f'Apago el pin {PIN}')

ejemplo 1

Ejemplo: Vamos a Encender y apagar un pin digital

from pyfirmata import Arduino    #importamos la libreria que nos permite conectarnos por el protocolo de firmata
import time         # importamos la libreria de retardos

# Indicamos el puerto donde se encuentra conectada la tarjeta electronica
PORT = 'COM#'
board = Arduino(PORT) 

board.digital[3].write(1) #se manda un nivel 1 a la salida del pin 3
time.sleep(5)             #nos esperamos un sengundo
board.digital[3].write(0) #se manda un nivel 0 a la salida del pin 3
time.sleep(5)             #nos esperamos un sengundo
board.digital[3].write(1) #se manda un nivel 1 a la salida del pin 3

circuito


Ejemplo 2: Ahora lo que haremos es que quede haciendo un blink, es decir, que quede parpadeando el led de forma infinita

from pyfirmata import Arduino
from time import sleep

PORT= 'COM#' #en window es COMx

board = Arduino(PORT)

while True:
    board.digital[3].write(1)
    sleep(1)
    board.digital[3].write(0)
    sleep(1)

# Para detener el proceso presiona Ctrl + C

circuito

circuito


Ejemplo 3: Secuencia de luces, 4 luces encienden consecutivamente y se apagan todas juntas, de forma indefinida

from pyfirmata import Arduino
from time import sleep

PORT= 'COM#' #en window es COMx

board = Arduino(PORT)
print('Conexion creada')

while True:
    for PIN_LED in range(2,7):
        board.digital[PIN_LED].write(1)
        print(f'Enciendo el pin {PIN_LED}')
        sleep(1)

    print('Apagando todos los LEDs')
    for PIN_LED in range(2,7):
        board.digital[PIN_LED].write(0)
        sleep(2)

secuencia1

secuencia2

secuencia3

Simulacion:

simulacion secuencia_bar


Ejemplo 4: Semaforo sencillo, el verde debe parpadear 3 veces antes de hacer el cambio, el amarillo tarda la mitad que el rojo

semaforo

semaforo

semaforo

Simulacion:

simulación semáforo

Ejemplo 5: Display de 7 segmentos, formando todos los numeros hexadecimales desde el 0 a la F, repiendo el ciclo

7 segmentos

7 segmentos

7 segmentos

7 segmentos

7 segmentos

7 segmentos

# opcion basica
from pyfirmata import Arduino    #importamos la libreria que nos permite conectarnos por el protocolo de firmata
from time import sleep         # importamos la libreria de retardos

# Indicamos el puerto donde se encuentra conectada la tarjeta electronica
PORT = 'COM#'
board = Arduino(PORT) #es la conexion con la placa
print('Placa conectada')

#segmentos del display
A = 2
B = 3
C = 4
D = 5
E = 6
F = 7
G = 8

while True:
    #digito 0
    print('Pongo el 0 en el display')
    board.digital[A].write(1)
    board.digital[B].write(1)
    board.digital[C].write(1)
    board.digital[D].write(1)
    board.digital[E].write(1)
    board.digital[F].write(1)
    board.digital[G].write(0)
    sleep(2)
    #digito 1
    print('Pongo el 1 en el display')
    board.digital[A].write(0)
    board.digital[B].write(1)
    board.digital[C].write(1)
    board.digital[D].write(0)
    board.digital[E].write(0)
    board.digital[F].write(0)
    board.digital[G].write(0)
    sleep(2)
    #digito 2
    print('Pongo el 2 en el display')
    board.digital[A].write(1)
    board.digital[B].write(1)
    board.digital[C].write(0)
    board.digital[D].write(1)
    board.digital[E].write(1)
    board.digital[F].write(0)
    board.digital[G].write(1)
    sleep(2)
    #digito 3
    print('Pongo el 3 en el display')
    board.digital[A].write(1)
    board.digital[B].write(1)
    board.digital[C].write(1)
    board.digital[D].write(1)
    board.digital[E].write(0)
    board.digital[F].write(0)
    board.digital[G].write(1)
    sleep(2)
    #digito 4
    print('Pongo el 4 en el display')
    board.digital[A].write(0)
    board.digital[B].write(1)
    board.digital[C].write(1)
    board.digital[D].write(0)
    board.digital[E].write(0)
    board.digital[F].write(1)
    board.digital[G].write(1)
    sleep(2)
    #digito F
    print('Pongo el F en el display')
    board.digital[A].write(1)
    board.digital[B].write(0)
    board.digital[C].write(0)
    board.digital[D].write(0)
    board.digital[E].write(1)
    board.digital[F].write(1)
    board.digital[G].write(1)
    sleep(2)

simulacion display basico


# Opcion avanzada
from pyfirmata import Arduino, util, INPUT
from time import sleep

def display(number):
    numbers = [number_0,number_1,number_2,number_3,number_4,number_5,number_6,number_7,number_8,number_9]

    for position,segments in enumerate(numbers):
        if position == number:
            segments()
            break

def number_0():
    set_segment(1,1,1,1,1,1,0)

def number_1():
    set_segment(0,1,1,0,0,0,0)

def number_2():
    set_segment(1,1,0,1,1,0,1)

def number_3():
    set_segment(1,1,1,1,0,0,1)

def number_4():
    set_segment(0,1,1,0,0,1,1)

def number_5():
    set_segment(1,0,1,1,0,1,1)

def number_6():
    set_segment(0,0,1,1,1,1,1)

def number_7():
    set_segment(1,1,1,0,0,0,0)

def number_8():
    set_segment(1,1,1,1,1,1,1)

def number_9():
    set_segment(1,1,1,1,0,1,1)

def set_segment(*segments):
    display_pins = [2,3,4,5,6,7,8]

    for pin, segment in enumerate(segments):
        print(f'Pin a encender{board.digital[display_pins[pin]]}, ')
        board.digital[display_pins[pin]].write(segment)

PORT = 'COM#'
# importamos los elementos necesarios
board = Arduino(PORT)

count = 0
while True:
    display(count)
    sleep(3)
    count += 1

    if count == 9: count = 0 # reincio el conteo

#otro opcion con una sola funcion
# importamos la libreria que nos permite conectarnos por el protocolo de firmata
from pyfirmata import Arduino
from time import sleep         # importamos la libreria de retardos

def display(A,B,C,D,E,F,G,time=1):
    # segmentos del display
    SEGMENT_A = 2
    SEGMENT_B = 3
    SEGMENT_C = 4
    SEGMENT_D = 5
    SEGMENT_E = 6
    SEGMENT_F = 7
    SEGMENT_G = 8

    board.digital[SEGMENT_A].write(A)
    board.digital[SEGMENT_B].write(B)
    board.digital[SEGMENT_C].write(C)
    board.digital[SEGMENT_D].write(D)
    board.digital[SEGMENT_E].write(E)
    board.digital[SEGMENT_F].write(F)
    board.digital[SEGMENT_G].write(G)

    sleep(time)


# Indicamos el puerto donde se encuentra conectada la tarjeta electronica
PORT = 'COM#'
board = Arduino(PORT)  # es la conexion con la placa
print('Placa conectada')

while True:
    # creo el digito 0
    print('digito 0')
    display(1,1,1,1,1,1,0)
    print('digito 1')
    display(0,1,1,0,0,0,0)
    print('digito 2')
    display(1,1,0,1,1,0,1)
    print('digito 3')
    display(1,1,1,1,0,0,1)
    print('digito F')
    display(1,0,0,0,1,1,1)

Ejemplo 7: Realizar un barrita de carga, puede contener cualquier forma

# importamos la libreria que nos permite conectarnos por el protocolo de firmata
from pyfirmata import Arduino
from time import sleep         # importamos la libreria de retardos

# Indicamos el puerto donde se encuentra conectada la tarjeta electronica
PORT = 'COM#'
board = Arduino(PORT)  # es la conexion con la placa
print('Placa conectada')

# segmentos del display
segements = {
    'A': 2,
    'B': 3,
    'C': 4,
    'D': 5,
    'E': 6,
    'F': 7,
    'G': 8
}

while True:
    # enciendo segmento por segmento esperandome un segundo entre cada segmento
    for key in segements:
        board.digital[segements[key]].write(1)
        sleep(1)

    #apago todos los segmentos y espero 1 segundo
    for key in segements:
        board.digital[segements[key]].write(0)
    sleep(1)

loading

loading

loading

loading

loading

Usando motor DC ¶

Para esto estaremos aplicando el Driver L293D (Puente H) para el control del motor, dado que el microcontrolador no es capaz de solventar el consumo de voltaje y corriente que requiere un motor.

Diagrama de bloques L293D


Ejemplo 8. Control basico de un motor DC. Se debe activar un motor DC en intervalos de 5 segundos, apagarse y encender, el otro motor debe funcionar en sentido contrario y actuar de la misma manera que el primero

motor_simul

motor_tinker

from pyfirmata import Arduino
from time import sleep

PORT = 'COM#'
board = Arduino(PORT)

MOTOR1_1 = 2
MOTOR1_2 = 3

MOTOR2_1 = 4
MOTOR2_2 = 5

while True:
    board.digital[MOTOR1_1].write(1)
    board.digital[MOTOR1_2].write(0)
    sleep(5)
    board.digital[MOTOR1_1].write(0)
    board.digital[MOTOR1_2].write(0)

    board.digital[MOTOR2_1].write(0)
    board.digital[MOTOR2_2].write(1)
    sleep(5)
    board.digital[MOTOR2_1].write(0)
    board.digital[MOTOR2_2].write(0)

from pyfirmata import Arduino
from time import sleep

# Creo una funcion que me facilita el cambio del giro del motor, 
def giro(pin, signal=[0,0]):
    board.digital[pin[0]].write(signal[0])
    board.digital[pin[1]].write(signal[1])

# configuracion de puerto 
PORT = 'COM#'
board = Arduino(PORT)
# configuro los pines de los motores
MOTOR1_1 = 2
MOTOR1_2 = 3

MOTOR2_1 = 4
MOTOR2_2 = 5

while True:
    giro([MOTOR1_1, MOTOR1_2],[0,1])
    sleep(5)
    giro([MOTOR1_1, MOTOR1_2],[0,0])

    giro([MOTOR2_1, MOTOR2_2],[1,10])
    sleep(5)
    giro([MOTOR2_1, MOTOR2_2],[0,0])

Ejemplo 9. Control GIRO basico de un motor DC. Se debe activar un motor DC girano hacia una direccion, 5 segundos depues se apaga por 1 segundo y gira en sentido contrario

motor giro

from pyfirmata import Arduino
from time import sleep

def giro(pin, signal):
    board.digital[pin[0]].write(signal[0])
    board.digital[pin[1]].write(signal[1])

# puerto de la tarjeta

PORT = 'COM#'
board = Arduino(PORT)

# configuro los pines del motor

MOTOR1_1 = 2
MOTOR1_2 = 3

TIME = 5

while True:
    giro([MOTOR1_1, MOTOR1_2],[0,1])
    sleep(TIME)
    giro([MOTOR1_1, MOTOR1_2],[1,0])
    sleep(TIME)

motor giro 2

# forma basica
from pyfirmata import Arduino
from time import sleep

PORT = 'COM#'
board = Arduino(PORT)

MOTOR1_1 = 2
MOTOR1_2 = 3

while True:
    print('gira en un sentido')
    board.digital[MOTOR1_1].write(1)
    board.digital[MOTOR1_2].write(0)
    sleep(5)
    print('apago el motor')
    board.digital[MOTOR1_1].write(0)
    board.digital[MOTOR1_2].write(0)
    sleep(1)
    print('gira en el otro sentido')
    board.digital[MOTOR1_1].write(0)
    board.digital[MOTOR1_2].write(1)
    sleep(5)
    print('apago el motor')
    board.digital[MOTOR1_1].write(0)
    board.digital[MOTOR1_2].write(0)
    sleep(1)

Motor PAP Unipolar y Bipolar ¶

Motores Paso a Pasa (PAP) Unipolar vs Bipolar ¶

Existen 2 tipos de motores Paso a Paso, los cuales son muy similares, lo que los diferencia es la cantidad de bobinas y derivaciones. Su control es muy parecido, al final lo que se debe realizar es una conmutacion al de las bobinas, con ello se configura su direccion y velocidad, esto consiste en hacer combinacion de polos magneticos en las bobinas del motor.

motor pap

Secuencia para controlar motores paso a paso Bipolares ¶

Un motor paso a paso bipolar necesita invertir la corriente que circula por sus bobinas en una secuencia determinada para provocar el movimiento del eje.

Paso Bobina 1A Bobina 1B Bobina 2A Bobina 2B
Paso 1 1 0 1 0
Paso 2 1 0 0 1
Paso 3 0 1 0 1
Paso 4 0 1 1 0

Secuencia para controlar motores paso a paso Unipolares ¶

Hay tres secuencias para controlar los motores paso a paso unipolares

Simple o wave drive : Es una secuencia donde se activa una bobina a la vez. Esto hace que el motor tenga un paso más suave pero por el contrario tenga menos torque y menos retención.

Paso Bobina A Bobina B Bobina C Bobina D
Paso 1 1 0 0 0
Paso 2 0 1 0 0
Paso 3 0 0 1 0
Paso 4 0 0 0 1

Normal : Es la secuencia más usada y la que recomiendan los fabricantes. Con esta secuencia el motor avanza un paso por vez y siempre hay dos bobinas activadas. Con esto se obtiene un mayor torque y retención.

Paso Bobina A Bobina B Bobina C Bobina D
Paso 1 1 1 0 0
Paso 2 0 1 1 0
Paso 3 0 0 1 1
Paso 4 1 0 0 1

Medio paso : Se activan primero dos bobinas y después solo una y así sucesivamente. Esto provoca que el motor avance la mitad del paso real. Esto se traduce en un giro más suave y preciso.

Paso Bobina A Bobina B Bobina C Bobina D
Paso 1 1 0 0 0
Paso 2 1 1 0 0
Paso 3 0 1 0 0
Paso 4 0 1 1 0
Paso 5 0 0 1 0
Paso 6 0 0 1 1
Paso 7 0 0 0 1
Paso 8 1 0 0 1

Documentación recomendada Articulo de Adafruit Types of Steppers

Ejericio 10. Control de un Motor PAP Bipolar. Haciendolo girar en un sentido y posteriormente invirtiendo el giro

motor pap bipolar


Ejemplo 11. Control de un motor PAP (Paso A Paso) Unipolar. Se necesita manejar un motor PAP para que gire en un momento hacia un sentido y posteriormente se invierta

motor_pap

from pyfirmata import Arduino
from time import sleep

def pap(pin,signal):
    board.digital[pin['A']].write(signal[0])
    board.digital[pin['B']].write(signal[1])
    board.digital[pin['C']].write(signal[2])
    board.digital[pin['D']].write(signal[3])

PORT = 'COM#'
board = Arduino(PORT)

TIME = 0.25

PINS = {
'A': 2,
'B': 3,
'C': 4,
'D': 5
}

while True:
    pap(PINS,[1,0,0,0])
    sleep(TIME)
    pap(PINS,[0,1,0,0])
    sleep(TIME)
    pap(PINS,[0,0,1,0])
    sleep(TIME)
    pap(PINS,[0,0,0,1])
    sleep(TIME)

Más detalles ¶

Al terminar el programa lo mas correcto es que se le indique al programa que termine de manera correcta cerrando lo que deba cerrar, para que no se quede en memoria o cacheado algun dato o lo que sea que este haciendo el sistema en ese momento, para ello debemos usar la funcion exit() de la tarjeta.

board.exit()

Ejemplo:

from pyfirmata import Arduino

PORT = 'COM#'
board = Arduino(PORT)

board.digital[13].write(1)

board.exit() # indicamos que cierre la conexion con la tarjeta

Pero, normalmente detenemos el progrma con Ctrl + C, entonces el programa termina abruptamente, y en la terminal vemos un mensaje de error, que realmente avisa que hay Exception. La forma correcta de manejar esto y salir correctamente del programa es con una sentencia llamada try-except .

Ejemplo:

from pyfirmata import Arduino
from time import sleep

try:
    PORT = 'COM#'
    board = Arduino(PORT)

    while True:
        board.digital[13].write(1)
        sleep(1)
        board.digital[13].write(0)
        sleep(1)
except:
    print('termino el programa')
    board.exit() # indicamos que cierre la conexion con la tarjeta

Tarea - Salidas digitales ¶

  1. Realizar un blink con 3 leds, el intervalo de tiempo será que cuando enciendan se queden 2 segundos y se queden apagados por 3 segundos.
  2. Semáforo de un cruce, 2 semáforos sincronizados
  3. Secuencia de luces, enciendo uno a uno, quedándose prendidos, después de 5 segundos apagarse en orden inverso, es decir, el último en apagarse fue el primero en encender
  4. Realizar una secuencia a gusto, con mínimo 5 leds, realizando la secuencia o forma que deseen, es libre.
  5. Realizar una secuencia de letras que formen la siguiente frase, es letra por letra, frase: HOLA-CbtIS-85 , se repite indefinidamente.
  6. Realizar una secuencia de letras que formen alguna frase, mínimo de 5 letras, no hay límite de letras para formar su frase, los espacios son representados por guion medio. La frase es libre.

Realizado por Docente: Alejandro Leyva

Mecatrónica 85

fb/mecatronica85