1. Le montage du mécanisme de la porte
Dans un premier temps, nous nous attarderons sur le montage qui permet à la fois l'ouverture de la porte et l'avènement du chevalier. Pour optimiser la place, j'utilise un moteur compatible CADA. Pour réaliser la translation d'avant en arrière, j'utilise des crémaillères techniques. Pour l'ouverture des portes, la meilleure solution que j'ai trouvée est l’utilisation des pièces techniques de type "Liftarm".
La commande du moteur s’effectuera avec un microcontrôleur Raspberry PI Pico. Nous utiliserons un module de puissance L298N, celui-ci alimentera le PI Pico en 5 volts. Les capteurs optoélectroniques utiliserons les ports analogiques (ADC).
Vous trouverez le montage complet sur le site de Rebrickable.
2. Le cablage
Nous utiliserons des capteurs optoélectroniques à fourche.
Le schéma électrique
L'organisation du montage sur le module Lego
3. Le code
J'utilise CircuitPython pour le code du PI Pico. Il y a une routine d'initialisation (init) pour revenir à la position originale (porte fermée) lors du démarrage du programme.
# 2024 Kermith72
#
# Porte automatique Version2
#bibliothèque
import time
import board
import digitalio
import analogio
import pwmio
"""
Bouton Lego
"""
# LED Bouton
led = digitalio.DigitalInOut(board.GP15)
led.direction = digitalio.Direction.OUTPUT
led.value = True
# bouton
button = digitalio.DigitalInOut(board.GP14)
button.switch_to_input(pull=digitalio.Pull.DOWN)
# moteur
in3=digitalio.DigitalInOut(board.GP16)
in4=digitalio.DigitalInOut(board.GP17)
in3.direction = digitalio.Direction.OUTPUT
in4.direction = digitalio.Direction.OUTPUT
in3.value = False
in4.value = False
ena= pwmio.PWMOut(board.GP18, frequency=1000, duty_cycle=0)
#capteur LTH
capteurA = analogio.AnalogIn(board.GP27)
capteurB = analogio.AnalogIn(board.GP26)
#sens du moteur
sens_vers_A = False
#nb deplacement
nb_deplacement = 0
#moteur normal
in3.value = False
in4.value = True
def init():
print('Initialisation')
valueA = capteurA.value
while valueA > 50000:
valueA = capteurA.value
in3.value = True
in4.value = False
ena.duty_cycle = 40000
in3.value = False
in4.value = False
init()
while True:
if button.value:
led.value = False
while nb_deplacement <= 1:
ena.duty_cycle = 40000
if sens_vers_A:
in3.value = True
in4.value = False
valueA = capteurA.value
print(f'Début valeurA : {valueA}')
if valueA < 50000:
ena.duty_cycle = 0
time.sleep(4)
ena.duty_cycle = 40000
in3.value = False
in4.value = True
sens_vers_A = False
print('Moteur inverse')
nb_deplacement = nb_deplacement + 1
else:
in3.value = False
in4.value = True
valueB = capteurB.value
print(f'Début valeurB : {valueB}')
if valueB < 50000:
ena.duty_cycle = 0
time.sleep(4)
ena.duty_cycle = 40000
in3.value = True
in4.value = False
sens_vers_A = True
print('Moteur normal')
#time.sleep(0.5)
#arret moteur
in3.value = False
in4.value = False
#reset nb
nb_deplacement = 0
time.sleep(3)
led.value = True
else:
led.value = True
time.sleep(0.2)
led.value = False
time.sleep(0.2)