/*=================== Mixage 2 voies pour 2 variateurs====================
Programme pour Arduino Nano
Servo Variateur droit sur le pin°A1
Servo Variateur gauche sur le pin°A2
Récepteur signal "GAZ" sur le pin D2
Récepteur signal "DIRECTION" sur le pin D4
Correction du bruit en fonction du taux de moyennage pour éviter vibration
Nécessite librairie "SoftRcPulseOut" (RC Navy)---> https://github.com/digistump/DigisparkArduinoIntegration
===========================================================================
*/
#include <SoftRcPulseOut.h>
SoftRcPulseOut myservo1; // Création du servo variateur droit
SoftRcPulseOut myservo2; // Création du servo variateur gauche
#define SERVO_PIN1 A1 // Servo Variateur droit attaché au Pin A1
#define SERVO_PIN2 A2 // Servo Variateur gauche attaché au Pin A2
#define signal1 2 // Signal radio "GAZ" attaché au Pin D2
#define signal2 4 // Signal radio "DIRECTION" attaché au Pin D4
#define REFRESH_PERIOD_MS 20 // Période de rafraîchissement
#define MOY_SUR_1_VALEURS 0
#define MOY_SUR_2_VALEURS 1
#define MOY_SUR_4_VALEURS 2
#define MOY_SUR_8_VALEURS 3
#define MOY_SUR_16_VALEURS 4
#define MOY_SUR_32_VALEURS 5
#define TAUX_DE_MOYENNAGE MOY_SUR_4_VALEURS /* Choisir ici le taux de moyennage parmi les valeurs precedentes possibles listees ci-dessus */
#define MOYENNE(Valeur_A_Moyenner,DerniereValeurRecue,TauxDeMoyEnPuissanceDeDeux) Valeur_A_Moyenner=((((Valeur_A_Moyenner)*((1<<(TauxDeMoyEnPuissanceDeDeux))-1)+(DerniereValeurRecue))/(1<<(TauxDeMoyEnPuissanceDeDeux)))+(TauxDeMoyEnPuissanceDeDeux-1))
int neutre = 1500; //neutre des servos dans le calcul moyennage
int val1; // Variable pour stocker la valeur du signal "GAZ"
int val2; // Variable pour stocker la valeur du signal "DIRECTION"
int pos; // Variable pour stocker la position du servo
int valA, valB, valxA, valxB, diff ; // Déclare les variables pour les servos
int posmin = 45; // Déclare en degrés la position mini des servos
int posmax = 135; // Déclare en degrés la position maxi des servos
int neutral = 90; // Déclare en degrés la position neutre des servos
void setup()
{
myservo1.attach(SERVO_PIN1); // Servo attaché au pin SERVO_PIN A1
myservo2.attach(SERVO_PIN2); // Servo attaché au pin SERVO_PIN A2
}
void loop()
{
unsigned long currentMillis = millis(); // Affectation du compteur de temps
#define TAUX_DE_MOYENNAGE MOY_SUR_4_VALEURS // Choix du taux de moyennage
static int ValMoyennee1; // Valeur à moyennée
val1 = pulseIn(signal1, HIGH, 30000); // Lecture du signal radio pour le servo Variateur droit
val1 = map(val1, neutre - 500, neutre + 500, 0, 180); // Mise à l’échelle
val1 = constrain(val1, 0, 180); // Conversion en degres
ValMoyennee1 = MOYENNE(ValMoyennee1, val1, TAUX_DE_MOYENNAGE); // Correction du bruit en fonction du taux de moyennage
val1 = ValMoyennee1;
//----------------------------------------------------------------------------------
#define TAUX_DE_MOYENNAGE MOY_SUR_4_VALEURS // Choix du taux de moyennage
static int ValMoyennee2; // Valeur à moyennée
val2 = pulseIn(signal2, HIGH, 30000); // Lecture du signal radio pour le servo Variateur gauche
val2 = map(val2, neutre - 500, neutre + 450, 0, 180); // Mise à l’échelle
val2 = constrain(val2, 0, 180); // Conversion en degres
ValMoyennee2 = MOYENNE(ValMoyennee2, val2, TAUX_DE_MOYENNAGE); // Correction du bruit en fonction du taux de moyennage
val2 = ValMoyennee2;
//----------------------------------------------------------------------------------
valxA = val1; // Donne à la variable (valxA) la valeur de signal de "GAZ"
valxB = val2; // Donne à la variable (valxB) la valeur de signal de "DIRECTION"
diff = (valxB - neutral); // Calcul l'ecart entre les deux variateurs
valA = valxA - diff; valB = valxA + diff; // Calcul la position des servos
valA=constrain(valA, posmin, posmax); // Calibre les valeurs pour le variateur dans la plage acceptée
valB=constrain(valB, posmin, posmax); // Calibre les valeurs pour le variateur dans la plage acceptée
//----------------------------------------------------------------------------------
myservo1.write(valA); // Positionne le servo Variateur droit
myservo2.write(valB); // Positionne le servo Variateur gauche
delay(REFRESH_PERIOD_MS); // Temps nécessaire au mouvement des servos
SoftRcPulseOut::refresh(); // Rafraîchissement de SoftRcPulseOut
}
//=============================FIN DE PROGRAMME ===========================================
|