Voici le code chargé dans l’Arduino Nano servant de récepteur pour ma locomotive LGB Rusty.

Le code est commenté et me semble suffisamment claire de ce fait. Pour ce qui est de l’installation du récepteur dans la loco, je vous invite à lire cet article.

/*
Transmission d'un unique caractère (réception)
(Basé sur l'exemple Basic_RX)

Code pour récepteur locomotive RUSTY

*/

#include "SPI.h"
#include "NRFLite.h"

const static uint8_t RADIO_ID = 10;  // Identifiant du récepteur
const static uint8_t PIN_RADIO_CE = 9;
const static uint8_t PIN_RADIO_CSN = 10;

NRFLite _radio;
int POT_Value = 0;    // variable reception potentiometre
int ARU = 0;          // variable arret d urence
int in1 = 4;          // sens rotation
int in2 = 3;          // sens rotation
int ENA = 5;          // pwm moteur
int in3 = 6;          // entrée lampe
int in4 = 7;          // entrée lampe
int LIGHT_Value = 0;  // variable eclairage

float analogVolt = 0;  // Pour lecture de la tension sur A2 ==> 0.....1023

//creation du paquet contenant les variables a envoyer

struct RadioPacket {
  int POT_Value;
  int ARU;
  int LIGHT_Value;
};

RadioPacket _radioData;  // declaration de la variable associée a la structure


void setup() {
  pinMode(4, OUTPUT);  // pin 4 sortie pour in1
  pinMode(3, OUTPUT);  // pin 3 sortie pour in2
  pinMode(5, OUTPUT);  // pin 5 sortie ENA PWM moteur
  pinMode(6, OUTPUT);  // pin 6 sortie pour in3 lampe
  pinMode(7, OUTPUT);  // pin 7 sortie pour in4 lampe
  pinMode(A2, INPUT);  // pin A2 lecture tension batterie
  Serial.begin(9600);  // on ouvre le port série

  if (!_radio.init(RADIO_ID, PIN_RADIO_CE, PIN_RADIO_CSN)) {
    Serial.println("Cannot communicate with radio");
    while (1)
      ;
  }
}

void loop() {
  while (_radio.hasData())  // Attente de réception d'un caractère
  {
    _radio.readData(&_radioData);  // lecture variable radioData comprenant la structure des 3 variables POT_Value et ARU

    ARU = _radioData.ARU;  // recuperation des variables dans la structure recue dans la variable radioData
    POT_Value = _radioData.POT_Value;
    LIGHT_Value = _radioData.LIGHT_Value;

    Serial.print("Eclairage : ");
    Serial.println(LIGHT_Value);

    // **** vérification tension batterie si moins de 10.3v on arrête sinon on continue le programme
    // R1=10Kohm, R2=27Kohm rapport de 0.270 donc tension max des 4 batteries 16.8v*0.270=4.54v au max à la borne A2
    // (4.54x1023)/5=929
    // donc pour une tension max de batterie on lira 929 en borne A2
    // je veux limiter la décharge à 2.7v par élément soit 10.8v au mini à lire sur A2 ce qui correspond
    // à 10.8x0.270=2.916v
    // (2.916x1023)/5=596 donc pour limiter la tension à 2.7v par élément il faut limiter à une valeur de 596

    analogVolt = analogRead(A2);  // lecture sur broche A2 et inscription dans la variable analogVolt
      Serial.println("Mesure batterie: ");
      Serial.print(analogVolt);

    if ((ARU == 1) || (analogVolt <= 596))   // Si arret d urgence OU tension batterie <10.8v
    {
      digitalWrite(in1, LOW);  // frein en coupant l'alimentation
      digitalWrite(in2, LOW);

      digitalWrite(in3, LOW); // on eteind la lampe
      digitalWrite(in4, LOW);
      
      Serial.println("Etat arret urgence :");
      Serial.print(ARU);
      Serial.println("Si batterie <10.8v soit <596 alors la loco stop");
      Serial.println("Etat batterie =");
      Serial.print(analogVolt);
    }

    // ****  si pas d'arret d'urgence et batterie OK on pilote le moteur ****

    else {
      Serial.println("Etat arret urgence : OFF");

      if (POT_Value < 450) {
        int mappedval = map(POT_Value, 450, 0, 80, 255);  //on map la moitie de la course du potentiometre en marche avant on commence à 55 le mappage car c'est à partir de cette valeur que le moteur démarre

        Serial.print("Reception Avant : ");
        Serial.println(POT_Value);  // affichage de la POT_Value du potentiometre
        Serial.println(mappedval);  // affichage valeur mappé pour trouver a quel valeur moteur démarre

        digitalWrite(in1, HIGH);
        digitalWrite(in2, LOW);
        analogWrite(ENA, mappedval);  // commande vitesse moteur pin 5

        delay(30);
           } 
        else if (POT_Value > 570) {
        int mappedval = map(POT_Value, 570, 1024, 80, 255);  // on map la moitie de la course du potentiomètre en marche arriere on commence à 45 le mappage car c'est à patir de cette valeur que le moteur démarre

        Serial.print("Reception Arrière : ");
        Serial.println(POT_Value);  // affichage de la POT_Value du potentiometre
        Serial.println(mappedval);  // affichage valeur mappé pour trouver a quel valeur moteur démarre

        digitalWrite(in1, LOW);
        digitalWrite(in2, HIGH);
        analogWrite(ENA, mappedval);  // commande vitesse moteur pin 5

        delay(30);
           } 
        else if (450 > POT_Value < 570) {
        Serial.print("Reception Stop : ");
        Serial.println(POT_Value);  // affichage de la POT_Value du potentiometre

        digitalWrite(in1, LOW);  // frein en coupant l'alimentation
        digitalWrite(in2, LOW);
      }
      //********* si pas d'arret d'urgence on pilote l'eclairage lampe ************

      if (LIGHT_Value == 1) {
        digitalWrite(in3, HIGH);
        digitalWrite(in4, LOW);
      } else if (LIGHT_Value == 0) {
        digitalWrite(in3, LOW);
        digitalWrite(in4, LOW);
      }
    }
  }
}