Re: Automatisation d'un ascenseur a trains avec un Arduino
Posté : 01 mai 2021, 08:42
Très peu de fonctionnement, mais le poids, lui, est permanent et peut contribuer a une déformation des roulements a court terme.
Le forum des passionnés de trains miniature, de petites autos etc etc
https://forum-passionnement.fr/phpbb/
Code : Tout sélectionner
// ***************************************************
// ****** Ascenseur avec un moteur pas à pas *******
// ****** *******
// ****** Programme V 1.2 *******
// ****** Du 01/05/2021 *******
// ****** Par C.ARFEL *******
// ****** *******
// ****** Version 3 vitesses *******
// ****** Mise a quai manuelle *******
// ***************************************************
//
#include <Stepper.h> // appel de la bibliothèque
#define STEPS 200 // nombre pas moteur par tour
Stepper stepper(STEPS, 8, 9, 10, 11); // création de l'objet moteur
const int nombre_pas=2100; // nombre de pas du moteur
const int buttonPin2 = 2; // borne du FCH
const int buttonPin3 = 3; // borne du 1er sous sol
const int buttonPin4 = 4; // borne du 2eme sous sol
const int buttonPin5 = 5; // Borne du RDC
const int buttonPin6 = 6; // Borne du I + 1
const int buttonPin12 = 12; // Borne du I - 1
const int buttonPin7 = 7; // Borne de l'inter incrémentation
int Pv1 = 20;
int Pv2 = 40;
int Gv = 0;
int Deplace = 0; // variable de déplacement
int plateau = 0;
int sens = 1; // sens de rotation moteur par défaut
int FCH = 0; // variable Fin de Course Haut
int SS0 = 0;
int SS1 = 0;
int SS2 = 0;
int BPMO = 0;
int BPDE = 0;
int Inter = 0;
int Pos1SS = -2000;
int Pos2SS = -3000;
void setup()
{
Serial.begin(9600);
pinMode(buttonPin2, INPUT); // initialisation de la borne du FCH en entrée
pinMode(buttonPin3, INPUT); // initialisation du bouton 1er sous sol
pinMode(buttonPin4, INPUT); // initialisation du bouton 2éme sous sol
pinMode(buttonPin5, INPUT); // initialisation du bouton RC
pinMode(buttonPin6, INPUT); // Initialisation du bouton d'incrémentation +1
pinMode(buttonPin12, INPUT); // Initialisation du bouton d'incrémentation -1
pinMode(buttonPin7, INPUT); // Initialisation du bouton d'incrémentation Inter
stepper.setSpeed(150); // vitesse du moteur en tours par minute
}
//
//
void Initialisation() // initialisation du plateau Recherche du FCH
{
if (sens >=1) {
if (FCH == LOW) {
sens = 1;
}
else {
sens = 0;
}
{
stepper.setSpeed(90);
stepper.step(sens);
}
}
}
void Bouge(){ // version 3 vitesses
Pv1 = Deplace/20 ; // distance de la Pv1
Pv2 = Pv1 ; // distance de la Pv2
Gv = (Deplace/10) * 8 ; // Distance pour la GV
stepper.setSpeed(40);
stepper.step(Pv1);
stepper.setSpeed(80);
stepper.step(Pv2);
stepper.setSpeed(150);
stepper.step(Gv);
stepper.setSpeed(80);
stepper.step(Pv2);
stepper.setSpeed(40);
stepper.step(Pv1);
}
void Apprentissage(){
if (BPMO == HIGH && FCH == LOW){
stepper.setSpeed(40);
stepper.step(1);
delay(200);
}
if (BPDE == HIGH){
stepper.setSpeed(40);
stepper.step(-1);
delay(200);
}
}
//
//
void loop()
{
FCH = digitalRead(buttonPin2); // lecture de la valeur du FCH
SS1 = digitalRead(buttonPin3); // lecture de la valeur du bouton 1ss
SS2 = digitalRead(buttonPin4); // lecture de la valeur du bouton 2ss
SS0 = digitalRead(buttonPin5); // lecture de la valeur du bouton RC
BPMO = digitalRead(buttonPin6); // lecture de la valeur du bouton I +1
BPDE = digitalRead(buttonPin12); // lecture de la valeur du bouton I -1
Inter = digitalRead(buttonPin7); // lectrue de la valeur du bouton Inter
Initialisation(); // Vas chercher le fin de course haut si le plateau est a un étage intermédiaire.
if (Inter == HIGH) { // Si basculement de l'interuteur direction Apprentissage
Apprentissage();
}
if (SS1 == HIGH && plateau == 0 && Inter == LOW) {
Deplace = plateau + Pos1SS;
Bouge();
plateau = Deplace;
}
if (SS1 == HIGH && plateau == Pos2SS && Inter == LOW) {
Deplace = (-(Pos2SS) + (Pos1SS));
Bouge();
plateau = plateau + Deplace;
}
if (SS2 == HIGH && plateau == 0 && Inter == LOW) {
Deplace = plateau + Pos2SS;
Bouge();
plateau = Deplace;
}
if (SS2 == HIGH && plateau == Pos1SS && Inter == LOW) {
Deplace = (Pos2SS - Pos1SS);
Bouge();
plateau = plateau + Deplace;
}
if (SS0 == HIGH && Inter == LOW) {
Deplace = (-plateau);
Bouge();
plateau = 0;
}
}
Code : Tout sélectionner
// ***************************************************
// ****** Ascenseur avec un moteur pas à pas *******
// ****** *******
// ****** Programme V 1.3 *******
// ****** Du 01/05/2021 *******
// ****** Par C.ARFEL *******
// ****** *******
// ****** Carte MEGA 2560 *******
// ****** *******
// ****** Version 3 vitesses *******
// ****** Mise a quai manuelle *******
// ****** Afficheur lcd 16 x 2 *******
// ****** RC + 5 sous sol *******
// ****** *******
// ***************************************************
//
#include <Stepper.h> // appel de la bibliothèque
#include "LiquidCrystal.h" // Ajout de la librairie pour afficheur lcd
#define STEPS 200 // nombre pas moteur par tour
LiquidCrystal lcd(7,6,5,4,3,2); // déclaration des bornes du lcd
Stepper stepper(STEPS, 8, 9, 10, 11); // création de l'objet moteur
const int nombre_pas=2100; // nombre de pas du moteur
const int buttonPin30 = 30; // borne du FCH
const int buttonPin32 = 32; // Borne du RDC
const int buttonPin34 = 34; // borne du 1er sous sol
const int buttonPin36 = 36; // borne du 2eme sous sol
const int buttonPin38 = 38; // borne du 3ème sous sol
const int buttonPin40 = 40; // borne du 4ème sous sol
const int buttonPin42 = 42; // borne du 5ème sous sol
const int buttonPin31 = 31; // Borne de l'inter incrémentation
const int buttonPin33 = 33; // Borne du I + 1
const int buttonPin35 = 35; // Borne du I - 1
int Pv1 = 20;
int Pv2 = 40;
int Gv = 0;
int Deplace = 0; // variable de déplacement
int plateau = 0; // variable pour la position du plateau
int Etage = 0; // variable contenant l'étage du plateau
int sens = 1; // sens de rotation moteur par défaut
int FCH = 0; // variable Fin de Course Haut
int SS0 = 0; // variable bouton RC
int SS1 = 0; // variable bouton 1er sous sol
int SS2 = 0; // variable bouton 2ème sous sol
int SS3 = 0; // variable bouton 3ème sous sol
int SS4 = 0; // variable bouton 4ème sous sol
int SS5 = 0; // variable bouton 5ème sous sol
int BPMO = 0; // variable bouton monté
int BPDE = 0; // variable bouton descente
int Inter = 0; // variable bouton auto / manuel
int Pos1SS = -2000; // Crans moteur pour la position plateau 1er sous sol
int Pos2SS = -3000; // Crans moteur pour la position plateau 2ème sous sol
int Pos3SS = -4000; // Crans moteur pour la position plateau 3ème sous sol
int Pos4SS = -5000; // Crans moteur pour la position plateau 4ème sous sol
int Pos5SS = -6000; // Crans moteur pour la position plateau 5ème sous sol
void setup()
{
Serial.begin(9600);
lcd.begin(16,2); // Déclaraton du type d'afficheur 16 cracteres sur 2 lignes
lcd.print("*** Bonjour ***"); // Affichage sur le lcd
lcd.setCursor (0,1); // passe a la ligne suivante
lcd.print ("*Initialisation*"); // affichage sur le lcd
pinMode(buttonPin30, INPUT); // initialisation de la borne du FCH en entrée
pinMode(buttonPin32, INPUT); // initialisation du bouton RC
pinMode(buttonPin34, INPUT); // initialisation du bouton 1er sous sol
pinMode(buttonPin36, INPUT); // initialisation du bouton 2éme sous sol
pinMode(buttonPin38, INPUT); // initialisation du bouton 3ème sous sol
pinMode(buttonPin40, INPUT); // initialisation du bouton 4ème sous sol
pinMode(buttonPin42, INPUT); // initialisation du bouton 5éme sous sol
pinMode(buttonPin31, INPUT); // Initialisation du bouton d'incrémentation Inter
pinMode(buttonPin33, INPUT); // Initialisation du bouton d'incrémentation +1
pinMode(buttonPin35, INPUT); // Initialisation du bouton d'incrémentation -1
stepper.setSpeed(150); // vitesse du moteur en tours par minute
}
//
//--------------------------- Initialisation ---------------------------------
//
void Initialisation() // Module initialisation du plateau Recherche du FCH
{
// lcd.setCursor (0,1);
// lcd.print ("Initialisation");
if (sens >=1) {
if (FCH == LOW) {
sens = 1;
}
else {
sens = 0;
lcd.clear (); // Efface l'ecran
delay (100);
lcd.setCursor (0,0);
lcd.print (" *** RC ***");
delay(10);
lcd.setCursor(0,1); // place le curseur ligne suivante
lcd.print ("** En attente **");
delay (10);
}
{
stepper.setSpeed(90);
stepper.step(sens);
}
}
}
//
//--------------------------- Commande moteur ---------------------------------
//
void Bouge(){ // Module commande moteur version 3 vitesses
Pv1 = Deplace/20 ; // distance de la Pv1
Pv2 = Pv1 ; // distance de la Pv2
Gv = (Deplace/10) * 8 ; // Distance pour la GV
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.setSpeed(40); // Acceleration Vitesse 1
stepper.step(Pv1);
stepper.setSpeed(80); // Acceleration Vitesse 2
stepper.step(Pv2);
stepper.setSpeed(150); // Passage en vitesse Maximum
stepper.step(Gv);
stepper.setSpeed(80); // Ralentissement en Vitesse 2
stepper.step(Pv2);
stepper.setSpeed(40); // Ralentissement en Vitesse 1
stepper.step(Pv1);
lcd.clear (); // Efface l'ecran
delay (100);
lcd.setCursor (0,0);
lcd.print ("** etage ");
lcd.println (Etage);
lcd.println (" **");
delay(10);
lcd.setCursor(0,1); // place le curseur ligne suivante
lcd.print ("** En attente **");
delay (10);
}
//
//--------------------------- Mise a quai manuel ---------------------------------
//
void Apprentissage(){ // Module apprentissage
if (BPMO == HIGH && FCH == LOW){
stepper.setSpeed(40);
stepper.step(1);
delay(200);
}
if (BPDE == HIGH){
stepper.setSpeed(40);
stepper.step(-1);
delay(200);
}
}
//
//--------------------------- Boucle principal ---------------------------------
//
void loop()
{
FCH = digitalRead(buttonPin30); // lecture de la valeur du FCH
SS0 = digitalRead(buttonPin32); // lecture de la valeur du bouton RC
SS1 = digitalRead(buttonPin34); // lecture de la valeur du bouton 1ss
SS2 = digitalRead(buttonPin36); // lecture de la valeur du bouton 2ss
SS3 = digitalRead(buttonPin38); // lecture de la valeur du bouton 3ss
SS4 = digitalRead(buttonPin40); // lecture de la valeur du bouton 4ss
SS5 = digitalRead(buttonPin42); // lecture de la valeur du bouton 5ss
Inter = digitalRead(buttonPin31); // lectrue de la valeur du bouton Inter
BPMO = digitalRead(buttonPin33); // lecture de la valeur du bouton I +1
BPDE = digitalRead(buttonPin35); // lecture de la valeur du bouton I -1
Initialisation(); // Vas chercher le fin de course haut si le plateau est a un étage intermédiaire.
if (Inter == HIGH) { // Si basculement de l'interuteur alors direction Apprentissage
Apprentissage(); // Vers le module Apprentissage
}
//
// -------------------- Appel au RDC -------------------------------------------------
//
if (SS0 == HIGH && Inter == LOW) {
Deplace = (-plateau);
Etage = 0;
Bouge();
plateau = 0;
}
//
// ------------------ Appel au 1er sous sol -----------------------
//
if (SS1 == HIGH && plateau == 0 && Inter == LOW) { // Appel au 1er sous sol
Deplace = plateau + Pos1SS;
Etage = (-1);
Bouge();
plateau = Deplace;
}
if (SS1 == HIGH && plateau == Pos2SS && Inter == LOW) {
Deplace = (-(Pos2SS) + (Pos1SS));
Etage = (-1);
Bouge();
plateau = plateau + Deplace;
}
if (SS1 == HIGH && plateau == Pos3SS && Inter == LOW) {
Deplace = (-(Pos3SS) + (Pos1SS));
Etage = (-1);
Bouge();
plateau = plateau + Deplace;
}
if (SS1 == HIGH && plateau == Pos4SS && Inter == LOW) {
Deplace = (-(Pos4SS) + (Pos1SS));
Etage = (-1);
Bouge();
plateau = plateau + Deplace;
}
if (SS1 == HIGH && plateau == Pos5SS && Inter == LOW) {
Deplace = (-(Pos5SS) + (Pos1SS));
Etage = (-1);
Bouge();
plateau = plateau + Deplace;
}
//
// ------------------ Appel au 2ème sous sol -----------------------
//
if (SS2 == HIGH && plateau == 0 && Inter == LOW) {
Deplace = plateau + Pos2SS;
Etage = (-2);
Bouge();
plateau = Deplace;
}
if (SS2 == HIGH && plateau == Pos1SS && Inter == LOW) {
Deplace = (Pos2SS - Pos1SS);
Etage = (-2);
Bouge();
plateau = plateau + Deplace;
}
if (SS2 == HIGH && plateau == Pos3SS && Inter == LOW) {
Deplace = (-(Pos3SS) + (Pos2SS));
Etage = (-2);
Bouge();
plateau = plateau + Deplace;
}
if (SS2 == HIGH && plateau == Pos4SS && Inter == LOW) {
Deplace = (-(Pos4SS) + (Pos2SS));
Etage = (-2);
Bouge();
plateau = plateau + Deplace;
}
if (SS2 == HIGH && plateau == Pos5SS && Inter == LOW) {
Deplace = (-(Pos5SS) + (Pos2SS));
Etage = (-2);
Bouge();
plateau = plateau + Deplace;
}
//
// ------------------ Appel au 3ème sous sol -----------------------
//
if (SS3 == HIGH && plateau == 0 && Inter == LOW) {
Deplace = plateau + Pos3SS;
Etage = (-3);
Bouge();
plateau = Deplace;
}
if (SS3 == HIGH && plateau == Pos1SS && Inter == LOW) {
Deplace = (Pos3SS - Pos1SS);
Etage = (-3);
Bouge();
plateau = plateau + Deplace;
}
if (SS3 == HIGH && plateau == Pos2SS && Inter == LOW) {
Deplace = (Pos3SS - Pos2SS);
Etage = (-3);
Bouge();
plateau = plateau + Deplace;
}
if (SS3 == HIGH && plateau == Pos4SS && Inter == LOW) {
Deplace = (-(Pos4SS) + (Pos3SS));
Etage = (-3);
Bouge();
plateau = plateau + Deplace;
}
if (SS3 == HIGH && plateau == Pos5SS && Inter == LOW) {
Deplace = (-(Pos5SS) + (Pos3SS));
Etage = (-3);
Bouge();
plateau = plateau + Deplace;
}
//
// ------------------ Appel au 4ème sous sol -----------------------
//
if (SS4 == HIGH && plateau == 0 && Inter == LOW) {
Deplace = plateau + Pos4SS;
Etage = (-4);
Bouge();
plateau = Deplace;
}
if (SS4 == HIGH && plateau == Pos1SS && Inter == LOW) {
Deplace = (Pos4SS - Pos1SS);
Etage = (-4);
Bouge();
plateau = plateau + Deplace;
}
if (SS4 == HIGH && plateau == Pos2SS && Inter == LOW) {
Deplace = (Pos4SS - Pos2SS);
Etage = (-4);
Bouge();
plateau = plateau + Deplace;
}
if (SS4 == HIGH && plateau == Pos3SS && Inter == LOW) {
Deplace = (Pos4SS - Pos3SS);
Etage = (-4);
Bouge();
plateau = plateau + Deplace;
}
if (SS4 == HIGH && plateau == Pos5SS && Inter == LOW) {
Deplace = (-(Pos5SS) + (Pos4SS));
Etage = (-4);
Bouge();
plateau = plateau + Deplace;
}
//
// ------------------ Appel au 5ème sous sol -----------------------
//
if (SS5 == HIGH && plateau == 0 && Inter == LOW) {
Deplace = plateau + Pos5SS;
Etage = (-5);
Bouge();
plateau = Deplace;
}
if (SS5 == HIGH && plateau == Pos1SS && Inter == LOW) {
Deplace = (Pos5SS - Pos1SS);
Etage = (-5);
Bouge();
plateau = plateau + Deplace;
}
if (SS5 == HIGH && plateau == Pos2SS && Inter == LOW) {
Deplace = (Pos5SS - Pos2SS);
Etage = (-5);
Bouge();
plateau = plateau + Deplace;
}
if (SS5 == HIGH && plateau == Pos3SS && Inter == LOW) {
Deplace = (Pos5SS - Pos3SS);
Etage = (-5);
Bouge();
plateau = plateau + Deplace;
}
if (SS5 == HIGH && plateau == Pos4SS && Inter == LOW) {
Deplace = (Pos5SS - Pos4SS);
Etage = (-5);
Bouge();
plateau = plateau + Deplace;
}
}
//
//--------------------------- Fin de la boucle principal ---------------------------------
//
Ah bon ? toi aussi !
Je reviens la dessus .
Non, ça c'est le couple de maintient : comme l'indique son nom, c'est le couple exercé par le moteur pour se maintenir en position quand il n'a pas d'ordre de rotation . Le couple moteur proprement dit est plus important !likiki a écrit : ↑07 mai 2021, 10:34 Le moteur que j'ai serait un 0,4 Nm sous 0,8A
CARACTÉRISTIQUES TECHNIQUE :
Norme du moteur pas à pas: NEMA 17
Dimensions: 42.3 x 42.3 x 40 mm
Poids: 285 g
Diamètre de l’axe: Ø5mm
Nombre de phase: 2
Voltage standard: 0.8 – 1 V
Nombre de pas: 200
Pas angulaire: 1,8° (+/-5%)
Couple de maintien: 40 N.cm pour 0.8 ampères
Connexion: 4 fils
:2: