Canalblog
Editer l'article Suivre ce blog Administration + Créer mon blog
Publicité
Le R2D2 de Chris
1 août 2013

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

Publicité
Publicité
Commentaires
Le R2D2 de Chris
Publicité
Archives
Newsletter
Derniers commentaires
Publicité