Code pour le récepteur de la locomotive Rusty
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);
}
}
}
}
Laisser un commentaire