/* programmer avec Arduin0 1.0.5
28 Avril 2020 , programme Mixage moteur U47 avec un Attiny 85
Mixage des 2 Moteurs en fonction de l'angle du gouvernail pour aider a tourner
Radio FUTABA
==============================================================================================*/
#include <SoftRcPulseOut.h> // Appel de la librairie servo
SoftRcPulseOut Variateur_Gauche; // Declarer le Variateur gauche
SoftRcPulseOut Variateur_Droit; // Declarer le Variateur droit
SoftRcPulseOut Gouvernail; // Declarer le servo gouvernail
#define S2 0 // Declare la variable S2, la sortie voie 2 du recepteur (variateur) sera branchee sur le pin 0 de l'attiny 85
#define S4 1 // Declare la variable S4, la sortie voie 4 du recepteur (gouvernail) sera branchee sur le pin 1 de l'attiny 85
//moyennage des valeurs impultions envoyees par l'emetteur
#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_8_VALEURS /* Choisir ici le taux de moyennage parmi les 6 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=50; // Valeur autour du neutre pour avoir aucune action de variateurs
int neutreS2=1500; // definir le point milieu du manche au centre voie 2 (moteur) (Radio FUTABA)1380
int neutreS4=1500; // definir le point milieu du manche au centre voie 4 (gouvernail) (Radio FUTABA)1430
int MaxDeb=170; // debattement maxi servo ou variateur en degres
int MinDeb=10; // debattement mini servo ou variateur en degres
int Val_M; // Declarer Val_M (Variateurs)
int Val_MD; // Declarer Val_MD (variateur droit)
int Val_MG; // Declarer Val_MG (Variateur gauche)
int Val_G; // Declarer Val_G (Gouvernail)
int Diff = 20; // Declarer Diff (Mixage)
//============================================================================================
void setup()
{
pinMode(S2, INPUT); // Declare S2 en entree (moteur) au pin 0 de l'attiny 85 (recepteur voie 2 FUTABA)
pinMode(S4, INPUT); // Declare S4 en entree (Gouvernail) au pin 1 de l'attiny 85 (recepteur voie 4 FUTABA)
Gouvernail.attach(2); // Attache le servo (gouvernail) au pin 2 de l'attiny 85
Variateur_Droit.attach(3); // Attache le servo (variateur Droit) au pin 3 de l'attiny 85
Variateur_Gauche.attach(4); // Attache le servo (variateur gauche) au pin 4 de l'attiny 85
}
//===========================================================================================
void loop()
{
//----------- gouvernail----------
#define TAUX_DE_MOYENNAGE MOY_SUR_8_VALEURS // Choix du taux de moyennage
static int ValMoyennee4; // Valeur a moyennae
Val_G = pulseIn(S4, HIGH); // Val_G = la valeur lue sur le pin 1 de l'attiny 85 venant du recepteur voie 4
Val_G = map(Val_G,neutreS4-500,neutreS4+500,MinDeb,MaxDeb); // Etalonne le servo de 10° a 170° avec les valeur du deplacemant du manche 1055 a 1880
ValMoyennee4=MOYENNE(ValMoyennee4,Val_G,TAUX_DE_MOYENNAGE); // Correction du bruit en fonction du taux de moyennage
Val_G=ValMoyennee4;
//--------- variateur x2 ---------
#define TAUX_DE_MOYENNAGE MOY_SUR_8_VALEURS // Choix du taux de moyennage
static int ValMoyennee2; // Valeur a moyennee
Val_M = pulseIn(S2, HIGH); // Val_M = la valeur lue sur le pin 0 de l'attiny 85 venant du recepteur voie 2
//if (Val_M > neutreS2+neutre || Val_M < neutreS2-neutre ) { // agrandir le neutre autour du manche ±50 impultions
Val_M = map(Val_M,neutreS2-500,neutreS2+500,MinDeb,MaxDeb); // Etalonne les variateurs de 10° a 170° avec les valeurs du deplacemant du manche 1127 a 1949
ValMoyennee2=MOYENNE(ValMoyennee2,Val_M,TAUX_DE_MOYENNAGE); // Correction du bruit en fonction du taux de moyennage
Val_M=ValMoyennee2;
//}else{
//Val_M=90; // variateurs à 0
//}
//-----------mixage a partir de ±40° de gouvernail et seulement en marche avant------------
if(Val_M>92 && (Val_G<50 || Val_G>130)){ // si ordre au gouvernail >40° ou >-40° et en marche avant seulement)
if(Val_M>92 && Val_M<=120){Diff = 20;} // modifier la valeur de mixage en fonction de la vitesse = 20
if(Val_M>120) {Diff = 40;} // modifier la valeur de mixage en fonction de la vitesse = 40
if(Val_G<50){ // si ordre au gouvernail >40° vers la gauche
Val_MD=Val_M;
Val_MG=Val_M-Diff; // reduire moteur gauche
}
if(Val_G>130){ // si ordre au gouvernail >-40° vers la droite
Val_MG=Val_M;
Val_MD=Val_M-Diff; // reduire moteur droit
}
}else{
Val_MD=Val_M; Val_MG=Val_M; // pas de mixage des moteurs
}
//--------- servo ---------
Val_MG=constrain(Val_MG, MinDeb, MaxDeb); // Calibre les valeurs Max et Min pour rester dans la plage acceptable
Val_MD=constrain(Val_MD, MinDeb, MaxDeb); // Calibre les valeurs Max et Min pour rester dans la plage acceptable
Gouvernail.write(Val_G); // Positionne le servo (Gouvernail)
Variateur_Gauche.write(Val_MG); // Positionne le servo (Variateur gauche)
Variateur_Droit.write(Val_MD); // Positionne le servo (Variateur droit)
delay(15); // Delai pour que les servos atteignes leur position
SoftRcPulseOut::refresh(); // Rafraichir la bibliotheque servo
}
//==========================FIN DU PROGRAMME ===============================================
|