Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Faire une moyenne pour detection
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » mer. 21 déc. 2022 21:01

Bonjour à tous,

J'utrilise un capteur a microwave pour detecter un mouvement. Ce détecteur ne sert qu'a scruter une valeur analogique dans la pratique.

En début de programme j'initialise avec une valeur de référence. qui est une moyenne sur 100 valeurs.

Ensuite mon idée est de surveiller les valeurs qui arrivent pour détecter un mouvement. Mais comment bien scrutezr en permanence les valeurs ?

Je suis partis dans l'idée, de scruter toutes les 5ms si une valeur est en dessous ou au dessus de la référence avec un petit threshold pour pouvoir a terme régler la sensibilité.

Si sur une salve de 10 mesures j'en mesure 3 hors cadre, alors je détecte un mouvement.

Le probleme si je passe par une moyenne c'est uqe la moyenne risque d'étre faussée si je par ueemple une valeur au dessus et une autre en dessous.
Disons que j'a iune référence à 2.5V, sdi je mesure 2V puis 3V, je me retrouve avec une moyenne de 2.5V et donc pas de detection.

D'ou mon idée de compteur le nombre de mesure hos cadre!

Qu'en pensez vous ? je ne doute pas qu'il y a beaucoup mieux pour rendre cela plus fiable.


Code : Tout sélectionner

while (1){
 
    
//Detection();
    
cnt 0;
    for (  
sampler 0sampler 10 sampler++ )
    {
        
single ADC_Read(2);
        
delay_ms(5);
        
        if ( (
single reference-10) || (single reference+10))
        {
            
cnt++;
        }
    }
    
   if ( 
cnt 3)
    {
        
UART1_Write_Text("Mouvement");
        
UART1_Write(10);
        
UART1_Write(13);
    }


 }

C'est en faisant des erreurs, que l'on apprend le mieux !!!

Faire une moyenne pour detection
francois77
Passioné
Passioné
Messages : 307
Enregistré en : avril 2022

#2 Message par francois77 » jeu. 22 déc. 2022 07:41

Bonjour Jérémy,
C’est possible de fournir la référence de ton capteur et le schéma de celui-ci si tu le possèdes ?
Il serait intéressant d’avoir une copie d’écran du signal à l’oscilloscope en régime stable et perturbé de ton capteur
A voir aussi l’impact du niveau de la lumière ambiante sur ton capteur
De souvenir cela joue aussi sur le niveau de sortie
A+
Francois

Faire une moyenne pour detection
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » jeu. 22 déc. 2022 09:30

Bonjour Francois7,

Rien de bien extraordinaire mais je m'exécute !

Voici les photos demandées. Une droite presque plate de 2.44V . le curseur du zéro est tout en bas.
Et suivant qu'on bouge ou non la fréquence et l'amplitude varie énormément. D’où mon souhait de pouvoir régler un peu tout ça, suivant si c'est un chat ou un éléphant que j'ai a détecté.

Le module c'est celui ci : microwave
On trouve un code de sampling; Mais il ne teste que les données inférieur à la référence au lieu de prendre aussi celle du dessus.

Tu trouveras le schéma ici : schéma
J'ai rajouté un condo chimique de 10µF et 100nF sur l'entrée de mon PIC pour lisser un peu.

IMG_20221222_085909.jpg

IMG_20221222_085847.jpg


L'idée est de pouvoir détecter des très faibles mouvements pour simuler une paroi. dès qu'on s’éloigne un peu ou que l'on met un obstacle la détection devient plus "touchy"
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Faire une moyenne pour detection
francois77
Passioné
Passioné
Messages : 307
Enregistré en : avril 2022

#4 Message par francois77 » jeu. 22 déc. 2022 09:57

Hello,

Je ferais un module type dérivée réglable avec seuil

le problème, c'est de mesurer le variation de signal

tu pourrais avec un tuyau pvc faire varier un objet (une balle de tennis par exemple )et quantifié les variation de signal en fonction du déplacement

Apres c'est du traitement de signal

ton programme est a peu près ce que j'aurais fait mais en ASM :sifflotte:

je blague

A+

Francois

Faire une moyenne pour detection
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#5 Message par paulfjujo » jeu. 22 déc. 2022 10:23

Bonjour à tous,

Je suis partis dans l'idée, de scruter toutes les 5ms si une valeur est en dessous ou au dessus de la référence avec un petit threshold pour pouvoir a terme régler la sensibilité.


Pourquoi ne pas utiliser directement les Comparateurs ...
Seuils avec valeur Ana => interruption si en dehors des clous ..

Rajout d'un filtre sur entree Ana ?
le double ampli OP MCP622 est deja bien limité en bande passante avec 1nF en // avec 150K

un filtrage exponentiel au lieu d'une moyenne ?
tres utile avec des mesures via ADC 16 ,18,ou 24 bits !

Init : Valeur Filtree=New valeur
filtre=0.2 ; ( filtre de 0.0 = jamais rafraichi max=1.0 =pas de filtrage)
boucle ayant un timing regulier
{
Valeur filtree = (New Valeur* filtre + (1-Filtre) Old valeur)
Old valeur=valeur Filtree
}

filtrage_exponentiel.xls


Filtrage_exponentiel.jpg



ou avec un calcul d'ecart type sur 30 mesures glissantes ?


Quelle portée (distance) de detection maxi peut-on espérer avec ce module ?
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Faire une moyenne pour detection
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#6 Message par Jérémy » jeu. 29 déc. 2022 20:57

Bonsoir,

Merci à tous pour vos conseils.

J'ai opté pour un truc simple.

Code : Tout sélectionner


 
while (1){

    
Error_cnt 0;
    
sum 0;
    
 for ( 
sampler 0sampler 30 sampler++ )
    {
        
single ADC_Read(2);
        
sum += single;
        if ( (
single reference THRESHOLD) || (single reference THRESHOLD))
        {
            
Error_cnt++;
        }
        
delay_ms(2);
    }

   if ( 
Error_cnt 3)
    {          
       
MOUVEMENT
    
}
    
   if ( 
Error_cnt == 0)
    {
        
sum sum 30;
        
reference sum;
    }
   } 


Je fais un échantillonnage sur 30 valeurs et je compte combien de valeurs on dépassé les limites hautes et basses.
Dans le même temps je fais une moyenne.

Si le nombre de valeurs qui ont dépassées les limites sont supérieurs à un nombre( ici 3/30 = 10%) alors je considère qu'il y a eu un mouvement.
Si le nombre de valeurs erronées est à 0 , alors je recalcule la valeur référence pour étalonner. Car je me suis rendu compte qu'avec la température la référence évolue lentement dans le temps.
Le threshold est la variable pour régler la sensibilité du capteur.
J'aurai pus aussi jouer avec le nombre d'erreurs pour la répétabilité mais bon .....
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 43 invités