Pages: 1 ... 5 6 [7] 8   Go Down
Author Topic: automatisation plaque tournante modelisme  (Read 14399 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 45
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour Artouste,

ci-dessous une ébauche de prog mais je n'arrive pas à faire valider la position capteur pour faire stopper le moteur.
j'ai déja fais plusieurs test et rien pourtant quand le N°voie correspond à la valeur du tableau rien!!!

Code:
/*
 *  Controle du moteur de la plaque tournante
 *
 *    En utilisant une sortie PWM pour le moteur sur la broche 9
 *    En utilisant une sortie pour basculer le relais pour l'inversion de sens du moteur sur la broche 13
 *
 *    En utilisant une entrée analogique pour le capteur de position sur la broche (A0)
 *
 *    En utilisant un clavier numérique matriciel XY 3x4
 *        Connecter sur la broche 3 la colonne 3 du clavier
 *        Connecter sur la broche 4 la colonne 2 du clavier
 *        Connecter sur la broche 5 la colonne 1 du clavier
 *
 *        Connecter sur la broche 16 (A2) la ligne 4 du clavier
 *        Connecter sur la broche 17 (A3) la ligne 3 du clavier
 *        Connecter sur la broche 18 (A4) la ligne 2 du clavier
 *        Connecter sur la broche 19 (A5) la ligne 1 du clavier
 */

//**************** Entête déclarative *******
// A ce niveau sont déclarées les librairies, les constantes, les variables...

// --- Inclusion des librairies utilisées ---

#include <Keypad.h> // inclusion de la librairie pour clavier matriciel

//--- Constantes utilisées avec le clavier 3x4
const byte LIGNES = 4; // 4 lignes
const byte COLONNES = 3; //3 colonnes

// --- constantes des broches ---
const int C3=3; //declaration constante de broche
const int C2=4; //declaration constante de broche
const int C1=5; //declaration constante de broche

const int L4=16; //declaration constante de broche
const int L3=17; //declaration constante de broche
const int L2=18; //declaration constante de broche
const int L1=19; //declaration constante de broche

int pwm = 9; // pin controlant le moteur (PWM pin)
int ledPin = 13; // pin inversion de sens du moteur
int sensorPin = A0; // pin acquisition capteur de position

// --- Déclaration des variables globales ---

word sensorValue = 0; // variable du capteur de position

byte nv=18; //nombre de voies/2
byte act=0; //position actuelle
byte fut=0; //position future
int dif=0; //ecart entre position fut et act
byte PasP=0;
byte PasN=0;
boolean sens;
int P=0;
int TPV = 50; //variable tres petite vitesse PWM
int PV = 100; //variable petite vitesse PWM
int V = 150; //variable vitesse PWM

word sensor[ 36 ] = {0,28,56,84,112,140,168,196,224,256,280,308,336,364,392,420,448,476,512,540,568,596,624,652,680,706,734,768,796,824,852,880,908,936,964,992};


//--- Définition des touches
char touches[LIGNES][COLONNES] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};

// tableaux de lignes et colonnes
byte BrochesLignes[LIGNES] = {
  L1, L2, L3, L4}; //connexions utilisées pour les broches de lignes du clavier
byte BrochesColonnes[COLONNES] = {
  C1, C2, C3}; //connexions utilisées pour les broches de colonnes du clavier

char touche; // variable de stockage valeur touche appuyée

unsigned int valeur; // variable pour valeur saisie

// création d'un objet keypad = initialisation clavier
Keypad clavier = Keypad( makeKeymap(touches), BrochesLignes, BrochesColonnes, LIGNES, COLONNES );
// les broches de lignes sont automatiquement configurées en ENTREE avec pullup interne activé
// les broches de colonnes sont automatiquement configurées en SORTIE


//**************** FONCTION SETUP = Code d'initialisation *****
// La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme

void setup()   { // debut de la fonction setup()

  pinMode(pwm, OUTPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
} // fin de la fonction setup()
// ********************************************************************************

//*************** FONCTION LOOP = Boucle sans fin = coeur du programme *************
// la fonction loop() s'exécute sans fin en boucle aussi longtemps que l'Arduino est sous tension

void loop(){ // debut de la fonction loop()



  valeur=SAISIE_uINT(); // appel de la fonction pour saisie valeur - # stoppe saisie

  fut=valeur;

  dif=fut-act;
  sens=true; // sens par défaut pour les conditions qui ne répondent pas aux IF

  if (dif > nv)
  {
    sens=false;
  }
  if (dif > -nv && dif < 0)
  {
    sens=false;
  }
  digitalWrite(ledPin, sens);
  P = fut - 1;
 
//*******************************************************************
//************************** sens positif ***************************
//*******************************************************************
    if (sens == true)
    {
    PasP = abs(fut - act);
   
//************************** PasP <= 4 ***************************
      if (PasP <= 4)
      {
        do
        {
          sensorValue = analogRead(sensorPin);
          analogWrite( pwm, TPV);
            Serial.println(sensorValue);
            Serial.println(sensor[P]);
          if (sensorValue == sensor[P])
          {
            analogWrite( pwm, 0);
          }
        }while( pwm != 0);
      }
 
//*******************************************************************
//************************** sens négatif ***************************
//*******************************************************************
    if (sens == false)
    {
    PasN = abs(act - fut);
   
//************************** PasP <= 4 ***************************
      if (PasN <= 4)
      {
        do
        {
          sensorValue = analogRead(sensorPin);
          analogWrite( pwm, TPV);
          Serial.println(sensorValue);
          Serial.println(sensor[P]);
          if (sensorValue == sensor[P])
          {
            analogWrite( pwm, 0);
          }
        }while( pwm != 0);
      }
    }
    }
//************************** bientot fin****************************
  act=valeur;
    }
// fin de la fonction loop() - le programme recommence au début de la fonction loop sans fin
// ********************************************************************************


// ////////////////////////// FONCTIONS DE GESTION DES INTERRUPTIONS ////////////////////


// ////////////////////////// AUTRES FONCTIONS DU PROGRAMME ////////////////////

unsigned int SAISIE_uINT (){ // fonction qui renvoie une valeur unsignedint

  //---- variables locales utilisées dans la fonction
  unsigned char saisie_int[8]={
    0,0,0,0,0,0,0,0  }; // crée un tableau de variables char pour saisir valeur
  unsigned char compt_touche_int; // variable de comptage du nombre de touches saisies
  unsigned long nombre_saisi_int; // variable de calcul du nombre saisi
  unsigned char touche_int; // variable locale pour valeur touche appuyée de 0 à 15

  //---- initialisation des variables utilisées ----
  compt_touche_int=0; // aucune touche saisie au démarrage
  nombre_saisi_int=0; // initialise la variable

  //------ gestion appui touche sur clavier

  while (compt_touche_int<2) { // tant que pas appuis maxi = 2 pour int

    touche_int= clavier.getKey(); // lecture de la touche appuyée

    if (touche_int!= NO_KEY){ // si une touche a été frappée -- gestion de la touche appuyée


      if (touche_int=='#') break; // sort du while si appui sur #

      for (byte i=0;i<LIGNES;i++) {
        for (byte j=0; j<COLONNES;j++){

          if (touche_int==touches[i][j]) touche_int=touches[i][j]-48; // extrait valeur numérique à partir ASCII
        }
      }
      saisie_int[compt_touche_int]=touche_int; //enregistre le caractère dans tableau code_saisi

      compt_touche_int=compt_touche_int+1; // on incrémente la variable compt qui mémorise le nombre de caractères saisis

      //delay ()

      touche_int=255; // remet à 255 la variable touche... pour éviter prise en compte même appui à plusieurs reprises

    } //---- fin gestion appui clavier

  }// fin du While = fin de la lecture du clavier

  //--------- calcul valeur saisie en fonction du nombre de chiffres saisis ---------
  if (compt_touche_int==0)nombre_saisi_int=0;   // si aucun chiffre saisi
  if (compt_touche_int==1)nombre_saisi_int=saisie_int[0];   // si 1 seul chiffre saisi
  if (compt_touche_int==2)nombre_saisi_int=(saisie_int[0]*10)+(saisie_int[1]*1);   // si 2 chiffres saisi

  //------ à réaliser en sortie de lecture du clavier ----


  compt_touche_int=0; // réinitialise le nombre de touche saisies

  //----- renvoi de la valeur saisie ----

  return (nombre_saisi_int); // renvoie la valeur - sortie de la fonction

}


// ////////////////////////// Fin du programme ////////////////////





j'ai mis tout le prog

merci de tes lumières je pense qu'il doit y avoir un détail de syntaxe ou autre qui m'échappe
bonne soirée
J-L
Logged

Offline Offline
Faraday Member
**
Karma: 34
Posts: 5087
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour Artouste,

ci-dessous une ébauche de prog mais je n'arrive pas à faire valider la position capteur pour faire stopper le moteur.
j'ai déja fais plusieurs test et rien pourtant quand le N°voie correspond à la valeur du tableau rien!!!



j'ai mis tout le prog

merci de tes lumières je pense qu'il doit y avoir un détail de syntaxe ou autre qui m'échappe
bonne soirée
J-L
je pense que lorsque tu lit la valeur attendue tu passe PWM à zero mais que ton capteur lit aussi  aussitôt en suite une valeur qui n'est plus celle attendue (phénomène d’hystérésis à gérer) et ça repart pour un tour.

essaie déjà pour voir au serial si tu passe bien par la lecture attendu
à faire dans les 2 sections CW CCW
si ce que tu attend est bien lu au moins une fois lu tu devrais voir passer ------ OK ------

Code:
if (sensorValue == sensor[P])
          {
            analogWrite( pwm, 0);
            Serial.println("------ OK ------");
          }
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 45
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir Artouste,

je viens de tester et effectivement le message ------ok------- s'affiche et boucle quand je touche au potar

maintenant comment faire pour palier à ce problèmes car il va sans doute se répercuter partout?

bonne soirée
J-L
Logged

Offline Offline
Faraday Member
**
Karma: 34
Posts: 5087
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonsoir Artouste,

je viens de tester et effectivement le message ------ok------- s'affiche et boucle quand je touche au potar

maintenant comment faire pour palier à ce problèmes car il va sans doute se répercuter partout?

bonne soirée
J-L
smiley-cool
ça veut dire que quand cette condition est réalisée, tu es arrivé là où tu voulais, il faut donc que tu sorte des conditions pour retourner simplement dans l'attente d'un nouvel ordre de déplacement entré au clavier.
Tu va trouver !  smiley-mr-green
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 45
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ahah!!!

il faut utiliser un break, je pensai que la validation du while( pwm != 0); suffisait à sortir de la boucle mais visiblement non

je vais approfondir mes recherches
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 45
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Re bonsoir,

je viens de finir une première ébauche du prog avec les 3 cas suivant le nombre de pas à parcourir et la gestion de la vitesse.
ça fonctionne si je ne dépasse pas plus de 18 pas et si je ne doit pas passer par la position Zero
déja il est impossible d'aller de la voie 2 vers la voie 30 par exemple

je vais essayer d'analyser demain les cas particuliers

bonne nuit
J-L
Logged

Offline Offline
Faraday Member
**
Karma: 34
Posts: 5087
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Re bonsoir,

je viens de finir une première ébauche du prog avec les 3 cas suivant le nombre de pas à parcourir et la gestion de la vitesse.
ça fonctionne si je ne dépasse pas plus de 18 pas et si je ne doit pas passer par la position Zero
déja il est impossible d'aller de la voie 2 vers la voie 30 par exemple

je vais essayer d'analyser demain les cas particuliers

bonne nuit
J-L
smiley-mr-green
et ...
pourquoi  veux tu affecter absolument une valeur 0 lue capteur à la voie 0 ?  smiley-cool

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 45
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il est certain que je peut mettre le 0 capteur entre la voie 36 et la voie 1 ce n'est qu'une question de référentielle et de valeur dans le tableau.

Mais je ne vois toujours pas la finalité de ta réponse! ou alors je suis complètement à coté de la plaque  smiley-razz

il faut que je fasse une condition supplémentaire si le nombre de pas >18 pour calculer le nb de pas pour un chemin plus court (36-fut)+act et non (fut-act)

le nombre de pas me sert à valider la séquence de déplacement (chemin court, moyen ou long) ça ok
mais dans ma séquence je me sers des n° de voie pour avancer dans la séquence. or si je tourne CCW de la voie 5 à 35 par exemple et si je freine 2 voie avant d'arriver ça me donne une voie 37 et elle n'existe pas dans le tableau de valeur

tu vas me dire, utilise le nombre de pas pour gérer la séquence mais je là ne sais pas comment faire le liens entre le décompte des pas et la lecture capteur. car il faudrait faire un décompte du nb de pas à chaque fois qu'on passe devant une valeur du tableau.
c'est une option difficile à mettre en place pour moi



Logged

Offline Offline
Faraday Member
**
Karma: 34
Posts: 5087
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Il est certain que je peut mettre le 0 capteur entre la voie 36 et la voie 1 ce n'est qu'une question de référentielle et de valeur dans le tableau.

Mais je ne vois toujours pas la finalité de ta réponse! ou alors je suis complètement à coté de la plaque  smiley-razz

il faut que je fasse une condition supplémentaire si le nombre de pas >18 pour calculer le nb de pas pour un chemin plus court (36-fut)+act et non (fut-act)

le nombre de pas me sert à valider la séquence de déplacement (chemin court, moyen ou long) ça ok
mais dans ma séquence je me sers des n° de voie pour avancer dans la séquence. or si je tourne CCW de la voie 5 à 35 par exemple et si je freine 2 voie avant d'arriver ça me donne une voie 37 et elle n'existe pas dans le tableau de valeur

tu vas me dire, utilise le nombre de pas pour gérer la séquence mais je là ne sais pas comment faire le liens entre le décompte des pas et la lecture capteur. car il faudrait faire un décompte du nb de pas à chaque fois qu'on passe devant une valeur du tableau.
c'est une option difficile à mettre en place pour moi

il faut que restructure déjà sur le papier la situation :
tu a déjà bien avancé
actuellement tu sais déjà d'où tu part N° de voie de depart et où tu veux aller N° de voie d'arrivée
tu sais aussi parce que tu l'a déjà determiner le nombre de voie à parcourir et le sens de rotation.
ça c'est acquis des l'action au clavier validée.

Partant de là tu doit rentrer dans une boucle dont tu ne sortira qu'une fois lue la valeur capteur correspondant dans le poste de tableau à la voie d'arrivée.
tu es obligé de lire en permanence dans cette boucle la position capteur et de la comparer pour diminuer le nombre de pas restant à parcourir au moment où tu passe devant une voie intermediaire.
Ce qui implique que tu doit connaitre cette valeur de position X , celle ci correspond  à l'indice +1 ou -1 selon le sens de rotation.
là où tu bloque c'est le passage de la voie 36 à 1  1 à 36 (pour indice 0 à 35)

il faut juste que lors de la détermination du prochain poste à lire que tu boucle ton tableau à une dimension pour en faire un pseudo circulaire.
un simple test selon le sens pour un tableau allant de 0 à 35
si i+1>35 alors i=0   et dans l'autre sens si i-1 = -1 ( attention au type de variable, ici il semble que tu utilise un int pour pointeur)
alors i=35
et tu retrouve tes petits pour continuer dans le bon sens jusqu'à l'arrivée, puisque ensuite l'addition ou la soustraction restera dans la plage autorisée.

pose ça calmement sur papier en fonction de ce qu tu a déjà validé, et il ne faut pas avoir peur de remettre en question l'organisation de la boucle "rotation", le principal et tu l'a déjà c'est d'avoir  tous les elements :
sens
nb voies à parcourir
valeur de positionnement des voies

tu peux aussi regarder du coté de la fonction modulo 36 pour faire un tableau circulaire, mais je pense que pour l'instant le test est mieux pour ta compréhension

un petit excel pour comprendre le modulo 36
http://cjoint.com/?BCinoauFU96


« Last Edit: March 08, 2012, 07:15:22 am by Artouste » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 45
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour Artouste,

je te mets ci-dessous un bout de code correspondant à un cas: sens positif et nb de pas compris entre 5 et10

Code:
//************************** 5 <= Pas <= 10 ***************************
      if (dif >= 5 && dif <= 10)
      {
        analogWrite( pwm, TPV);
       
        do
        {
          sensorValue = analogRead(sensorPin);
          Serial.println(pas);
          if (sensorValue == sensor[A+1])
          {
            A=A+1;
            if (A+1 > 35)
            {
              A=0;
            }
            pas=pas-1;
          }
         
          if (pas == (dif - 1))
          {
            analogWrite( pwm, PV);
            Serial.println("------ PV ------");
          }
         
          if (pas == 2)
          {
            analogWrite( pwm, TPV);
            Serial.println("------ TPV ------");
          }
         
          if (sensorValue == sensor[F])
          {
            analogWrite( pwm, 0);
            Serial.println("------ STOP ------");
            break;
          }
        }while( pwm != 0);
      }

quand j'actionne le potar qui me sert de capteur très lentement, la séquence se déroule bien, décompte des pas et gestion pwm ok, le moteur stop quand je suis à la bonne valeur.

si je tourne le potar plus vite, j'ai l'impression que ça saute des étapes, les différents paliers ne s'affichent pas.

est-ce le potar qui n'est pas précis ou bien le prog qui nécessite des break ou autre chose?

bonne soirée
J-L

Logged

Offline Offline
Faraday Member
**
Karma: 34
Posts: 5087
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour Artouste,

je te mets ci-dessous un bout de code correspondant à un cas: sens positif et nb de pas compris entre 5 et10


quand j'actionne le potar qui me sert de capteur très lentement, la séquence se déroule bien, décompte des pas et gestion pwm ok, le moteur stop quand je suis à la bonne valeur.

si je tourne le potar plus vite, j'ai l'impression que ça saute des étapes, les différents paliers ne s'affichent pas.

est-ce le potar qui n'est pas précis ou bien le prog qui nécessite des break ou autre chose?

bonne soirée
J-L


Bonsoir JL
rien d’étonnant (j'avais un peu anticipé ça , mais pour plus tard  smiley-mr-green  )
Actuellement l'on cherche une stricte égalité entre lecture capteur et valeur attendue pour passer à l’étape suivante.
Actuellement tu simule l'accouplement du capteur à la main , selon la vitesse à laquelle tu deplace lle curseur, la boucle de lecture peut très bien ne pas voir passer la valeur attendue par dépassement= la "bonne position curseur" passe entre deux lecture et n'est pas lue.
c'est un probleme qui sera peut être à voir lorsque la capteur sera mécaniquement accouplé, mais pour l'instant ce n'est pas nécessaire de se préoccuper de cet éventuel futur probleme.

pour test , tu peux coller un serial pour voir que tu ne passe pas par la valeur lue.

Mais si tu arrive maintenant à avoir la bonne direction, la bonne gestion d'acceleration/decelaration et l'arret, tu a fait plus qu'une bonne avancée.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 45
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour Artouste,

j'avais déjà mis un retour d'info pour afficher le nb de pas restant et l'action à effectuer justement pour visualiser ce qui se passe.

j'ai bien l'impression que si ça tourne trop vite on saute des étapes. le décompte des pas ne fonctionne pas. il faut mettre une priorité ou autre.

je vais attendre de remonter le capteur en situation et voir ce qui se passe.

bon week end
J-L
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous !

Je suis actuellement en train d'établir un nouveau réseau en HO marklin voie M. Vu mon budget, j'ai choisi, moi aussi, de réaliser ma plaque de façon artisanale. ^^


Mes ambitions sont plus modeste que celles d'Artouste ( bravo !  smiley-wink)

J'ai déjà le nécessaire pour la motorisation depuis quelques jours:

- 1 carte Arduino Uno
- 1 moteur pap Unipolaire 5 fils 64 pas 12v (ST28 Velleman)
- 1 ci uln2004an
- 4 boutons poussoir
- 1 un contact à rouleau (j'appelle ça un briquet ! ^^)
- 1 potar de 10k
- Une vis sans fin et un pignon de 24 dents récupérer dans mon vieux tas de Lego Technic.


Mon but :

- Un bouton pour que le pont prenne sa référence sur le briquet.
- Deux boutons pour faire 15°(un tour de vis, ça tombe juste !) horaire et antihoraire avec incrémentation positve/négative.
- Un bouton pour exécuter un demi-tour complet de la plaque
- un ajustement de vitesse avec le potar


Mais voilà, je suis une bille dans ce type de programmation... (ah si j'avais un automate siemens pour programmer en logique...) et de plus j'ai le sentiment que mon moteur ne fonctionne pas comme il devrais.
 
Je n'ai aucun problème pour le faire tourner en continu, mais en mode pas à pas ce n'est pas ça du tout ! Il saute des pas et il semble en faire beaucoup plus que 64. Impossible de lui faire faire exécuter le programme d'exemple "stepper_oneRevoltion" correctement. j’obtiens seulement un allez-retour sur 20° environ. j'ai donc triché sur les pas, soit j’obtiens un léger mieux soit un absence totale de réaction du moteur.

Se pourrait-il que le temps d’excitation des bobines soit trop court ? une défectuosité moteur ? Un incompétence de ma part dans le montage ?

Bref, je sollicite donc un peu de votre aide.
Logged

Offline Offline
Faraday Member
**
Karma: 34
Posts: 5087
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour à tous !

Je suis actuellement en train d'établir un nouveau réseau en HO marklin voie M. Vu mon budget, j'ai choisi, moi aussi, de réaliser ma plaque de façon artisanale. ^^


Mes ambitions sont plus modeste que celles d'Artouste ( bravo !  smiley-wink)



Sauf qu'il s'agit de Jean-loïk , pas de moi  smiley-mr-green
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 4
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oups ! Pardon Jean-loïk !^^"  Bravo Jean-loïk !
« Last Edit: June 13, 2012, 04:40:35 pm by Olivierv » Logged

Pages: 1 ... 5 6 [7] 8   Go Up
Jump to: