//******************************************************************************************//
// Programme pour Arduino NANO //
// Contrôle de la vitesse et la sens d'un moteur courant continu DOUBLE //
// Un Joystick est utilisé pour accélérer ou ralentir par pas allant de 1 à 5 //
// et pour indiquer la sens avant = 0 neutre = 2 arriere = 5 //
// Un écran LCD de 16 par 2 indique la sens choisie et la vitesse atteinte //
// Programme réécrit par Daniel pour Denis le 03/07/2023 //
// Modifié le: 22/10/2025 par Denis //
// Amélioration de l'affichage sur LCD indication du sens sur la première ligne //
// Supression des caractères centaines et dizaines au ralentissement //
// Introduction d' arret d'urgence par interruption si on appuie sir le joystick //
// //
//******************************************************************************************//
const char Titre[] = "TEST_cmde_train_Denis1"; // titre
const char Version[] = "2"; // numéro de version
const char derModif[] = "03/08/2023"; // date de dernière modification
// LIBRAIRIES
//#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// paramètres Outil1.h
const int nb_tempo = 1; // nombre de tempos utilisées +1
const int nb_FM = 1; // nombre de FM utilisés +1
const int nb_visu = 6; // nombre de visu utilisées +1
//#include <Outils1.h> // bibliothèque outils1 de Daniel
LiquidCrystal_I2C lcd1(0x27, 16, 2); // afficheur à l'adresse 0x27, 16 caractères sur 2 lignes
LiquidCrystal_I2C lcd2(0x26, 16, 2); // afficheur à l'adresse 0x26, 16 caractères sur 2 lignes
// Variables globales réseau 1
//*******************
int change1 = 0;
int vitesse1 = 0;
byte avant_arriere1 = 0;
int sens1 = 0;
int pas1 = 0;
int pinterupt1 = 2;
// Variables globales réseau 2
//*******************
int change2 = 0;
int vitesse2 = 0;
byte avant_arriere2 = 0;
int sens2 = 0;
int pas2 = 0;
int pinterupt2 = 2;
// Association des entrées du L298N, aux sorties utilisées sur notre Arduino Nano
//*******************************************************************************
const byte borneENA = 10; // On associe la borne "ENA" du L298N à la pin D10 de l'arduino
const byte borneIN1 = 9; // On associe la borne "IN1" du L298N à la pin D9 de l'arduino
const byte borneIN2 = 8; // On associe la borne "IN2" du L298N à la pin D8 de l'arduino
const byte borneIN3 = 7; // On associe la borne "IN3" du L298N à la pin D7 de l'arduino
const byte borneIN4 = 6; // On associe la borne "IN4" du L298N à la pin D6 de l'arduino
const byte borneENB = 5; // On associe la borne "ENB" du L298N à la pin D5 de l'arduino
// Entrées analogiques 1
//********************
const byte SENS1 = A0; // avant arriere
const byte VITESSE1 = A1; // Accélérer Ralentir
// Entrées analogiques 2
//********************
const byte SENS2 = A2; // avant arriere
const byte VITESSE2 = A3; // Accélérer Ralentir
void setup()
{
Serial.begin(115200);
Serial.println(Titre);
Serial.print("Version n° ");
Serial.print(Version);
Serial.print(" du ");
Serial.println(derModif);
Serial.println("__________________________");
// Configuration de toutes les pins de l'Arduino en "sortie" (car elles attaquent les entrées du module L298N)
pinMode(borneENA, OUTPUT); // va recevoir le signal PWM selon la vitesse
pinMode(borneIN1, OUTPUT);
pinMode(borneIN2, OUTPUT);
// pinMode(borneIN3, OUTPUT); // inutilisée car un seul moteur
// pinMode(borneIN4, OUTPUT); // inutilisée car un seul moteur
// pinMode(borneENB, OUTPUT); // inutilisée car un seul moteur
pinMode(pinterupt1, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(pinterupt1), arretUrgence1, CHANGE);
// initialize the lcd
lcd1.init();
delay(50);
lcd1.backlight();
// Print a message to the LCD.
lcd1.setCursor(0,0);
lcd1.print("bonjour");
delay ( 2000);
lcd1.clear();
// initialize the lcd
lcd2.init();
delay(50);
lcd2.backlight();
// Print a message to the LCD.
lcd2.setCursor(0,0);
lcd2.print("bonjour");
delay ( 2000);
lcd2.clear();
}