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.


Sujets - Mcarmina

Pages: [1]
1
Vos projets / Bibliotheque minabay et le DCC.loop()
« le: juin 13, 2017, 12:10:42 am »
Bonsoir à vous tous,

je développe (j'essaye) un décodeur accessoire basé sur un nano et la bibliothèque de minabay pour piloter 7 servo d'aiguillage avec un relais pour la pointe de coeur.
mon système fonctionne bien, pas de soucis mais :
pour plus de réalisme j'ai ralenti la vitesse du décodeur dans une boucle comme ci dessous (les serial.print sont uniquement là pour comprendre ce qui se passe)
le temps de déplacement d'une butée à l’autre est de 1sec. Pendant ce temps le nano n'est pas capable de lire une commande DCC. Je suis sur Train Controller et Train Controller envoi les ordres les uns derrière les autres sans delai, le résultat fait que mon système n'est pas capable de lire toutes les commandes DCC envoyées par la centrale. en fait il lit la premiere et puis plus rien tant que le servo n'est pas arrivé
Logiquement j'ai inserré une commande DCC.loop() dans la boucle for pour pouvoir lire plusieurs commande DCC en provenance de la centrale.

case 0:  // bouge le servo vers position droite
        for (pos = Aig[xx][2] ; pos <= Aig[xx][1] ; pos = pos + Pas) {
          Aig1.writeMicroseconds(pos);
          Serial.println (pos);
          delay(30);
          if (pos == xP + Aig[xx][2] ) {
            Serial.println("vers pos droite pos Droit > devié relais actionne");
            digitalWrite (NumPinR[xx], LOW);
            DCC.loop();
          }
        }
        Aig1.writeMicroseconds(Aig[xx][1] + Ressort);
        break;
      case 1:  // bouge le servo vers position deviee
        for (pos = Aig[xx][1] ; pos >= Aig[xx][2] ; pos = pos - Pas) {
          Aig1.writeMicroseconds(pos);
          Serial.println (pos);
          delay(30);
          if (pos == Aig[xx][1] - xP) {
            Serial.println("vers pos deviee pos Droit > devié relais actionne");
            digitalWrite (NumPinR[xx], HIGH);
             DCC.loop();
          }     
        }

dans la routine de lecture de la commande j'ai cree une pile pour sauvegarder les commandes DCC envoyées par la centrale

void BasicAccDecoderPacket_Handler(int address, boolean activate, byte data)
{
  // Convert NMRA packet address format to human address
  address -= 1;
  address *= 4;
  address += 1;
  address += (data & 0x06) >> 1;
  Etat = (data & 0x01) ? HIGH : LOW;

  Serial.print ("addresse lue DCC: ");
  Serial.print (address);
  Serial.print ("   Position cde: ");
  Serial.print (Etat);
  Serial.print ("  pointeur pile: ");
  Serial.println (PileAdrPointeur);

  if ((address >= DCC_AddressDeb) && (address < DCC_AddressDeb + NbrServo) && (PileAdrPointeur < NbrServo + 2))  {

    if ((PileAdrPointeur >= 1)) {  // gestion de la pile a l'empilage
      DCC_AddressLu = PileAdr[PileAdrPointeur-1] ;
      EtatCdeDCC = PileAigPos[PileAdrPointeur-1] ;
    }
    else {
      DCC_AddressLu = 0;
    }

    if ((DCC_AddressLu == address) && (EtatCdeDCC != Etat) || (DCC_AddressLu != address)) {
      PileAdrPointeur = PileAdrPointeur + 1 ;
      PileAdr[PileAdrPointeur-1] = address ;
      PileAigPos[PileAdrPointeur-1] = Etat;
      Serial.print ("addresse sauver sur pile: ");
      Serial.print (address);
      Serial.print ("  Position Cde sauve: ");
      Serial.print (Etat);
      Serial.print ("  pointeur :");
      Serial.println (PileAdrPointeur);
    }
  }
}

et dans ma void loop() je depile et actionne mes servos

void loop()
{

  Tp1 = millis();
  DCC.loop();

  if (PileAdrPointeur >= 1) {  // Gestion de la pile au depilage
    DCC_AddressLu = PileAdr[0] ;
    EtatCdeDCC = PileAigPos
  • ;

    AigPos[DCC_AddressLu - DCC_AddressDeb] = EtatCdeDCC;
    EtatChange = true ;
    for (xx = 2 ; xx <= PileAdrPointeur ; xx++) {  // depile
      PileAdr[xx - 2] =  PileAdr[xx - 1];
      PileAigPos[xx - 2] =  PileAigPos[xx - 1];
    }
    PileAdrPointeur = PileAdrPointeur - 1;
  }

  if (EtatChange == true) {   //   actionne le servo lu par le DCC
    Serial.print("@ à bouger: ");
    Serial.print(DCC_AddressLu);
    Serial.print("  etat: ");
    Serial.println(EtatCdeDCC);
    Tp = millis();

    switch (DCC_AddressLu - DCC_AddressDeb) {
      case 0:  // aiguillage 1
        xx = 0;
        Update_Aig();
        Update_Aig1();
        break ;
      case 1:  // aiguillage 2
        xx = 1;
        Update_Aig();
        Update_Aig2();
        break;
      case 2:  // aiguillage 3


bon ben ça ne marche pas, j'ai comme l'impression que les commandes DCC.loop() dans les boucles for ne fonctionnent pas
un peu d'aide svp, merci, je bloque et ne comprends pas pourquoi.
pour info, il y a 10 mois je ne connaissais pas l’existence du langage C, donc il doit bien y avoir dans mon code quelques problemes, soyez donc  indulgent :)

2
Présentez vous ! / Bonjour à vous tous
« le: avril 19, 2017, 01:27:09 pm »
Bonjour
nouvel inscrit et  utilisateur de arduino
je suis ce site depuis 6 mois (environ)
merci à vous tous, ce site est une mine d'info sur notre passion qui est l'automatisme d'un réseau.
intéressé par la conception d'un décodeur d’accessoire pilotable avec Train Controller.
merci de m’accueillir parmi vous,
mes projets :
pilotage d'un moteur pap pour commande d'une table transfert et pont tournant + creation d'un switch board pour actionner les aiguillages + renvoi au TCO .
mon réseau : 250m de voie piloté par Train Controller centrale lenz
bien à vous,

Pages: [1]