//****************************************************************************************************************************************************************************** // Le 24/04/2022 fonctionne, à noter toutefois un pic trés bref de vitesse lors du passage de neutre à V1 // Le ValueDac donne une information analogique en tension destinée à jouer sur le volume sonore du bruitage moteur // NE PLUS TOUCHER //****************************************************************************************************************************************************************************** #include "wiring_analog_extras.h" // Librairie permettant de passer à 20Khz la fréquence PWM #define BrocheEntreePWM 1 // Broche (2) PB3 entrée impulsion PWM #define BrocheSens1 8 // Broche (6) PB1 de la commande 1 du sens du moteur #define BrocheSens2 9 // Broche (7) PB2 de la commande 2 du sens du moteur #define BrochePWMMoteur 7 // Broche (5) PB0 de la commande PWM du moteur #define BrochePresence 2 // Broche (3) PB4 pour signaler la présence du module moteur au module principal #define BrocheDAC A0 #define BrochePWMMoteurInverse 6 // Broche créée de part la nécessité de rajouter un interface à transistor pour adapter le 3.3V Seeeduino vers le L298N int accelerationMoteur = 0; int selectBoite = 0; // Variable contenant la position courante de la boite de vitesses int ValueDAC; // Variable du signal DAC int V1Min = 125; int V1MinAR = 135; int V1Max = 170; int V1MaxAR = 150; int V2Min = 170; int V2Max = 255; unsigned long dureeImpulsion = 0; // Valeur de l'impulsion lue sur la broche d'entrée PWM void setup() { analogReadResolution(10); // Spécification résolution à utiliser pour la lecture ANA analogWriteResolution(10); analogWrite(BrocheDAC, 0); pinMode(BrocheEntreePWM, INPUT_PULLUP); // Configuration de la broche en entrée pinMode(BrocheSens1, OUTPUT); // Configuration des ports en Sorties pinMode(BrocheSens2, OUTPUT); pinMode(BrochePWMMoteur, OUTPUT); pinMode(BrochePWMMoteurInverse, OUTPUT); // Broche pour signal complémentaire à celui de BrochePWMMoteur pinMode(BrochePresence, OUTPUT); digitalWrite(BrochePresence, HIGH); // Signale la présence de ce module au module principal digitalWrite(BrocheSens1, LOW); // Initialisation des relais du moteur digitalWrite(BrocheSens2, LOW); digitalWrite(BrochePWMMoteur, 0); // Initialisation de la PWM du moteur digitalWrite(BrochePWMMoteurInverse, 255); // Idem ci-dessus mais inversé delay (1000); } void loop() { //************************************************************************************************************************************************************************* noInterrupts(); dureeImpulsion = pulseIn(BrocheEntreePWM, HIGH); // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Lecture de la durée d'impulsion du signal PWM envoyé par le module principal interrupts(); if (dureeImpulsion > 2032) {dureeImpulsion = 2032;} // Borne la durée d'impulsion //************************************************************************************************************************************************************************* if (dureeImpulsion >= 23 && dureeImpulsion <= 53 && selectBoite != 0) // ++++++++++++++++++++++++++++++++++++++++++++ // Sélection Boite = Stop { selectBoite = 0; // Mémorise la position de la boite de vitesses accelerationMoteur = 0; digitalWrite(BrocheSens1, HIGH); // Positionne l'inverseur pour un freinage digitalWrite(BrocheSens2, HIGH); analogWrite(BrocheDAC, 0); analogWrite20kHz(BrochePWMMoteur, 0); analogWrite20kHz(BrochePWMMoteurInverse, 255 - 0); // Complément de BrochePWMMoteur } else if (dureeImpulsion >= 180 && dureeImpulsion <= 210 && selectBoite != 20) // ------------------------------------ // Sélection Boite = Neutre { delay (50); selectBoite = 20; // Mémorise la position de la boite de vitesses accelerationMoteur = 0; analogWrite(BrocheDAC, 0); analogWrite20kHz(BrochePWMMoteur, 0); // PWM Moteur = 0 analogWrite20kHz(BrochePWMMoteurInverse, 255 - 0); digitalWrite(BrocheSens1, LOW); // Positionne l'inverseur au repos digitalWrite(BrocheSens2, LOW); delay (100); } else if (dureeImpulsion >= 340 && dureeImpulsion <= 370 && selectBoite != 30) // ------------------------------------ // Sélection Boite = Vitesse 1 { accelerationMoteur = 0; delay (50); selectBoite = 30; // Mémorise la position de la boite de vitesses delay (100); analogWrite(BrocheDAC, 0); analogWrite20kHz(BrochePWMMoteur, 0); // PWM Moteur = 0 analogWrite20kHz(BrochePWMMoteurInverse, 255 - 0); digitalWrite(BrocheSens1, HIGH); // Positionne l'inverseur pour une marche avant digitalWrite(BrocheSens2, LOW); } else if (dureeImpulsion >= 500 && dureeImpulsion <= 530 && selectBoite != 40) // ------------------------------------ // Sélection Boite = Vitesse 2 { selectBoite = 40; // Mémorise la position de la boite de vitesses analogWrite(BrocheDAC, 0); analogWrite20kHz(BrochePWMMoteur, 0); // PWM Moteur = 0 analogWrite20kHz(BrochePWMMoteurInverse, 255 - 0); digitalWrite(BrocheSens1, HIGH); // Positionne l'inverseur pour une marche avant digitalWrite(BrocheSens2, LOW); } else if (dureeImpulsion >= 660 && dureeImpulsion <= 700 && selectBoite != 50) // ------------------------------------ // Sélection Boite = Marche Arrière { selectBoite = 50; // Mémorise la position de la boite de vitesses analogWrite(BrocheDAC, 0); analogWrite20kHz(BrochePWMMoteur, 0); // PWM Moteur = 0 analogWrite20kHz(BrochePWMMoteurInverse, 255 - 0); digitalWrite(BrocheSens1, LOW); // Positionne l'inverseur pour une marche arrière digitalWrite(BrocheSens2, HIGH); } //************************************************************************************************************************************************************************* if (selectBoite == 30 || selectBoite == 40 || selectBoite == 50) // +++++++++++++++++++++++++++++++++++++++++++++++++ // Active ou désactive la PWM moteur { if (selectBoite == 30) // ----------------------------------------------------------------------------------------- / Accélération en Vitesse 1 { accelerationMoteur = map(dureeImpulsion, 943, 2032, V1Max,V1Min); // Convertit l'impulsion reçue en accélération de 118 à 150 ValueDAC = map(dureeImpulsion, 943, 2032, (V1Max*1023/255),(V1Min*1023/255)); analogWrite(BrocheDAC, ValueDAC); if (accelerationMoteur <= V1Min) {accelerationMoteur = 0;} analogWrite20kHz(BrochePWMMoteur, accelerationMoteur); // Active la PWM moteur en fonction de la valeur reçue analogWrite20kHz(BrochePWMMoteurInverse, 255 - accelerationMoteur); } else if (selectBoite == 40) // ------------------------------------------------------------------------------------ // Accélération en Vitesse 2 { accelerationMoteur = map(dureeImpulsion, 943, 2032, V2Max, V2Min); // Convertit l'impulsion reçue en accélération de 118 à 255 ValueDAC = map(dureeImpulsion, 943, 2032, (V2Max*1023/255),(V2Min*1023/255)); analogWrite(BrocheDAC, ValueDAC); if (accelerationMoteur <= V2Min) {accelerationMoteur = 0;} analogWrite20kHz(BrochePWMMoteur, accelerationMoteur); // Active la PWM moteur en fonction de la valeur reçue analogWrite20kHz(BrochePWMMoteurInverse, 255 - accelerationMoteur); } else if (selectBoite == 50) // ------------------------------------------------------------------------------------ // Accélération en Marche Arrière { accelerationMoteur = map(dureeImpulsion, 943, 2032, V1MaxAR, V1MinAR); // Convertit l'impulsion reçue en accélération de 126 à 150 ValueDAC = map(dureeImpulsion, 943, 2032, (V1MaxAR*1023/255),(V1MinAR*1023/255)); analogWrite(BrocheDAC, ValueDAC); if (accelerationMoteur <= V1MinAR) {accelerationMoteur = 0;} analogWrite20kHz(BrochePWMMoteur, accelerationMoteur); // Active la PWM moteur en fonction de la valeur reçue analogWrite20kHz(BrochePWMMoteurInverse, 255 -accelerationMoteur); } } }