// Sketch pour treuil modélisme valide pour Arduino Nano et module H-bridge IBT_4 // controle moteur DC avec valeur cible fixé par un signal rc et lecture sur un potentiometre de la position // Ce sketch pilote un pont en H IBT_4 (maximum 50 ampères) // La recopie position se fait avec un potentiomètre multitours (10) de 10K. // juste 2 sorties PWM pour piloter le pont en H // Il faut positionner le potentiomètre en position milieu soit 5 Kohms (indiqué par la led) avant d'accoupler au moteur. // Le nombre de tours possible pour le potentiomètre est limité à huit dans le sketch (val3) (à définir entre 60 et 440) // La vitesse moteur est défini dans le sketch (val4) (à définir entre 0 et 254) int val1; // Valeur du signal récepteur int val2; // variable pour la lecture de la valeur analogique du potentiomètre asservissement int val3; // variable pour la valeur analogique du nombre de tours potentiomètre int val4 = 200; // variable pour paramétré la vitesse moteur (à définir entre 0 et 254) int hyseteris = 15; // 10 stoppe déjà les tremblement moteur mais dépend de l'ordre de vitesse int max; // variable pour la lecture de la valeur maxi nombre de tours potentiomètre int min; // variable pour la lecture de la valeur mini nombre de tours potentiomètre #define LPWM 5 // IN1 sur pin 5 #define RPWM 6 // IN2 sur pin 6 #define signal 2 // Signal radio attaché au Pin 2 #define pot1 A0 // Potar asservissement attaché au Pin A0 #define led13 13 // Led indiquant que le potar est en position milieu = 5 Kohms void setup() { pinMode(signal, INPUT); // Signal entrée pinMode(pot1, INPUT); // Potentiomètre asservissement position moteur pinMode(led13, OUTPUT); // Led allumée quand potentiomètre calibré à 5 Kohms (position milieu) pinMode(RPWM, OUTPUT); pinMode(LPWM, OUTPUT); } void loop() { val3 = 440; // Ici on défini le nombre de tours potentiomètre, limiter la valeur entre 60 et 440 val3 = constrain(val3, 60, 440); max = (500 + val3); min = (500 - val3); val1 = pulseIn(signal, HIGH); // Alors stocker la valeur du signal dans Val1 val1 = map(val1, 1000, 2000, min, max); // min et max définnissent le nombre de tours potentiomètre val1 = constrain(val1,min, max); // ici on limite le signal val2 = analogRead(pot1); // lis la valeur du potentiometre d'asservissement entre 0 et 1023 val2 = map(val2, 1, 1023, 1, 1023); val2 = constrain(val2, 1, 1023); if ((val2 > 495) && (val2 < 505)) { digitalWrite(led13, HIGH); } else if ((val2 < 495) || (val2 > 505)) { digitalWrite(led13, LOW); } if (val1 > (val2 + hyseteris)) { // reverse rotation int reversePWM = val4 ; // ordre de vitesse (à définir entre 0 et 254) analogWrite(LPWM, 0); analogWrite(RPWM, reversePWM); } else if (val1 < (val2 - hyseteris)) { // forward rotation int forwardPWM = val4 ; // ordre de vitesse (à définir entre 0 et 254) analogWrite(LPWM, forwardPWM); analogWrite(RPWM, 0); } else if (val1 < (val2 + hyseteris) && val1 > (val2 - hyseteris)) { int forwardPWM = 0; // stop int reversePWM = 0; // stop analogWrite(LPWM, forwardPWM); analogWrite(RPWM, reversePWM); } } |