// 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);
}
}
|