[RÉSOLU]Aide pour un programme signal PWM

Ah làlà làlà làlà
Faut tout faire ici :wink:

1er exemple (demo_train.ino)
Un seul gros automate qui gère tout avec :

enum ETATS_APPLICATION {
  CHANGE_DIR_1_VERS_2,  // changer le relai pour aller de 1 vers 2
  ACCELERE_1_VERS_2,    // le train va de 1 vers 2 et accélère jusqu'au maximum
  DE_1_VERS_2,          // le train roule a fond de 1 vers 2
  RALENTIT_EN_2,        // le train a atteint le capteur 2 et ralentit jusqu'à l'arrêt
  CHANGE_DIR_2_VERS_1,  // changer le relai pour aller de 2 vers 1
  ACCELERE_2_VERS_1,    // le train accélère jusqu'au maximum
  DE_2_VERS_1,          // le train roule a fond vers 1
  RALENTIT_EN_1         // le train a atteint le capteur 1 et ralentit jusqu'à l’arrêt
} etat = CHANGE_DIR_1_VERS_2;

Commence par comprendre la logique.
C'est un bon gros exemple avec des états très expensifs, Il y a 4 étapes pour chaque sens :

  • On change de sens
  • On accélère
  • On est stable à fond
  • On ralentit quand on atteint le capteur

Mais comme tu peux le voir il y a beaucoup de code redondant.
Les phases d'accélération et de ralentissement sont identiques pour chacun des sens ce qui est dommage et complique la maintenance du code.

Pour une bonne raison, c'est que cet exemple, bien qu'il mette en oeuvre un automate ne découpe pas bien l'application.

Le 2eme exemple (démo_train2.ino) utilise 2 automate :

  • Un pour gérer le moteur avec 4 phases : arrêt, accélération, au max, décélération
enum ETATS_MOTEUR {
  ARRET,
  ACCELERE,
  AU_MAX,
  RALENTIT
} etat_moteur = ARRET;
  • Un pour le train : part vers le point 2, roule vers le point 2, repart vers le point 1, roule vers le point 2
enum ETATS_TRAIN {
  DEMARRER_VERS_2,
  EN_ROUTE_VERS_2,
  DEMARRER_VERS_1,
  EN_ROUTE_VERS_1
} etat_train = DEMARRER_VERS_2;

L'automate du train est le maître. Ses entrées sont les capteurs et il pilote l'automate du moteur.

Bon je n'ai pas de train, mais j'ai ressortit ma base robot roulant et voilà le résultat ICI (musique: Lat Train to London - Electric Light orchestra /D)

Je n'utilise pas de transistors ni de relai mais un driver de moteur (double pont en H) TB6612FNG (sur un breakout de chez Sparkfun).
Tu peux faire la même chose avec un L298.

demo_train.ino (7.34 KB)

demo_train2.ino (5.99 KB)