Installation de capteurs à effet hall et d'aimants sur chaque disque de coupe afin d'asservir les 3 moteurs brushless. Objectifs: réguler la vitesse en fonction de la difficulté rencontré pour la coupe de chacun des disques et permettre au programme de relancer un démarrage si un moteur cale par bourrage.
Code provisoire pour tester la régulation des moteurs de coupe:
/* Senseur à Hall Effect
Le circuit:
* Le senseur Effet Hall
Pin 1: +5v
Pin 2: Masse/GND
Pin 3: +5V via une résistance pull-up de 10 KOhms
*/
#include "Servo.h"
long timeRef=0; // variable pour temps de référence en millisecondes
long tps_comptage=1000; // variable pour délai de comptage en millisecondes
long timeRef2=0; // variable pour temps de référence en millisecondes
long tps_comptage2=10000; // variable pour délai de comptage en millisecondes
volatile long comptageImpuls_G=0;
volatile long comptageImpuls_M=0;
volatile long comptageImpuls_D=0;
const int ledPin = 13;
const int BRUSHLESS_M=38;
const int BRUSHLESS_G=36;
int sensorValue;
Servo cont_brushless_G;
Servo cont_brushless_M;
Servo cont_brushless_D;
int tourmin = 5000;
int vit_lame_G=140;
int vit_lame_M=140;
int vit_lame_D=140;
void setup()
{
Serial.begin(9600);
Serial.println("DEBUT SETUP");
pinMode( ledPin, OUTPUT );
cont_brushless_D.attach(BRUSHLESS_D);
pinMode(BRUSHLESS_D, OUTPUT);
cont_brushless_M.attach(BRUSHLESS_M);
pinMode(BRUSHLESS_M, OUTPUT);
cont_brushless_G.attach(BRUSHLESS_G);
pinMode(BRUSHLESS_G, OUTPUT);
delay (100);
attachInterrupt(4, gestionINT_D, RISING); // pin 19 attache l'interruption externe n°0 à la fonction gestionINT0()
attachInterrupt(3, gestionINT_M, RISING); // pin 20 mode déclenchement possibles = LOW, CHANGE, RISING, FALLING
attachInterrupt(2, gestionINT_G, RISING); // pin 21
DEM_MOT_G();
DEM_MOT_M();
DEM_MOT_D();
delay (1000);
Serial.println("FIN SETUP");
delay (1000);
}
void loop()
{
REG_COUPE();
}
void DEM_MOT_G() //demarrage de la coupe
{
Serial.println("DEM_MOT_G");
cont_brushless_G.write(50); // génère initialisation du controleur
delay (2000); //attente de 2 secondes pour initialisation du controleur
cont_brushless_G.write(vit_lame_G); // génère initialisation du controleur
delay (50);
}
void DEM_MOT_D() //demarrage de la coupe
{
Serial.println("DEM_MOT_D");
cont_brushless_D.write(50); // génère initialisation du controleur
delay (2000); //attente de 2 secondes pour initialisation du controleur
cont_brushless_D.write(vit_lame_D); // génère initialisation du controleur
delay (50);
}
void DEM_MOT_M() //demarrage de la coupe
{
Serial.println("DEM_MOT_M");
cont_brushless_M.write(50); // génère initialisation du controleur
delay (2000); //attente de 2 secondes pour initialisation du controleur
cont_brushless_M.write(vit_lame_M); // génère initialisation du controleur
delay (50);
}
void REG_COUPE()
{
if (millis()>(timeRef+tps_comptage))
{ // si le delai de comptage est écoulé
timeRef=timeRef+tps_comptage; // réinitialise le délai de comptage
//************* BRUSHLESS GAUCHE
Serial.print(comptageImpuls_G*60/2);
Serial.println("tours/mn G ");
if (((comptageImpuls_G*60)/2)>tourmin)
{
vit_lame_G = vit_lame_G-2;
cont_brushless_G.write(vit_lame_G);
Serial.print(vit_lame_G);
Serial.println("vit_lame_G-2");
}
if (((comptageImpuls_G*60)/2)<(tourmin-100))
{
vit_lame_G = vit_lame_G+5;
if (vit_lame_G > 170)
{
vit_lame_G = 170;
}
cont_brushless_G.write(vit_lame_G);
Serial.print(vit_lame_G);
Serial.println("vit_lame_G+5");
}
//************
//************* BRUSHLESS MILIEU
Serial.print(comptageImpuls_M*60/2);
Serial.println("tours/mn M");
if (((comptageImpuls_M*60)/2)>tourmin)
{
vit_lame_M = vit_lame_M-2;
cont_brushless_M.write(vit_lame_M);
Serial.print(vit_lame_M);
Serial.println("vit_lame_M-2");
}
if (((comptageImpuls_M*60)/2)<(tourmin-100))
{
vit_lame_M = vit_lame_M+5;
if (vit_lame_M > 170)
{
vit_lame_M = 170;
}
cont_brushless_M.write(vit_lame_M);
Serial.print(vit_lame_M);
Serial.println("vit_lame_M+5");
}
//************
//************* BRUSHLESS DROITE
Serial.print(comptageImpuls_D*60/2);
Serial.println("tours/mn D");
if (((comptageImpuls_D*60)/2)>tourmin)
{
vit_lame_D = vit_lame_D-2;
cont_brushless_D.write(vit_lame_D);
Serial.print(vit_lame_D);
Serial.println("vit_lame_D-2");
}
if (((comptageImpuls_D*60)/2)<(tourmin-100))
{
vit_lame_D = vit_lame_D+5;
if (vit_lame_D > 170)
{
vit_lame_D = 170;
}
cont_brushless_D.write(vit_lame_D);
Serial.print(vit_lame_D);
Serial.println("vit_lame_D+5");
}
//************
DETECT_ARRET_BRUSHLESS();
comptageImpuls_G=0;
comptageImpuls_M=0;
comptageImpuls_D=0;
} // fin si délai de comptage s'est écoulé
}
void gestionINT_G()
{
comptageImpuls_G=comptageImpuls_G+1;
}
void gestionINT_D()
{
comptageImpuls_D=comptageImpuls_D+1;
}
void gestionINT_M()
{
comptageImpuls_M=comptageImpuls_M+1;
}
void DETECT_ARRET_BRUSHLESS()
{
if (millis()>(timeRef2+tps_comptage2)) //delai comptage X10 pour detection arret moteur
{
timeRef2=timeRef2+tps_comptage2; // réinitialise le délai de comptage
if (((comptageImpuls_D*60)/2)<10)
{
DEM_MOT_D();
}
if (((comptageImpuls_M*60)/2)<10)
{
DEM_MOT_M();
}
if (((comptageImpuls_G*60)/2)<10)
{
DEM_MOT_G();
}
}
}