from machine import Pin, PWM
import time
# Configuration des broches pour le moteur
ENA = PWM(Pin(16)) # Broche PWM pour la vitesse (GPIO16)
IN1 = Pin(17, Pin.OUT) # Direction IN1 (GPIO17)
IN2 = Pin(18, Pin.OUT) # Direction IN2 (GPIO18)
# Configuration des broches pour le codeur
ENCODER_A = Pin(14, Pin.IN, Pin.PULL_UP) # Canal A du codeur (GPIO14)
ENCODER_B = Pin(15, Pin.IN, Pin.PULL_UP) # Canal B du codeur (GPIO15)
# Variables globales
encoder_count = 0
position_max = 100 # Nombre d'impulsions nécessaires pour que la porte soit complètement ouverte
position_min = 0 # Nombre d'impulsions nécessaires pour que la porte soit complètement fermée
# Fonction de rappel pour le codeur
def encoder_callback(pin):
global encoder_count
a_state = ENCODER_A.value()
b_state = ENCODER_B.value()
if a_state == b_state:
encoder_count += 1
else:
encoder_count -= 1
# Attacher une interruption pour le canal A
ENCODER_A.irq(trigger=Pin.IRQ_RISING | Pin.IRQ_FALLING, handler=encoder_callback)
# Fonction pour configurer la vitesse et la direction du moteur
def set_motor_speed(speed):
if speed > 0:
IN1.on()
IN2.off()
elif speed < 0:
IN1.off()
IN2.on()
else:
IN1.off()
IN2.off()
# Vitesse PWM (0-100%)
ENA.duty_u16(int(abs(speed) * 655.35)) # Convertir la vitesse en 16 bits (0-65535)
# Fonction pour ouvrir la porte
def open_door():
global encoder_count
set_motor_speed(10) # Vitesse positive pour ouvrir la porte
while encoder_count < position_max:
time.sleep(0.1) # Attendre que la porte avance
print(f"Ouverture en cours... Position: {encoder_count}/{position_max}")
set_motor_speed(0) # Arrêter le moteur lorsque la porte est complètement ouverte
print("Porte complètement ouverte")
# Fonction pour fermer la porte
def close_door():
global encoder_count
set_motor_speed(-10) # Vitesse négative pour fermer la porte
while encoder_count > position_min:
time.sleep(0.1) # Attendre que la porte recule
print(f"Fermeture en cours... Position: {encoder_count}/{position_min}")
set_motor_speed(0) # Arrêter le moteur lorsque la porte est complètement fermée
print("Porte complètement fermée")
# Boucle principale
try:
while True:
action = input("Entrez 'ouvrir' pour ouvrir la porte ou 'fermer' pour fermer la porte : ").lower()
if action == "ouvrir":
open_door()
elif action == "fermer":
close_door()
else:
print("Commande invalide. Utilisez 'ouvrir' ou 'fermer'.")
except KeyboardInterrupt:
print("Arrêt du programme.")
set_motor_speed(0) # Arrêter le moteur