Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - philippe 31

Pages: [1]
1
Vos projets / Re : Construction nouveau réseau
« le: juillet 14, 2016, 07:03:06 pm »
Je viens de résoudre le problème en supprimant la partie alimentation prise sur le bus JK . J'ai dessoudé les composants : pont de diode , régulateur et condensateurs

J'alimente le circuit imprimé par une alimentation indépendante sur les broches Vin et masse de la Nano

Salutations
Philippe

2
Vos projets / Construction nouveau réseau
« le: juillet 13, 2016, 03:19:07 pm »
Je réalise un nouveau réseau comprenant la gare principale et une gare cachée de 10 voies
Pour la commande des aiguilles de la gare visible , j'utilise des servo pilotés par des SA DEC et carte arduino ( J'en parle sur le forum et jlb m'a fortement aider à terminer le programme des nanos , je le remercie encore)
Pour la gare cachée , j'utilise des moteur peco . J'ai donc pris le décodeur pour aiguillage à solénoïdes sur Arduino , la conclusion de l'article indique qu'il fonctionne correctement
J'ai fait faire les CI suivant le typon , souder les composants , programmer la NANO ( AVEC UNE TEMPO DE 100 ms) et raccorder le tout

J'ai une multimaus et ampli 10764 ( pour du N , c'est parfait )

Au premier essais , parfait . Mais à un moment un ULN 2803 fume , ensuite le moteur PECO  ( je n'ai pas fait le circuit de protection pensant qu'il était plus une décharge capacitive et que j'avais régler l’impulsion à 100 ms)
J'ai supprimer les UNL 2003 et mis des cartes relais : idem moteur fume , carte en panne  )
Je me sais pas très bon bricoleur mais là ......

Je pense avoir trouvé la raison, mais pourquoi j'ai ce problème chez moi alors que sur locoduino il est indiqué que cela fonctionne parfaitement
Lors d'un  stop sur la maus ou d'un CC ,cela coupe le signal DCC et réinitialise la carte NANO et envoi un ordre sur la patte 16 qui correspond à la bobine 2 de l'aiguille 6

Merci de votre aide
Philippe

3
Débuter / Re : commande servo par inter
« le: janvier 03, 2016, 06:43:38 pm »
Je viens de faire la modification . Le programme marche à merveille.

Je vais donc pouvoir commander mes aiguilles par des servos afin d'avoir des mouvements lents.
La commande se fera depuis RRTC via une centrale "Lenz" , des décodeurs d'accessoires "LTD" SA-DEC-4 et des cartes NANO .

Merci à vous pour votre aide , un merci particulier à Jean Luc
Cordialement
Philippe

4
Débuter / Re : commande servo par inter
« le: janvier 02, 2016, 07:25:31 pm »
J'ai trouvé une solution afin de résoudre le problème. Je viens de faire la manip , le fonctionnement est bien
J'ai supprimé les 2 boucles dans le loop
A la place de
void loop()
{
  int numServo;
 
  for (numServo = 0; numServo < 4; numServo++)
    gereServo(numServo);
   
    for (numServo = 0; numServo < 4; numServo++)
    {
    byte positionInterrupteur = digitalRead(brocheInterrupteurPourServo[i]);
   
    if (positionInterrupteur == LOW) {
      evenementServo_DROIT(numServo);
                                      }
    else                              {
      evenementServo_DEVIE(numServo);
                                      }
     }
 
  delay(3);
}
J'ai écrit
void loop()
{
  gereServo(3);
       byte positionInterrupteur3 = digitalRead(brocheInterrupteurPourServo[3]);
        if (positionInterrupteur3 == LOW)
        {
         evenementServo_DROIT(3);
        }
        else 
        {
        evenementServo_DEVIE(3);
        }
  gereServo(2);
       byte positionInterrupteur2 = digitalRead(brocheInterrupteurPourServo[2]);
        if (positionInterrupteur2 == LOW)
        {
         evenementServo_DROIT(2);
        }
        else 
        {
        evenementServo_DEVIE(2);
        }
     gereServo(1);
       byte positionInterrupteur1 = digitalRead(brocheInterrupteurPourServo[1]);
        if (positionInterrupteur1 == LOW)
        {
         evenementServo_DROIT(1);
        }
        else 
        {
        evenementServo_DEVIE(1);
        }
     gereServo(0);
       byte positionInterrupteur0 = digitalRead(brocheInterrupteurPourServo[0]);
        if (positionInterrupteur0 == LOW)
        {
         evenementServo_DROIT(0);
        }
        else 
        {
        evenementServo_DEVIE(0);
        }
 
  delay(3);
}
Ce n'est pas le top en écriture de programme , mais je ne sais pas faire mieux
Je veux bien qu'il soit corrigé

5
Débuter / Re : commande servo par inter
« le: janvier 02, 2016, 04:47:56 pm »
Jean Luc , merci  pour ton aide. Beau cadeau d'anniversaire , Eh oui 59 ans!!!!

J'ai repris le code en intégrant tes remarques

// Déclaration des variables pour les servomoteurs
#include <Servo.h>
 
const byte SERVO_A_ANGLE_MIN = 0;
const byte SERVO_A_ANGLE_MAX = 1;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX = 2;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN = 3;

const boolean DROIT = true;   
const boolean DEVIE = false;   
 
const int angleMin = 1250;
const int angleMax = 1750;
 
struct DescripteurServo {
  Servo objetServo;
  int vitesse;
  int angle;
  int pin;
  byte etatServo;
                       };

struct DescripteurServo servoMoteur[4];
 
const byte NON_PRESSE = 0;
const byte ENFONCE = 1;
const byte PRESSE = 2;
 
byte etatAutomate = NON_PRESSE;
int etatPoussoir = -1;
 
const byte AUCUN_EVENEMENT = 0;
const byte EVENEMENT_PRESSE = 1;
const byte EVENEMENT_RELACHE = 2;

// Déclaration des variables pour les bistables
 int i;
 const byte brocheInterrupteurPourServo[4] =
 {
  A0,
  A1,
  A2,
  A3
  };

// Lecture du numéro de bistable


void setup()
{
   /* Initialisation des servos */
   int numServo;
 
  for (numServo = 0; numServo < 4; numServo++)
  {
    servoMoteur[numServo].angle = angleMin;
    servoMoteur[numServo].vitesse = 0;
    servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MIN;
    servoMoteur[numServo].pin = numServo + 2;
    servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
  }
 
  /* Initialisation des bistables */
 
for (byte i = 0; i < 4; i++)
  {
   pinMode(brocheInterrupteurPourServo[i], INPUT_PULLUP);
  }   
}

void gereServo(int numServo)
{
  servoMoteur[numServo].objetServo.writeMicroseconds(servoMoteur[numServo].angle);
 
  servoMoteur[numServo].angle += servoMoteur[numServo].vitesse;
 
  if (servoMoteur[numServo].angle > angleMax)
  {
    servoMoteur[numServo].angle = angleMax;
    servoMoteur[numServo].vitesse = 0;
    servoMoteur[numServo].objetServo.detach();
    servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MAX;
  }
  else
    if (servoMoteur[numServo].angle < angleMin)
    {
    servoMoteur[numServo].angle = angleMin;
    servoMoteur[numServo].vitesse = 0;
    servoMoteur[numServo].objetServo.detach();
    servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MIN;
    }
}

void evenementServo_DROIT (int numServo)
{
  servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
  switch (servoMoteur[numServo].etatServo)
  {
    case SERVO_A_ANGLE_MIN:
    case SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN:
      servoMoteur[numServo].vitesse =  1;
      servoMoteur[numServo].etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX;
      break;
  }
}

void evenementServo_DEVIE (int numServo)
{
  servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
  switch (servoMoteur[numServo].etatServo)
  {
    case SERVO_A_ANGLE_MAX:
    case SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX:
      servoMoteur[numServo].vitesse = -1;
      servoMoteur[numServo].etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN;
      break;
  }
}

void loop()
{
  int numServo;
 
  for (numServo = 0; numServo < 4; numServo++)
    gereServo(numServo);
   
    for (numServo = 0; numServo < 4; numServo++)
    {
    byte positionInterrupteur = digitalRead(brocheInterrupteurPourServo[i]);
   
    if (positionInterrupteur == LOW) {
      evenementServo_DROIT(numServo);
                                      }
    else                              {
      evenementServo_DEVIE(numServo);
                                      }
     }
 
  delay(3);
}
J'ai modifié les fonctions   evenementServo_DROIT et evenementServo_GAUCHE
J'ai réalisé le montage avec 3 inters et 3 servos. Les servos fonctionnent bien , vont de droite à gauche et vis versa .
Le seul problème est que les servos sont commandés par l'inter A0 , les autres inters A1 et A2 sont à priori inertes.
Je ne pens pas avoir fait un mauvais montage !!
Salutations


6
Débuter / Re : commande servo par inter
« le: janvier 02, 2016, 10:12:15 am »
Meilleurs vœux à tous les membres pour cette année 2016 et longue vie à ce forum

J'ai modifié le code suivant vos remarques .
// Déclaration des variables pour les servomoteurs
#include <Servo.h>
 
const byte SERVO_A_ANGLE_MIN = 0;
const byte SERVO_A_ANGLE_MAX = 1;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX = 2;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN = 3;

const boolean DROIT = true;   
const boolean DEVIE = false;   
 
const int angleMin = 1250;
const int angleMax = 1750;
 
struct DescripteurServo {
  Servo objetServo;
  int vitesse;
  int angle;
  int pin;
  byte etatServo;
                       };

struct DescripteurServo servoMoteur[4];
 
const byte NON_PRESSE = 0;
const byte ENFONCE = 1;
const byte PRESSE = 2;
 
byte etatAutomate = NON_PRESSE;
int etatPoussoir = -1;
 
const byte AUCUN_EVENEMENT = 0;
const byte EVENEMENT_PRESSE = 1;
const byte EVENEMENT_RELACHE = 2;

// Déclaration des variables pour les bistables

boolean ancienA0  = HIGH;
boolean nouveauA0 = HIGH;
boolean ancienA1  = HIGH;
boolean nouveauA1 = HIGH;
boolean ancienA2  = HIGH;
boolean nouveauA2 = HIGH;
boolean ancienA3  = HIGH;
boolean nouveauA3 = HIGH;

// Lecture du numéro de bistable
int lirePoussoirs()
{
  int resultat;

  int numPoussoir = 4;                   

  nouveauA0 = digitalRead(A0);   
  if (ancienA0 != nouveauA0)
  {
    ancienA0 = nouveauA0;
    if (nouveauA0==LOW);
    {
     numPoussoir = 0;
    }
  }
  else
  {
    nouveauA1 = digitalRead(A1);
    if (ancienA1 != nouveauA1)
    {
      ancienA1 = nouveauA1;
      if (nouveauA1==LOW);
      {
       numPoussoir = 1;
      }   
    }
    else
    {
       nouveauA2 = digitalRead(A2);
    if (ancienA2 != nouveauA2)
    {
      ancienA2= nouveauA2;
      if (nouveauA2==LOW);
      {
       numPoussoir = 2;
      }   
    }
    else
      {
        nouveauA3 = digitalRead(A3);
    if (ancienA3 != nouveauA3)
    {
      ancienA3 = nouveauA3;
      if (nouveauA3==LOW);
      {
       numPoussoir = 3;
      }   
    }                                   
      }
    }
  }

  int nouvelEtatPoussoir = etatPoussoir;
 
  switch (etatAutomate)
  {
    case NON_PRESSE:
      if (numPoussoir < 4)
        etatAutomate = ENFONCE;
      break;
     
    case ENFONCE:
      if (numPoussoir < 4)
      {
        etatAutomate = PRESSE;
        nouvelEtatPoussoir = numPoussoir;
      }
      else
        etatAutomate = NON_PRESSE;
       
      break;
     
    case PRESSE:
      if (numPoussoir == 4)
      {
        etatAutomate = NON_PRESSE;
        nouvelEtatPoussoir = -1;
      }
      break;
  }
   
  return nouvelEtatPoussoir;
}

byte lireEvenement(int *inpNumPoussoir)
{
  byte evenement;
  int nouvelEtatPoussoir = lirePoussoirs();
   
  if (nouvelEtatPoussoir == etatPoussoir)
    evenement = AUCUN_EVENEMENT;
  if (nouvelEtatPoussoir >= 0 && etatPoussoir == -1)
    evenement = EVENEMENT_PRESSE;
  if (nouvelEtatPoussoir == -1 && etatPoussoir >= 0)
    evenement = EVENEMENT_RELACHE;
 
  etatPoussoir = nouvelEtatPoussoir;
  *inpNumPoussoir = etatPoussoir;
   
  return evenement;
}

void setup()
{
   /* Initialisation des servos */
   int numServo;
 
  for (numServo = 0; numServo < 4; numServo++)
  {
    servoMoteur[numServo].angle = angleMin;
    servoMoteur[numServo].vitesse = 0;
    servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MIN;
    servoMoteur[numServo].pin = numServo + 2;
    servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
  }
 
  /* Initialisation des bistables */
  pinMode(A0, INPUT_PULLUP);    //  BP 0
  pinMode(A1, INPUT_PULLUP);    //  BP 1
  pinMode(A2, INPUT_PULLUP);    //  BP 2
  pinMode(A3, INPUT_PULLUP);    //  BP 3     
}

void gereServo(int numServo)
{
  servoMoteur[numServo].objetServo.writeMicroseconds(servoMoteur[numServo].angle);
 
  servoMoteur[numServo].angle += servoMoteur[numServo].vitesse;
 
  if (servoMoteur[numServo].angle > angleMax)
  {
    servoMoteur[numServo].angle = angleMax;
    servoMoteur[numServo].vitesse = 0;
    servoMoteur[numServo].objetServo.detach();
    servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MAX;
  }
  else
    if (servoMoteur[numServo].angle < angleMin)
    {
    servoMoteur[numServo].angle = angleMin;
    servoMoteur[numServo].vitesse = 0;
    servoMoteur[numServo].objetServo.detach();
    servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MIN;
    }
}

void evenementServo_DROIT (int numServo)
{
  servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
  switch (servoMoteur[numServo].etatServo)
  {
    case SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN:
      servoMoteur[numServo].vitesse =  1;
      servoMoteur[numServo].etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX;
      break;
  }
}

void evenementServo_DEVIE (int numServo)
{
  servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
  switch (servoMoteur[numServo].etatServo)
  {
    case SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX:
      servoMoteur[numServo].vitesse = -1;
      servoMoteur[numServo].etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN;
      break;
  }
}

void loop()
{
  int numServo;
 
  for (numServo = 0; numServo < 4; numServo++)
    gereServo(numServo);
 
  byte evenement = lireEvenement(&numServo);
 
  if (evenement == EVENEMENT_PRESSE)
    evenementServo_DROIT(numServo);

  if (evenement == EVENEMENT_RELACHE)
    evenementServo_DEVIE(numServo);
   
  delay(3);
}
Bien sûr , j'arrive a le compiler mais il ne marche toujours pas .
Comme je vous l'ai dit précédemment , je ne sais pas programmer . Je n'ai donc pas trouver la solution , d'ailleurs , je ne sais quoi chercher.
Désolé DDEF , mais comme tu le précisais dans ton message du 18 décembre , je t'appelle à l'aide.
Cordialement

7
Débuter / Re : commande servo par inter
« le: décembre 31, 2015, 01:19:37 pm »
J’ai chargé ce skecth avec 4 inters afin de voir le fonctionnement, et bien sur, je ne peux lire le numéro du poussoir
J’ai fait plusieurs manipulations : suppression de la fonction  « LirePoussoirs », de la variable resultat , déplacement des variables « resultat » , « numPoussoir » dans setup , loop .

Je ne maitrise pas la programmation pour résoudre seul ce problème

boolean ancienA0  = HIGH;
boolean nouveauA0 = HIGH;
boolean ancienA1  = HIGH;
boolean nouveauA1 = HIGH;
boolean ancienA2  = HIGH;
boolean nouveauA2 = HIGH;
boolean ancienA3  = HIGH;
boolean nouveauA3 = HIGH;

int lirePoussoirs()
 {
 int resultat;
     int numPoussoir=4;

    nouveauA0 = digitalRead(A0);   
    if (ancienA0 != nouveauA0)
    {
        ancienA0 = nouveauA0;
        numPoussoir = 0;
    }
    else
    {
        nouveauA1 = digitalRead(A1);
        if  (ancienA1 != nouveauA1)
        {
            ancienA1 = nouveauA1;
            numPoussoir = 1;
        }
        else
        {
            nouveauA2 = digitalRead(A2);
            if  (ancienA2 != nouveauA2)
            {
                ancienA2 = nouveauA2;
                numPoussoir = 2;
            }
            else
            {
                nouveauA3 = digitalRead(A3);
                if  (ancienA3 != nouveauA3)
                {
                    ancienA3 = nouveauA3;
                    numPoussoir = 3;
                }                                 
            }
        }
    }
    return resultat;
    }
void setup()
{
 
     Serial.begin(9600);
}

void loop()
{

  byte evenement = lirePoussoirs();
 
Serial.print("N° inter : ");

Serial.println(lirePoussoirs());

Serial.println(resultat);

delay(100);
}
J’ai réalisé , en modifiant celui de jlb «  un servo un inter » , un programme que j’installe sur des ATtiny 85
Ce programme est superbe , cela crée un mouvement très réaliste de l’aiguille
#include "Servo8Bit2.h"

const byte SERVO_A_ANGLE_MIN = 0;     
const byte SERVO_A_ANGLE_MAX = 1;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX = 2;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN = 3;

const boolean DROIT = true;         
const boolean DEVIE = false;

Servo8Bit2 monServo;
int vitesse = 1;
int angle;
byte etatServo = SERVO_A_ANGLE_MIN;   

const int angleMin = 1250;
const int angleMax = 1720;

boolean etatInter = DEVIE;           
int Led = 3;                           // Led TCO sur patte 2 ATtiny 85
int pinInter = 0;                      // Interrupteur sur patte 5 ATtiny 85
int etatcontact;

boolean lireInter()                   
{
  boolean resultat ;                 
  etatcontact = digitalRead(pinInter);

  if (etatcontact == HIGH) {           
    resultat = DROIT;                 
  }
  else  resultat = DEVIE;             
}
void setup()
{
  pinMode(Led,OUTPUT);                 
  monServo.attach(1);                   // Servo sur patte 6 ATtiny 85
  angle = angleMin;
  vitesse = 1;
}

void loop()
{
  monServo.writeMicroseconds(angle);
  /* calcule le nouvel angle */
  angle = angle + vitesse;
  if (angle > angleMax) {
    angle = angleMax;
    vitesse = 0;
    monServo.detach();
    etatServo = SERVO_A_ANGLE_MAX;
  }
  else if (angle < angleMin) {
    angle = angleMin;
    vitesse = 0;
    monServo.detach();
    etatServo = SERVO_A_ANGLE_MIN;
  }

  byte evenement = lireInter();
  if (evenement == DROIT)  {
    digitalWrite(Led,1);
    monServo.attach(1);
    switch (etatServo)
    {
      case SERVO_A_ANGLE_MIN:
      case SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN:
        vitesse =  1;
        etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX;
        break;
    }
  }
  if (evenement == DEVIE) {
    digitalWrite(Led,0);
    monServo.attach(1);
    switch (etatServo)
    {
      case SERVO_A_ANGLE_MAX:
      case SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX:
        vitesse = -1;
        etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN;
        break;
    }
  }
  delay(2);
}
Mon objectif est d’installer ce programme sur carte nano , mais avec 4 commandes
En reprenant le skecth de jlb et les remarques de DDEF  et après avoir réalisé la manip d’essai des 8 inters sur une entrée , je suis arrivé à ce début( semblant) de programme :

// A PRIORI PAS DE MODIFICATION
#include <Servo.h>
 
const byte SERVO_A_ANGLE_MIN = 0;
const byte SERVO_A_ANGLE_MAX = 1;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX = 2;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN = 3;

const boolean DROIT = true;     // MODIFICATION PROG     
const boolean DEVIE = false;    // MODIFICATION PROG
 
const int angleMin = 1250;
const int angleMax = 1750;
 
struct DescripteurServo {
  Servo objetServo;
  int vitesse;
  int angle;
  int pin;
  byte etatServo;
};

struct DescripteurServo servoMoteur[4];
 
const byte NON_PRESSE = 0;
const byte ENFONCE = 1;
const byte PRESSE = 2;
 
byte etatAutomate = NON_PRESSE;
int etatPoussoir = -1;
 
const byte AUCUN_EVENEMENT = 0;
const byte EVENEMENT_PRESSE = 1;
const byte EVENEMENT_RELACHE = 2;

//variable pour les inters

boolean ancienA0  = HIGH;
boolean nouveauA0 = HIGH;
boolean ancienA1  = HIGH;
boolean nouveauA1 = HIGH;
boolean ancienA2  = HIGH;
boolean nouveauA2 = HIGH;
boolean ancienA3  = HIGH;
boolean nouveauA3 = HIGH;

                        //const int pinPoussoirs = 0; // A SUPPRIMER

// MODIFICATION DE LirePoussoirs et Lire Evenement AFIN D’AVOIR LE NUMERO
// ET L’ETAT DE L’INTER

   int lirePoussoirs()
  {
    int resultat;
 //  int numPoussoir = (analogRead(pinPoussoirs) + 64) / 128;  //  A SUPPRIMER

    numPoussoir = 4;                     // Ou faut il déclarer numPoussoir ?

    nouveauA0 = digitalRead(A0);   
    if (ancienA0 != nouveauA0)
    {
        ancienA0 = nouveauA0;
        numPoussoir = 0;
    }
    else
    {
        nouveauA1 = digitalRead(A1);
        if  (ancienA1 != nouveauA1)
        {
            ancienA1 = nouveauA1;
            numPoussoir = 1;
        }
        else
        {
            nouveauA2 = digitalRead(A2);
            if  (ancienA2 != nouveauA2)
            {
                ancienA2 = nouveauA2;
                numPoussoir = 2;
            }
            else
            {
                nouveauA3 = digitalRead(A3);
                if  (ancienA3 != nouveauA3)
                {
                    ancienA3 = nouveauA3;
                    numPoussoir = 3;
                }                                 
            }
        }
    }

    int nouvelEtatPoussoir = etatPoussoir; /* à priori rien ne change */
 
    switch (etatAutomate) {
        case NON_PRESSE:
            if (numPoussoir < 4)
                etatAutomate = ENFONCE;
            break;
        case ENFONCE:
            if (numPoussoir < 4) {
                etatAutomate = PRESSE;
                nouvelEtatPoussoir = numPoussoir;
            }
            else {
                etatAutomate = NON_PRESSE;
            }
            break;
        case PRESSE:
            if (numPoussoir == 4) {
                etatAutomate = NON_PRESSE;
                nouvelEtatPoussoir = -1;
            }
            break;
    }
   
    return nouvelEtatPoussoir;
}

byte lireEvenement(int *numPoussoir)
{
    byte evenement;
    int nouvelEtatPoussoir = lirePoussoirs();
   
    if (nouvelEtatPoussoir == etatPoussoir)
        evenement = AUCUN_EVENEMENT;
    if (nouvelEtatPoussoir >= 0 && etatPoussoir == -1)
        evenement = EVENEMENT_PRESSE;
    if (nouvelEtatPoussoir == -1 && etatPoussoir >= 0)
        evenement = EVENEMENT_RELACHE;
 
    etatPoussoir = nouvelEtatPoussoir;
    *numPoussoir = etatPoussoir;
   
    return evenement;
}

// A PRIORI PAS DE MODIFICATION
void setup()
{
    /* Initialisation des servos */
    int numServo;
 
    for (numServo = 0; numServo < 4; numServo++) {
        servoMoteur[numServo].angle = angleMin;
        servoMoteur[numServo].vitesse = 0;
        servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MIN;
        servoMoteur[numServo].pin = numServo + 2;
        servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
                                                 }                                       
       /* Initialisation des inters */ 
    pinMode(A0, INPUT_PULLUP);    //  BP 0
    pinMode(A1, INPUT_PULLUP);    //  BP 1
    pinMode(A2, INPUT_PULLUP);    //  BP 2
    pinMode(A3, INPUT_PULLUP);    //  BP 3     
}
// A PRIORI PAS DE MODIFICATION

void gereServo(int numServo)
{
    servoMoteur[numServo].objetServo.writeMicroseconds(servoMoteur[numServo].angle);
 
    servoMoteur[numServo].angle += servoMoteur[numServo].vitesse;
 
    if (servoMoteur[numServo].angle > angleMax) {
      servoMoteur[numServo].angle = angleMax;
      servoMoteur[numServo].vitesse = 0;
      servoMoteur[numServo].objetServo.detach();
      servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MAX;
    }
    else if (servoMoteur[numServo].angle < angleMin) {
      servoMoteur[numServo].angle = angleMin;
      servoMoteur[numServo].vitesse = 0;
      servoMoteur[numServo].objetServo.detach();
      servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MIN;
    }
}
//MODIFICATION J’AI PRIS DROIT = VERS ANGLE MAX ( A VERIFIER)

void evenementServo DROIT (int numServo)
{
    switch (servoMoteur[numServo].etatServo) {
        servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
      case SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN:
        servoMoteur[numServo].vitesse =  1;
        servoMoteur[numServo].etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX;
        break;
                                              } 
}

//MODIFICATION J’AI PRIS DEVIE = VERS ANGLE MIN ( A VERIFIER)

void evenementServo DEVIE (int numServo)
{
    switch (servoMoteur[numServo].etatServo) {
        servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
      case SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX:
        servoMoteur[numServo].vitesse = -1;
        servoMoteur[numServo].etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN;
        break;
                                              }
}

//MODIFICATION
void loop()
{
    int numServo;
 
    for (numServo = 0; numServo < 4; numServo++) gereServo(numServo);
 
    //  byte evenement = lireEvenement(&numServo);
 
      if (evenement == EVENEMENT_DROIT) {
        evenementServo DROIT(numServo);

     if (evenement == EVENEMENT_DEVIE) {
        evenementServo DEVIE(numServo);
   }
 
    delay(3);
}

Je pense être arrivé au max de mes compétences .
Sans aide , je ne pourrai avancer
Merci d'avance à DDEF

Bonnes fêtes à tous
Philippe

8
Débuter / Re : commande servo par inter
« le: décembre 28, 2015, 08:18:27 pm »
Bonnes fêtes de fin d'année à tous les membres

 Désolé pour les désagréments de présentation sur le forum

DDEF , j’ai travaillé sur le projet mais je n’ai guère avancé . Je n’ai pas trouvé le problème à résoudre

J’utilise le sketch « Programme Arduino avec coupure de la commande PWM » que je copie sur le blog de jlb

Je ne comprends pas les fonctions « LirePoussoir » et « Lire evenement »

Afin de voir le fonctionnement, j’ai réalisé le schéma du blog de jlb « Plusieurs boutons poussoir sur une entrée analogique »

Et là , je me rends compte que ce n’est pas vraiment le fonctionnement que je désire ( en plus des 4 inters )

Le sketch que je souhaite est :
-   Déclarations des constantes nécessaires

-   Void setup :
Initialisation des servos   ( angle min  , vitesse nulle , état à angle min , affectation de la pin( numservo+2) , attache à la pin )
Initialisation des inters (pullup sur A0 ,A1,A2,A3 )

-   Void événément servo P   : on attache le servo
                            : on impose la vitesse à 1
                            : on impose l’état Servo en movement vers angle max
             
-   Void événement servo NP    : on attache le servo
                            : on impose la vitesse à 1
                            : on impose l’état Servo en movement vers angle min

-   Fonction à étudier    : Lit l’inter qui a changé de position (O ou F)
                          : test changement d’état (pressé , non pressé )

Void gerer servo    : permet le mouvement de servo ( writMicroseconds
                 : test la valeur de l’angle
                        : positionne à Max ou Min
                 : désactive la connection
                 : modifie l’angle , état du servo , et la vitesse

-   Void loop

Du servo 0 à servo 3 donc <4 ,
on va dans « gerer servo »    
on va dans « fonction à étudier »   
-   Test l’inter et son état :   Si pressé on va dans « événement Servo P                
                                           Si non pressé on va dans « événement Servo NP
Tempo


Je pense pouvoir créer «  événément servo P » et » « en événément servo NP »   en modifiant modifier « évènement servo » . Je mettrai le sketch  la semaine prochaine

Mon énorme problème est de :
    trouver l’inter concerné ( 0 ,1 , 2 ou 3) : tu m’as résolu cette difficulté
    de savoir son état ( repos ou travail ) (contact permanent)
    déclaré 2 variables ( pressé ) et ( non pressé )

Merci d’avance pour ton aide

Cordialement
Philippe

9
Débuter / Re : commande servo par inter
« le: décembre 19, 2015, 11:21:56 am »
Je n'ai pas tout compris , mais je pense  qu'il devrait avoir 2 tests : le numéro de l'inter et son état  . Donc la fonction LirePoussoirs n'est pas suffisante.
Je suis part du sketch de jlb que je remercie ( je lui dois des droits d'auteurs !!!!! ) : "huit boutons  huit servos détach .
j'ai fait des modifications afin d' avoir 4 inters ( pin AO ,A3) pour 4 servos (pin 2,5);
Je compile ce sketch , il n'indique aucune erreur . Par contre , je ne peux pas faire d'essais réels d'ou je suis .
J'attends avec impatience tes critiques et conseils
Bonnes fêtes
Philippe

#include <Servo.h>

// Déclaration des constantes spécifiques aux servos
const byte SERVO_A_ANGLE_MIN = 0;
const byte SERVO_A_ANGLE_MAX = 1;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX = 2;
const byte SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN = 3;
 
const int angleMin = 1250;
const int angleMax = 1750;
 
struct DescripteurServo {
  Servo objetServo;
  int vitesse;
  int angle;
  int pin;
  byte etatServo;
};
 
struct DescripteurServo servoMoteur[4];

const byte NON_PRESSE=0;
const byte ENFONCE = 1;
const byte PRESSE =2;

byte etatAutomate = NON_PRESSE;
int etatPoussoir = -1;
 
const byte AUCUN_EVENEMENT = 0;
const byte EVENEMENT_PRESSE = 1;
const byte EVENEMENT_RELACHE = 2;
 
          const int pinPoussoirs = 0;
 
// Déclaration des variables spécifiques aux inters
boolean ancienA0  = HIGH;
boolean nouveauA0 = HIGH;
boolean ancienA1  = HIGH;
boolean nouveauA1 = HIGH;
boolean ancienA2  = HIGH;
boolean nouveauA2 = HIGH;
boolean ancienA3  = HIGH;
boolean nouveauA3 = HIGH;
int numPoussoir ;

// Calcul du numéro du poussoir
int lirePoussoirs()
{
  int nouvelEtatPoussoir = etatPoussoir; /* à priori rien ne change */
   
  numPoussoir = 4;
 
    nouveauA0 = digitalRead(A0);   
    if (ancienA0 != nouveauA0)
    {
        ancienA0 = nouveauA0;
        numPoussoir = 0;
    }
    else
    {
        nouveauA1 = digitalRead(A1);
        if  (ancienA1 != nouveauA1)
        {
            ancienA1 = nouveauA1;
            numPoussoir = 1;
        }
        else
        {
            nouveauA2 = digitalRead(A2);
            if  (ancienA2 != nouveauA2)
            {
                ancienA2 = nouveauA2;
                numPoussoir = 2;
            }
            else
            {
                nouveauA3 = digitalRead(A3);
                if  (ancienA3 != nouveauA3)
                {
                    ancienA3 = nouveauA3;
                    numPoussoir = 3;
                }                                 
            }
        }
    }
    return nouvelEtatPoussoir;   
}

byte lireEvenement(int *numPoussoir)
{
    byte evenement;
    int nouvelEtatPoussoir = lirePoussoirs();
   
    if (nouvelEtatPoussoir == etatPoussoir)
        evenement = AUCUN_EVENEMENT;
    if (nouvelEtatPoussoir >= 0 && etatPoussoir == -1)
        evenement = EVENEMENT_PRESSE;
    if (nouvelEtatPoussoir == -1 && etatPoussoir >= 0)
        evenement = EVENEMENT_RELACHE;
 
    etatPoussoir = nouvelEtatPoussoir;
    *numPoussoir = etatPoussoir;
   
    return evenement;
}

void setup()
{
// Initialisation des inters
pinMode(A0, INPUT_PULLUP);    //  BP 0
pinMode(A1, INPUT_PULLUP);    //  BP 1
pinMode(A2, INPUT_PULLUP);    //  BP 2
pinMode(A3, INPUT_PULLUP);    //  BP 3

// Initialisation des servos
int numServo;
for (numServo = 0; numServo < 4; numServo++)    {
      servoMoteur[numServo].angle = angleMin;
      servoMoteur[numServo].vitesse = 0;
      servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MIN;
      servoMoteur[numServo].pin = numServo + 2;    // pin 2,3,4,5 de la carte NANO
      servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
                                                }
}

void gereServo(int numServo)  // pas de modification !!!!!
{
    servoMoteur[numServo].objetServo.writeMicroseconds(servoMoteur[numServo].angle);
 
    servoMoteur[numServo].angle += servoMoteur[numServo].vitesse;
 
    if (servoMoteur[numServo].angle > angleMax)     {
      servoMoteur[numServo].angle = angleMax;
      servoMoteur[numServo].vitesse = 0;
      servoMoteur[numServo].objetServo.detach();
      servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MAX;
                                                     }
    else if (servoMoteur[numServo].angle < angleMin) {
      servoMoteur[numServo].angle = angleMin;
      servoMoteur[numServo].vitesse = 0;
      servoMoteur[numServo].objetServo.detach();
      servoMoteur[numServo].etatServo = SERVO_A_ANGLE_MIN;
                                                     }
}

void evenementServo(int numServo) // pas de modification !!!!!
{
    switch (servoMoteur[numServo].etatServo) {
      case SERVO_A_ANGLE_MIN:
        servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
      case SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN:
        servoMoteur[numServo].vitesse =  1;
        servoMoteur[numServo].etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX;
        break;
      case SERVO_A_ANGLE_MAX:
        servoMoteur[numServo].objetServo.attach(servoMoteur[numServo].pin);
      case SERVO_EN_MOUVEMENT_VERS_ANGLE_MAX:
        servoMoteur[numServo].vitesse = -1;
        servoMoteur[numServo].etatServo = SERVO_EN_MOUVEMENT_VERS_ANGLE_MIN;
        break;
                                             }
}
 
void loop() // pas de modification !!!!!!
{
    int numServo;
 
    for (numServo = 0; numServo < 8; numServo++) gereServo(numServo);
 
    byte evenement = lireEvenement(&numServo);
 
    if (evenement == EVENEMENT_PRESSE) {
        evenementServo(numServo);
    }
 
    delay(3);
}



10
Débuter / Re : commande servo par inter
« le: décembre 18, 2015, 08:49:34 pm »
Merci DDEF pour ton aide et ta pédagogie .

Je pars pour deux semaines et ne sait pas si j'aurai internet . J'ai donc imprimer tout le sujet.

J'espère , à mon retour , avoir réussi le challenge .

Bonnes fêtes

Cordialement

Philippe

11
Débuter / Re : commande servo par inter
« le: décembre 16, 2015, 10:07:24 pm »
Merci pour ta réponse
Sur Attiny
La bibliothèque Servo ne marche quà 16 MHZ. Les Attiny fonctionnent à 8MHZ. Donc si on veut commander un servo par un Attiny , il faut une autre bibliothèque qui est Servo8Bit2  . A priori , j'ai réglé le problème , je commande un servo par un inter avec recopie sur TCO par Led avec la commande writMicroseconds .
J'ai utilisé le sketch  de jlb (un servo par un inter )
Sur Nano
Le blog de jlb est mon livre de chevet ( je suis impressionné par la pédagogie de ce monsieur et sa compétence en programmation ).Mon but est d'utilisé le sketch " 8 servos par 8 inters écrit en C et non en c++( je ne souhaite pas le réglage des butées , je le fais directement sur le réseau avec une carte uno et un afficheur ). Le programme de jlb est 8 inters sur une seule entrée , il utilise un pont diviseur  . Je le cite
"""""""""""""""""""""
int lirePoussoirs()
{
    int resultat;
    int numPoussoir = (analogRead(pinPoussoirs) + 64) / 128;
   
    int nouvelEtatPoussoir = etatPoussoir; /* à priori rien ne change */
"""""""""""""""""""""""
De cette manière , on ne peut lire qu'un seul inter à la fois
Mon but est d'avoir 4 inters sur les bornes par ex  (AO , A3 ). Je souhaite modifier la fonction"LirePoussoirs() " pour savoir quel inter est activé . Et la je bloque
La raison est que je pilote les commandes aiguilles ou accessoire  par RRTC et des décodeurs LTD TYPE SA DEC 4 (4 sorties bistable C R T ) . Si j'avais cette fonction , je pourrai utilisé le T( contact travail)  du décodeur sur la borne AO, A3 et avoir un mouvement lent des aiguilles PECO code 55 ( je fais du N)et tout cela un moindre coût par rapport à d'autres commandes  moteur (type tortoi... , etc....)
Le logiciel de jlb est parfait pour mes besoins , reste à modifier cette ""maudite"" fonction
D'ou mon appel à l'aide
Cordialement
Philippe

12
Débuter / commande servo par inter
« le: décembre 14, 2015, 02:54:03 pm »
Bonjour ,
comme indiqué dans ma présentation, je cherche à piloter des servos . J'ai honteusement copié les fichiers de jlb ( que je remercie et félicite pour la qualité de son travail )
J'ai 2 options :
soit piloter par attiny 45, 1 servo par 1 inter suivant le programme de jlb que j'ai trouvé sur le site de LR
soit piloter par carte NANO , 4 servos par 4 inters suivant le programme ( 8 servos 8 inters )
dans les 2 cas je n'y arrive pas
pour le pilotage par NANO , je ne veux pas 8 inters sur une entrée mais 1 entrée pour chaque inter . J'ai essayé de modifié sur le programme  la structure(Lire poussoir) par un semblant de descripteur clavier . Malgré le nombre d'heures à chercher  (je ne suis pas programmeur ) ,je ne vous dit pas le résultat . Vous avez compris .
Pour le pilotage par attiny , j'arrive à transférer le programme cité ci dessus en modifiant la bibliothèque servo par servo8Bit 2 Mais le servo ne répond pas à la commande de l'inter. Sur la carte NANO j'utilise les bornes AO pour l'inter et 2 pour le servo( comme le logiciel ) . Quand je le transpose sur attiny ,j'utilise la pin 3 soit la patte 2 pour l'inter et la pin 2 soit la patte 7
Dans les 2 cas , j'aimerai de l'aide de votre part
Cordialement
Philippe



13
Présentez vous ! / Re : Bonjour à tous
« le: décembre 13, 2015, 10:35:41 pm »
Bonjour DDEFF  et à tous
A ce jour mon réseau est digitalisé avec deux MS TRIX 01 . Ce réseau à 10 ans .Etant à la retraite , je prépare la construction d'un nouveau réseau . Ce futur réseau devrait avoir une gare cachée  (16 aiguilles  ) et une gare  (8 aiguilles et 2 TJD ) , la voie étant du peco code 55
Après avoir rencontré plusieurs forumistes de LR  et de RRTC ( j'habite Toulouse) , j'ai décidé de commander mon futur réseau par RRTC et centrale Lenz  . Dans un premier temps , je ne m'occupe pas de rétrosignalisation seulement de commande d'aiguilles .
Pour la gare cachée , je vais (essayer ) construire le décodeur de LOCODUINO pour 8 aiguillages à solénoïdes en mode DCC  raccordé sur le bus JK ( lenz) car je garde les moteurs PL 10
Par contre pour la gare , je souhaite des mouvements lents pour les aguilles . Pour des raisons d'économie  et après avoir lu de nombreux articles , j'ai décidé d'utiliser des servos . J'avais acheté la centrale et les décodeurs ( LTD S A DEC 4 sortie bistable ) . Il me faut donc un interface analogique arduino , 1 Atiny  par aiguille un servo piloté par le bistable (idem un inter)  ou une NANO pilotant 4 servos par 4 bistables )
Je travaille sur ce programme , je m'inspire du le sketch de jlB mais comme je ne suis pas programmeur , j'ai des difficultés afin de le mettre au point
Je prévois d'ouvrir un fil pour vous montre mon sketch et avoir votre aide
J'espère avoir été plus clair
Bien cordialement
Philippe

14
Présentez vous ! / Bonjour à tous
« le: décembre 12, 2015, 08:33:02 pm »
J'ai découvert Arduino grâce au site et à locorevue . Mon problème est que je ne maitrise pas la programmation .
J'ai une carte UNO avec l'IDE 1.6.4  .Jusqu'à présent  , j'ai réalisé  une simulation de poste à souder , un feu routier , un radar ,un chenillard (protection travaux) . J'ai transféré ces sketchs sur ATtiny 45, 85 et 2313 . Tout cela afin de réaliser des animations sur mon réseau à l'échelle N que je pratique depuis 1988
Mon réseau est digitalisé pour la traction (MSTRIX 01) , les aiguilles  (PECO PL10) sont pilotées par un TCO .
Mon nouvel objectif est de manoeuvrer les aiguilles par des servos  commandés par des décodeurs LTD SA DEC 4 interfacés par Arduino
Cordialement à tous
Philippe

Pages: [1]