Analyser et supprimer des données avec Arduino.

Bonjour,

Nous sommes un groupe de 3 en école d'ingénieur à travailler sur la réalisation d'un vélo qui freine automatiquement à l'approche d'un obstacle. Le système est composé d'un capteur ultrason très puissant qui capte jusqu'à 10m, d'un servomoteur et d'une carte Arduino UNO.
Notre capteur est branché sur une entrée numérique de la carte et lui envoie des données numériques qui sont ensuite converties, grâce à un programme Arduino, en une longueur exprimée en cm.

Le problème est que le capteur n'est pas toujours précis dans ses mesures et affiche de temps en temps des longueurs complètement différentes de la réalité. C'est pour cela que nous avons pensé à réaliser un algorithme qui permettrait "d'analyser" les données envoyées par le capteur.

Son analyse se basera sur les longueurs en cm (ce serait certainement plus simple).

Nous nous plaçons à l’ instant "t". Le capteur envoie une valeur qui va ensuite être stockée. "A t+11", lorsque 11 valeurs ont étés stockées, cette 11ème valeur sera comparée à la moyenne des 10 précédentes.

Si cette 11ème valeur est proche de la moyenne des 10 précédentes, elle est conservée. Si elle est trop éloignée de la moyenne des 10 précédentes, elle est automatiquement supprimée.

On passe alors à la valeur 12 et ainsi de suite. Supposant que la mémoire de la carte n’est pas infinie, il faudra penser à supprimer les précédentes valeurs qui ne servent plus.

Avez-vous une idée de la programmation de cet algorithme ?
Merci d'avance pour votre aide !
A bientôt.

Vous voulez faire une moyenne glissante

Soit un tableau de n éléments 
Soit une variable qui contiendra la moyenne
Soit une variable qui pointe dans ledit tableau.

a chaque nouvelle acquisition on fait:
    moyenne = moyenne - valeur pointée dans le tableau
    moyenne = moyenne + nouvelle acquisition
    valeur pointée dans le tableau = nouvelle acquisition
    on incrémente le pointeur dans le tableau
    si le pointeur déborde du tableau on le remet à 0

Le tableau aura de préférence une taille en puissance de 2 (c'est juste une facilité de programmation le débordement peut être réalisé par un masque logique au lieu d'un test)

hum... les idées, c'est peut-être à vous de les avoir non ? Il me semble que c'est l'objectif de votre formation que de vous demander de réfléchir à des solutions pour résoudre des problèmes.

Vous avez défini votre algorithme d'analyse maintenant à vous au moins d'essayer de le coder. Une fois que vous aurez fait votre code, reviens avec pour demander de l'aide s'il ne fonctionne pas ou ne répond pas à vos attentes.

L'objectif du forum, c'est de l'entraide et du partage mais pas de fournir du code à la demande.

Bonjour, merci beaucoup pour ton aide fdufnews ! Ça nous a donné pleins d'idées sur la manière de coder cette moyenne. Mon groupe et moi avons réussi à coder proprement ce que l'on attendait mais sans supprimer de valeurs dans le tableau et ça fonctionne ! Voici notre code pour que tout le monde puisse en profiter:

#include <Servo.h>  //  Librairie servant à écrire le code.
const int anPin = 0;  //  Déclaration de l'entrée analogique (Pin 0).
long anservo;
long anVolt;
Servo servo; //  Déclaration du servomoteur.
int tableau[5]; // Création d'un tableau de taille 6 pour faire une moyenne.
int moy; // Variable entière contenant la moyenne.

void setup() {
  
pinMode(13, OUTPUT);  // LED Rouge
pinMode(12, OUTPUT);  // LED Orange 1
pinMode(11, OUTPUT);  // LED Orange 2
pinMode(10, OUTPUT);  // LED Verte 1
pinMode(9, OUTPUT);  // LED Verte 2
pinMode(8, OUTPUT);  // Buzzer

servo.attach(7);  //Indication de la broche de commande du servomoteur, la valeur basse (angle à 0°) et la valeur haute (angle au max).
servo.write(120);  //Consigne d'angle à laquelle il doit se positionner.

//Conditions initiales:
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);
digitalWrite(8, LOW);
   
Serial.begin(9600);  // Cette fonction permet d'initier la lecture de la distance de l'obstacle à 9600 Bauds par le biais du port USB.
}

void loop()  {

{
// Le facteur d'échelle est: Vcc/1024 par 2cm. Une alimentation de 5v donne un rendement de ~4.9mV/2cm pour les capteurs de 10,68m.

// Début du moyenneur :
anVolt = 2*analogRead(anPin);  // Lire la tension de sortie analogique du sonar.
tableau[0]=anVolt;
  moy=(tableau[0]+tableau[1]+tableau[2]+tableau[3]+tableau[4]+tableau[5])/6;
  Serial.print(moy);  //Appel de la variable
  Serial.print("cm");  //Afficher le mot "cm".
  Serial.println();  //Afficher un espace sur le terminal série.
  delay(30);  // Taux de rafraichissement du capteur.
anVolt = 2*analogRead(anPin);
tableau[1]=anVolt;
  moy=(tableau[0]+tableau[1]+tableau[2]+tableau[3]+tableau[4]+tableau[5])/6;
  Serial.print(moy);  //Appel de la variable
  Serial.print("cm");  //Afficher le mot "cm".
  Serial.println();  //Afficher un espace sur le terminal série.
  delay(30);  // Taux de rafraichissement du capteur.
anVolt = 2*analogRead(anPin);
tableau[2]=anVolt;
  moy=(tableau[0]+tableau[1]+tableau[2]+tableau[3]+tableau[4]+tableau[5])/6;
  Serial.print(moy);  //Appel de la variable
  Serial.print("cm");  //Afficher le mot "cm".
  Serial.println();  //Afficher un espace sur le terminal série.
  delay(30);  // Taux de rafraichissement du capteur.
anVolt = 2*analogRead(anPin);
tableau[3]=anVolt;
  moy=(tableau[0]+tableau[1]+tableau[2]+tableau[3]+tableau[4]+tableau[5])/6;
  Serial.print(moy);  //Appel de la variable
  Serial.print("cm");  //Afficher le mot "cm".
  Serial.println();  //Afficher un espace sur le terminal série.
  delay(30);  // Taux de rafraichissement du capteur.
anVolt = 2*analogRead(anPin);
tableau[4]=anVolt;
  moy=(tableau[0]+tableau[1]+tableau[2]+tableau[3]+tableau[4]+tableau[5])/6;
  Serial.print(moy);  //Appel de la variable
  Serial.print("cm");  //Afficher le mot "cm".
  Serial.println();  //Afficher un espace sur le terminal série.
  delay(30);  // Taux de rafraichissement du capteur.
anVolt = 2*analogRead(anPin);
tableau[5]=anVolt;
  moy=(tableau[0]+tableau[1]+tableau[2]+tableau[3]+tableau[4]+tableau[5])/6;
  Serial.print(moy);  //Appel de la variable
  Serial.print("cm");  //Afficher le mot "cm".
  Serial.println();  //Afficher un espace sur le terminal série.
  delay(30);  // Taux de rafraichissement du capteur.
}
}