Advertisement
nikolas77

pont tournant

Mar 31st, 2024
14
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.18 KB | None | 0 0
  1. // Include the libraries
  2. #include <AccelStepper.h>
  3. //#include <DCC_Decoder.h>
  4.  
  5. #define nbPosition 11 // Le nombre de positions d'arret face aux voies (crans)
  6.  
  7. #define vitesseRotationManuelle 30 // Vitesse de Rotation en mode manuel/calibrage (~50 = très lent)
  8. #define vitesseMaxCrans 75 // Vitesse de Rotation en mode crans (~200)
  9. #define vitesseAccelerationCrans 40 // Vitesse d'accélération / décélération en mode crans (~25)
  10. // Utilisation en mode demi-pas MotorInterfaceType 8
  11. int tabPosition[nbPosition] = {-2048, -1886, -306, -194, -150, 0, 163, 1740, 1840, 1994, 2048};
  12.  
  13. // Utilisation en mode plei-pas MotorInterfaceType 4
  14. //int tabPosition[nbPosition] = {-2048, -1962, -1166, -1097, -1024, -108, 0, 82, 880, 950, 1024, 1939, 2048};
  15.  
  16. int ptrCranZero; // Position du point 0 dans le tableau
  17. int ptrCranCourant; // Pointeur de position courante dans le tableau
  18.  
  19. bool btnClic = false;
  20.  
  21. // Assignation des broches moteurs aux broches arduino
  22. #define motorPin1 8 // IN1 (Module ULN2003)
  23. #define motorPin2 9 // IN2 (Module ULN2003)
  24. #define motorPin3 10 // IN3 (Module ULN2003)
  25. #define motorPin4 11 // IN4 (Module ULN2003)
  26.  
  27. // Le type d'interface est défini sur 8 (HALF4WIRE), car nous voulons utiliser des demi-pas avec un moteur à 4 fils
  28. // Si l'on souhaite mettre le moteur en mode plein-pas, la valeur devra être défini à 4 (FULL4WIRE)
  29. #define MotorInterfaceType 8
  30. //#define MotorInterfaceType 4
  31.  
  32. // Initialisation pour utiliser AccelStepper avec les paramètres du dessus (Séquence IN1-IN3-IN2-IN4 avec le moteur 28BYJ-48)
  33. AccelStepper stepper = AccelStepper(MotorInterfaceType, motorPin1, motorPin3, motorPin2, motorPin4);
  34.  
  35. #define baseAdresse 100 // Adresse de base du Arduino-Decodeur
  36.  
  37.  
  38. // Assigner les boutons aux Pins
  39. const int BPG = 3; // Bouton tourne sens inverse aiguilles d'une montre
  40. const int BPD = 4; // Bouton tourne sens aiguilles d'une montre
  41. const int Inter = 5; // Interrupteur de mode
  42. const int ledTemoin = 13; // Led intégrée à la carte de l'arduino
  43.  
  44. bool rotationEnCours = false; // true = Rotation en Cours
  45.  
  46. /*
  47. * Fonction appelée par la librairie DCC et qui permet
  48. * d'activer ou de désactiver les sorties accessoires
  49. * Dans notre cas pour mettre en rotation le pont
  50. * Attention, une ligne doit être décommentée si vous utilisez une Z21 qui a un décalage d'adressage)
  51. */
  52. void BasicAccDecoderPacket_Handler(int address, boolean activate, byte data) {
  53. address -= 1;
  54. address *= 4;
  55. address += 1;
  56. address += (data & 0x06) >> 1;
  57. //address = address - 4; // Retirer le commentaire de cette ligne en cas d'utilisation d'un Z21
  58.  
  59. // Appel de la fonction qui va réagir en fonction de l'adresse lue
  60. actionsDecodeurArduino (address);
  61. }
  62.  
  63. /*
  64. * Permet de traduire l'adresse qui a été activée en action
  65. */
  66.  
  67. void actionsDecodeurArduino (int adresseLue) {
  68.  
  69. // Ex: si adresse de base est 100 alors l'arduino réagit aux adresse 100, 101, 102,...
  70. switch (adresseLue) {
  71.  
  72. // Faire tourner le pont d'un cran à gauche (= comme bouton gauche)
  73. case (baseAdresse):
  74. ptrCranCourant --;
  75. rotationByCrans ();
  76. break;
  77.  
  78. // Faire tourner le pont d'un cran à droite (= comme bouton droite)
  79. case (baseAdresse + 1):
  80. ptrCranCourant ++;
  81. rotationByCrans ();
  82. break;
  83.  
  84. // Mettre le pont à son point 0 (s'il n'est pas déjà en position 0)
  85. case (baseAdresse + 2):
  86.  
  87. if (ptrCranCourant != ptrCranZero) {
  88.  
  89. ptrCranCourant = ptrCranZero;
  90. int goTO = tabPosition[ptrCranCourant];
  91. stepper.moveTo(goTO);
  92. stepper.runToPosition();
  93. stepper.setCurrentPosition(0);
  94. delay(250);
  95. powerOffMoteur();
  96. }
  97. break;
  98.  
  99. }
  100. }
  101.  
  102. /*
  103. * Coupe l'alimentation sur le moteur
  104. * Pour éviter qu'il ne chauffe à l'arrêt
  105. */
  106.  
  107. void powerOffMoteur () {
  108. digitalWrite( 8, LOW); // Si le moteur chauffe toujours à l'arret
  109. digitalWrite( 9, LOW); // Remplacer les LOW par des HIGH (et inversement)
  110. digitalWrite(10, LOW);
  111. digitalWrite(11, LOW);
  112. }
  113.  
  114. /*
  115. * Initialisation de la carte Arduino
  116. * Et des composants qui lui sont raccordés
  117. */
  118.  
  119. void setup() {
  120.  
  121. // Le mode PULL-UP permet de s'affranchir d'une résistance
  122. pinMode(Inter, INPUT_PULLUP);
  123. pinMode(BPD, INPUT_PULLUP);
  124. pinMode(BPG, INPUT_PULLUP);
  125.  
  126. // On utilise la LED intégrée à la carte comme témoin
  127. pinMode(ledTemoin, OUTPUT); //LED
  128.  
  129. // Cherche l'emplacement du point 0 dans le tableau des positions
  130. for (int ii=0; ii<nbPosition; ii++) {
  131. if (tabPosition[ii] == 0) ptrCranZero = ii;
  132. }
  133.  
  134. // Force l'emplacement du point courant dans le tableau au 0
  135. ptrCranCourant = ptrCranZero; // Au point 0 au début
  136.  
  137.  
  138. // Pour le mode rotation par crans
  139. // On définit la vitesse MAX
  140. // Et la vitesse dé départ et de fin de rotation
  141. // La classe "AccelStepper" se charge de calculer la courbe de vitesse :)
  142. stepper.setMaxSpeed(vitesseMaxCrans);
  143. stepper.setAcceleration(vitesseAccelerationCrans);
  144.  
  145. // Par défaut on dit que le moteur démarre au point 0
  146. // Mais on peu l'ajuster en manuel
  147. stepper.setCurrentPosition(0);
  148.  
  149. // Déclaration pour la partie DCC
  150. // La fonction est appelée sur Interruption de la broche 2
  151. // A chaque action faite sur la centrale
  152.  
  153. /* A activer si module DCC
  154. *
  155. *
  156. */
  157. // DCC.SetBasicAccessoryDecoderPacketHandler(BasicAccDecoderPacket_Handler, true);
  158. // DCC.SetupDecoder( 0x00, 0x00, 0 );
  159.  
  160. }
  161.  
  162. /*
  163. * Fait tourner le moteur à gauche ou à droite en continu
  164. * Lorsque l'un des boutons est pressé
  165. */
  166.  
  167. void rotationManuelle (int sensRotation = 1) {
  168. rotationEnCours = true;
  169. if (digitalRead(ledTemoin)== LOW) digitalWrite(ledTemoin, HIGH);
  170.  
  171. stepper.setSpeed(vitesseRotationManuelle * sensRotation);
  172. stepper.runSpeed();
  173. }
  174.  
  175. /*
  176. * Fait tourner le moteur à gauche ou à droite par crans prédéfinis
  177. * Lorsque l'un des boutons est pressé
  178. * On définit la position de destination avec moveTo()
  179. * Puis runToPosition() pour lancer la rotation à la vitesse définit et avec accélération
  180. * Le moteur ralentira en atteignant sa position de destination
  181. * (1 tour = 4096)
  182. */
  183.  
  184. void rotationByCrans () {
  185.  
  186. rotationEnCours = btnClic = true;
  187. if (digitalRead(ledTemoin)== LOW) digitalWrite(ledTemoin, HIGH);
  188.  
  189. int goTO = tabPosition[ptrCranCourant];
  190. stepper.moveTo(goTO);
  191. stepper.runToPosition();
  192. delay(100);
  193. powerOffMoteur();
  194.  
  195. if (ptrCranCourant == 0 || ptrCranCourant == (nbPosition-1)) {
  196. ptrCranCourant = ptrCranZero;
  197. stepper.setCurrentPosition(0);
  198. }
  199. }
  200.  
  201. void loop() {
  202.  
  203. // Mode rotation Manuelle / Calibrage
  204. // ---------------------------------------------
  205. if (digitalRead(Inter) == HIGH) {
  206.  
  207. if (digitalRead(BPG) == LOW) {
  208. rotationManuelle (-1) ;
  209. } else if (digitalRead(BPD) == LOW ){
  210. rotationManuelle (1) ;
  211. } else {
  212. // Arreter la rotation lorsqu'un bouton poussoir est relaché
  213. if (rotationEnCours == true) {
  214. rotationEnCours = false;
  215. if (digitalRead(ledTemoin) == HIGH) { digitalWrite(ledTemoin, LOW); }
  216.  
  217. // Le point d'arrêt devient alors le point 0
  218. stepper.setCurrentPosition(0);
  219. ptrCranCourant = ptrCranZero;
  220. powerOffMoteur();
  221. }
  222. }
  223.  
  224. } else {
  225.  
  226. // Rotation par crans / taquets
  227. // ---------------------------------------------
  228.  
  229. // Call to library function that reads the DCC data
  230. // Lecture DCC uniquement dans le mode Crans.
  231. //DCC.loop();
  232.  
  233. if (digitalRead(BPG) == LOW) {
  234. ptrCranCourant --;
  235. rotationByCrans ();
  236. } else if (digitalRead(BPD) == LOW ) {
  237. ptrCranCourant ++;
  238. rotationByCrans ();
  239. } else {
  240. if (rotationEnCours == true) {
  241. rotationEnCours = false;
  242. if (digitalRead(ledTemoin) == HIGH) { digitalWrite(ledTemoin, LOW); }
  243. }
  244. }
  245.  
  246. // Lorsque les 2 poussoirs sont relachés
  247. if (digitalRead(BPG) == HIGH && digitalRead(BPD) == HIGH) { btnClic = false; }
  248.  
  249. }
  250. }
  251.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement