j'utilise une broche de mon capteur "MicroEpsilon, OptoNCDT1320" qui delivre un courant de 4mA a 20mA en fonction de la distance. J'ai donc relie cette sortie avec une resistance de 250 ohm pour avoir une tension de 0-5V en sortie pour pouvoir lire cette donnee sur la broche analogique de la carte arduino.
Cependant les valeur que m'affiche le termial ne represente aucunement la distance lu par le capteur et je ne comprends pas pourquoi. Pouvez vous m'aider ?
Voici le code utilise :
/*
* Programmation du capteur optoNCDT 1320 de Micro Epsilon avec la broche
* blanche qui delivre un courrant de 4mA a 20mA
*/
const int analogOutPin = A0;
int outputValue = 0;
float VoltValue = 0;
float distance = 0;
unsigned long DELAY_TIME = 10000; // 10 sec
unsigned long delayStart = 0; // the time the delay started
bool delayRunning = false; // true if still waiting for delay to finish
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(A0,OUTPUT);
// start delay
delayStart = millis();
delayRunning = true;
}
void loop() {
// put your main code here, to run repeatedly:
outputValue = analogRead(analogOutPin);
// print the results to the Serial Monitor:
Serial.print("Value = ");
Serial.println(outputValue);
//Convertion data to distance
VoltValue = ((outputValue*5)/1024); // Volt "Umax/10bytes" tension = map(valeurLue, 0, 1023, 0, 5000);
// Serial.println(VoltValue); // tension = tension / 1000;
distance = ((VoltValue*100)/5); // Distance en mm
//Serial.println(distance);
Serial.println();
// check if delay has timed out
if (delayRunning && ((millis() - delayStart) >= DELAY_TIME)) {
delayRunning = false; // finished delay -- single shot, once only
//while(1);
}
}
Pour une lecture analogique, la broche doit être déclarée en input.
Non, INPUT et OUTPUT sont uniquement pour le mode digital.
En mode analogique on active la sous fonction "mesure analogique" de certaines entrées.
Cette activation est faite dans la fonction analogRead() qui se charge de la modification du contenu des registres.
L'entrée sur ces broches est routée du port digital vers le multiplexeur analogique.
const int analogOutPin = A0;
Utiliser un int (sur deux octets) est du gâchis , un seul octet suffit.
const uint8_t analogOutPin = A0
ou
const byte analogOutPin = A0
Édit : ceci dit, je préfère une entrée en haute impédance à une sortie à 0 ou 5V pour le branchement d'un capteur
La broche est maintenue sur le circuit auxiliaire ?
Il y a beaucoup de gâchis dans ce code:
une conversion en volts, suivie d'une conversion en mm (et au passage, il multiplie puis divise par 5).
J'aurais fait une règle de 3 avec map
distance= map ( analogRead(A0,0, 1023, 0, MAXRANGE_EN_MM );
Je l'aurais affiché
et j'aurais attendu 10 secondes pour recommencer
La boucle loop aurait été bien plus petite 3-4 lignes) .
Par contre, je vois mal comment ce capteur peut être commandé.
Le peut il?
Est ce à l'arduino de le commander/configurer?
Merci beaucoup pour toutes les informations, j'en prends note
Je veux simplement effectuer la lecture du capteur et non le commander.
Je veux par la suite faire deplacer ce capteur sur une distance de 10mm avec une vitesse de 1mm/s et faire la moyenne des valeurs pour me donner la hauteur moyenne du capteur au sol.
Je reviens vers vous si j'ai d'autres problemes. Merci
Avez vous in multimètre?
Parce que (à une règle de trois près), vous pourriez assez vite voir si votre capteur est bien -ou mal -configuré, et si les valeurs de l'arduino collent avec celles du multimètre (donc tester la connection , voire le bout de logiciel) ....