LOCODUINO

Forum de discussion
Dépôt GIT Locoduino
Flux RSS

samedi 20 juillet 2019

46 visiteurs en ce moment

Comment piloter trains et accessoires en DCC avec un Arduino (1)

Comment générer un signal DCC

. Par : Dominique

Une première méthode pour produire un signal DCC simple avec Arduino On a dit précédemment, voir « L’Arduino et le système de commande numérique DCC » que l’envoi des commandes DCC impose de faire travailler notre Arduino en tâche de fond, sous interruption. On va donc utiliser un des timers existants. Le Timer0 est utilisée par les fonctions delay(), (...)

Retourner à l'article

Vous répondez à :

Bonjour,

Vous aviez raison. Le souci venait vraisemblablement du manque de répétitions. J’ai revu le code (ci-dessous) en provoquant un rafraîchissement, suivant votre méthode, toutes les 200 msec et cela fonctionne parfaitement.

Je joins le code à toutes fins utiles (dans l’état actuel, il ne sert qu’à tester la solution).

Un grand merci pour votre aide !

  1. /*
  2.  * Croquis basé sur la référence suivante à laquelle j'ai ajouté une adaptation de l'exemple repris dans la librairie accompagnant le
  3.  display I2C/TWI LCD1602 de DFROBOT, article TOY0046 :
  4.  
  5.  
  6.  * Avec télécommande PANASONIC DVD/TV
  7.  * Version V6 24-03-2016 : suite modifications Dominique
  8.  
  9.  Le display I2C LCD1602 est raccordé comme suit : SDA à la pin analog4 et SCL à la pin analog5 de l'Arduino; attention dans certaines docs ces 2 pins sont inversées à tort.
  10.  
  11.  Le capteur IR TSOP 4838 est raccordé comme suit à l'Arduino :
  12.  Pin 1 (à gauche lorsque le capteur est vu de face) = Vout (pin 3 de l'Arduino)
  13.  Pin 2 (au centre) = GND raccordée à un GND de l'Arduino
  14.  Pin 3 (à droite lorsque le capteur est vu de face) = Vcc (+5v de l'Arduino)
  15. Le signal à destination du LMD18200 part de la pin 9
  16. */
  17.  
  18. /*******************CODE********************/
  19.  
  20. #include <IRLib.h>
  21. #include <Wire.h>
  22. #include <LiquidCrystal_I2C.h>
  23. #include <DCCPacket.h>
  24. #include <DCCPacketQueue.h>
  25. #include <DCCPacketScheduler.h>
  26.  
  27. //definition des codes de la telecommande Panasonic
  28.  
  29. //telecommande Panasonic lib IRLib
  30. #define arrow_up 3796283338
  31. #define arrow_down 989538004
  32. #define arrow_left 1296259434
  33. #define arrow_right 3138313506
  34. #define digit_0 950179491
  35. #define digit_1 1366498449
  36. #define digit_2 1242645753
  37. #define digit_3 577270721
  38. #define digit_4 278230305
  39. #define digit_5 3236444089
  40. #define digit_6 2050858721
  41. #define digit_7 1376882089
  42. #define digit_8 1077841673
  43. #define digit_9 809146499
  44. #define button_pause 2860196199
  45. #define button_play 3737721253
  46.  
  47.  
  48. LiquidCrystal_I2C lcd(0x20, 16, 2); // attention! Lorsque tous les 3 jumpers sont placés (réglage d'usine) l'addresse LCD est 0x20
  49. int IRpin = 3;
  50.  
  51.  
  52. IRrecv My_Receiver(IRpin);
  53. IRdecode My_Decoder;
  54. IRdecodeHash My_Hash_Decoder;
  55.  
  56. DCCPacketScheduler dps;
  57. unsigned int analog_value;
  58. int old_speed = 0;
  59. byte count = 0;
  60. byte prev_state = 1;
  61. byte F0 = 0;
  62. int timerefresh = 200 ;//frequence de rafraichissement des commandes vitesse (msec).
  63.  
  64. int vit_abs = 0; //valeur absolue de la vitesse
  65. int vit = 0; //consigne de vitesse a envoyer a la loco
  66. int sens_marche = 1; // seulement deux valeurs possible de sens de marche : 1= AV, -1 = AR
  67.  
  68. int lumiere = 0; //a utiliser pour la fonction lumiere
  69. int long time = 0; // mesure du temps avant répétition
  70. int timebcl = 0; // mesure du temps de boucle
  71. int oldtimebcl = 0; // mesure du temps de boucle
  72.  
  73. void setup()
  74. {
  75. lcd.init(); // initialisation du LCD
  76. lcd.backlight(); // allumage retroeclairage
  77.  
  78. Serial.begin(9600);
  79.  
  80. My_Receiver.enableIRIn();
  81. dps.setup(); // initialisation de la librairie
  82. }
  83.  
  84. void loop()
  85. {
  86. //rafraichissement des commandes vitesse et fonctions
  87. timebcl = millis();
  88. int tbcl = timebcl - oldtimebcl;
  89.  
  90. if (tbcl > 5) //affichage du temps de boucle seulement lors de commande ir (temps boucle superieur a 5 msec)
  91. {
  92. Serial.println(timebcl - oldtimebcl);
  93. }
  94. oldtimebcl = timebcl;
  95.  
  96. if ((time + timerefresh) < millis())//instruction de rafraichissement regulier des commandes de vitesse (tous les timerefresh msec)
  97. {
  98. time = time + timerefresh;
  99. SR_500();
  100. }
  101.  
  102.  
  103. if (My_Receiver.GetResults(&My_Decoder))
  104. {
  105. My_Hash_Decoder.copyBuf(&My_Decoder);//copy the results to the hash decoder
  106. My_Decoder.decode();
  107.  
  108. lcd.clear();
  109. lcd.setCursor(0, 1);
  110.  
  111. dps.update();
  112. My_Hash_Decoder.decode();
  113.  
  114. switch (My_Hash_Decoder.hash)
  115. {
  116. case arrow_up:
  117. lcd.print("UP");
  118. //limitation de montee a 127
  119. if (vit_abs < 127) {
  120. vit_abs = vit_abs + 1;
  121. }
  122. break;
  123.  
  124. case arrow_down:
  125. lcd.print("DOWN");
  126. //limitation de descente à 0
  127. if (vit_abs > 0) {
  128. vit_abs = vit_abs - 1;
  129. }
  130. break;
  131.  
  132. case arrow_left:
  133. lcd.print("LEFT");
  134. if (sens_marche == 1) {
  135. vit_abs = -1;
  136. }
  137. sens_marche = -1;
  138. break;
  139.  
  140. case arrow_right:
  141. lcd.print("RIGHT");
  142. if (sens_marche == -1) {
  143. vit_abs = 1;
  144. }
  145. sens_marche = 1;
  146. break;
  147.  
  148. case digit_0:
  149. lcd.print("=0=");
  150. vit_abs = 1;
  151. break;
  152.  
  153. case digit_1:
  154. lcd.print("=1=");
  155. vit_abs = 15;
  156. break;
  157.  
  158. case digit_2:
  159. lcd.print("=2=");
  160. vit_abs = 25;
  161. break;
  162.  
  163. case digit_3:
  164. lcd.print("=3=");
  165. vit_abs = 35;
  166. break;
  167.  
  168. case digit_4:
  169. lcd.print("=4=");
  170. vit_abs = 48;
  171. break;
  172.  
  173. case digit_5:
  174. lcd.print("=5=");
  175. vit_abs = 55;
  176. break;
  177.  
  178. case digit_6:
  179. lcd.print("=6=");
  180. vit_abs = 65;
  181. break;
  182.  
  183. case digit_7:
  184. lcd.print("=7=");
  185. vit_abs = 75;
  186. break;
  187.  
  188. case digit_8:
  189. lcd.print("=8=");
  190. vit_abs = 85;
  191. break;
  192.  
  193. case digit_9:
  194. lcd.print("=9=");
  195. vit_abs = 95;
  196. break;
  197.  
  198. case button_pause:
  199. lcd.print("PAUSE");
  200. vit_abs = 30;
  201. break;
  202.  
  203. case button_play:
  204. lcd.print("PLAY");
  205. vit_abs = 127;
  206. break;
  207. }
  208. //envoi de la commande de vitesse a la loco
  209.  
  210.  
  211. vit = vit_abs * sens_marche;
  212. Serial.print ("Vitesse : ");
  213. Serial.print (vit);
  214.  
  215. Serial.print (" Vitesse abs : ");
  216. Serial.print(vit_abs);
  217. Serial.print (" - ");
  218.  
  219. lcd.setCursor(8, 0);
  220. lcd.print(vit);
  221. //inclure ici la commande de vitesse DCC
  222. dps.setSpeed128(3, DCC_SHORT_ADDRESS, vit);
  223.  
  224. dps.update();
  225.  
  226. Serial.println(My_Hash_Decoder.hash, DEC); // Impression du code ir recu
  227.  
  228. My_Receiver.resume();
  229. }
  230. }
  231. // repetition commande loco
  232. void LocoRepeter()
  233. {
  234. dps.setSpeed128(3, DCC_SHORT_ADDRESS, vit);
  235. dps.setFunctions0to4(3, DCC_SHORT_ADDRESS, lumiere);
  236. }
  237.  
  238. //relance des commandes DCC de vitesse
  239. void SR_500()
  240. {
  241. LocoRepeter();
  242. dps.update();
  243. }
Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)

64 Messages

Rubrique Projets

Un chenillard de DEL

Enseigne de magasin

Feux tricolores

Multi-animations lumineuses

L’Arduino et le système de commande numérique DCC

Un décodeur d’accessoire DCC versatile basé sur Arduino

Un moniteur de signaux DCC

Une barrière infrarouge

Un capteur RFID

Un TCO xpressnet

Une animation sonore

L’Arduino au coeur des systèmes de pilotage analogiques ou numériques

Un décodeur DCC pour 16 feux tricolores

Calcul de la vitesse d’un train miniature avec l’Arduino

La génèse d’un réseau 100% Arduino

Une horloge à échelle H0

Simulateur de soudure à arc

Un automatisme de Passage à Niveau

La rétro-signalisation sur Arduino

Décodeur pour aiguillage à solénoïdes sur Arduino

Un décodeur DCC pour les signaux à deux ou trois feux sur Arduino NANO/UNO

Etude d’un passage à niveau universel

Réalisation pratique d’un système de mesure de vitesse à l’échelle N

Une Passerelle entre le bus S88 et le bus CAN pour la rétro signalisation

Un décodeur DCC pour 16 feux tricolores

Block Automatique Lumineux avec la carte shield "Arduino 4 relays"

Réalisation d’un affichage de gare ARRIVEE DEPART

Ménage à trois (Ordinateur, Arduino, réseau)

Realisation d’un va-et-vient automatique et réaliste

Souris et centrale sans fil

Communications entre JMRI et Arduino

Annonces en gare avec la RFID

Comment piloter trains et accessoires en DCC avec un Arduino (1)

Comment piloter trains et accessoires en DCC avec un Arduino (2)

Comment piloter trains et accessoires en DCC avec un Arduino (3)

Comment piloter trains et accessoires en DCC avec un Arduino (4)

SGDD : Système de Gestion DD (1)

SGDD : Système de Gestion DD (2)

SGDD : Système de Gestion DD (3)

La PWM : Qu’est-ce que c’est ? (1)

La PWM : Qu’est-ce que c’est ? (2)

La PWM : Qu’est ce que c’est ? (3)

La PWM : Qu’est ce que c’est ? (4)

Mise en oeuvre du Bus CAN entre modules Arduino (1)

Mise en oeuvre du Bus CAN entre modules Arduino (2)

Un gestionnaire en C++ pour votre réseau (1)

Un gestionnaire en C++ pour votre réseau (2)

Un gestionnaire en C++ pour votre réseau (3)

Un gestionnaire en C++ pour votre réseau (4)

Réalisation de centrales DCC avec le logiciel libre DCC++ (1)

Réalisation de centrales DCC avec le logiciel libre DCC++ (2)

Réalisation de centrales DCC avec le logiciel libre DCC++ (3)

Contrôleur à télécommande infrarouge pour centrale DCC++

Gestion d’une gare cachée (1)

Gestion d’une gare cachée (2)

Gestion d’une gare cachée (3)

La carte Satellite V1

La carte Satellite V1

La carte Satellite V1

La carte Satellite V1

Les derniers articles

Annonces en gare avec la RFID


bobyAndCo, Catplus, Christian

La carte Satellite V1


bobyAndCo, Dominique, Jean-Luc, Thierry

La carte Satellite V1


bobyAndCo, Dominique, Jean-Luc, Thierry

La carte Satellite V1


bobyAndCo, Dominique, Jean-Luc, Thierry

La carte Satellite V1


bobyAndCo, Dominique, Jean-Luc, Thierry

Communications entre JMRI et Arduino


Dominique, Nopxor

Souris et centrale sans fil


tony04

Realisation d’un va-et-vient automatique et réaliste


Dominique

Ménage à trois (Ordinateur, Arduino, réseau)


Christian

La PWM : Qu’est ce que c’est ? (4)


Jean-Luc

Les articles les plus lus

La PWM : Qu’est-ce que c’est ? (1)

Comment piloter trains et accessoires en DCC avec un Arduino (3)

Réalisation d’un affichage de gare ARRIVEE DEPART

Feux tricolores

Mise en oeuvre du Bus CAN entre modules Arduino (1)

Réalisation de centrales DCC avec le logiciel libre DCC++ (3)

Mise en oeuvre du Bus CAN entre modules Arduino (2)

La rétro-signalisation sur Arduino

Calcul de la vitesse d’un train miniature avec l’Arduino

Un décodeur d’accessoire DCC versatile basé sur Arduino