/**************************************************************/ //Contrôle de commande de moteur brushless "aviation" //Mesure par capteur infrarouge Sharp GP2Y0A41SK0F sur AN0. // Un ajustage de hauteur par potentiomètre // de quelques kilo ohms est possible. /*************************************************************/ int distance=0; int offset= 0; int dist_utile=0; unsigned int temps_pulse; int sortie_servo=9; unsigned long debut_periode; int pinDistance =0,pinOffset=1; boolean flag_demarre=1; // valeur 1 pendant la séquence de démarrage // mis à 0 pour passer à la boucle de durée infinie void mesures(void) { distance=0; offset = 0; for(int ii=0; ii<16; ii++) { distance += analogRead(pinDistance); offset += analogRead(pinOffset); } dist_utile = (distance >>4); offset >>= 4; offset -=512; dist_utile = constrain(dist_utile,0,720); dist_utile = map(dist_utile,0,720,0,1023); //utiliser la ligne suivante si la tension augmente quand la réserve //d'air augmente, sinon il faut la mettre en // commentaire, //afin d'obtenir une variation dans le sens de la contre-réaction /************************************************/ /************************************************/ dist_utile = 1023 - dist_utile; /************************************************/ /************************************************/ // dist_utile sera comprise entre 0 et 1023 // Serial.print("Distance utile :"); // pour debugger éventuellement // Serial.println(dist_utile); // Affichage éventuel pour vérifier la mesure } void faire_pulse(int commande) { temps_pulse = (990 + constrain(commande,0,1023)); digitalWrite(sortie_servo,HIGH); delayMicroseconds(temps_pulse); digitalWrite(sortie_servo,LOW); } void setup()//Initialise l'utilisation des PINs de l'arduino { pinMode(sortie_servo,OUTPUT); digitalWrite(sortie_servo,LOW); Serial.begin(9600);// pour déboggage éventuel analogReference(DEFAULT); } unsigned compte=0; void loop() { // 6 secondes pour que le contrôleur brushless s'initialise while(flag_demarre)// boucle tant que flag_demarre est à 1 { debut_periode= micros();// la période durera 20 millisecondes faire_pulse(0); compte++; if(compte>300) // (300 x 20 msec = 6 sec) { compte = 0; flag_demarre = 0; } while( (micros()-debut_periode) < 19999); } //refaire une boucle pour une augmentation progressive de la puissance // afin de ne pas bousculer trop rapidement la réserve d'air. flag_demarre = 1; while(flag_demarre) { debut_periode = micros(); faire_pulse( compte ); compte++; if(compte > 1023) flag_demarre=0;//puissance max atteinte mesures(); if(compte > dist_utile+offset) flag_demarre = 0; // consigne atteinte if(compte < 100) flag_demarre= 1; while( (micros()-debut_periode) < 19999){ }; } // Passage en fonctionnement normal : boucle infinie while(1) { debut_periode = micros(); mesures(); faire_pulse(dist_utile + offset ); while( (micros()-debut_periode) < 19999); } }