Hallo,
ich habe wie im Bild unten mehrere Taster gemeinsam über 3 x 220 Ohm Widerstände miteinander verbunden und mit dem Analog Pin 5 des Arduino ausgelwertet. Der rechte Widerstand, der die Taster mit GROUND verbindet beträgt 1,5 KOhm.
Hab dann ein kleines Programm geschrieben, das die Werte ausliest und dann über den SerialMonitor ausgibt, welcher Knopf gedrückt wurde :
Jetzt zu meiner Frage : Sehr oft müssen die Werte von Breadboard zu Breadboard angepasst werden. Zum Beispiel funktionieren die obigen Werte für das aktuelle Steckbrett, bei einem anderen Steckbrett mit demselben Aufbau allerdings kann es sein, dass "Taste 1 gedrückt" oder "Taste 2 gedrückt" niemals erscheinen, weil es da um den Wert 20 veränderte Analogwerte gibt.
Wie ist das möglich ?
Kann man das ganze so umbauen, dass die Werte von Steckbrett zu Steckbrett konstanter sind als jetzt ?
P.S. : Die verwendeten Widerstände haben eine Toleranz von 1 % und die verwendeten Steckbretter sind beide von Elegoo.
Du prüfst auf einen sehr kleinen Wertebereich. Auch kannst du das mit if und else if so aufbauen, das du nicht auf einen Bereich prüfst, sondern nur einen Vergleich machst
nicht auf einen Bereich prüfst, sondern nur einen Vergleich machst
Ähm, da komm ich jetzt nicht so ganz mit. Ich kann ja nicht auf LOW oder HIGH prüfen, sondern nur auf einen Wertebereich oder ?
Mir gehts darum dass, falls ich das ganze ausbauen will (z.B. 6 statt bisher 3 Taster), dass ich dann gewisse feste "Wertebereiche" habe, mit denen ich arbeiten kann und ich nicht immer wieder von Steckbrett zu Steckbrett erst mit dem SerialMonitor die Werte auslesen und dann im Code anpassen muss.
du musst die Widerstände so wählen, das du am Analogpin einen möglichst grossen Spannungsbereich abdeckst. Deswegen sind identische Werte ungeeignet.
Dann von niedrig nach hoch mit else if und nur auf kleiner vergleichen. Dann kannst du u. U. über 10 Taster problemlos abfragen. bei weniger Taster und geschickter Kombination unter Umständen sogar 2 gleichzeitig gedrückte Tasten
UnoRookie:
Welche Werte wären denn ideal ?Ähm, da komm ich jetzt nicht so ganz mit. Ich kann ja nicht auf LOW oder HIGH prüfen, sondern nur auf einen Wertebereich oder ?
Du fragst nur ein kleines Intervall von 20 oder 40 ab. Dazwischen sind Lücken. Das entspricht einer Zielscheibe, wo zwischen den Ringen größere Lücken sind und alles was dort landet wird nicht bewertet.
Du solltest diese Lücken schließen. Am besten lässt du dir am seriellen Monitor auch den analogen Wert anzeigen und setzt die Intervalgrenzen dazwischen.
Ich habe das in den Code mit else-Schachtelung eingefügt.
Du fragst ja nur sehr enge Bereiche ab. Wenn du mal die Streuung nur über die Toleranz rechnest, fällt das teilweise schon aus deinem Fenster raus (Ich habe hier mal 5% Extremwerten gerechnet.) Und alle Ungenauigkeiten über Aufbau, schlechte Kontakte etc sind noch nicht mit drin.
Ich würde jeweils nur eine Schwelle zwischen zwei Schaltzuständen festlegen, und nur die abfragen.
Aber warum nimmst du nicht die Werte, die sich bewährt haben und im Web mehrfach gezeigt werden ?
Weil da Werte teils über 10k Ohm verwendet werden. Und Widerstände über 10k können von meinem Arduino-Durchgangsprüfer, mit dem ich meine ersten Lötversuche immer auf Kontakt überprüfe, nimmer ausgewertet werden. Ab 10k Widerstand ist der Zustand immer LOW => hat aber nix mit dem Thema zu tun.
@guntherb : Darf ich mal blöd fragen, wie du diese Werte berechnet hast ?
Bitte kaufe dir ein Multimeter, dann bist du diese Einschränkung los.
Hab ich bereits, sollte ich wahrscheinlich öfters verwenden
P.S. :
Um meine Grenzen aufzuheben (Salopp gesagt) :
Wenn man den 5V-Ausgang am Arduino über einen Widerstand mit einem AnalogPin verbindet, ab wann liegt dann der Wert 0 an (was ist also die "magische Obergrenze" für einen Widerstand beim auswerten über den AnalogPin) ?
Widerstände gibt es in verschiedenen Fertigungstoleranzen und aus unterschiedlichen Materialien, die auch unterschiedlich driften bei Temperatur und Alterung.
Bei solchen Sachen verwende 1% Metallschichtwiderstände, die kosten kaum mehr, sind aber hinreichend genau und stabil. Außerdem schau dir mal die Grundlagen eines R2R Netzwerkes an:
Da haben dieses Problem bereits helle Köpfe für dich gelöst. Das wird seit Jahrzehnten bei A/D und D/A Wandlern so gemacht. Du kaufst dir eine 100'er Tüte 1% Metallschicht. Untereinander sind Exemplare aus der selben Charge sogar noch genauer. Es zählt hier nicht der Absolutwert, sondern die Abweichung. Und du schaltest einfach für 2R zwei in Reihe ODER für R zwei Exemplare parallel. So erreichst du mit einem einzigen Wert die geringsten Abweichungen untereinander
UnoRookie:
Wenn man den 5V-Ausgang am Arduino über einen Widerstand mit einem AnalogPin verbindet, ab wann liegt dann der Wert 0 an (was ist also die "magische Obergrenze" für einen Widerstand beim auswerten über den AnalogPin) ?
NIE.
Du willst einen Spannungsteiler machen zwischen einem externen Widerstand und dem Innenwiderstand des Eingengs. Dieser ist erstens nicht konstant, weder absolut noch in der Zeit und damit Du null mißt muß der externe Widerstand mindestens 1000 mal größer sein als der Innenwiderstand. Bei einem Innenwiderstand in der Größenordnung von einigen MOhm verstehst Du das. Außerdem hat der A/D Converter im Atmega einen Sample and Hold Kondensator der in einer gewissen Zeit (einige µS) auf Endspannung geladen werden muß. Umdas sicher zu gewährleisten muß die Außenbeschaltung einen Ersatzwiderstand von ca 10KOhm haben.
Andere Thema: Du weißt schon daß bei dieser Schaltung (Spannungsteiler mit mehreren Widerständen) Du keine 2 gleichzeitig gedrückte Tasten erkennen kannst.