LOCODUINO

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

mardi 19 mars 2024

Visiteurs connectés : 82

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 (...)

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 !

/*
 * Croquis basé sur la référence suivante à laquelle j'ai ajouté une adaptation de l'exemple repris dans la librairie accompagnant le
 display I2C/TWI LCD1602 de DFROBOT, article TOY0046 :


 * Avec télécommande PANASONIC DVD/TV
 * Version V6 24-03-2016 : suite modifications Dominique

 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.

 Le capteur IR TSOP 4838 est raccordé comme suit à l'Arduino :
 Pin 1 (à gauche lorsque le capteur est vu de face) = Vout (pin 3 de l'Arduino)
 Pin 2 (au centre) = GND raccordée à un GND de l'Arduino
 Pin 3 (à droite lorsque le capteur est vu de face) = Vcc (+5v de l'Arduino)
Le signal à destination du LMD18200 part de la pin 9
*/

/*******************CODE********************/

#include <IRLib.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DCCPacket.h>
#include <DCCPacketQueue.h>
#include <DCCPacketScheduler.h>

//definition des codes de la telecommande Panasonic

//telecommande Panasonic lib IRLib
#define arrow_up 3796283338
#define arrow_down 989538004
#define arrow_left 1296259434
#define arrow_right 3138313506
#define digit_0 950179491
#define digit_1 1366498449
#define digit_2 1242645753
#define digit_3 577270721
#define digit_4 278230305
#define digit_5 3236444089
#define digit_6 2050858721
#define digit_7 1376882089
#define digit_8 1077841673
#define digit_9 809146499
#define button_pause 2860196199
#define button_play 3737721253


LiquidCrystal_I2C lcd(0x20, 16, 2); // attention! Lorsque tous les 3 jumpers sont placés (réglage d'usine) l'addresse LCD est 0x20
int IRpin = 3;


IRrecv My_Receiver(IRpin);
IRdecode My_Decoder;
IRdecodeHash My_Hash_Decoder;

DCCPacketScheduler dps;
unsigned int analog_value;
int old_speed = 0;
byte count = 0;
byte prev_state = 1;
byte F0 = 0;
int timerefresh = 200 ;//frequence de rafraichissement des commandes vitesse (msec).

int vit_abs = 0; //valeur absolue de la vitesse
int vit = 0; //consigne de vitesse a envoyer a la loco
int sens_marche = 1; // seulement deux valeurs possible de sens de marche : 1= AV, -1 = AR

int lumiere = 0; //a utiliser pour la fonction lumiere
int long time = 0; // mesure du temps avant répétition
int timebcl = 0; // mesure du temps de boucle
int oldtimebcl = 0; // mesure du temps de boucle

void setup()
{
  lcd.init();                      // initialisation du LCD
  lcd.backlight();		   // allumage retroeclairage

  Serial.begin(9600);

  My_Receiver.enableIRIn();
  dps.setup();  // initialisation de la librairie
}

void loop()
{
  //rafraichissement des commandes vitesse et fonctions
  timebcl = millis();
  int tbcl = timebcl - oldtimebcl;

  if (tbcl > 5) //affichage du temps de boucle seulement lors de commande ir (temps boucle superieur a 5 msec)
  {
    Serial.println(timebcl - oldtimebcl);
  }
  oldtimebcl = timebcl;

  if ((time + timerefresh) < millis())//instruction de rafraichissement regulier des commandes de vitesse (tous les timerefresh msec)
  {
    time = time + timerefresh;
    SR_500();
  }


  if (My_Receiver.GetResults(&My_Decoder))
  {
    My_Hash_Decoder.copyBuf(&My_Decoder);//copy the results to the hash decoder
    My_Decoder.decode();

    lcd.clear();
    lcd.setCursor(0, 1);

    dps.update();
    My_Hash_Decoder.decode();

    switch (My_Hash_Decoder.hash)
    {
      case arrow_up:
        lcd.print("UP");
        //limitation de montee a 127
        if (vit_abs < 127) {
          vit_abs = vit_abs + 1;
        }
        break;

      case arrow_down:
        lcd.print("DOWN");
        //limitation de descente à 0
        if (vit_abs > 0) {
          vit_abs = vit_abs - 1;
        }
        break;

      case arrow_left:
        lcd.print("LEFT");
        if (sens_marche == 1) {
          vit_abs = -1;
        }
        sens_marche = -1;
        break;

      case arrow_right:
        lcd.print("RIGHT");
        if (sens_marche == -1) {
          vit_abs = 1;
        }
        sens_marche = 1;
        break;

      case digit_0:
        lcd.print("=0=");
        vit_abs = 1;
        break;

      case digit_1:
        lcd.print("=1=");
        vit_abs = 15;
        break;

      case digit_2:
        lcd.print("=2=");
        vit_abs = 25;
        break;

      case digit_3:
        lcd.print("=3=");
        vit_abs = 35;
        break;

      case digit_4:
        lcd.print("=4=");
        vit_abs = 48;
        break;

      case digit_5:
        lcd.print("=5=");
        vit_abs = 55;
        break;

      case digit_6:
        lcd.print("=6=");
        vit_abs = 65;
        break;

      case digit_7:
        lcd.print("=7=");
        vit_abs = 75;
        break;

      case digit_8:
        lcd.print("=8=");
        vit_abs = 85;
        break;

      case digit_9:
        lcd.print("=9=");
        vit_abs = 95;
        break;

      case button_pause:
        lcd.print("PAUSE");
        vit_abs = 30;
        break;

      case button_play:
        lcd.print("PLAY");
        vit_abs = 127;
        break;
    }
    //envoi de la commande de vitesse a la loco


    vit = vit_abs * sens_marche;
    Serial.print ("Vitesse : ");
    Serial.print (vit);

    Serial.print ("   Vitesse abs : ");
    Serial.print(vit_abs);
    Serial.print (" - ");

    lcd.setCursor(8, 0);
    lcd.print(vit);
    //inclure ici la commande de vitesse DCC
    dps.setSpeed128(3, DCC_SHORT_ADDRESS, vit);

    dps.update();

    Serial.println(My_Hash_Decoder.hash, DEC); // Impression du code ir recu

    My_Receiver.resume();
  }
}
// repetition commande loco
void LocoRepeter()
{
  dps.setSpeed128(3, DCC_SHORT_ADDRESS, vit);
  dps.setFunctions0to4(3, DCC_SHORT_ADDRESS, lumiere);
}

//relance des commandes DCC de vitesse
void SR_500()
{
  LocoRepeter();
  dps.update();
}
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.)

74 Messages

Rubrique Projets

LaBox, Une Centrale DCC polyvalente et abordable (1)

LaBox, Une Centrale DCC polyvalente et abordable (2)

LaBox, Une Centrale DCC polyvalente et abordable (3)

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 (1)

La carte Satellite V1 (2)

La carte Satellite V1 (3)

La carte Satellite V1 (4)

La carte Satellite V1 (5)

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

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

Automatisation du pont FLEISCHMANN 6152 (HO) avec un ESP32 (1)

Identifier et localiser vos trains avec le RFID/NFC et un bus CAN.

Etude d’un passage à niveau multivoies

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)

Réalisation 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

Une croix de pharmacie animée avec Arduino UNO

Réalisation d’un wagon de mesure (distance et vitesse)

Passage à niveau géré par Arduino (1)

Passage à niveau géré par Arduino (2)

Passage à niveau géré par Arduino (3)

Passage à niveau géré par Arduino (4)

Passage à niveau géré par Arduino (5)

Une manette simple et autonome pour LaBox

Éclairer le réseau (1)

Éclairer le réseau (2)

Block Automatique Lumineux à 8 cantons analogiques

Un décodeur DCC pour les plaques tournantes Fleischmann et Roco

Éclairer le réseau (3)

Éclairer le réseau (4)

Éclairer le réseau (5)

JMRI pour Ma première centrale DCC

Rocrail pour Ma première centrale DCC

CDM-Rail pour Ma première centrale DCC (1)

CDM-Rail pour Ma première centrale DCC (2)

Banc de test pour les décodeurs DCC

Ma première manette pour les aiguillages DCC

Mon premier décodeur pour les aiguillages DCC

Boitier 3D pour la station DCC minimale

Va-et-vient pour deux trains

Un programme pour régler facilement les servos moteurs avec un ESP32

Affichage publicitaire avec Arduino (1)

Affichage publicitaire avec Arduino (2)

TCO Web interactif avec des ESP32 et des ESP8266 (1)

TCO Web interactif avec des ESP32 et des ESP8266 (2)

TCO Web interactif avec des ESP32 et des ESP8266 (3)

TCO Web interactif avec des ESP32 et des ESP8266 (4)

TCO Web interactif avec des ESP32 et des ESP8266 (5)

Les derniers articles

LaBox, Une Centrale DCC polyvalente et abordable (3)


Thierry

LaBox, Une Centrale DCC polyvalente et abordable (1)


Thierry

LaBox, Une Centrale DCC polyvalente et abordable (2)


Dominique, msport, Thierry

Un programme pour régler facilement les servos moteurs avec un ESP32


bobyAndCo

TCO Web interactif avec des ESP32 et des ESP8266 (5)


utpeca

TCO Web interactif avec des ESP32 et des ESP8266 (4)


utpeca

TCO Web interactif avec des ESP32 et des ESP8266 (3)


utpeca

TCO Web interactif avec des ESP32 et des ESP8266 (2)


utpeca

TCO Web interactif avec des ESP32 et des ESP8266 (1)


utpeca

Affichage publicitaire avec Arduino (2)


catplus, Christian

Les articles les plus lus

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

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

Mon premier décodeur pour les aiguillages DCC

La rétro-signalisation sur Arduino

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

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

Chenillard de DEL

LaBox, Une Centrale DCC polyvalente et abordable (1)

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

Réalisation d’un va-et-vient automatique et réaliste