Comment faire l'automatisme d'un ascenseur

Avatar du membre
likikiFrance
Site Admin
Site Admin
Messages : 11063
Enregistré le : 27 févr. 2021, 16:11
Prénom : Christian
LOCALISATION : Ile de France
Centres d'intérêts : Le train miniature (H0 3R), l'impression 3D
Echelle pratiquée : H0
Âge : 58
Pays :
France (fr)
France
avr. 2025 26 15:24

Comment faire l'automatisme d'un ascenseur

Message par likikiFrance

Le projet présenté ici est généraliste et a pour but de faire comprendre le principe.

Il est adaptable a plusieurs situation.

Le matériel utilisé :

Le Wemos D1 Mini. C'est lui qui commande. Ce jour, 2,50€ les 10.
.
Weemos D1 Mini.jpg
.


Le TMC2209. Très présent dans les imprimantes 3D, c'est lui qui sert d'interface entre le microprocesseur (ici le Wemos D1 Mini) et le moteur Nema 17. Ce jour, 17,60€ les 5.
.
TMC2209.jpg
.


Le moteur avec poulies d'entrainement 1:1. Ce jour 14,90€ pièce, 3,70€ les 2 amortisseurs, Poulies + courroies 5€ environs.
.
Moteur Nema 17.jpg
.

L'ensemble complet
.
ensemble.jpg
.


Le programme de test :

Code : Tout sélectionner

/*
***************************************************
****** Ascenseur avec un moteur pas à pas   *******
******                                      *******
****** Programme V 1.0                      *******
****** Du 22/02/2025                        *******
****** Par C.ARFEL                          *******
******                                      *******
****** Carte Wemos D1 Mini                  *******
******                                      *******
****** Version 1.0                          *******
****** Mise a quai manuelle                 *******
****** Afficheur lcd 16 x 2 I2C             *******
****** RC + 5 sous sol                      *******
****** Menu par encodeur                    *******
******                                      *******
******                                      *******                                      
******      Liste des bornes utilisées      *******                                      
******                                      *******                                      
****** D0 Capteur infrarouge                *******                                      
****** D1 I2C écran                         *******                                      
****** D2 I2C écran                         *******
****** D3 DIR commande de direction moteur  *******
****** D4 STEP commande nb pas moteur       *******
****** D5 SW encodeur                       *******                                      
****** D6 DT encodeur                       *******                                     
****** D7 Clic encodeur                     *******                                      
****** D8 Arrêt d'urgence + FC total        *******                                     
****** RST (reset carte)                    *******                                      
******                                      *******                                      
****** Le croquis utilise ***** octets (**%)******* 
****** de l'espace de stockage de           ******* 
****** programmes. Le maximum est de        *******
****** ****** octets.                       *******
******                                      *******
****** Les variables globales utilisent     *******
****** **** octets (**%) de mémoire         *******
****** dynamique, ce qui laisse ****        *******
****** octets pour les variables locales.   *******                                      
****** Le maximum est de **** octets.       *******                                     
******                                      *******
******                                      *******                                                                            
***************************************************

. Variables and constants in RAM (global, static), used 28184 / 80192 bytes (35%)
║   SEGMENT  BYTES    DESCRIPTION
╠══ DATA     1496     initialized variables
╠══ RODATA   920      constants       
╚══ BSS      25768    zeroed variables
. Instruction RAM (IRAM_ATTR, ICACHE_RAM_ATTR), used 59687 / 65536 bytes (91%)
║   SEGMENT  BYTES    DESCRIPTION
╠══ ICACHE   32768    reserved space for flash instruction cache
╚══ IRAM     26919    code in IRAM    
. Code in flash (default, ICACHE_FLASH_ATTR), used 235076 / 1048576 bytes (22%)
║   SEGMENT  BYTES    DESCRIPTION
╚══ IROM     235076   code in flash 
 
*/

#include <AccelStepper.h>

const byte pin_DIR = D3;  // définition borne DIR
const byte pin_STEP = D4; // définition borne STEP


AccelStepper stepper(AccelStepper::DRIVER, pin_STEP, pin_DIR); // création objet Stepper

void setup()
{  
    stepper.setMaxSpeed(10000.0);      // Vitesse max moteur
    stepper.setAcceleration(1000.0);   // distance accélération / décélération
}

void loop()
{   
    delay(8000) ;  
    stepper.runToNewPosition(0);

    delay(2000); 
    stepper.runToNewPosition(10000);

    delay(2000); 
    stepper.runToNewPosition(20000);

    delay(2000); 
    stepper.runToNewPosition(30000);

    delay(2000); 
    stepper.runToNewPosition(40000);

    delay(2000); 
    stepper.runToNewPosition(50000);

    delay(2000); 
    stepper.runToNewPosition(30000);

    delay(2000); 
    stepper.runToNewPosition(0);

    delay(2000); 
    stepper.runToNewPosition(50000);

}                      // fin du loop

La vidéo correspondante.




:a_suivre:
ImageImageImage

:tirechap:
Avatar du membre
ramasoftFrance
1300 posts et +
1300 posts et +
Messages : 1383
Enregistré le : 29 juil. 2024, 19:06
Prénom : Patrick
LOCALISATION : Indre
Centres d'intérêts : Modélisme ferroviaire
Programmation C++, VB6 et assembleur
Électronique
Echelle pratiquée : H0
Âge : 67
Pays :
France (fr)
France
avr. 2025 26 16:32

Re: Comment faire l'automatisme d'un ascenseur

Message par ramasoftFrance

Super 👍
:merciiii: :merciiii:


Donc là, les positions sont justes calculées en nombre de pas du moteur
C'est très simple.
Avatar du membre
likikiFrance
Site Admin
Site Admin
Messages : 11063
Enregistré le : 27 févr. 2021, 16:11
Prénom : Christian
LOCALISATION : Ile de France
Centres d'intérêts : Le train miniature (H0 3R), l'impression 3D
Echelle pratiquée : H0
Âge : 58
Pays :
France (fr)
France
avr. 2025 26 17:14

Re: Comment faire l'automatisme d'un ascenseur

Message par likikiFrance

Oui, c'est la solution la plus simple.

Etape 2, installation d'un écran, pour la communication c'est plus pratique. :mdr3:

:a_suivre:
ImageImageImage

:tirechap:
Avatar du membre
patrice_bFrance
Posteur insomniac
Posteur insomniac
Messages : 485
Enregistré le : 31 janv. 2025, 14:45
Prénom : Patrice
LOCALISATION : Beziers Herault
Centres d'intérêts : Modelisme HO et HOM ou HOe
Echelle pratiquée : H0
Âge : 64
Pays :
France (fr)
France
avr. 2025 26 17:31

Re: Comment faire l'automatisme d'un ascenseur

Message par patrice_bFrance

Coucou,

Petites questions :


Le wemos c'est un microcontroleur et le TMC c'est un driver pour le moteur pas a pas ??

Merci.
Cordialement,

Patrice
Avatar du membre
likikiFrance
Site Admin
Site Admin
Messages : 11063
Enregistré le : 27 févr. 2021, 16:11
Prénom : Christian
LOCALISATION : Ile de France
Centres d'intérêts : Le train miniature (H0 3R), l'impression 3D
Echelle pratiquée : H0
Âge : 58
Pays :
France (fr)
France
avr. 2025 26 17:36

Re: Comment faire l'automatisme d'un ascenseur

Message par likikiFrance

Tu as tout bon Patrice.

Ajout d'un écran 2 lignes 16 caractères en I2C

.
Ecran I2C.jpg
.


Le programme modifié en conséquence.

Code : Tout sélectionner

#include <AccelStepper.h>

const byte pin_DIR = D3;  
const byte pin_STEP = D4;

#include <Wire.h>
#include <LiquidCrystal_I2C.h>  

LiquidCrystal_I2C lcd(0x27, 16, 2);                                           // 0x27 ou 0x3F déclaration adresse du lcd
// LiquidCrystal_I2C lcd(0x3f, 16, 2); 


AccelStepper stepper(AccelStepper::DRIVER, pin_STEP, pin_DIR); // création objet Stepper


void setup()
{  

stepper.setMaxSpeed(10000.0);      // Vitesse max moteur
stepper.setAcceleration(1000.0);   // distance accélération / décélération

lcd.init();                                                                   // Initialisation de l'afficheur

lcd.backlight();                                                              // Allume l'ecran

  lcd.clear(); 

                                                        // Efface l'ecran
        lcd.setCursor (0,0);                                                 // place le curseur sur la ligne 0 a gauche
        lcd.print ("*Initialisation*");                                      // Affichage sur le lcd 
        lcd.setCursor (0,1);                                                 // passe a la ligne suivante
        lcd.print ("*  Programme   *");                                      // affichage sur le lcd       
        



}

void loop()
{



    delay(1000); 
    stepper.runToNewPosition(0);
    delay(3000) ;

    lcd.clear();
        lcd.setCursor (0,0);                                            // place le curseur sur la ligne 0 a gauche
        lcd.print ("*Direction*");                                      // Affichage sur le lcd 
        lcd.setCursor (0,1);                                            // passe a la ligne suivante
        lcd.print ("*10 000 points*");                                  // affichage sur le lcd  

    delay(1000); 
    stepper.runToNewPosition(10000);
    delay(3000); 

    lcd.clear();
        lcd.setCursor (0,0);                                                 // place le curseur sur la ligne 0 a gauche
        lcd.print ("*Direction*");                                      // Affichage sur le lcd 
        lcd.setCursor (0,1);                                                 // passe a la ligne suivante
        lcd.print ("*20 000 points*");

    delay(1000); 
    stepper.runToNewPosition(20000);
    delay(3000); 

    lcd.clear();
        lcd.setCursor (0,0);                                                 // place le curseur sur la ligne 0 a gauche
        lcd.print ("*Direction*");                                      // Affichage sur le lcd 
        lcd.setCursor (0,1);                                                 // passe a la ligne suivante
        lcd.print ("*Point zero*");



}

Un déplacement de 10 000 pas représente 5 cm linéaire.

La vidéo :




Etape suivante ajout d'un encodeur rotatif, création de menu interactif.

:a_suivre:
ImageImageImage

:tirechap:
Avatar du membre
patrice_bFrance
Posteur insomniac
Posteur insomniac
Messages : 485
Enregistré le : 31 janv. 2025, 14:45
Prénom : Patrice
LOCALISATION : Beziers Herault
Centres d'intérêts : Modelisme HO et HOM ou HOe
Echelle pratiquée : H0
Âge : 64
Pays :
France (fr)
France
avr. 2025 26 18:25

Re: Comment faire l'automatisme d'un ascenseur

Message par patrice_bFrance

likiki a écrit : 26 avr. 2025, 17:36 Tu as tout bon Patrice.

:a_suivre:
Ahhh, je suis content je progresse :ouf

Tu maitrise c'est super ! :bienv:

Oui ton système de moteur et entrainement pourrait s'utiliser a l'horizontale pour faire tourner les 2 plateaux du bas ...(pater noster)
Cordialement,

Patrice
Avatar du membre
herwatFrance
2000 posts et +
2000 posts et +
Messages : 6201
Enregistré le : 11 mars 2021, 16:14
Prénom : Hervé
LOCALISATION : Creuse
Centres d'intérêts : Modélisme ferroviaire
Impression 3D
Arduino
Echelle pratiquée : H0
Âge : 78
Pays :
France (fr)
France
avr. 2025 26 18:27

Re: Comment faire l'automatisme d'un ascenseur

Message par herwatFrance

Ah, ben tu t'y remet ! cool ! :cooooool: :cooooool: :cooooool: :cooooool: :cooooool:
Avatar du membre
patrice_bFrance
Posteur insomniac
Posteur insomniac
Messages : 485
Enregistré le : 31 janv. 2025, 14:45
Prénom : Patrice
LOCALISATION : Beziers Herault
Centres d'intérêts : Modelisme HO et HOM ou HOe
Echelle pratiquée : H0
Âge : 64
Pays :
France (fr)
France
avr. 2025 26 18:44

Re: Comment faire l'automatisme d'un ascenseur

Message par patrice_bFrance

herwat a écrit : 26 avr. 2025, 18:27 Ah, ben tu t'y remet ! cool ! :cooooool: :cooooool: :cooooool: :cooooool: :cooooool:
Allez Hervé, on t'attend dans le sujet sur mon ascenseur + stockage ;-)
Cordialement,

Patrice
Avatar du membre
ramasoftFrance
1300 posts et +
1300 posts et +
Messages : 1383
Enregistré le : 29 juil. 2024, 19:06
Prénom : Patrick
LOCALISATION : Indre
Centres d'intérêts : Modélisme ferroviaire
Programmation C++, VB6 et assembleur
Électronique
Echelle pratiquée : H0
Âge : 67
Pays :
France (fr)
France
avr. 2025 26 20:55

Re: Comment faire l'automatisme d'un ascenseur

Message par ramasoftFrance

Et de mon côté j'ai trouvé où placer un ascenseur de 1m50 de long avec une voie d'accès mais qui descendrait à - 10cm sous le plateau actuel comme j'avais fait pour la boucle "un train chasse l'autre" et de là me donnerait accès à 2 (ou 3 ...) niveaux inférieurs pour des garages sous le plan de voie actuel avec une boucle de retournement à chaque niveau pour revenir machine en tête vers l'ascenseur.
Ça ferait au final un peu comme sur les vidéos de DB TR1 sur YouTube: viewtopic.php?p=54472#p54472
Donc on devrait être 3 à se lancer dans l'aventure...
Chez moi, le challenge c'est que je ne peux pas déborder en largeur sur la taille actuelle des plateaux, il faut être strictement en dessous.
Modifié en dernier par ramasoftFrance le 26 avr. 2025, 20:59, modifié 1 fois.
Avatar du membre
herwatFrance
2000 posts et +
2000 posts et +
Messages : 6201
Enregistré le : 11 mars 2021, 16:14
Prénom : Hervé
LOCALISATION : Creuse
Centres d'intérêts : Modélisme ferroviaire
Impression 3D
Arduino
Echelle pratiquée : H0
Âge : 78
Pays :
France (fr)
France
avr. 2025 26 20:58

Re: Comment faire l'automatisme d'un ascenseur

Message par herwatFrance

patrice_b a écrit : 26 avr. 2025, 18:44
Allez Hervé, on t'attend dans le sujet sur mon ascenseur + stockage ;-)
J'arrive, j'arrive ! :hhhaaaa: :hhhaaaa: :hhhaaaa:
Avatar du membre
herwatFrance
2000 posts et +
2000 posts et +
Messages : 6201
Enregistré le : 11 mars 2021, 16:14
Prénom : Hervé
LOCALISATION : Creuse
Centres d'intérêts : Modélisme ferroviaire
Impression 3D
Arduino
Echelle pratiquée : H0
Âge : 78
Pays :
France (fr)
France
avr. 2025 26 21:00

Re: Comment faire l'automatisme d'un ascenseur

Message par herwatFrance

ramasoft a écrit : 26 avr. 2025, 20:55 Et de mon côté j'ai trouvé où placer un ascenseur de 1m50 de long avec une voie d'accès mais qui descendrait à - 10cm sous le plateau actuel comme j'avais fait pour la boucle "un train chasse l'autre" et de là me donnerait accès à 2 (ou 3 ...) niveaux inférieurs pour des garages sous le plan de voie actuel avec une boucle de retournement à chaque niveau pour revenir machine en tête vers l'ascenseur.
Ça ferait au final un peu comme sur les vidéos de DB TR1 sur YouTube: viewtopic.php?p=54472#p54472
Donc on devrait être 3 à se lancer dans l'aventure...
Chez moi, le challenge c'est que je ne peux pas déborder en largeur sur la taille actuelle des plateaux, il faut être strictement en dessous.
Alors on va faire du travail à la chaine . . . c'est le cas de la dire ! :siffle: :siffle:
Avatar du membre
TrainDolyFrance
Posteur insomniac
Posteur insomniac
Messages : 343
Enregistré le : 09 févr. 2025, 14:37
Prénom : Olivier
LOCALISATION : Alsace
Centres d'intérêts : Train HO & Impression résine & Fraiseuse CNC faite maison
Echelle pratiquée : H0
Pays :
France (fr)
France
avr. 2025 26 21:14

Re: Comment faire l'automatisme d'un ascenseur

Message par TrainDolyFrance

likiki a écrit : 26 avr. 2025, 17:36
Etape suivante ajout d'un encodeur rotatif, création de menu interactif.

:a_suivre:
Pour ta culture personnelle,
"encoder" = Anglais
"codeur" = Français
"encodeur" = Barbarisme

Alors mes questions...
Tu veux que le codeur serve à positionner ton ascenseur?
Le programme de comptage des pas ne te semble pas suffisant?
Tu veux utiliser les deux?

Tu penses changer tes NEMA17 simples par des NEMA17 pré-équipés de codeurs?
Il existe des codeurs que tu peux clipser sur les NEMA?
Avatar du membre
ramasoftFrance
1300 posts et +
1300 posts et +
Messages : 1383
Enregistré le : 29 juil. 2024, 19:06
Prénom : Patrick
LOCALISATION : Indre
Centres d'intérêts : Modélisme ferroviaire
Programmation C++, VB6 et assembleur
Électronique
Echelle pratiquée : H0
Âge : 67
Pays :
France (fr)
France
avr. 2025 26 21:15

Re: Comment faire l'automatisme d'un ascenseur

Message par ramasoftFrance

Moi aussi je dis toujours encodeur... 😜

Sinon j'ai une question aussi: le moteur pas à pas est assez puissant pour lever un plateau d'1,50m avec une rame dessus ?
Avatar du membre
likikiFrance
Site Admin
Site Admin
Messages : 11063
Enregistré le : 27 févr. 2021, 16:11
Prénom : Christian
LOCALISATION : Ile de France
Centres d'intérêts : Le train miniature (H0 3R), l'impression 3D
Echelle pratiquée : H0
Âge : 58
Pays :
France (fr)
France
avr. 2025 26 21:38

Re: Comment faire l'automatisme d'un ascenseur

Message par likikiFrance

Je parle de ça Olivier => Encodeur rotatif

:lunette:
ImageImageImage

:tirechap:
Avatar du membre
herwatFrance
2000 posts et +
2000 posts et +
Messages : 6201
Enregistré le : 11 mars 2021, 16:14
Prénom : Hervé
LOCALISATION : Creuse
Centres d'intérêts : Modélisme ferroviaire
Impression 3D
Arduino
Echelle pratiquée : H0
Âge : 78
Pays :
France (fr)
France
avr. 2025 26 21:40

Re: Comment faire l'automatisme d'un ascenseur

Message par herwatFrance

ramasoft a écrit : 26 avr. 2025, 21:15 Moi aussi je dis toujours encodeur... 😜

Sinon j'ai une question aussi: le moteur pas à pas est assez puissant pour lever un plateau d'1,50m avec une rame dessus ?
J'ai fait des essais pour les miens .
J'ai un moteur à chaque extrémité de l'ascenseur . Il fait à peu prés 1.30 m et j'ai soulevais sans problème prés de 5 Kg ! ! ! :yess:
J'ai donc continué tranquillement ! :hhhaaaa:
Avatar du membre
herwatFrance
2000 posts et +
2000 posts et +
Messages : 6201
Enregistré le : 11 mars 2021, 16:14
Prénom : Hervé
LOCALISATION : Creuse
Centres d'intérêts : Modélisme ferroviaire
Impression 3D
Arduino
Echelle pratiquée : H0
Âge : 78
Pays :
France (fr)
France
avr. 2025 26 21:45

Re: Comment faire l'automatisme d'un ascenseur

Message par herwatFrance

Petite question à Christian :
ton Wemos D1 Mini , il accepte toutes les bibliothèques arduino ?
Avatar du membre
likikiFrance
Site Admin
Site Admin
Messages : 11063
Enregistré le : 27 févr. 2021, 16:11
Prénom : Christian
LOCALISATION : Ile de France
Centres d'intérêts : Le train miniature (H0 3R), l'impression 3D
Echelle pratiquée : H0
Âge : 58
Pays :
France (fr)
France
avr. 2025 27 08:46

Re: Comment faire l'automatisme d'un ascenseur

Message par likikiFrance

Pour le moment oui.

L'IDE signale un potentiel problème avec la bibliothèque I2C mais cela fonctionne.
ImageImageImage

:tirechap:
Avatar du membre
herwatFrance
2000 posts et +
2000 posts et +
Messages : 6201
Enregistré le : 11 mars 2021, 16:14
Prénom : Hervé
LOCALISATION : Creuse
Centres d'intérêts : Modélisme ferroviaire
Impression 3D
Arduino
Echelle pratiquée : H0
Âge : 78
Pays :
France (fr)
France
avr. 2025 27 10:52

Re: Comment faire l'automatisme d'un ascenseur

Message par herwatFrance

Oui, on aura surement des surprises, mais bon . . . :siffle:
Je suppose qu'il fonctionne en 3.3v ?
Avatar du membre
patrice_bFrance
Posteur insomniac
Posteur insomniac
Messages : 485
Enregistré le : 31 janv. 2025, 14:45
Prénom : Patrice
LOCALISATION : Beziers Herault
Centres d'intérêts : Modelisme HO et HOM ou HOe
Echelle pratiquée : H0
Âge : 64
Pays :
France (fr)
France
avr. 2025 27 11:32

Re: Comment faire l'automatisme d'un ascenseur

Message par patrice_bFrance

ramasoft a écrit : 26 avr. 2025, 20:55 Et de mon côté j'ai trouvé où placer un ascenseur de 1m50 de long avec une voie d'accès mais qui descendrait à - 10cm sous le plateau actuel comme j'avais fait pour la boucle "un train chasse l'autre" et de là me donnerait accès à 2 (ou 3 ...) niveaux inférieurs pour des garages sous le plan de voie actuel avec une boucle de retournement à chaque niveau pour revenir machine en tête vers l'ascenseur.
Ça ferait au final un peu comme sur les vidéos de DB TR1 sur YouTube: viewtopic.php?p=54472#p54472
Donc on devrait être 3 à se lancer dans l'aventure...
Chez moi, le challenge c'est que je ne peux pas déborder en largeur sur la taille actuelle des plateaux, il faut être strictement en dessous.
Ahhh bravo Patrick, tu as bien cogité alors !

On va monter une boite de fabrication d'ascenseur HO :hhhaaaa: :hhhaaaa: :hhhaaaa:
(Ce sera moi le moins doué, ça c'est sur :siffle: )
Sacré réseau DB TR1, je l'avais vu, impressionnant.
Cordialement,

Patrice
Avatar du membre
patrice_bFrance
Posteur insomniac
Posteur insomniac
Messages : 485
Enregistré le : 31 janv. 2025, 14:45
Prénom : Patrice
LOCALISATION : Beziers Herault
Centres d'intérêts : Modelisme HO et HOM ou HOe
Echelle pratiquée : H0
Âge : 64
Pays :
France (fr)
France
avr. 2025 27 11:34

Re: Comment faire l'automatisme d'un ascenseur

Message par patrice_bFrance

herwat a écrit : 26 avr. 2025, 21:40
ramasoft a écrit : 26 avr. 2025, 21:15 Moi aussi je dis toujours encodeur... 😜

Sinon j'ai une question aussi: le moteur pas à pas est assez puissant pour lever un plateau d'1,50m avec une rame dessus ?
J'ai fait des essais pour les miens .
J'ai un moteur à chaque extrémité de l'ascenseur . Il fait à peu prés 1.30 m et j'ai soulevais sans problème prés de 5 Kg ! ! ! :yess:
J'ai donc continué tranquillement ! :hhhaaaa:
Whaou, et avec 2 moteurs, pas trop de complication de décalage ?
Cordialement,

Patrice
Avatar du membre
likikiFrance
Site Admin
Site Admin
Messages : 11063
Enregistré le : 27 févr. 2021, 16:11
Prénom : Christian
LOCALISATION : Ile de France
Centres d'intérêts : Le train miniature (H0 3R), l'impression 3D
Echelle pratiquée : H0
Âge : 58
Pays :
France (fr)
France
avr. 2025 27 12:06

Re: Comment faire l'automatisme d'un ascenseur

Message par likikiFrance

herwat a écrit : 27 avr. 2025, 10:52 Oui, on aura surement des surprises, mais bon . . . :siffle:
Je suppose qu'il fonctionne en 3.3v ?
Oui, mais il y a une entrée USB C (Un chargeur de téléphone + le câble et op). :lunette:
ImageImageImage

:tirechap:
Avatar du membre
likikiFrance
Site Admin
Site Admin
Messages : 11063
Enregistré le : 27 févr. 2021, 16:11
Prénom : Christian
LOCALISATION : Ile de France
Centres d'intérêts : Le train miniature (H0 3R), l'impression 3D
Echelle pratiquée : H0
Âge : 58
Pays :
France (fr)
France
avr. 2025 27 12:17

Re: Comment faire l'automatisme d'un ascenseur

Message par likikiFrance

patrice_b a écrit : 27 avr. 2025, 11:32 On va monter une boite de fabrication d'ascenseur HO :hhhaaaa: :hhhaaaa: :hhhaaaa:
(Ce sera moi le moins doué, ça c'est sur :siffle: )
Je retiens l'idée.

:bien:
ImageImageImage

:tirechap:
Avatar du membre
likikiFrance
Site Admin
Site Admin
Messages : 11063
Enregistré le : 27 févr. 2021, 16:11
Prénom : Christian
LOCALISATION : Ile de France
Centres d'intérêts : Le train miniature (H0 3R), l'impression 3D
Echelle pratiquée : H0
Âge : 58
Pays :
France (fr)
France
avr. 2025 27 12:45

Re: Comment faire l'automatisme d'un ascenseur

Message par likikiFrance

Ont continue avec l'ajout d'un encodeur rotatif et la création de menus ...

.
Encodeur.jpg
.

Le programme :

Code : Tout sélectionner

 


/*
***************************************************
****** Ascenseur avec un moteur pas à pas   *******
******                                      *******
****** Programme V 3.0                      *******
****** Du 22/02/2025                        *******
****** Par C.ARFEL                          *******
******                                      *******
****** Carte Wemos D1 Mini                  *******
******                                      *******
****** Version 1.0                          *******
****** Mise a quai manuelle                 *******
****** Afficheur lcd 16 x 2 I2C             *******
****** RC + 5 sous sol                      *******
****** Menu par encodeur                    *******
******                                      *******
******                                      *******                                      
******      Liste des bornes utilisées      *******                                      
******                                      *******                                      
****** D0 Capteur infrarouge                *******                                      
****** D1 I2C écran                         *******                                      
****** D2 I2C écran                         *******
****** D3 DIR commande de direction moteur  *******
****** D4 STEP commande nb pas moteur       *******
****** D5 SW encodeur                       *******                                      
****** D6 DT encodeur                       *******                                     
****** D7 Clic encodeur                     *******                                      
****** D8 Arrêt d'urgence + FC total        *******                                     
****** RST (reset carte)                    *******                                      
******                                      *******                                      
****** Le croquis utilise ***** octets (**%)******* 
****** de l'espace de stockage de           ******* 
****** programmes. Le maximum est de        *******
****** ****** octets.                       *******
******                                      *******
****** Les variables globales utilisent     *******
****** **** octets (**%) de mémoire         *******
****** dynamique, ce qui laisse ****        *******
****** octets pour les variables locales.   *******                                      
****** Le maximum est de **** octets.       *******                                     
******                                      *******
******                                      *******                                                                            
***************************************************
. Variables and constants in RAM (global, static), used 29192 / 80192 bytes (36%)
║   SEGMENT  BYTES    DESCRIPTION
╠══ DATA     1536     initialized variables
╠══ RODATA   1240     constants       
╚══ BSS      26416    zeroed variables
. Instruction RAM (IRAM_ATTR, ICACHE_RAM_ATTR), used 60995 / 65536 bytes (93%)
║   SEGMENT  BYTES    DESCRIPTION
╠══ ICACHE   32768    reserved space for flash instruction cache
╚══ IRAM     28227    code in IRAM    
. Code in flash (default, ICACHE_FLASH_ATTR), used 245364 / 1048576 bytes (23%)
║   SEGMENT  BYTES    DESCRIPTION
╚══ IROM     245364   code in flash 

*/


#include <AccelStepper.h>                                                     // Bibliothéque moteur pas a pas

const byte pin_DIR = D3;                                                      // Borne contrôle pour TMC2209 
const byte pin_STEP = D4;                                                     // Borne contrôle pour TMC2209

#include <Wire.h>
#include <LiquidCrystal_I2C.h>                                                // Bibliothéque ecran protocole I2C

LiquidCrystal_I2C lcd(0x27, 16, 2);                                           // 0x27 ou 0x3F déclaration adresse du lcd

#include "RotaryEncoder.h"                                                    // Appel de la bibliothéque pour encodeur

#define STEPSS 1                                                              // Nombre par pas d'encodeur

#define POSMIN -5                                                             // Position MINI de l'encodeur

#define POSMAX 4                                                              // Position MAX de l'encodeur

#define BPE D5                                                                // Borne SW encodeur (bouton)

RotaryEncoder encoder(D6, D7);                                                // Borne de l'encodeur (DT, CLK)

AccelStepper stepper(AccelStepper::DRIVER, pin_STEP, pin_DIR);                // création objet Stepper

int Pos0SS = 0;                                                               // Crans moteur pour la position plateau niveau reseau.
int Pos1SS = 10000;                                                           // Crans moteur pour la position plateau 1er sous sol
int Pos2SS = 20000;                                                           // Crans moteur pour la position plateau 2ème sous sol
int Pos3SS = 30000;                                                           // Crans moteur pour la position plateau 3ème sous sol
int Pos4SS = 40000;                                                           // Crans moteur pour la position plateau 4ème sous sol
int Pos5SS = 50000;                                                           // Crans moteur pour la position plateau 5ème sous sol
int Init = 0;                                                                 // Variable pour l'initialisation
int Ebpe = 10;                                                                // Variable bouton encodeur
int lastPos, newPos;                                                          // Variable encodeur



void setup()
{  


lcd.init();                                                                   // Initialisation de l'afficheur

lcd.backlight();                                                              // Allume l'ecran

lcd.clear();                                                                  // Efface l'ecran
lcd.setCursor (0,0);                                                          // place le curseur sur la ligne 0 a gauche
lcd.print ("*Initialisation*");                                               // Affichage sur le lcd 
lcd.setCursor (0,1);                                                          // passe a la ligne suivante
lcd.print ("*  Programme   *");                                               // affichage sur le lcd       


stepper.setMaxSpeed(8000.0);                                                  // Vitesse max moteur
stepper.setAcceleration(500.0);                                               // distance accélération / décélération


encoder.setPosition(10 / STEPSS);                                             // Position initiale encodeur

pinMode(BPE, INPUT);                                                          // Initialisation du clic encodeur rotatif

}

/*
************************
* Fin de la zone SETUP *
************************
*/

/*
****************************
* Séquence initialisation  *
****************************
*/


void Initialisation() {                                                     // Module initialisation du plateau  Recherche du FC 

// Il ne se passe rien d'important ici pour le moment a ce stade du programme.

    lcd.clear ();                                                           // Efface l'ecran
    delay (100);
    lcd.setCursor (0,0);
    lcd.print (" Niveau reseau. ");
    delay(10);
    lcd.setCursor(0,1);                                                     // place le curseur ligne suivante
    lcd.print ("** En attente **");
    delay (200);

    Init = 1;                                                               // Informe que l'initialisation a été faite pour ne pas y revenir
 }








void loop()
{

if (Init <1) {                                                            // Si 1er passage executerligne suivante sinon passer
Initialisation();                                                         // Vas executer le bloc "initialisation"
}


/*
********************************
* Début de la zone des appels  *
********************************
*/


/*
****************************************
* Menu selection par encodeur rotatif  *
****************************************
*/

//                                    ________________ Zone lecture encodeur rotatif _______________

   encoder.tick();
   newPos = encoder.getPosition() * STEPSS;

   if (newPos < POSMIN) { 
   encoder.setPosition(POSMIN / STEPSS); 
   newPos = POSMIN;
   }
   else if (newPos > POSMAX) { 
   encoder.setPosition(POSMAX / STEPSS); 
   newPos = POSMAX; 
   }

   if (lastPos != newPos) {
      
      if (newPos <= 0){                                                   // valable de -5 a 0
      lcd.setCursor(0,1);                                                 // place le curseur ligne suivante
      lcd.print ("Choix => ");lcd.print(newPos);lcd.print("      ");
      delay (10);
      lastPos = newPos;
      }

      if (newPos >= 1){                                                   // Valable si 1
      lcd.setCursor(0,1);                                                 // place le curseur ligne suivante
      lcd.print ("Choix => ");lcd.print("Reglage");
      delay (10);
      lastPos = newPos;
    
      }

 }

   if (digitalRead(BPE) == LOW) {                                         // Control si Bouton encodeur actionné
    Ebpe = newPos;
    delay(500);                                                           // Tempo de pause pour éviter la redondance du clic
   
   }


/*
*****************************
* Appel au rez de chaussée  *
*****************************
*/


if (Ebpe == 0) {                                                          // Action si choix 0 RC
    

    lcd.clear ();                                                         // Efface l'ecran
    delay (100);
    lcd.setCursor (0,0);
    lcd.print ("** Plateforme **");
    delay(10);
    lcd.setCursor(0,1);                                                   // place le curseur ligne suivante
    lcd.print ("* En mouvement *");
    delay (10);

    stepper.runToNewPosition(Pos0SS);
    delay(1000) ;

Ebpe = 10;
    
    lcd.clear ();                                                         // Efface l'ecran
    delay (100);
    lcd.setCursor (0,0);
    lcd.print (" Niveau reseau. ");
    delay(10);
    lcd.setCursor(0,1);                                                   // place le curseur ligne suivante
    lcd.print ("** En attente **");
    delay (1000);
 

  }


/*
**************************
* Appel au 1er sous sol  *
**************************
*/

if (Ebpe == -1) {                                                       // Action si choix -1
    

    lcd.clear ();                                                         // Efface l'ecran
    delay (100);
    lcd.setCursor (0,0);
    lcd.print ("** Plateforme **");
    delay(10);
    lcd.setCursor(0,1);                                                   // place le curseur ligne suivante
    lcd.print ("* En mouvement *");
    delay (10);

    stepper.runToNewPosition(Pos1SS);
    delay(1000) ;
    
    Ebpe = 10;  

         
    lcd.clear ();                                                         // Efface l'ecran
    delay (100);
    lcd.setCursor (0,0);
    lcd.print ("   Niveau  -1   ");
    delay(10);
    lcd.setCursor(0,1);                                                   // place le curseur ligne suivante
    lcd.print ("** En attente **");
    delay (1000);
 
  
  } 


/*
***************************
* Appel au 2ème sous sol  *
***************************
*/



if (Ebpe == -2 ) { 


    lcd.clear ();                                                         // Efface l'ecran
    delay (100);
    lcd.setCursor (0,0);
    lcd.print ("** Plateforme **");
    delay(10);
    lcd.setCursor(0,1);                                                   // place le curseur ligne suivante
    lcd.print ("* En mouvement *");
    delay (10);

    stepper.runToNewPosition(Pos2SS);
    delay(1000) ;
    Ebpe = 10;

     lcd.clear ();                                                         // Efface l'ecran
    delay (100);
    lcd.setCursor (0,0);
    lcd.print ("   Niveau  -2   ");
    delay(10);
    lcd.setCursor(0,1);                                                   // place le curseur ligne suivante
    lcd.print ("** En attente **");
    delay (1000);

}


/*
***************************
* Appel au 3ème sous sol  *
***************************
*/


if (Ebpe == -3 ) { 


    lcd.clear ();                                                         // Efface l'ecran
    delay (100);
    lcd.setCursor (0,0);
    lcd.print ("** Plateforme **");
    delay(10);
    lcd.setCursor(0,1);                                                   // place le curseur ligne suivante
    lcd.print ("* En mouvement *");
    delay (10);

    stepper.runToNewPosition(Pos3SS);
    delay(1000) ;
    Ebpe = 10;
    
    lcd.clear ();                                                         // Efface l'ecran
    delay (100);
    lcd.setCursor (0,0);
    lcd.print ("   Niveau  -3   ");
    delay(10);
    lcd.setCursor(0,1);                                                   // place le curseur ligne suivante
    lcd.print ("** En attente **");
    delay (1000);

}


/*
***************************
* Appel au 4ème sous sol  *
***************************
*/


if (Ebpe == -4 ) { 


    lcd.clear ();                                                         // Efface l'ecran
    delay (100);
    lcd.setCursor (0,0);
    lcd.print ("** Plateforme **");
    delay(10);
    lcd.setCursor(0,1);                                                   // place le curseur ligne suivante
    lcd.print ("* En mouvement *");
    delay (10);

    stepper.runToNewPosition(Pos4SS);
    delay(1000) ;
    Ebpe = 10;
    
    lcd.clear ();                                                         // Efface l'ecran
    delay (100);
    lcd.setCursor (0,0);
    lcd.print ("   Niveau  -4   ");
    delay(10);
    lcd.setCursor(0,1);                                                   // place le curseur ligne suivante
    lcd.print ("** En attente **");
    delay (1000);
}



/*
***************************
* Appel au 5ème sous sol  *
***************************
*/

if (Ebpe == -5 ) { 


    lcd.clear ();                                                         // Efface l'ecran
    delay (100);
    lcd.setCursor (0,0);
    lcd.print ("** Plateforme **");
    delay(10);
    lcd.setCursor(0,1);                                                   // place le curseur ligne suivante
    lcd.print ("* En mouvement *");
    delay (10);

    stepper.runToNewPosition(Pos5SS);
    delay(1000) ;
    Ebpe = 10;
    
    lcd.clear ();                                                         // Efface l'ecran
    delay (100);
    lcd.setCursor (0,0);
    lcd.print ("   Niveau  -5   ");
    delay(10);
    lcd.setCursor(0,1);                                                   // place le curseur ligne suivante
    lcd.print ("** En attente **");
    delay (1000);

}

    


}


  

La vidéo qui vas bien avec :




Etape suivante :

Régler finement les arrêt et enregistrement (volatil dans un 1er temps) des novelles positions.

Modification du programme de sélections qui passera de 170 lignes de codes a .... 40 lignes.


:a_suivre:
ImageImageImage

:tirechap:
Avatar du membre
patrice_bFrance
Posteur insomniac
Posteur insomniac
Messages : 485
Enregistré le : 31 janv. 2025, 14:45
Prénom : Patrice
LOCALISATION : Beziers Herault
Centres d'intérêts : Modelisme HO et HOM ou HOe
Echelle pratiquée : H0
Âge : 64
Pays :
France (fr)
France
avr. 2025 27 14:07

Re: Comment faire l'automatisme d'un ascenseur

Message par patrice_bFrance

likiki a écrit : 27 avr. 2025, 12:17
patrice_b a écrit : 27 avr. 2025, 11:32 On va monter une boite de fabrication d'ascenseur HO :hhhaaaa: :hhhaaaa: :hhhaaaa:
(Ce sera moi le moins doué, ça c'est sur :siffle: )
Je retiens l'idée.

:bien:
Y'a un marché :cooooool:
Cordialement,

Patrice
Avatar du membre
patrice_bFrance
Posteur insomniac
Posteur insomniac
Messages : 485
Enregistré le : 31 janv. 2025, 14:45
Prénom : Patrice
LOCALISATION : Beziers Herault
Centres d'intérêts : Modelisme HO et HOM ou HOe
Echelle pratiquée : H0
Âge : 64
Pays :
France (fr)
France
avr. 2025 27 14:09

Re: Comment faire l'automatisme d'un ascenseur

Message par patrice_bFrance

likiki a écrit : 27 avr. 2025, 12:45 Ont continue avec l'ajout d'un encodeur rotatif et la création de menus ...

Etape suivante :

Régler finement les arrêt et enregistrement (volatil dans un 1er temps) des novelles positions.

Modification du programme de sélections qui passera de 170 lignes de codes a .... 40 lignes.


:a_suivre:
Whaou tu progresse bien ! :bienv:

Sacré cure d'amaigrissement. J'attends alors pour plonger mon nez dans ton code :siffle:
Cordialement,

Patrice
Répondre

Retourner vers « L'ascenseur a trains »