recevoir une donnee analogique et en deduire une distance

Bonjour,

Je fais actuellement un projet je vais essayer de vous expliquer meme si jai un peu de mal :

En gros jaurais une tension analogique qui entre dans mon arduino et en fonction de cette tension bah je dois avoir une distance en micrometre. je n'ai pas encore trouver la relation entre la tension d'entre et la distance que je devrais obtenir.

J'ai fais un test avec mon potientiometre jai utiliser ce programme :

Void setup() {

Serial.begin(9600); //Comunication serie
}

void loop() {

float OpticDVD = analogRead(A0);

// Transforme la mesure en valeur numerique
float distance = OpticDVD * (5.0 / 1023.0);

// Envoi la mesure au PC pour affichage et attends 250ms
Serial.println(distance);
delay(250);

Jai fais un test sa marche a peu pres. mais je sais pas si je fais bonne route.
Mais le plus grand probleme c'est que la tension que l'on a en entree n'ai pas fixe, c'est seulement une inpulsion.

par exemple : je recois une impulsion de 3V donc mon objet sera a 3micrometre de hauteur.
apres 10 seconde par exemple je recois une autre impulsion de 1V sa veu dire que mon objet est a 2 micrometre de hauteur.

mais entre les deux impulsions il faudrais dire que l'objet na pas changer de hauteur parceque entre les deux impulsions il yaura 0V donc le programme vas croire que l'objet est au sol alors qu'il est a 3 micrometre dans mon exemple.

je sais que je ne suis pas tres clair mais j'aurais vraiment besoin d'un petit coup de pouce.

Merci d'avance en esperant avoir un peu d'aide

qu'est-ce qui décide d'envoyer des impulsions? si c'est à chaque changement de hauteur, il vous faut surveiller les fronts montants par une interruption par exemple qui vous signaleront un changement de position.

on a besoin d'un peu plus de détails sur le fonctionnement de votre capteur

sinon n'oubliez pas que le Convertisseur Analogique Numérique n'a que 1024 positions... je ne sais pas quel ordre de grandeur vous allez mesurer mais si votre capteur donne une distance de 0 à 5000 microns par exemple vous avez avez une précision de l'ordre de 5000/1024 microns (environ 5 microns). Si votre capteur donne une distance de 0 à 1mm alors oubliez la précision au micron...

et il faudra bien calibrer votre analogRead(A0); - il y a bcp d'articles sur internet pour cela pour la tension de référence

En faite on a pas vraiment de capteur, un faisceau laser qui est reflechi par une surface reflechissante et on recoit une impulsion qui est plus ou moin grande en fonction de la distance quil yaura entre le laser et la surface

donc l’impulsion revient quand vous alimentez le laser et c’est vous qui contrôlez quand vous alimentez le laser?

Salut;
Pour ton code SPV utilise les balises ! </>.

C’est plus facile. Merci.

en faite c comme un lecteur optic du dvd, on gere pas le laser on recoit juste des donnee et en fonction de ses donne on doit dire que lechantillon est a tel ou tel hauteur

Quelle sont les capteurs utilisé et quelle est le but du projet ? Ça aide plus a la compréhension.

Si je comprends => Utilisation d'un laser pour mesurer la distance d'une surface réfléchissante. +> Retour d'une mesure brute transmise par le laser en volt (Quelle est l’échelle de tension mini/maxi du capteur laser)

Tu souhaite donc mettre en corrélation la distance réel de la surface avec la tension retourné par la laser.

Mesuré des micromètres pas facile sans appareil adapté +> Ça relève de l’équipement de labos §§§§ ça coute bonbon !!

Si le capteur est fait pour mesurer des micromètres la documentation devrais donner la relation a appliquer pour la conversion tension mesure.

on recoit une impulsion qui est plus ou moin grande en fonction de la distance quil yaura entre le laser et la surface

à quelle fréquence vous recevez cette impulsion? sans idée du protocole difficile de vous aider

Le but du projet est de créé un detecteur afm , c'est un apareil qui sert a mesurer la rugosité d'une surface, je suis qu'un simple stagiaire et mon projet je l'effectue a taiwan dans un labo de recherche, ils ont tous les equipement adapté et ils mont dit que la resolution de larduino nest pas sufisante mais quil ont un moyen externe de la monté. Donc pour linstant je peux travailler avec une resolution de 1023.
L'impulsion on la reçois quand la hauteur change et je n'ai pas acces a la documentation technique du dvd optic

ok donc suffit de mesurer en continu à la vitesse de l'arduino la tension et si elle est à 0 ça veut dire que vous restez à la distance mesurée précédemment, si elle change alors vous calculez la nouvelle distance.

Ensuite reste à savoir si le front ne dure pas assez longtemps pour être "vu" par votre arduino (ça prend 100 microseconds pour faire un analogRead) alors il faut bidouiller un peu plus

==> pendant combien de temps l'impulsion reste présente?

Bon de 1 tu n'est pas qu'un "simple stagiaire" mais UN STAGIAIRE.

Je connais le principe de mesure de rugosité => On applique cela en usinage pour les état de surfaces.
Sur mon lieu de travaille on contrôle l’état de surface au laser mais cela demande un déplacement de la pièce (barres).

Plus couramment utilisé après un usinage avec des comparateurs à aiguilles => Mesure mécanique.

Il faut déplacer la surface sous le comparateur pour relever des mesure +> Donc la mesure ne change que lors du déplacement de la surface.
Les impulsions de mesure correspondent elle a un déplacement sur la surface?

Je me suis me intéresser a l'AFM c'est coton !! Tu être un simple stagiaire!! faut être plus que cela pour que l'on te confie un tel projet.

Donc ta fréquence de lecture c'est le nombre de points de mesures lors du déplacement.

Pour info la résolution de 1023 en entrée analogique correspond a une tension de référence de 5V.

Si ta tension est inférieure tu dois faire le rapport de tension sur la résolution efficace 1023.
Ex pour 2.5V 1023/2= 512. (ou 511 cela dépendra de ton traitement.)

Peut tu nous donner la tension maximum que le capteur peut transmettre => Fait des essais.

Recevoir la donnée n'est pas un problème.

La difficulté est de collecter les bonnes données de référence en butée de lectures pour réaliser les bonnes mesures.

Je suis un stagiaire mais je suis pas seul sur le projet, cela fais partit de ma partie individuel. Et je sens que j'ai pas leur niveau en arduino... Demain je vais faire les essaies que vous m'avez dit de faire, la il est 20h21 et j'ai pas acces au labo, donc demain matin je ferais toute les tests que vous m'avez indiqué si yen a d'autre dite moi.
Merci de votre aide

j'ai fais quelques mesures en gros on recois une impulsion sinusoidale d'amplitude 1,19V maximum donc crete a crete on aura 2,38V, l'impulsion dure entre 2 et 4milliseconde.
et je comfirme qu'il y a qu'une seul impulsion par mesure donc entre deux mesure la tension en entree sera nul.

Et quel temps entre 2 mesures?

Bah elle est infini, sauf si elle detect un changement au niveau de la hauteur dans ce cas la elle vas envoyer une nouvel impulsion qui vas definir la nouvelle hauteur

OK donc vous pouvez juste détecter les fronts de l'impulsion et comme elle reste "longtemps" ( 2 et 4milliseconde.) lire l'amplitude en cherchant la valeur max pendant qques ms après l'impulsion et ça vous donne une nouvelle hauteur jusqu'à la prochaine impulsion

faudra bien sûr bien calibrer votre entrée analogique.

Vous avez bien résumé la situation mieux que moi dailleur... Et c'est la ou je suis bloqué... J'arrive pas a faire ce programme

Bonjour,

Comme dit J-M-L, il faut rechercher le maxi après la montée du signal.
Voici un programme simple que tu pourras utiliser ou dont tu pourras t’inspirer

void setup() {
 Serial.begin(9600);
}

void loop() {
 const int seuilBas=10; // seuil en dessous duquel on considère 0
 
 static bool mesureEnCours=false;
 static int maxi=0;

 int val=analogRead(A0);
//  Serial.println(val);
 if (val<seuilBas)
 {
   // pas de mesure
   if (mesureEnCours)
   {
     // on vent de terminer une mesure
     float distance = maxi * (5.0 / 1023.0);
     Serial.print("maxi: ");
     Serial.println(maxi);
     Serial.print("distance: ");
     Serial.println(distance);
   }
   mesureEnCours=false;
   maxi=0;
 }
 else
 {
   // recherche le maximum du signal
   mesureEnCours=true;
   if (val>maxi)
     maxi=val;
 }
}

Il y a quand même quelque-chose qui m’inquiète quand tu parles d’une sinusoïde de 2,38V crête à crête, j’espère qu’elle est toujours positive car l’arduino n’accepte pas les tensions négatives.