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 3bon 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