Merci..
Alors l'image de mon càblage (le MOSFET est un IRF 540 BPBF). Le moteur à CC est un 200W fonctionnant sous 20V et donc 10A) ==>
Le code ==>
// Connexion du LCD sur les broches de la carte Arduino
// Connecter broche RS du LCD sur la broche 8 (gris)
// Connecter broche E du LCD sur la broche 9 (orange)
// Connecter broche D4 du LCD sur la broche 4 (vert)
// Connecter broche D5 du LCD sur la broche 5 (bleu)
// Connecter broche D6 du LCD sur la broche 6 (jaune)
// Connecter broche D7 du LCD sur la broche 7 (mauve)
// +LED retro éclairage sur sortie 3,3V (marron)
// Alimentation +5V (rouge) - Masse (Noir)
// Connection de la LED attestant de la demande de démarrage moteur, Led allumée (ou arrêt = étteinte) sur D13 (Utilisation résistance interne ARDUINO)
// Connection de la sortie du capteur phot-sensible sur PIN 2 pour gestion interruption 0
// Connection de l'interrupteur "Action Opérateur" sur PIN 3 pour gestion interruption 1 - Interrupteur relié à la masse
// Sortie pour commande moteur 11
//**************** Entête déclarative *******
// A ce niveau sont déclarées les librairies, les constantes, les variables...
// --- Inclusion des librairies utilisées ---
#include <Wire.h> // librairie standard
#include <LiquidCrystal.h> // Inclusion de la librairie pour afficheur LCD
#include <SimpleTimer.h> //
// --- Déclaration des constantes ---
// --- constantes des broches ---
int ledPin = 13;
int inter = 3;
const int RS=8; //declaration constante de broche
const int E=9; //declaration constante de broche
const int D4=4; //declaration constante de broche
const int D5=5; //declaration constante de broche
const int D6=6; //declaration constante de broche
const int D7=7; //declaration constante de broche
long vitesse = 0;
long chrono = 0; // valeur courante du chrono
long chrono_depart = 0; // valeur de départ du chrono
long duree_test = 2000; // test sur X milli secondes
SimpleTimer timer;
const int _Moteur = 11;
// --- Déclaration des variables globales ---
volatile long nb_chgt = 0; // nb de changement etat Pin 2 (interup 0)
volatile int Act_OP = 1; // etat Pin 3 (interup 1)
volatile int EtatLED = 0;
int cmd = 0; // commande du moteur
float consigne_Vaxe_tours_minute = 200; //Nombre de tour d'axe par minute
int Consigne_Atteinte = 0;
int Maintien_Alim = 0;
// --- Initialisation des fonctionnalités utilisées ---
LiquidCrystal lcd(RS, E, D4, D5, D6, D7);// initialisation LCD en mode 4 bits
//**************** FONCTION SETUP = Code d'initialisation : La fonction setup() est exécutée en premier et 1 seule fois, au démarrage du programme *****
void setup() // debut de la fonction setup()
{
delay(1000);
lcd.begin(16,2); // Initialise le LCD avec 16 colonnes x 2 lignes
delay(1000); // pause rapide pour laisser temps initialisation
// Test du LCD
lcd.print("LCD OK") ; // affiche la chaîne texte - message de test
delay(1000); // pause de 1 seconde
lcd.setCursor(0,0); // curseur début première ligne
lcd.print (" Version du ");
lcd.setCursor(0,1); // curseur début deuxième ligne
lcd.print (" 07_02_2014 ");
delay (4000);
lcd.clear(); // // efface écran et met le curseur en haut à gauche
delay(10); // pour laisser temps effacer écran
pinMode(ledPin,OUTPUT);
digitalWrite(ledPin,LOW);
pinMode(inter,INPUT);
digitalWrite(inter,HIGH);
Serial.begin(115200); // initialise connexion série à 115200 bauds
pinMode (_Moteur, OUTPUT); // Sortie moteur PIN11
analogWrite (_Moteur, 255); // Sortie moteur à 0
lcd.begin(16,2); // Initialise le LCD avec 16 colonnes x 2 lignes
delay(10); // pause rapide pour laisser temps initialisation
lcd.setCursor(0,1);
lcd.print("Vaxe= 0 tr/min"); // affiche fixe de la chaîne texte
chrono_depart = millis();
attachInterrupt(0,gere_int0,CHANGE); // lance la procédure gere_int0 lors de la détection d'un changement sur interrup0 de la PIN2
attachInterrupt(1,gere_int1,LOW); // lance la procédure gere_int1 lors de la détection d'un changement sur interrup0 de la PIN3
timer.setInterval (duree_test, Calcul_Vitesse); //interruption pour calcul de la vitesse de rotation de l'axe
}
// ********************************************************************************
void loop() // debut de la fonction loop()
{
//Serial.println ("LOOP");
while (EtatLED == 1){
Consigne_Atteinte = 2;
lcd.setCursor(0,0);
lcd.print(" Marche Moteur ");
Consigne_Atteinte = 0;
Maintien_Alim = 0;
while (Consigne_Atteinte != 1 && EtatLED == 1) {
timer.run();
delay (10);
// Serial.println ("Cherche_Atteindre_Consigne");
analogWrite (_Moteur, 0); // Sortie moteur à 100%
if (vitesse > consigne_Vaxe_tours_minute + 20) {
Maintien_Alim = 1;
Consigne_Atteinte = 1;
}
};
while (Maintien_Alim == 1 && EtatLED == 1) {
timer.run();
delay (10);
//Serial.println ("Maintien_Consigne");
analogWrite (_Moteur, 200); // Sortie moteur à 50%
if (vitesse < consigne_Vaxe_tours_minute - 20) {
Consigne_Atteinte = 0;
Maintien_Alim = 0;
}
};
}
while (EtatLED == 0){
// Serial.println ("Arret_Moteur");
analogWrite (_Moteur, 255); // Sortie moteur à 0
timer.run();
delay (10);
if (nb_chgt != 0){ lcd.setCursor(0,0);
lcd.print(" ARRET EN COURS ");
}
else { lcd.setCursor(0,0);
lcd.print(" MMC ARRETEE ");
analogWrite (_Moteur, 255); // Sortie moteur à 0
}
}
}
// ********************************************************************************
// ------------------- fonction de gestion l'interruption externe n°0 (broche 2) ----------------
// cette fonction est appelée à chaque fois que l'interruption a lieu selon le mode configuré (LOW, CHANGE, RISING, FALLING)
void gere_int0() {
nb_chgt = nb_chgt + 1 ;
}
void gere_int1() {
if (digitalRead(inter)==Act_OP) {
if (EtatLED==0) EtatLED=1; else EtatLED=0; // inverse la variable etatLED
}
if (EtatLED==1) { // si la variable vaut 1
digitalWrite(ledPin,HIGH); // la LED est allumée
}
else { // sinon, càd si la variable vaut 0
digitalWrite(ledPin,LOW); // la LED est éteinte
}
}
// ********************************************************************************
void Calcul_Vitesse() {
int chang = nb_chgt;
nb_chgt = 0;
lcd.setCursor(5,1); // curseur début deuxième ligne et 5ième colonne
lcd.print(" "); // effacer la mesure précédente
vitesse=1.05 * (((60000/duree_test) * chang) / 40);
lcd.setCursor(6,1); // curseur début deuxième ligne
lcd.print(vitesse);
Serial.println(vitesse);
}
// ********************************************************************************
// --- Fin programme ---
Merci pour votre aide.....
Laurent