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".

Mecanisme porte 

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.

capteur a fourche

Le schéma électrique

cablage diorama porte chateau 

L'organisation du montage sur le module Lego

schema electrique module

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)