Défi: nano-ohmmètre

Bonjour,

Dans la série des défis, en voici un nouveau: Le but est de faire un ohmmètre avec une nano permettant de mesurer (ou d'estimer) une résistance avec le moins de composants possibles.

Caractéristiques demandées:
− Mesures entre 10Ω à 100kΩ (environ)
− Résolution 10Ω + 5% (environ)
− Précision non exigée, comme c'est un système informatique, on peut toujours l'améliorer par des corrections, mais une erreur de l'ordre de 10% est souhaitée (si on mesure 10Ω avec une résolution de 10Ω on est de toutes façon à 50% près au maximum, mais pour le milieu de gamme, on peut faire mieux).
− carte Nano (vu que c'est un nano-ohmmètre) , mais peut être testé sur une Uno ou une Mega.
− pas de sécurité prévue si on y met des tensions sur les pointes de touches.

On dispose de 20 points et les pénalités sont:
− 0 point pour une carte Nano, Uno, Mega, pointes de touche, alimentation 5V, fils, connectique
− 0 point pour un afficheur (on peut aussi utiliser la console)
− 0 point pour l'aspirine
− -1 par résistance, par bouton
− -2 par diode
− -5 par transistor
− -10 par condensateur, inductance
− éliminatoire pour une deuxième carte, pour un circuit intégré, un moteur, ou pour tout composant non listé.
− éliminatoire pour toute solution insuffisamment expliquée (en gros si elle ne devrait pas fonctionner ou si on ne sait pas comment elle pourrait fonctionner).

Les solutions proposées doivent donner le schéma de l'ohmmètre et donner l'algorithme et la note sur 20. Il n'est pas nécessaire de donner une solution fonctionnant, c'est le principe qui est recherché.

A vos méninges!

hello
j'en suis là:
on va dire que c'est bon de 680K à 10K ( je n'ai pas fais de tests au dessus de 680K)
matériel: 1 méga

theorique réel tol basse mesure tol haute
680 683,3 612 637,303 748
150 150,7 135 145,242 165
120 119,03 108 114,61 132
47 47,92 42,3 47,057 51,7
10 10,695 9 10,533 11
1 994 0,9 889,6 1,1
670 673 603 600 737
550 555 495 564,17 605
470 469 423 386,04 517
390 388 351 315,22 429
330 327 297 244,69 363

Pour la mise en forme d'un tableau, il faut ajouter cette ligne entre le titre des colonnes et le contenu
|:---:|:---:|:---:|:---:|:---:|
Les : indiquent l'alignement
|:---:| centré dans la colonne
|:---| aligné à gauche
|---:| aligné à droite

hello
merci, ils y étaient et je les ai viré. je n'ai pas refléchi..............

Schéma?

Pour les bonnes valeurs ce n'est pas très important, car on est sur un système informatisé et l'on peut apporter des corrections.

Merci pour ta participation!

Je ne savais pas faire les tableaux aussi facilement, merci.

principe du pont diviseur entre :
une résistance connue(Rb)
et la résistance de pullup d'une entrée (Rh)
le point de jonction Rb et Rh est reliée à une entrée analogique
la lecture de cette netrée analogique nous donne la tension de sortie Vs
la tension Ve est la tension de fonctionnement de la platine arduino
on calcule en premier la valeur de Rh (pullup) en partant de ces formules
Vs =(Ve/(Rh+Rb))Rb"));
Rh = ((Ve
Rb)/Vs)-Rb"));
puis en changeant RB par une résistance inconnue
on calcule la valeur de cette résistance Rb en partant de cette formule
Rb=((Ve*Rh)/Vs)-Rh

reflexion: pour retrouver de la précision dans les valeurs inférieures au k,
je pense qu'il faut mettre 1,2,3,4 entrées (en PULL UP) en parallèle.
en effet, si nous prenons 4 pullup de 36k en //, pour avons une résistance
équivalente de 9k. ce qui nous ramene dans des valeurs de proportionnalité
plus raisonnables dans le ratio des PULL UP par rapport à la résistance inconnue ( sous le K)
et si ce n'était pas encore assez, il faudrait ajouter d'autres entrées (en PULL UP )
en parallele avec les premieres.

une deuxième piste:
faire le meme montage avec une DUE, et le convertisseur utilisé en 12 bits
la DUE étant en 3V , cela donne une resolution de 3V/4096 =7,32µ

non réalisée, à tester

float Vs = 0.00;
float Ve = 5.08;//tension de fonctionnement de la platine Arduino
float Rh = 00.00;
float Rb = 9930;//résistance connue (mesurée avec un multimètre)
void setup() {
  Serial.begin(115200);
  pinMode(2, INPUT_PULLUP);
}

void loop() {
  Serial.println(analogRead(A8));
  //Serial.println(F("   Vs =(Ve/(Rh+Rb))*Rb"));
  //Serial.print(F("     Rh = ((Ve*Rb)/Vs)-Rb"));
  Vs = Ve - (analogRead(A8) * (Ve / 1023));
  Rh = (((Ve * Rb) / Vs) - Rb);
  Serial.print(F("     Rh = ")); Serial.println(Rh);
  Serial.println(" ");
  Rb = 0.0;

  //Serial.print(F("     Vs = "));Serial.println(Ve-(analogRead(A8)*(Ve/1023)));
  //Serial.print(F("     Ve = "));Serial.println(Ve);
  //Serial.print(F("     Rh = "));Serial.println(Rh);
  //Serial.println(F("Rb=((Ve*Rh)/Vs)-Rh"));
  float tampon1 = Ve * Rh;
  //Serial.print(F("Ve*Rh = "));Serial.println(Ve*Rh);
  Vs = Ve - (analogRead(A8) * (Ve / 1023));//4096));//1023));
  //Serial.print(F("     Vs = "));Serial.println(Ve-(analogRead(A8)*(Ve/1023)));
  float tampon2 = tampon1 / Vs;
  //Serial.print(F("     Ve*Rh/Vs = "));Serial.println((Ve*Rh)/Vs);
  float tampon3 = tampon2 - Rh;
  //Serial.print(F("     Ve*Rh/Vs-Rh = "));Serial.println(((Ve*Rh)/Vs)-Rh);
  Rb = tampon3;
  Serial.print(F("     Rb = ")); Serial.println(Rb);
  Serial.println(F(" "));
  Serial.println(F(" "));
  while (1);
}


1 Like

Désolé de ne pas avoir répondu avant, mais on a eu 12h de coupure du réseau.

Ton analyse mérite le 20/20.

Je n'avais pas réfléchi à l'idée d'utiliser plusieurs entrées pour profiter d'une résistance plus faible, mais il faut dire que j'ai utilisé une uno avec un TFT parallèle qui utilise toutes les entrés saut A5.

Pour diminuer la résolution pour les faibles résistances, j'ai utilisé la référence 1,1V au lieu des 5V par défaut. On gagne un facteur 4,5.

Maintenant utiliser une seule entrée cause un problème que je ne comprends pas:
− si je connecte ensemble A4 en INPUT-PULLUP et A5 en INPUT et que je lis la valeur numérique sur A5, cela correspond à ce que j'attends (comme ce que tu as fait)
− si je mets et A5 en INPUT avec une pull-up externe de 35kΩ et que je lis la valeur numérique sur A5, j'ai exactement la même chose
− si je mets A5 en INPUT_PULLUP et que je lis la valeur numérique sur A5, avec une référence à 5V, A5 en l'air (R infini) j'ai 995 au lieu de 1023, et si je mets A5 à GND, j'ai 14 au lieu de 0
− si je mets A5 en INPUT_PULLUP et que je lis la valeur numérique sur A5, avec une référence à 1,1V, A5 en l'air (R infini) j'ai bien 1023, mais si je mets A5 à GND, j'ai 72 au lieu de 0

Du coup utiliser une seule broche demande plus de correction, et fonctionne mal pour les résistances élevées. Je n'ai pas regardé quelle résolution j'ai pour les faibles résistances, le courant a été coupé toute la journée.

hello, merci de ton retour.
en complément,
j'ai déterminé la valeur de RH pullup par approximation , je connaissais à quelque chose près la Rh
donc, avec quelques résistances en série, j'ai déterminé la valeyr réelle des pullup de ma méga.
puis, avec le prg modifié, j'ai déclaré D2 à D10 comme entrées, mais ensute, je n'ai utilisé que D2,D3,D4 et D5.
j'ai cablé D2,D3,D4 ensemble ( pas D5 qui est resté NC) . leur point commun relié d'une part à A9 et Rb (dont la valeur est identique à celle de Rh). l'autre extrémité de Rb est raccordée à GND.
dans le prog, j'effectue en boucle :
la déclaration de D2,D3,D4,D5 en INPUT (elles se retrouvent en haute impédence.
puis je déclare D2 et D3 en pullup. je me retrouve donc avec les deux pullup en série.
les calculs du programme me donnent Rh = 18 000 ohms.
au tour de boucle suivante, ce sont D3 et D4 qui sont mises en //
les calculs du programme me donnent Rh = 18000 ohms.
au dernier tour, ce sont D4 et D5 qui sont mises en //. mais D5 n'est pas cablé. donc il n'y a en réalité que D4.
les calculs du programme me donnent Rh 36 000 ohms.

voilà, j'en suis là . je continuerai probablement, mais pour l'instant, je pense aux vacances.

le code n'est pas "présentable", c'est du brut de "tests"

byte pinRh[10] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
float Rh[10]   = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
float Rh_pullup = 0.00;
float Vs = 0.00;
float Ve = 5.08;//tension de fonctionnement de la platine Arduino
//float Rh = 00.00;
float Rb = 33030 + 3302 + 269 + 17.7; //36618//résistance connue (mesurée avec un multimètre)
void setup() {
  Serial.begin(115200);
  pinMode(2, INPUT_PULLUP);
  for (int f = 0; f <= 10; f++) {
    pinMode(pinRh[f], INPUT);
  }
  Serial.println(F(" mettre Rb égale à Rh"));
  Serial.println(F(" assurez vous que sa valeur excate à été renseignée dans les déclarations"));
  //calcul des valeurs des 10 résistances de pullup des entrées 2,3,4,5,6,7,8,9,10,11,12
  Vs = Ve - ((analogRead(A9)) * (Ve / 1023));
  Serial.println (Vs);

  for (int f = 0; f <= 2; f++)
  {
    //Serial.println(f);
    for (int g = 0; g <= 2; g++)
    { delay(50);
      Serial.print(F(" D")); Serial.print(pinRh[g]); Serial.println(" input");
      pinMode(pinRh[g], INPUT); // toutes les entrées en haute inpédance
    }
    delay(50);
    pinMode(pinRh[f], INPUT_PULLUP);
    pinMode(pinRh[f + 1], INPUT_PULLUP);
    //pinMode(pinRh[f+2], INPUT_PULLUP);
    Serial.print(F(" D")); Serial.print(pinRh[f]); Serial.print(" passe en input_pullup  "); Serial.println((1023 - analogRead(A9)));        // sauf celle dont c'est le tour d'etre calcule
    Serial.print(F(" D")); Serial.print(pinRh[f + 1]); Serial.print(" passe en input_pullup  "); Serial.println((1023 - analogRead(A9)));
    //Serial.print(F(" D"));Serial.print(pinRh[f+2]);Serial.print(" passe en  input_pullup  "); Serial.println((1023-analogRead(A9)));
    Serial.println(F("et sont raccordées au point milieu du pont diviseur"));
    delay(1000);
    Vs =  (Ve - (analogRead(A9)) * (Ve / 1023));
    Serial.print(F(" Vs/Rh = ")); Serial.print (Vs); Serial.println(F("  "));
    Serial.print(F(" Vs/Rb = ")); Serial.print (Ve - Vs); Serial.println(F("  "));
    Rh[f] = 0.0;
    float tampon1 = Ve * Rb;
    Serial.print(F("     Ve*Rb = ")); Serial.print(tampon1);
    //Vs = (Ve-(analogRead(A9)) * (Ve / 1023));
    Vs = ((analogRead(A9)) * (Ve / 1023));
    //Serial.print(F(" Vs = "));Serial.println((analogRead(A9)*(Ve/1023)));
    float tampon2 = tampon1 / Vs;
    Serial.print(F("     Ve*Rb/Vs = ")); Serial.print(tampon2);
    float tampon3 = tampon2 - Rb;
    Serial.print(F("     Ve*Rb/Vs-Rb = ")); Serial.println(tampon3);
    Rh[f] = tampon3;
    Serial.print(F("     Rh = ")); Serial.println(Rh[f]);


    //Rh[f] = (((Ve * Rb) / Vs) - Rb);
    //Serial.println(Rh[f],8);
    delay(2000);
  }
  for (int f = 0; f <= 2; f++) {
    Serial.print(F("resistance de pull up de l entree D"));
    Serial.print(pinRh[f]);
    Serial.print(F(" "));
    Serial.println(Rh[f]);
    //Serial.print(F("resistance de pull up de l entree D"));
    //Serial.print(pinRh[f+1]);
    //Serial.print(F(" "));
    //Serial.println(Rh[f+1]);
  }
  //Serial.print(F("     Rh = ")); Serial.println(Rh);
  Serial.println(" ");

  while (1);
}

void loop() {
  Serial.println(analogRead(A9));
  //Serial.println(F("   Vs =(Ve/(Rh+Rb))*Rb"));
  //Serial.print(F("     Rh = ((Ve*Rb)/Vs)-Rb"));
  //Vs = Ve - (analogRead(A8) * (Ve / 1023));
  Rh_pullup = (((Ve * Rb) / Vs) - Rb);
  Serial.print(F("     Rh = ")); Serial.println(Rh[0]) ;
  Serial.println(" ");

  //calcul_Rb();

  // if(Rb<=Rh){pinMode(D3,INPUT_PULLUP);}
  Serial.println(F(" "));
  Serial.println(F(" "));
  while (1);
}
/*
  void calcul_Rb(){
  //Serial.print(F("     Vs = "));Serial.println(Ve-(analogRead(A8)*(Ve/1023)));
  //Serial.print(F("     Ve = "));Serial.println(Ve);
  //Serial.print(F("     Rh = "));Serial.println(Rh);
  //Serial.println(F("Rb=((Ve*Rh)/Vs)-Rh"));
  Rb = 0.0;
  float tampon1 = Ve * Rh;
  //Serial.print(F("Ve*Rh = "));Serial.println(Ve*Rh);
  Vs = Ve - (analogRead(A8) * (Ve / 1023));//4096));//1023));
  //Serial.print(F("     Vs = "));Serial.println(Ve-(analogRead(A8)*(Ve/1023)));
  float tampon2 = tampon1 / Vs;
  //Serial.print(F("     Ve*Rh/Vs = "));Serial.println((Ve*Rh)/Vs);
  float tampon3 = tampon2 - Rh;
  //Serial.print(F("     Ve*Rh/Vs-Rh = "));Serial.println(((Ve*Rh)/Vs)-Rh);
  Rb = tampon3;
  //Serial.print(F("     Rb = ")); Serial.println(Rb);
  }
*/

En parallèle, simple erreur sans suite.

Pour avoir RH, j'ai été paresseux,le l'ai lu dans la datasheet (graphe V=f(i) pour l'entrée pullup, 140mA pour 5V soit 35kΩ)

Dans le code le calcul de Vs est mis en commentaire.

Je suis à Marseille, ce serait des vacances si il n'y avait pas cette chaleur et tout le bricolage à faire....
Bonnes vacances à toi.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.