Mon 1er programme Arduino (oh c'est émouvant!!!).
Mon 1er programme Arduino (oh c'est émouvant!!!).
Avec l'aide d'un ami (merci Fab :-) ), le petit programme sert à mesurer une distance via un capteur ultra son puis afficher 3 états: Led rouge moins de 40cm, led jaune moins de 100cm et vert au delà
Un retour sur le moniteur du pc affiche les données, on a galéré à faire une boucle pour incrémenter un compteur car le capteur donne parfois des valeurs qui sont hors spectre, il y a donc un calcul de moyenne et une suppression des valeurs supérieures à 200cm.
Je suis bien sûr ouvertà toutes critiques, vu que c'est le 1er programme, il y a forcément d'autres logiques pour réduire le code...
A terme je voudrais faire une fonction de ce code pour pouvoir piloter la sabertooth et pouvoir réduire la vitesse à moins 1m et stopper à 40cm.
// Capteur de distance avec trois valeurs de sortie 40cm, 1m et infini
//variable hardware
#define distmin 10 //distance de ralentissement des moteurs à 1 mètre
#define distmax 11 //distance sans obstacle à plus d'un mètre, vitesse max des moteurs.
#define diststop 12 //distance d'arrêt des moteurs detection obstacle à moins de 20cm
#define triggerPin 9 //pinoche trig du module capteur de distance
#define echoPin 8 //pinoche echo du module capteur de distance
//variable softawre
int nombre_mesure=10; // nombre de mesures à réaliser pour le moyennage
int cumul=0; // variable pour cumul des mesures
int moyenne; // variable calcul de la moyenne
int vdistmin=100; //valeur distance de ralentissement des moteurs
int vdiststop=40; //valeur distance d'arrêt des moteur détection obstacle à moins de xxcm
void setup() {
// Configuration vitesse moniteur série
Serial.begin(9600);
// Configuration des ports de sortie
pinMode(triggerPin, OUTPUT);
pinMode(distmin, OUTPUT);
pinMode(distmax, OUTPUT);
pinMode(diststop, OUTPUT);
// Configuration des ports d'entrée
pinMode(echoPin, INPUT);
}
void loop() {
//----- calcul d'une moyenne de plusieurs mesures -------
for (int i=0; i<nombre_mesure; i++) // répète la mesure
{
// Envoie d'un signal de 10ms au capteur
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
//Calcul duree retour pulsation capteur
long duration = pulseIn(echoPin, HIGH);
// Convertion en cm
float cm = microsecondsToCentimeters(duration);
//Forcer les valeur de plus de 200cm a 199cm
if (cm >200)
cm = 199;
//affichage valeur cm et cumul sur moniteur serie
Serial.print("cm="), Serial.println(cm);
Serial.print("cumul="), Serial.println(cumul);
// calcul du cumul pour la moyenne
cumul=cumul+cm;
//affichage valeur moyenne
Serial.print("moyenne="), Serial.println(moyenne); //retour moniteur serie
delay(1);
}
moyenne=cumul/nombre_mesure; //calcul de la moyen une fois sortie de la boucle compteur
cumul=0; //RAZ cumul...
//mise à 0 des mesures de distance pour le contrôle des moteurs
//mise à l'état haut d'une des sortie en fonction de la distance
if (moyenne <vdiststop){
digitalWrite(diststop, HIGH); // distance de sécu atteinte, arrêt des moteurs
digitalWrite(distmax, LOW);
digitalWrite(distmin, LOW);}//digitalWrite(distmin, LOW); // distance de sécu atteinte, arrêt des moteurs
else
if (moyenne >vdistmin){
digitalWrite(distmax, HIGH); // pas d'obstacle, moteurs à 100%
digitalWrite(distmin, LOW);
digitalWrite(diststop, LOW); } // pas d'obstacle, moteurs à 100%
else
{
digitalWrite(distmin, HIGH); //obstacle proche, moteur à 33%
digitalWrite(diststop, LOW); // distance de sécu atteinte, arret des moteurs
digitalWrite(distmax, LOW); // pas d'obstacle, moteurs à 100%
}
} // fin boucle test calibrage
//----- affichage du résultat --------
//Fonction conversion microseconds en centimetre
float microsecondsToCentimeters(long microseconds){
// Convertion de temps
float seconds = (float) microseconds / 1000000.0;
//calcule de la distance 340m/secondes
float distance = seconds * 340;
// division par deux (aller retour)
distance = distance / 2;
// Convertion en cm
distance = distance * 100;
return distance;
}