Forums LR PRESSE

Où il est question de trains, petits et grands

  • Advertisement

Transformation d'une imprimante 3D en pont transbordeur

Toutes les discussions sur l'Arduino !

Modérateur: MOD

Re: Transformation d'une imprimante 3D en pont transbordeur

Publié: Dim 19 Nov 2017, 17:18 
Dur dur ce samedi, j'ai passé l'après-midi à me casser les dents sur une punaise tenace. Après avoir craint que mon EEPROM ne soit brûlée, puis pensé que la déclaration d'une structure n'était pas supportée, j'ai finalement compris que j'avais écrit :

if (a=0) {sauver une struct en EEPROM}

au lieu de :

if (a==0) {sauver une struct en EEPROM}

et bien évidemment le sauvetage ne se faisait jamais...

Quel corniaud, ce compilateur, que d'accepter de telles âneries... :siffle:

Avec tout ça, pas encore de version 0.1 à vous présenter... :mort:
Loch & LOL !
Avatar de l’utilisateur
DeepPurple
Fécond
 
Messages: 517
Inscrit le: Ven 04 Nov 2016, 20:36
Localisation: Un peu plus à l'ouest
Âge: 63
Echelle pratiquée: N/DCC
Club: AMFB Braine-l'Alleud

Re: Transformation d'une imprimante 3D en pont transbordeur

Publié: Dim 19 Nov 2017, 19:23 
Je te rassure : cela m'est arrivé aussi.
Et cela m'arrivera encore... :lol:

Si à la place de a=0 tu avais mis a=1, alors le test if aurait été toujours vrai et tu aurais sauvegardé dans l'EEPROM... mais tellement de fois que tu aurais certainement tué l'EEPROM, donc il faut faire attention à la gestion des écritures afin de ne pas toujours écrire au même endroit.
Avatar de l’utilisateur
Arduino
Prolixe
 
Messages: 1688
Inscrit le: Mer 25 Sep 2013, 17:14

Re: Transformation d'une imprimante 3D en pont transbordeur

Publié: Dim 19 Nov 2017, 19:43 
Merci de vos encouragements. En dépit des attaques de punaises féroces, j'ai pu progresser un peu et je ne résiste pas à l'envie de vous partager ce petit film du déplacement du pont de la voie 3 à la voie 5 (les voies sont symbolisées par de petits traits de crayon). Pour lancer le pont, il suffit de régler l'afficheur sur "5" à l'aide d'un bouton poussoir, et puis d'appuyer sur un bouton "GO".

Pour régler les voies, il faut passer en mode programmation en appuyant plus de trois secondes sur le bouton GO. Ensuite, déplacer le moteur avec les flèches. Appuyer sur GO quand le pont est à la bonne place. Choisir le numéro de la voie à programmer, et appuyer à nouveau sur le bouton GO pour enregistrer les coordonnées de cette voie dans l'EEPROM. Je vous ferai une vidéo de la programmation quand j'aurai une maquette un peu plus présentable.

En dessous de la vidéo, vous trouverez :
  • Une copie de ce qui est affiché sur l'écran de monitoring quand le pont passe de la voie 3 à la voie 5.
  • La version 0.1 du programme Arduino.



Code: Tout sélectionner
Départ vers la voie cible
Position du moteur: -411
Voie cible: 5
Voie précédente: 3
Position moteur sauvée: NON
Pos 0: 0
Pos 1: 30; Pos 2: 193; Pos 3: -411; Pos 4: -991;
Pos 5: -1792; Pos 6: 0; Pos 7: 0; Pos 8: 0;
Check EEPROM=97: 97

Voie cible atteinte
Position du moteur: -1792
Voie cible: 5
Voie précédente: 5
Position moteur sauvée: OUI
Pos 0: 0
Pos 1: 30; Pos 2: 193; Pos 3: -411; Pos 4: -991;
Pos 5: -1792; Pos 6: 0; Pos 7: 0; Pos 8: 0;
Check EEPROM=97: 97


Code: Tout sélectionner
/*
  GESTION D'UN PONT TRANSBORDEUR par DeepPurple 2017

  Version 0.1

  Le pont est construit sur base d'un châssis d'imprimante 3D.
  L'entraînement du pont est assuré par un moteur pas à pas et une vis sans fin.
  Le choix de la voie se fait à l'aide de boutons poussoirs.
  - Deux boutons fléchés pour le choix de la voie, dont le numéro est affiché sur l'afficheur à 7 segments.
  - Un bouton GO pour lancer le pont vers la voie choisie.
  Une pression longue sur le bouton GO active le mode programmation. Les opérations ci-dessous sont à répéter pour chaque voie, en commençant par le règlage du point zéro.
  Attention, il faut commencer par le point zéro, et ne plus le modifier ensuite, car il sert de référence pour toutes les voies !
  - Les boutons fléchés permettent alors d'amener manuellement le pont devant une des voies, ou devant le point de référence "Zéro".
  - Appuyer sur GO quand la voie est parfaitement positionnée.
  - Choisir ensuite le numéro attribué à cette voie (de 1 à 8) ou le point 0 (zéro) et appuyer sur GO pour confirmer.
*/
#include <EEPROM.h> // pour le sauvetage des données permanentes dans l'EEPROM
#include <TM1637Display.h> // gestion de l'afficheur 4 x 7 segments
#include <Bounce2.h> // gestion des boutons poussoirs
#include <Stepper.h> // gestion du moteur pas à pas

// activation ou désactivation des messages de mise au point
const boolean debugMode = true;

// moteur pas à pas
const int stepsPerRevolution = 200;
const int stepperSpeed = 60;
int stepperPin[] = {2, 3, 4, 5}; // pattes de connection du moteur pas à pas
Stepper myStepper(stepsPerRevolution, stepperPin[0], stepperPin[1], stepperPin[2], stepperPin[3]);
long currentStepperPosition = 0; // position courante du moteur

// boutons
const int upButtonPin = 6;
const int downButtonPin = 7;
const int goButtonPin = 8;
Bounce upButton = Bounce();
Bounce downButton = Bounce();
Bounce goButton = Bounce();

// afficheur 4 * 7 segments
const int displayClock = 9;
const int displayIO = 10;
TM1637Display display(displayClock, displayIO);
byte displayData[] = {0, 0, 0, 0};
const byte dash = SEG_G; // -

// voies
const byte checkEEPROM = 97; // tag pour initialisation de l'EEPROM
const byte maxTrackNumber = 8; // voies de 1 à N
// structure pour l'enregistrement en EEPROM des paramètres des voies entre deux sessions d'exploitation
struct bridgeStruct {
  byte checkEEPROM;
  long trackPositions[32]; // à changer si plus de 32 voies...
  long zeroPointPosition;
  byte previousTrack;
  byte targetTrack;
  boolean targetReached;
};
bridgeStruct bridge; // paramètres par défaut pour amorcer l'appli

// mode programmation
bool positionSetMode = false;
bool trackSetMode = false;

// flags pour passage en mode programmation après avoir appuyé 3 s sur GO
const int programmingButtonTriggerDelay = 3000;
unsigned long programmingButtonPreviousTime = 0;
unsigned long currentTime;

// initialisation
void setup() {

  Serial.begin(9600);
  printAndSaveBridgeParameters("Pont transbordeur par DeepPurple V1.0", false);

  // Vérification de l'EEPROM et chargement des paramètres
  EEPROM.get(0, bridge);
  if (bridge.checkEEPROM == checkEEPROM) { // chargement des paramètres depuis l'EEPROM
    currentStepperPosition = bridge.trackPositions[bridge.previousTrack - 1]; // on se replace à la dernière position connue
    printAndSaveBridgeParameters("Dernière position sauvegardée ", true);
  }
  else { // initialisation des paramètres en EEPROM
    bridge.checkEEPROM = checkEEPROM;
    for (int i = 0; i < maxTrackNumber; i++) {
      bridge.trackPositions[i] = 0;
    }
    bridge.zeroPointPosition = 0;
    bridge.previousTrack = 0;
    bridge.targetTrack = 1;
    bridge.targetReached = false;
    printAndSaveBridgeParameters("Initialisation des paramètres", true);
  }

  // init moteur pas à pas
  myStepper.setSpeed(stepperSpeed);

  // init boutons
  upButton.attach(upButtonPin, INPUT_PULLUP);
  downButton.attach(downButtonPin, INPUT_PULLUP);
  goButton.attach(goButtonPin, INPUT_PULLUP);
  upButton.interval(100);
  downButton.interval(100);
  goButton.interval(100);

  // init display
  display.setBrightness(7, true);

  // vérification du positionnement du zéro
  if (!bridge.targetReached) { // le dernier mouvement ne s'est pas complètement terminé
    positionSetMode = true; // on force le mode repositionement
  }
}

// Boucle principale
void loop() {

  // Contrôle des boutons
  upButton.update();
  downButton.update();
  goButton.update();

  // on passe en mode programmation si le bouton GO a été pressé plus de 3 secondes
  currentTime = millis();
  if (goButton.fell()) {
    programmingButtonPreviousTime = currentTime; // initialisation du timer
  }
  if (goButton.rose()) {
    if  ((currentTime - programmingButtonPreviousTime) > programmingButtonTriggerDelay) {
      positionSetMode = true;
      bridge.targetReached = false; // positionnement du moteur sera à refaire si l'on ne finit pas la séquence
      printAndSaveBridgeParameters("PositionSetMode activé", true);
    }
  }

  if (positionSetMode) {  // mode détermination de la position d'une voie ou du zéro
    // afficher "----" pour montrer que le mode programmation est activé
    for (int i = 0; i <= 3; i++) {
      displayData[i] = dash;
    }
    display.setSegments(displayData, 4, 0);
    // positionnement du moteur à l'aide des boutons
    if (!upButton.read()) setStepperPosition(currentStepperPosition + 1);
    if (!downButton.read()) setStepperPosition(currentStepperPosition - 1);
    // Entrée en mode enregistrement de la voie ?
    if (goButton.fell()) {
      printAndSaveBridgeParameters("Activation TrackSetMode", false);
      positionSetMode = false;
      trackSetMode = true;
    }
  }

  else if (trackSetMode) { // mode enregistrement de la position d'un voie ou du zéro
    // choix et affichage de la voie à enregistrer
    if (upButton.fell()) bridge.targetTrack = min(bridge.targetTrack + 1, maxTrackNumber) ;
    if (downButton.fell()) bridge.targetTrack = max(bridge.targetTrack - 1, 0);
    display.showNumberDec(bridge.targetTrack, false);
    displayData[0] = dash;
    displayData[1] = dash;
    display.setSegments(displayData, 2, 0);
    if (goButton.fell()) { // enregistrement de la position de la voie ou du zéro
      if (bridge.targetTrack == 0) {
        bridge.zeroPointPosition = currentStepperPosition;
      }
      else {
        bridge.trackPositions[bridge.targetTrack - 1] = currentStepperPosition;
      }
      trackSetMode = false;
      bridge.targetReached = true;
      printAndSaveBridgeParameters("Voie enregistrée", true);
    }
  }

  else {
    // choix et affichage de la voie de destination
    if (upButton.fell()) bridge.targetTrack = min(bridge.targetTrack + 1, maxTrackNumber) ;
    if (downButton.fell()) bridge.targetTrack = max(bridge.targetTrack - 1, 1);
    display.showNumberDec(bridge.targetTrack, false);
    if (goButton.fell()) { // positionnement vers la voie de destination
      bridge.targetReached = false;
      printAndSaveBridgeParameters("Départ vers la voie cible", true);
    }
    if (!bridge.targetReached) {
      setStepperPosition(bridge.trackPositions[bridge.targetTrack - 1]);
      if (currentStepperPosition == bridge.trackPositions[bridge.targetTrack - 1]) {
        bridge.targetReached = true;
        bridge.previousTrack = bridge.targetTrack;
        printAndSaveBridgeParameters("Voie cible atteinte", true);
      }
    }
  }
}


void setStepperPosition(long targetStepperPosition) {
  // rapproche le moteur de sa destination, d'un pas à la fois
  const int pace = 30; // délai en ms entre les avancements d'un pas
  static unsigned long previousTime = 0;
  unsigned long currentTime;
  // Avançons d'un pas vers la cible, toutes les N ms (où N = pace)
  currentTime = millis();
  if ((currentTime - previousTime) >= pace) {
    previousTime = currentTime;
    if (currentStepperPosition > targetStepperPosition) {
      myStepper.step(-1);
      currentStepperPosition = currentStepperPosition - 1;
    }
    if (currentStepperPosition < targetStepperPosition) {
      myStepper.step(+1);
      currentStepperPosition = currentStepperPosition + 1;
    }
  }
}

void printAndSaveBridgeParameters(char message[], boolean saveEEPROM) {
  static int savingsThisSession = 0;
  const int maxSavingsInDebugMode = 100; // pour protéger l'EEPROM en mode mise au point
  if (saveEEPROM) {
    savingsThisSession = savingsThisSession + 1;
    if (debugMode && (savingsThisSession > maxSavingsInDebugMode)) {
    Serial.println("ATTENTION : LE NOMBRE MAX DE SAUVETAGES EN EEPROM EST DEPASSE !!!!!");
    }
    else {
      EEPROM.put(0, bridge);
    }
  }
  if (debugMode) {
    Serial.println();
    Serial.println(message);
    Serial.print("Position du moteur: "); Serial.println(currentStepperPosition);
    Serial.print("Voie cible: "); Serial.println(bridge.targetTrack);
    Serial.print("Voie précédente: "); Serial.println(bridge.previousTrack);
    Serial.print("Position moteur sauvée: "); Serial.println(bridge.targetReached ? "OUI" : "NON");
    Serial.print("Pos 0: "); Serial.println(bridge.zeroPointPosition);
    for (int i = 0; i < maxTrackNumber; i++) {
      Serial.print("Pos "); Serial.print(i + 1); Serial.print(": "); Serial.print(bridge.trackPositions[i]); Serial.print("; ");
      if ((((i + 1) % 4) == 0) || (i == (maxTrackNumber - 1))) Serial.println();
    }
    Serial.print("Check EEPROM=" + String(checkEEPROM) + ": "); Serial.println(bridge.checkEEPROM);
  }
}
Loch & LOL !
Avatar de l’utilisateur
DeepPurple
Fécond
 
Messages: 517
Inscrit le: Ven 04 Nov 2016, 20:36
Localisation: Un peu plus à l'ouest
Âge: 63
Echelle pratiquée: N/DCC
Club: AMFB Braine-l'Alleud

Re: Transformation d'une imprimante 3D en pont transbordeur

Publié: Sam 25 Nov 2017, 19:29 
Bonsoir, me voilà à nouveau tout perdu. L'étape suivante consistait à relier mon pont transbordeur à RocRail, pour le commander depuis mon PC. Je voudrais utiliser le protocole RASCII, pour lequel il existe une bibliothèque sur GitHub.

Mais cette bibliothèque n'est pas documentée et je m'arrache les cheveux. L'un d'entre-vous aurait-il un tutorial, ou une description des fonctions de la bibliothèque ?

Merci de votre aide.
Loch & LOL !
Avatar de l’utilisateur
DeepPurple
Fécond
 
Messages: 517
Inscrit le: Ven 04 Nov 2016, 20:36
Localisation: Un peu plus à l'ouest
Âge: 63
Echelle pratiquée: N/DCC
Club: AMFB Braine-l'Alleud

Re: Transformation d'une imprimante 3D en pont transbordeur

Publié: Lun 04 Déc 2017, 19:19 
DeepPurple a écrit:
Image


Tu es sûr que son axe est faussé ? Ne s'agit-il pas plutôt de ce qu'on appelle un roulement rotulé qui permet de compenser l'auto alignement ?

A la vue de ta photo, je pense que tu peux prendre ton roulement et le faire pivoter un peu dans tous les sens.

Généralement, ces roulements sont graissés, donc si tu vois un peu de graisse, je ne pense pas que cela soit très grave. Tu peux enlever le flasque noir, et remettre un peu de graisse si tu as des doutes, et ensuite, remettre le flasque en place.

Steam
Il y a pire que de ne jamais réussir, c'est de ne jamais essayer !
Avatar de l’utilisateur
Steam
Passe-Partout
 
Messages: 1233
Inscrit le: Lun 23 Oct 2006, 00:15
Localisation: Là où l'on a préparé le record du monde

Re: Transformation d'une imprimante 3D en pont transbordeur

Publié: Lun 04 Déc 2017, 20:32 
@Stream : je vais essayer de le redresser avec un levier, mais les colliers ne tournent pas "dans tous les sens". Ils sont solidement sertis les uns dans les autres. Et l'autre support, le bon, est parfaitement dans l'axe. Sur celui de la photographie, le deuxième collier est faussé par rapport au collier central. Le mieux est de prendre mon mal en patience, un tel support n'est pas cher, mais le délai de livraison est très long.
Loch & LOL !
Avatar de l’utilisateur
DeepPurple
Fécond
 
Messages: 517
Inscrit le: Ven 04 Nov 2016, 20:36
Localisation: Un peu plus à l'ouest
Âge: 63
Echelle pratiquée: N/DCC
Club: AMFB Braine-l'Alleud

Re: Transformation d'une imprimante 3D en pont transbordeur

Publié: Lun 04 Déc 2017, 20:54 
En regardant la photo, j'ai l'impression déjà que le roulement en lui-même n'est pas insérer correctement dans le palier. si tu veux essayer de le replacer correctement, il faut appuyer sur la bague extérieure, et non sur la partie intérieure.

Steam
Il y a pire que de ne jamais réussir, c'est de ne jamais essayer !
Avatar de l’utilisateur
Steam
Passe-Partout
 
Messages: 1233
Inscrit le: Lun 23 Oct 2006, 00:15
Localisation: Là où l'on a préparé le record du monde

Re: Transformation d'une imprimante 3D en pont transbordeur

Publié: Jeu 07 Déc 2017, 12:17 
DeepPurple a écrit:Mais cette bibliothèque n'est pas documentée et je m'arrache les cheveux. L'un d'entre-vous aurait-il un tutorial, ou une description des fonctions de la bibliothèque ?


Bonjour

Une bonne façon de faire dans ce genre de cas est d'explorer les fichiers de la bibliothèque. Comme je l'explique dans mon article
Locoduino, le fichier library.properties contient les données importantes liées à la bibliothèque, comme son nom, son numéro de version, etc... Dans celle ci se trouve également l'adresse d'un site pour la documentation (ligne 'url') : Rocrail/RASCII. Peut être y trouveras tu des réponses à tes questions. Dans le répertoire 'extras' de la bib peuvent aussi se trouver des fichiers d'aide : pdf, chm ou html, mais ce n'est pas le cas ici. Les exemples livrés sont aussi souvent d'une grande aide. En dernier recours, les sources eux même peuvent être une source d'information s'ils sont correctement documentés et à jour... Ce n'est le cas non plus ici ! Il reste encore le contact avec l'auteur qui peut aider, ou avec des gens qui ont déjà utilisé cette bibliothèque...
Avatar de l’utilisateur
Trusty
Bavard
 
Messages: 64
Inscrit le: Lun 03 Déc 2012, 12:04
Localisation: Melun
Âge: 56
Echelle pratiquée: N
Prénom: Thierry

Re: Transformation d'une imprimante 3D en pont transbordeur

Publié: Mar 19 Déc 2017, 20:42 
Bonsoir à tous,

Je ne vous oublie pas, mais mon projet n'avance pas très vite, pour cause d'activités annexes :siffle: , et aussi parce que j'ai rencontré quelques obstacles. Le protocole RASCII est bien supporté en Rocrail, mais pas sur l'interface ethernet. Je suis donc passé à DCC++, qui marche bien en ethernet. Hélas, le composant "pont transbordeur" de Rocrail n'était pas supporté... J'ai fait appel aux développeurs de Rocrail, qui sont très efficaces et m'ont fourni dès le lendemain une nouvelle version compatible avec mon projet. :applause:

Voilà où j'en suis ce soir. Suite l'an prochain, au rythme où ça avance.

Image
Le composant "pont transbordeur" de Rocrail
Loch & LOL !
Avatar de l’utilisateur
DeepPurple
Fécond
 
Messages: 517
Inscrit le: Ven 04 Nov 2016, 20:36
Localisation: Un peu plus à l'ouest
Âge: 63
Echelle pratiquée: N/DCC
Club: AMFB Braine-l'Alleud

Re: Transformation d'une imprimante 3D en pont transbordeur

Publié: Mer 17 Jan 2018, 16:24 
:moi:
ENCORE un sujet passionnant :applause:

j'avais repéré ces petits mécanismes sur le site chinois ( :ange3: ) avec la même idée ... un pont transbordeur, c'est économique en place, sur un module :P

D'ailleurs , il y a là bas un mécanisme différent, au pas de vis "plus allongé", dont la vis est en métal jaune : ce "pas" n"influencerait-il pas "la réalité" du déplacement ??

ici : https://fr.aliexpress.com/item/2-phase- ... 0.0.UkYZR1

:wink:
A toute vapeur...en + du reste
Avatar de l’utilisateur
BB9004
Fécond
 
Messages: 547
Inscrit le: Jeu 09 Août 2012, 15:58
Localisation: Planète Bleue, à coté de la ville Lumière : 94
Âge: 63
Echelle pratiquée: HO
Prénom: Lionel
Club: ex CMG 92

Re: Transformation d'une imprimante 3D en pont transbordeur

Publié: Mer 17 Jan 2018, 19:44 
Bonjour,

Le pas de la référence que tu donnes me semble identique au mien, soit 2 mm par tour, ce qui avec un moteur 200 pas par tour donne une progression de 0,01 mm par pas. Plutôt précis.

Par contre la longueur totale de la vis est de 52 mm, ce qui est bien court pour un pont, même en N.

Je travaille à relier mon pont à Rocrail, mais cela n'avance pas vite. :roll:
Loch & LOL !
Avatar de l’utilisateur
DeepPurple
Fécond
 
Messages: 517
Inscrit le: Ven 04 Nov 2016, 20:36
Localisation: Un peu plus à l'ouest
Âge: 63
Echelle pratiquée: N/DCC
Club: AMFB Braine-l'Alleud

Re: Transformation d'une imprimante 3D en pont transbordeur

Publié: Mar 23 Jan 2018, 16:57 
hello
j'ai vu ça aussi... pour un "bô" mouvement linéaire de pont transbordeur en DIY...
intéressant ?
https://fr.aliexpress.com/item/Free-shi ... e882&tpp=1

encore mieux : quasi tout pret ...
> https://fr.aliexpress.com/item/CNBTR-Ho ... autifyAB=3
:idea: :?:
A toute vapeur...en + du reste
Avatar de l’utilisateur
BB9004
Fécond
 
Messages: 547
Inscrit le: Jeu 09 Août 2012, 15:58
Localisation: Planète Bleue, à coté de la ville Lumière : 94
Âge: 63
Echelle pratiquée: HO
Prénom: Lionel
Club: ex CMG 92

Re: Transformation d'une imprimante 3D en pont transbordeur

Publié: Mar 23 Jan 2018, 20:00 
BB9004 a écrit:encore mieux : quasi tout pret ...
> https://fr.aliexpress.com/item/CNBTR-Ho ... autifyAB=3
:idea: :?:

Cela ressemble à ce que j'ai acheté. Attention à la longueur de la vis, en fonction de la largeur du pont que tu souhaites fabriquer.

PS: de mon côté, la programmation avance tout doucement... :siffle:
Loch & LOL !
Avatar de l’utilisateur
DeepPurple
Fécond
 
Messages: 517
Inscrit le: Ven 04 Nov 2016, 20:36
Localisation: Un peu plus à l'ouest
Âge: 63
Echelle pratiquée: N/DCC
Club: AMFB Braine-l'Alleud

Précédent

Retour vers Arduino

Qui est en ligne ?

Utilisateur(s) parcourant actuellement ce forum : Aucun utilisateur inscrit et 1 invité