Attiny85 mehrere Taster an Analog Pin, Werte ermitteln

Hallo !

Bin gerade mit meinem Attiny85 am basteln. Über analogRead möchte ich 4 Taster abfragen. Der analoge Eingang ist ohne PullUp aufgebaut, da ich mit einem randomseed(analogpin) zufällige Zahlen erhalten möchte. Danach schalte ich den internen PullUp mit digitalWrite(analogPin, HIGH); ein.

Soweit so gut. Nun kann ich am Arduino per serieller Ausgabe die Werte anzeigen lassen, die mir die Widerstandsreihe an den Tastern liefert. Diese Werte habe ich mit +/- 10 in einer IF Abfrage abgefangen und damit 4 Taster sozusagen simuliert.

Wie mache ich das aber auf dem Attiny ? Wollte eben einfach eine LED blinken lassen, mit dem Wert, der gerade beim analog Pin ankommt...aber 855x der LED zuschauen ist dann doch etwas doof :D

Leider habe ich auch nicht so ein USB Kabel um den Attiny dann per SoftwareSerial mit dem PC zu verbinden. Dann wollte ich eben einfach die Zahlen per 4 LEDs anzeigen lassen, das würde mit zählen ja noch gehen, also Tausender, Hunderter, Zehner und Einer...so wie in der Grundschule (aber da kannte ich noch kein IF)

Habe dann aber eben aufgegeben (was auch an der Uhrzeit liegt) :(

Verstehe jetzt nicht genau, was du mir sagen möchtest. Evtl. hilft dir mapping weiter (weiß gerade nicht, ob der kleine das unterstützt).

map(actValue, minValue, maxValue, 0, 255) minValue = kein Taster gedrückt maxValue = Alle Taster gedrückt

Also ich habe 4 Taster am analog Eingang mit je einem 100K Ohm Widerstand. Dadurch erhalte ich nun Zahlen zwischen 500 bis 800. Beim Arduino habe ich diese Werte per serieller Ausgabe anzeigen lassen und im Programm entsprechend angepasst. Also wenn Wert 500-520 dann bedeutet das Taster 1. Wert 650-670 Taster 2...usw.

Beim Attiny habe ich aber keine Anzeige und die Werte scheinen anders zu sein, da nur ein Taster reagiert mit dem gleichen Schaltungsaufbau. Bei beiden habe ich den PullUp aktiviert, daran kann es nicht liegen.

Also ich muss nur wissen, wenn ich Taster 1 drücke, was für Werte ich dann am analog Pin habe um diese entsprechend auszuwerten. Vor allem werde ich später andere Widerstände benutzen und dann ändern sich die Werte wieder.

Ach mir fällt gerade ein....das kann man doch bestimmt berechnen...aber später werde ich das ganze nicht mit 5V sondern 5,3V laufen haben, dann ändert sich sicher wieder alles?!?

Wie sieht deine Schaltung genau aus? Schaltest du die Taster in Reihe? Wenn ja, was geschieht, wenn Taster 3 gedrückt wird. Kommt da der gleiche Wert raus wie Taster1 und Taster 2?

100k hört sich nach viel zu hoch an.

Wo sollen später die 5,3V herkommen und wieso 5,3V?

Heho, was machst du bei analogen Messungen mit einem Pullup? Der gehört da überhaupt nicht hin. Kein wunder das du immer das selbe ergebniss erhältst. Es liegt ja immer 5v an durch den pullup. Noch dazu bin ich mir nicht sicher ob es überhaupt ein gültiger zustand ist einen Pin als ADC input zu betreiben und diesen dann den internen pullup zu verpassen. Also mal ganz schnell weg mit der idee. Ansonsten kann ich dir noch raten das du die Widerstände eventuell anders berechnest wenn es nicht funktioniert.

Mfg
his

Der interne Pullup ist definiert zwischen 20k und 50k.
Also für den Zweck nicht geeignet.

Edit:

geht doch.
Selbst mit den großen Toleranzen kriegt man das Überschneidungsfrei hin:
Zwischenablage02.jpg

später werde ich das ganze nicht mit 5V sondern 5,3V laufen haben, dann ändert sich sicher wieder alles?

Nicht wenn du “normal” misst ( ohne analogReference zu verstellen ), und deine Taster/Widerstände mit den “nom. 5V” vom Arduino versorgst.

Zu deinem 100k Widerstand: Schau dir mal eine Schaltung von “LCD mit Keypad” an. z.B.
http://linksprite.com/wiki/index.php5?title=16_X_2_LCD_Keypad_Shield_for_Arduino
Die Widerstände sind im Bereich von 330 bis 3.3k …
Die Werte sind nicht kritisch, aber ein Button sollte 0, kein Button 1023 (geht auch umgekehrt)
und die anderen irgendwas deutlich unterschiedliches dazwischen liefern.

edit: 0 … 1023 natürlich, statt der “5V” Bezeichnung

Keiner versteht mich...sorry, hatte die Wolldecke noch im Mund :D

Also noch mal. 1. Es funktioniert alles ! 2. Den PullUp kann man sehr wohl verwenden, nämlich dann, wenn man keinen eigenen in der Schaltung hat.

Die Seite die ich damals gefunden hatte, finde ich nicht mehr. Hier aber was ähnliches: http://forum.arduino.cc/index.php/topic,8558.0.html

Den Grund warum ich keinen PullUp in der Schaltung habe, habe ich im ersten Posting stehen. Alle Pins sind belegt und ich brauche ein randomseed(analogpin) um eine vernünftige zufällige Zahl zu erzeugen.

Bei der Abfrage habe ich keinen PullUp, bedeutet, der analoge Pin liefert mir irgend welche absurden Zahlen, genau richtig für die random Funktion (wie auch in der Reference zu lesen ist) Danach schalte ich den PullUp ein und ich habe saubere Werte. Und dann funktioniert alles so, wie guntherb so schön geschrieben hat.

Bedeutet, alle 4 Taster werden ohne Probleme erkannt, aber NUR weil ich mir vorher die Werte am Arduino habe anzeigen lassen. Jetzt auf dem Attiny passt das aber nicht mehr, bedeutet also, das irgend was anders ist.

Meine eigentlich Frage : Wie kann ich nun die Werte herraus finden (berechnen ?) die am analog Pin nun auf dem Attiny raus kommen ? Warum auch immer, sind die Werte anscheinend anders als auf dem Arduino. Leider kann ich so was nicht berechnen, habe auch keinen Anhaltspunkt wie ich da dran gehen soll.

Letzte Sache zu den 5V und 5,3V : Den Attiny85 Programmiere ich über den Arduino. Der Arduino liefert mir 5V. Wenn der Attiny später eigenständig läuft, werde ich 2x3V Knopfzellen verwenden (2032 oder so was). Da maximal nur 5,5V erlaubt sind, schalte ich eine Diode davor. Diese hat einen Spannungsabfall von ca. 0,7V, bleibt 5,3V als Versorgungsspannung übrig.

EDIT: Ach super ! Da steht ja alles ! Hab die Werte grad irgend wie übersehen.

@guntherb Wie macht man denn so was ? Ohmsche Gesetz kann ich, aber es kommt ja nicht nur auf die einzelnen Widerstände an, bei mir hab ich alles mit 100KOhm gemacht und erhalte ja auch vernünftige Werte von 500 - 900 für die 4 Taster. Das muss ja irgend wie anhand des Gesamtwiderstandes aufgeteilt werden ?

EDIT2: Durch den Link von michael_x und der dort angezeigten Tabelle habe ich nun fast die Lösung gefunden ! Es handelt sich um einen Spannungsteiler. Vor 10 Jahren hab ich auch schon mal was damit zu tun gehabt. Damit erhalte ich genau die Spannungen die auch in der Tabelle zu sehen sind. Nun muss ich nur noch heraus finden, was es mit den 8Bit und 10Bit auf sich hat (siehe Tabelle) und wie ich damit meine Werte berechnen kann. Hier wird sich der Attiny sicher auch vom Arduino unterscheiden. Lässt sich aber rausfinden.

Captain-DJ:
@guntherb
Wie macht man denn so was ?
Ohmsche Gesetz kann ich, aber es kommt ja nicht nur auf die einzelnen Widerstände an, bei mir hab ich alles mit 100KOhm gemacht und erhalte ja auch vernünftige Werte von 500 - 900 für die 4 Taster.
Das muss ja irgend wie anhand des Gesamtwiderstandes aufgeteilt werden ?

Dann frag doch einfach nach der Berechnung eines Spannungsteilers… :slight_smile:
Meine Schaltung ist so:
vom AD-Pin gehen die Widerstände R1-R4 auf jeweils ihren Taster nach GND.
Wenn der interne Pullup eingeschalten ist, dann kann man die Spannung, die am AD-Eingang anliegt so Berechnen:
UAD = R1/(R1+RPullup)*5V

bzw. wenn ich gleich den AD-Wert ausrechnen will:
AD-Wert = R1/(R1+RPullup)*1023

ich habe dir das Exelsheet, in dem die Abstände angezeigt werden mal zum Spielen drangehängt.
Die farbigen Balken zeigen dir an, in welchen Bereich sich die AD-Werte bewegen können über die Streuung des Pullup.
Du mußt also auf Bereiche abfragen, z.B. “boolean Taste2pressed = (AD > 133 && AD <279);”
ACHTUNG 1: Die Toleranzen von R1-R4 sind NICHT berücksichtigt, sollten aber kaum ins Gewicht fallen.
ACHTUNG 2: Gleichzeitiges Drücken von Tasten führt zu falschen Ergebnissen.

Analoger_Tastenmultiplexer.xls (54.5 KB)

@guntherb: mit R1=0 hat Captain-DJ noch mehr Luft für seinen unbestimmten Pullup-Widerstand. Der Normal-Fall "Kein Taster" muss ja auch sauber erkannt werden. (Ein 200k Widerstand bei 5V ist auch schon recht hoch )

@Captain-DJ: das ist mehr Excel-Zaubern als Ohmsches Gesetz ;) Wie schliesst du die Widerstände an ?

Vcc - Pullup -+
              |
Pin ----------+-- R1 ---+-- R2 --+-- R3 --+-- R4 --+  
                         /        /        /        /
GND --------------------+--------+--------+--------+

so verfälschen mehrere Taster nicht das Ergbnis. Der erste gewinnt. (Im Gegensatz zu deinem Link).

Ja JETZT weiß ich auch wieder das man so was einen Spannungsteiler nennt :D Um auf die Werte zu kommen braucht man nur 3 Satz, sozusagen !

Ich habe mich mehr mit dem Programmieren beschäftigt, deshalb die einfache Lösung: analog Pin auslesen, +/- was dazu und fertig. Die Abfrage habe ich so gemacht wie du geschrieben hast, also einen Bereich abgefragt. Es hat ja schon funktioniert, nur stand ich etwas auf dem Schlauch weil ich eben diese serielle Ausgabe nicht hatte !

Nun muss ich mal sehen, warum ich am Attiny andere Werte habe als am Arduino. Vielleicht haben die unterschiedliche PullUp. Soweit ich bis jetzt herausgefunden habe, arbeiten beide mit einem 10Bit ADC.

Bedanke mich schon mal sehr für eure Hilfe !!!!

michael_x: @Captain-DJ: das ist mehr Excel-Zaubern als Ohmsches Gesetz ;) Wie schliesst du die Widerstände an ?

Vcc - Pullup -+
              |
Pin ----------+-- R1 ---+-- R2 --+-- R3 --+-- R4 --+  
                         /        /        /        /
GND --------------------+--------+--------+--------+

so verfälschen mehrere Taster nicht das Ergbnis. Der erste gewinnt. (Im Gegensatz zu deinem Link).

Nur hilft Excel nicht, wenn man nicht weiß wie man es ausrechnet :D

Ich hab es so wie du hier zeigst, bis auf die 5V, die hab ich nicht, aber das ist ja dann intern denke ich, sonst würde es ja nicht gehen.

michael_x: @guntherb: mit R1=0 hat Captain-DJ noch mehr Luft für seinen unbestimmten Pullup-Widerstand. Der Normal-Fall "Kein Taster" muss ja auch sauber erkannt werden. (Ein 200k Widerstand bei 5V ist auch schon recht hoch )

Alte Gewohnheit. So kann man auch Kurzschluss nach Masse und nach VCC erkennen und ausschliessen. Ist aber in dem Fall wohl nicht nötig.

Funktioniert ! Nun konnte ich neue Widerstände bestimmen und entsprechend das Programm darauf anpassen. Als ersten Widerstand habe ich einen 220 Ohm genommen. Der berechnete Wertebereich 4 - 11 passte am Arduino und am Attiny nicht ganz, am Arduino bekam ich Werte um die 30 angezeigt. Am Attiny funktionierte es wenn ich von 0 - 15 ausgewertet habe. Vielleicht ist der erste Widerstand etwas zu klein. Entweder ich erhöhe den etwas, oder der fliegt ganz raus...oder es bleibt so, mal sehen.

Habe nun 4 LED (Charlieplexing), einen Pipser und 4 Taster am Attiny85 !!!

EDIT: @guntherb

Mir fällt gerade auf, das meine Schaltung anders ist als deine in der Excel Tabelle ! Meine ist so wie michael_x geschrieben hat, also alle Widerstände in Reihe. So habe ich ja am letzten Taster alle Widerstände zusammen, bei dir nur den, der auch wirklich geschaltet wird.

Aber warum stimmen die Werte trotzdem ?

Captain-DJ:
Der berechnete Wertebereich 4 - 11 passte am Arduino und am Attiny nicht ganz, am Arduino bekam ich Werte um die 30 angezeigt. Am Attiny funktionierte es wenn ich von 0 - 15 ausgewertet habe.
Vielleicht ist der erste Widerstand etwas zu klein.

4-11 ist auch ein exrem enger Wertebereich.
Du muß ja nicht exakt die Grenzen aus dem Excel abfragen, du kannst die Grenze ja auch irgendwo in die Mitte legen.
Mit
min max
R1 220 4 11
R2 7,5k 136 285
R3 39k 494 717
R4 200k 851 947
könnest du die Grenzen so legen:
T1 = AD < 75;
T2 = AD > 75 && AD < 390;
T3 = AD > 390 && AD < 785;
T4 = AD > 785;

Captain-DJ:
Mir fällt gerade auf, das meine Schaltung anders ist als deine in der Excel Tabelle !
Meine ist so wie michael_x geschrieben hat, also alle Widerstände in Reihe.
So habe ich ja am letzten Taster alle Widerstände zusammen, bei dir nur den, der auch wirklich geschaltet wird.

Aber warum stimmen die Werte trotzdem ?

Die Werte stimmen nicht überein, aber dadurch dass die Toleranzen ja schon durch den Pullup so riesig sind, verschieben sich die Werte mit deiner Schaltung nur minimal. Aber das kannst du ja einfach prüfen, in dem du statt der Einzelwiderstände die jeweilige Summe der Widerstände in die Excel-Felder einträgst. Es ändert sich nicht viel.
Und wenn du die Grenzen so nimmst wie ich sie oben angegeben habe, ist das eh egal.

T4 = AD > 785;

Du hast den wichtigsten Fall vergessen, Günther:
T4 = (AD > 785 && AD < 1010);
keinTaster = AD > 1010;

:wink:

michael_x:

T4 = AD > 785;

Du hast den wichtigsten Fall vergessen, Günther:
T4 = (AD > 785 && AD < 1010);
keinTaster = AD > 1010;

:wink:

Du hast recht! :blush:
Grüße
Gunther