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 |
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 .
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)
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: 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
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
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)
Simulacion:
Ejemplo 4: Semaforo sencillo, el verde debe parpadear 3 veces antes de hacer el cambio, el amarillo tarda la mitad que el rojo
Simulacion:
Ejemplo 5: Display de 7 segmentos, formando todos los numeros hexadecimales desde el 0 a la F, repiendo el ciclo
# 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)
# 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)
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
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
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)
# 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)
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.
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 |
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
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
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)
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