PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Widerstandsmessung mit Arduino



Modellbauer
03.12.2017, 00:36
Ich habe nun ein Material für mein Projekt mit der Lagebestimmung über den elektrischen Widerstand einer leitenden Bahn gefunden.
Versuche nun das Ganze über Arduino zu messen, habe mir zu diesem Zweck einen der üblichen Sketches zur Widerstandsmessung über Referenzwiderstände kopiert.
Hier der Code:


const int sensorPin = A0; // Analog input pin that senses Vout
int sensorValue = 0; // sensorPin default value
float Vin = 5; // Input voltage
float Vout = 0; // Vout default value
float Rref = 1000; // Reference resistor's value in ohms (you can give this value in kiloohms or megaohms - the resistance of the tested resistor will be given in the same units)
float R = 0; // Tested resistors default value


void setup ()
{
Serial.begin(9600); // Initialize serial communications at 9600 bps
}


void loop ()
{
sensorValue = analogRead(sensorPin); // Read Vout on analog input pin A0 (Arduino can sense from 0-1023, 1023 is 5V)
Vout = (Vin * sensorValue) / 1023; // Convert Vout to volts
R = Rref * (1 / ((Vin / Vout) - 1)); // Formula to calculate tested resistor's value
Serial.print("R: ");
Serial.println(R); // Give calculated resistance in Serial Monitor
delay(100); // Delay in milliseconds between reeds
}


Der Refernzwiderstand ist 1MegaOhm, da 1K zu schnell zu heiß werden, irgendwie.

Nun schließe ich das Ganze an und fahre die Bahn ab, bleibe dabei auf einem Punkt stehen und sehe auf dem Seriellen Monitor dass kurz zwei Werte zu sehen sind welche dann wieder verschwinden, das passiert einige Male. Ich öffne dann den Seriellen Plotter und sehe dass sich dies in gleichen Zeitabständen wiederholt, die Werte ändern sich dabei nicht.

Wieso kann ich nicht durchgehend den Widerstand auslesen?
Was habe ich hier übersehen?

Sisor
03.12.2017, 10:32
Hallo!

Deine Beschreibung ist etwas schwer zu lesen. Wenn ich dich richtig verstanden habe, hast du den oben genannten Code auf den Arduino gespielt und dein Ergebnis ist, dass du 'kurz zwei Werte siehst'.
Das Programm selbst ist ok, und ich schließe es erstmal als Fehlerquelle aus.
Meine Vermutung ist die Spannungsversorgung des Arduino, sodass der Arduino ständig resetet. Um das herauszufinden, ändere

void setup ()
{
Serial.begin(9600); // Initialize serial communications at 9600 bps
}

in

void setup ()
{
Serial.begin(9600); // Initialize serial communications at 9600 bps
Serial.println("Start...");
}

um. Wenn du jetzt auf dem Seriellen Monitor ständig 'Start...' liest, wird es wahrscheinlich an der Spannungsversorgung des Arduino liegen.

cdk
04.12.2017, 01:16
Der Refernzwiderstand ist 1MegaOhm, da 1K zu schnell zu heiß werden, irgendwie.
Ich weiß ja nicht wie der Schaltplan aussieht - aber der 1k-Referenzwiderstand sollte doch vermutlich auch nur an die 5V angeschlossen sein, oder? Dann sollte er aber nur 5V x 5mA = 25mW verbraten und davon wird kein normaler Widerstand heiß. Ich vermute also da liegt ein Problem mit dem Schaltungsaufbau vor...

Modellbauer
04.12.2017, 21:33
Also die Schaltung sueht so aus wie auf dieser Seite hier:
http://electronfun.com/project_4.php

Nur der eine Testwiderstand ist durch die Bahn ersetzt worden. Es handelt sich dabei um eine Leitende Bahn mit hohem Widerstand die ich mit einem Kontakt abfahren kann.

Ich habe auch, wie empfohlen, den Code geändert. Es kommt nur einmal "Start" am Anfang, dann nur die Messwerte.
So sieht das dann im Plotter aus wenn ich mich an einem Punkt der Bahn aufhalte.

33099

Die Abstände sind recht regelmäßig, keine Ahnung wieso das nicht konstant angezeigt wird, es ist auch nicht bei 100ms die ich als Messintervale angegeben habe.

cdk
04.12.2017, 22:03
Da ist was faul an Deinem Aufbau oder Du hantierst mit den falschen Widerständen. Ein 1k-R kann an 5V niemals heiß werden, wie gesagt.

Besorg Dir mal ein Multimeter und meß die von Dir verwendeten Widerstände nach. Meß dann auch scherzhalber mal die Spannung am 5V-Pin (nach GND natürlich). In DC-Stellung sollten 5V +- 0,2V anstehen, in AC-Stellung höchstens einige mV. Beide Messungen sind wichtig um die Güte der Arduino-Betriebsspannung zu beurteilen.

Wenn das ok ist dann laß mal Deine Bahn weg und bau das genauso auf wie abgebildet, und zwar wie dort mit 2x mindestens 220R. Und starte das Meßprogrammchen nochmal.

Der Referenzwiderstand sollte für die beste Meßauflösung in der Größenordnung des Meßwiderstands liegen - das wird dann also von Deiner Bahn bestimmt. Ich habe jetzt zwar nicht die Eingangswiderstände der Arduino-Analogeingänge im Kopf aber 1M-Ohm als Meß- oder Ref.widerstand dürfte ziemlich schon in der Grauzone liegen. Wenn Du wirklich so hochohmig messen willst (oder auch wenn's niederohmiger als 100R wird) mußt Du mehr externen Schaltungsaufwand treiben.

i_make_it
08.12.2017, 07:32
Ein Multimeter als Mindestausstattung an Messgeräten sollte wirklich vorhanden sein.

Und auch das Wissen wie man mißt ohne zum einen "Mist" zu messen und zum anderen das Messgerät zu beschädigen oder zu zerstören.

Heutige Kleinlastwiederstände haben üblicherweise 1/16W (früher 1/8W)

beim I=U/R

I=5V/1000Ohm (1kOhm)

I=0,005A=5mA

und P=U*I

P=5V*0,005A

P=0,025W

sollte ein 1/16 W Widerstand nicht heiß werden.

1/16W=0,0625W

0,025W=X
0,0625W=100%

X=(0,025W*100%)/0,0625W

X=40%

Also mal durchmessen ob der vermeintliche 1k Widerstand wirklich ein k hat.
(bei meinem letzten Einkauf in einer Conrad Filiale, hat es der Verkäufer bei 8 unterschiedlichen Widerständen geschafft zwei falsche einzupacken)
Kann also durchaus vorkommen, das man nicht das bekommt was man wollte.
Im Extremfall kann sogar mal ein Widerstand beim Umstellen der Produktionslinie mit dem falschen Wert gekennzeichnet sein und der wurde dann ausversehen nicht weggeschmissen sondern landete dann im Verkauf.
(hatte ich einmal 1993, allerdings war da Wert höher als der Ringcode angab)

Modellbauer
25.12.2017, 04:03
Nun habe ich das Ding mit Widerständen aufgebaut und es sieht nun wieder so aus:
33136
Sollte das nicht bei einer Messung auf dem selben Wert bleiben, schon weil es ein einfacher Widerstand ist?
Das Ganze sieht ziemlich ungenau aus.

i_make_it
25.12.2017, 14:47
Du rechnest munter mit "float" und "int".
Ich selbst vermeide float wo es nur geht, da die Verarbeitung deutlich langsamer ist als bei int.
Wenn ich mir mal kurz die Arduino Referenz ansehe:
https://www.arduino.cc/reference/en/language/variables/data-types/float/

Versuch doch mal als erstes:
Vout = (Vin * sensorValue) / 1023;
in
Vout = (Vin * (float)sensorValue) / 1023;
zu ändern.
Dann rechnest Du zumindest schon mal nicht mehr mit Äpfeln (int) und Birnen (float).

https://www.arduino.cc/en/Reference/Cast

Schneller wäre die ganze Berechung mit Int oder (wenn den 32 Bit benötigt werden) mit long durchzuführen.
Mann kann das ganze ja auf Millivolt oder Mikrovolt trimmen. Die Umrechnung in Volt und den Nachkomma Bereich ist dann nicht so schwer.

HaWe
25.12.2017, 15:21
Du rechnest munter mit "float" und "int".
Ich selbst vermeide float wo es nur geht, da die Verarbeitung deutlich langsamer ist als bei int.
Wenn ich mir mal kurz die Arduino Referenz ansehe:
https://www.arduino.cc/reference/en/language/variables/data-types/float/

Versuch doch mal als erstes:
Vout = (Vin * sensorValue) / 1023;
in
Vout = (Vin * (float)sensorValue) / 1023;
zu ändern.
Dann rechnest Du zumindest schon mal nicht mehr mit Äpfeln (int) und Birnen (float).

https://www.arduino.cc/en/Reference/Cast

Schneller wäre die ganze Berechung mit Int oder (wenn den 32 Bit benötigt werden) mit long durchzuführen.
Mann kann das ganze ja auf Millivolt oder Mikrovolt trimmen. Die Umrechnung in Volt und den Nachkomma Bereich ist dann nicht so schwer.

das stimmt nicht, (Vin * sensorValue) wird automatisch (implizit) zu float gecastet, weil einer der beiden Faktoren bereits als float vordefiniert ist.
Außerdem hat der OP sicherlich kein Timing-Problem mit float.

delay(100); // Delay in milliseconds between reeds

Modellbauer
31.07.2018, 03:00
Ich push das mal nach oben weil das Problem noch besteht und ich dazu eine weitere Frage habe:

Kann es sein dass die genannten Abstände durch die HArdware selbst, also durch deren Beschränkungen zustande kommen?
Wie kann ich das am Besten mit einem Oszilloskop durchmessen und bestätigen oder widerlegen?

HaWe
31.07.2018, 17:41
Ich push das mal nach oben weil das Problem noch besteht und ich dazu eine weitere Frage habe:

Kann es sein dass die genannten Abstände durch die HArdware selbst, also durch deren Beschränkungen zustande kommen?
Wie kann ich das am Besten mit einem Oszilloskop durchmessen und bestätigen oder widerlegen?

also ich messe selber Widerstände, und bei mir funktioniert es perfekt!
Guckst du: https://michaelsarduino.blogspot.com/2015/09/feuchtigkeitsensor-selber-bauen.html

Die Analogwerte (ADC) müssen nur noch per Dreisatz in Ohm umgerechnet werden, am besten in einem größeren Bereich per Eichmessungen.

Siro
31.07.2018, 18:21
Hallo Modellbauer,
für mich sieht es aus, als wenn Du eine Brumeinstrahlung auf dem Meßsignal hast.
In dem Bild (Ohmmeter.jpg) sieht es aus als ob da die oberen Halbwellen einer Brummspannung oder einer anderen Störung drauf liegen.

Ich würde zum Testen mal an den Meßeingang nach Masse einen 10 oder 100 µF Kondensator anschließen.
Wenn es Störungen sind, sollte das Signal dann sauberer aussehen.

Siro