Auteur Sujet: Projet: pont élévateur pour loco  (Lu 844 fois)

papytrain

  • Newbie
  • *
  • Messages: 36
    • Voir le profil
Re : Projet: pont élévateur pour loco
« Réponse #30 le: mai 20, 2020, 03:46:35 pm »
j'ai tout envoyé avec le else et ms, mais rien ne change, j'ai toujours les mêmes vitesses comme au début.

Est-ce que la valeur du potentiomètre peut jouer.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1557
    • Voir le profil
Re : Projet: pont élévateur pour loco
« Réponse #31 le: mai 20, 2020, 03:47:19 pm »
Peux tu mettre le code complet ?
Cordialement

papytrain

  • Newbie
  • *
  • Messages: 36
    • Voir le profil
Re : Projet: pont élévateur pour loco
« Réponse #32 le: mai 20, 2020, 03:49:54 pm »
Voici:

//ATtiny-UNO_Pont_tournant.ino
/*
  Christian BEZANGER - Jean-Luc BECHENNEC - septembre 2019
  *** Pour carte UNO ou µC ATtiny25/45/85 ***
  Commande la rotation du moteur pas a pas avec un potentiomètre.
  Peut servir a un pont tournant.

  Les phases du moteur pas a pas sont reliees imperativement aux
  sorties PB0:3 : soit 8, 9, 10, 11 sur UNO et broches 5, 6, 7, 2 sur ATtiny25/45/85
  Le point milieu d un potentiometre est branche sur A2 (broche 3 sur ATtiny)
*/

#define UNO  //
//#define ATtiny  // a commenter si UNO

#ifdef UNO
const int portSortie[] = {8, 9, 10, 11};
#endif

#ifdef ATtiny  //
const int portSortie[] = {0, 1, 2, 3};
#endif

void setup() {
  // les pins en sortie
  for (int i = 0; i < 4; i++) {
    pinMode(portSortie[i], OUTPUT);
  }
}

void loop() {
  int vitesse;  // plus petit implique plus rapide, sauf 0 = immobile
  bool sens;
  int potentiometre;  // valeur du potentiometre

  potentiometre = analogRead(A2);  // valeur du potentiomètre (de 0 a 1023)
  potentiometre = potentiometre - 512;  // maintenant de -512 a +511
  // Analyse de la valeur pour determiner le sens
  if(potentiometre < 0) sens = false; else sens = true;
  // Analyse de la valeur pour determiner la vitesse
  potentiometre = abs(potentiometre);  // on ne considere que la valeur absolue
  if(potentiometre < 100) {vitesse = 0;}
  else if(potentiometre >= 100 && potentiometre < 150) {vitesse = 30000;}
  else if(potentiometre >= 150 && potentiometre < 200) {vitesse = 26000;}
  else if(potentiometre >= 200 && potentiometre < 250) {vitesse = 22000;}
  else if(potentiometre >= 250 && potentiometre < 300) {vitesse = 18000;}
  else if(potentiometre >= 300 && potentiometre < 350) {vitesse = 14000;}
  else if(potentiometre >= 350 && potentiometre < 400) {vitesse = 10000;}
  else if(potentiometre >= 400 && potentiometre < 450) {vitesse = 6000;}
  else if(potentiometre >= 450 && potentiometre < 500) {vitesse = 2000;}
  else if(potentiometre >= 500) {vitesse = 300;}
  // Rotation egale a un pas en fonction du sens
  tourneUnPas(sens, vitesse);
}

void tourneUnPas(bool dir, int ms) {
  // tableau pour la phase
  const byte phases[] = {HIGH, LOW, LOW, LOW};
  // variable "phaseIndex". Une variable static se comporte comme une variable globale.
  // en ce qui concerne sa durée de vie : elle existe avant que le programme ne commence
  // et donc en dehors de la fonction où elle est déclarée ; et comme une variable locale
  // en ce qui concerne son 'scope' : elle n'est accessible que de tourneUnPas comme
  // si il s'agissait d'une variable locale.
  static byte phaseIndex = 0;
  // La valeur de cette variable indique quelle phase du moteur est alimentee.
  // On augmente (ou diminue) cette valeur de 1 unite pour alimenter la phase suivante,
  // selon sens de rotation. phaseIndex reste egal a 0, 1, 2, 3 par operation modulo %
  if(ms>0) {  // moteur non immobile
    if(dir) { // decalage vers la gauche
      phaseIndex = (phaseIndex+1)%4;
    }
    else {  // decalage vers la droite
      phaseIndex = (phaseIndex-1)%4;
    }
    for(int i=0;i<4;i++) {  // ecriture sur les lignes PB0:3
      digitalWrite(portSortie[i], phases[(phaseIndex+i)%4]);
    }
    delayMicroseconds(ms);
  }
}

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1557
    • Voir le profil
Re : Projet: pont élévateur pour loco
« Réponse #33 le: mai 20, 2020, 03:56:40 pm »
Il n'y a que pour le dernier cran (>=500) que ça change quelque chose par rapport à la version avec des millisecondes.

Essaye ça

if(potentiometre < 100) {vitesse = 0;}
else if(potentiometre >= 100 && potentiometre < 150) {vitesse = 9600;}
else if(potentiometre >= 150 && potentiometre < 200) {vitesse = 4800;}
else if(potentiometre >= 200 && potentiometre < 250) {vitesse = 2400;}
else if(potentiometre >= 250 && potentiometre < 300) {vitesse = 1200;}
else if(potentiometre >= 300 && potentiometre < 350) {vitesse = 600;}
else if(potentiometre >= 350 && potentiometre < 400) {vitesse = 300;}
else if(potentiometre >= 400 && potentiometre < 450) {vitesse = 150;}
else if(potentiometre >= 450 && potentiometre < 500) {vitesse = 75;}
else if(potentiometre >= 500) {vitesse = 50;}
Cordialement

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1557
    • Voir le profil
Re : Projet: pont élévateur pour loco
« Réponse #34 le: mai 20, 2020, 04:08:21 pm »
Mais on peut prendre le problème à l'envers : décrit ton système mécanique et la vitesse désirée.

Edit : parce que le moteur que tu comptes utiliser a une réduction. Au total une rotation complète de l'axe nécessite 4096 pas, ce qui est beaucoup. D'après ce que j'ai vu sur le web, il ne monte pas à plus de 30 tours/minutes, soit 2s pour un tour, soit 2048 pas/s et donc 488µs minimum. Donc il se peut que 300µs interpas ne soit pas atteignable, le moteur rate des pas.
« Modifié: mai 20, 2020, 04:20:09 pm par Jean-Luc »
Cordialement

papytrain

  • Newbie
  • *
  • Messages: 36
    • Voir le profil
Re : Projet: pont élévateur pour loco
« Réponse #35 le: mai 20, 2020, 04:22:11 pm »
J'ai prolongé l'axe du moteur par une tige filetée. Sue cette tige filetée j'ai réalisé un appui avec un écrou incrusté. Le faite de la rotation de l'axe du moteur, l'appui monte ou descend. Lorsque j'ai envoyé le programme initial, la rotation se fait impeccablement mais j'aurais voulu avoir une vitesse un peu plus élevée.
Maintenant quelle vitesse aucune idée. Disons un peu plus importante que l'originale. Sachant qu'il y aura 4 moteurs qui soulèveront une loco qui peut peser en gros 800g maxi.
Ave les dernières modifs que tu m'as envoyé je ne vois aucune différence.

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1557
    • Voir le profil
Re : Projet: pont élévateur pour loco
« Réponse #36 le: mai 20, 2020, 05:44:39 pm »
Bon,

Comme j'avais un moteur pas-à-pas de ce type dans mes tiroirs (Le modèle distribué par Velleman : https://www.velleman.eu/products/view/?id=435560) j'ai fait des essais avec l'oscillo pour voir les impulsions.

Mauvaise nouvelle, le moteur déclare forfait quand la « vitesse » descend au dessous de 1900µs (environ, on peut descendre un peu plus bas mais le moteur doit être déjà en mouvement, il ne peut pas démarrer à cette cadence). Ce qui explique pourquoi la plus faible valeur du programme de Christian est 2000. En dessous le moteur décroche.

Avec un système à tige filetée, il te faut un autre moteur, sans doute sans réduction car la tige filetée s'en occupe. Si par exemple tu as une tige 6mm, le pas ISO est de 1mm. Donc un moteur 200 pas par tour aura une précision de 1/200 mm !
C'est pas forcément facile à trouver en unipolaire.
Cordialement

papytrain

  • Newbie
  • *
  • Messages: 36
    • Voir le profil
Re : Projet: pont élévateur pour loco
« Réponse #37 le: mai 20, 2020, 06:57:08 pm »
Aïe, en effet pas bon tout ça.
Ce que je vais faire, attendre la réception des moteurs en 12v. Faire des essais afin de voir avec un lestage du poids d'une loco.

Sinon, que penses-tu, au cas où, de bifurquer sur des moteurs dc?
@+

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1557
    • Voir le profil
Re : Re : Projet: pont élévateur pour loco
« Réponse #38 le: mai 20, 2020, 10:59:24 pm »
Ce que je vais faire, attendre la réception des moteurs en 12v. Faire des essais afin de voir avec un lestage du poids d'une loco.

Si ils sont aussi avec réduction, je ne pense pas que tu les fera tourner plus vite. Le poids de la loco ne devrait pas être un soucis.

Citer
Sinon, que penses-tu, au cas où, de bifurquer sur des moteurs dc?

Je pense que si tu veux faire tourner 4 moteurs à la même vitesse, il faut que tu programmes un asservissement et donc il va falloir que tu mettes des codeurs, 1 par moteur, pour compter les tours et piloter 4 PWM de manière à garder la différence entre les tours de chaque moteur à 0. Et échantillonner 4 interruptions en parallèle sans en perdre, ça commence à être velu. Accessoirement ils faut qu'ils fassent le même nombre de tours au total et avec un codeur tu vas au plus avoir une erreur de deux tours : on peut avoir compté le même nombre de tour pour deux moteurs mais le codeur de l'un est sur le point d'envoyer l'impulsion et le codeur de l'autre vient de l'envoyer. Et 2 tours d'erreur c'est, avec un filtage M3, 1mm d'erreur, 2mm avec un M6.

Non, les moteurs pas-à-pas sont idéaux pour ton application mais pas avec réduction.
« Modifié: mai 20, 2020, 11:08:35 pm par Jean-Luc »
Cordialement

papytrain

  • Newbie
  • *
  • Messages: 36
    • Voir le profil
Re : Projet: pont élévateur pour loco
« Réponse #39 le: mai 20, 2020, 11:32:44 pm »
ok, merci pour ta réponse.

Maintenant il faut trouver des moteurs unipolaires sans réducteur, je sens que ça va être galère. Surtout dans ces petites dimensions.   :(

@+
Eric

Jean-Luc

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1557
    • Voir le profil
« Modifié: mai 21, 2020, 12:05:17 am par Jean-Luc »
Cordialement

papytrain

  • Newbie
  • *
  • Messages: 36
    • Voir le profil
Re : Projet: pont élévateur pour loco
« Réponse #41 le: mai 22, 2020, 09:57:49 am »
Bonjour
Je note ces infos au cas où.      ;)
Merci pour l'aide
@+
Eric