Multible Buttons über einen analogen Eingang abfragen - und zwar gleichzeitig!

Ich hab mir mit einem Arduino Micro und einer defekten Graupner MX12 Modellflugzeugsteuerung eine USB-Fernsteuerung für den Computer gebastelt, damit ich da fliegen kann.

Es gibt zwar die ein oder andere PC-Steuerung im Handel, die sind aber durch die Bank Mist: Entweder sind sie nicht empfindlich genug, nicht reaktionsschnell genug, haben nur einen Knopf, die Potis geben nacheinander den Geist auf oder sie beherrschen kein USB.

Mit der Zeit hab ich sie immer weiter ausgebaut, und nun hat sie zu den normalen vier analogen Achsen noch sechs Buttons, ein dynamisch beleuchtetes Display, einen Piezo-Piepser, kann zusätzlich zu ihrem "normalen" Aufgabengebiet noch ein paar Gimmicks wie bei der Einstellung der Maus-Empfindlichkeit bei Spielen zu helfen oder Idle-Drops verhindern, wenn ich mal schnell wo hin muss. Unter Anderem kann sie auch den Abspann-Song von Portal piepsen (da war mir mal langweilig).

Leider sind die Pins des Arduino damit komplett belegt, und nachdem ich nun auch noch einen Farbsensor einbauen will musste ich mir überlegen, wie ich den ein oder anderen Pin dafür freistellen könnte.

Wenn man in einschlägigen Foren sucht kommt immer wieder der Begriff der Widerstansleiter auf, was in diesem Fall aber nichts bringt, da man bei dem Einsatzzweck durchaus mehrere Knöpfe gleichzeitig drücken können will, und das geht damit nicht.

Also hab ich mir überlegt, ich bau mir einen Spannungsteiler aus einem Basiswiderstand und dazu in Reihe mehrere parallel geschaltete Widerstände, welche dann jeweils über einzelne Buttons zugeschaltet würden, was dann, wenn alle Widerstände von unterschiedlichen Werten wären, den Widerstandswert jeweils so verändern würde, dass ich aus der gemessenen Spannung über diesen zuschaltbaren Widerständen ermessen könnte, welche denn nun genau betätigt worden wären. Wasn Satz. :smiley:

Bei zwei Buttons geht das noch relativ Pi mal Daumen, schön wären aber drei oder vier (oder wie viele auch immer gehen). Bei dem Gedanken wurde mir klar, dass ich keine Ahnung habe, ob es eine allgemeingültige Formel gibt, mit der man solche Widerstände abhängig von der Anzahl der Buttons und vom Basiswiderstand berechnen könnte, und ich hab auf den ersten Blick auch nichts gefunden.

Meine Frage ist nun: Weiß jemand von einer Formel, mit der man die optimalen Widerstandswerte für sowas berechnen kann?

Hi Joghurt,
die Formel ist einfach, aber beliebig viele Buttons gehen wegen der Ungenauigkeiten nicht.
Der 1. Schalter kriegt nen 1kOhm, der zweite einen 2kOhm, der 3. 4kOhm, usw. (immer schön verdoppeln).
Aber nimm Präzissionswiderstände, max 1% Ungenauigkeit.
Du erzeugst damit eine Spannung, deren Wert die Schalter binär kodiert und analog gewandelt darstellt. Das zurückgewandelt und Du hast einen Binärwert for die Schalter. Allerdings mußt Du die Ungenauigkeisschwankungen rausrechnen (ein Bereich statt einem festen Wert). Bis 4 Knöpfe wür ich mir gute Chancen ausrechen, bei 8 weiß ich schon nicht mehr ob das paßt. Im Zweifel geht probieren über studieren.
MFG Mekanax

Das wäre aber nur Pi mal Daumen und nicht optimal, da Du ja nicht den Widerstand an sich misst (dann wärs natürlich durchaus optimal) sondern die Spannung an einem Teiler. :wink:

Über das Konzept könnte man es zwar grundsätzlich machen, allerdings wären dann die Abstände zwischen den Spannungen am Teiler bei Druck der einzelnen möglichen Buttonkombinationen unnötig gering, was zu weniger möglichen Buttons führen würde, bevor die Ungenauigkeitsschwankung im Verhältnis zur Nutzspannung zu groß wird, um eindeutige Ergebnisse erzielen zu können.

Hallo,

ich würde es auch mit Zweierpotenzen am Spannungsteiler versuchen. Das dürfte allerdings sicher nur bis 3 oder 4-Knöpfe gehen. Wenn du mehr brauchst, würde ich nicht mit Widerständen rummurksen sondern entweder I2C-Portexpander (z.B. PCF8574) oder Schieberegister nehmen. Es gibt auch Eingabeschieberegister wie den 4021.

Für solche Spannungsteiler nimmt man ein R-2R Netzwerk. So braucht man nur 1 Widerstandswert. Man braucht bei den Tastern aber wechsler nicht Schließer.

grüße Uwe

Hi Uwe,
recht hast Du, nur das mit den Wechselschaltern wäre vermutlich ein Neukauf... Bin von einfachen Tastern ausgegangen und da geht's nur so.
@Theseus: Und die andere Variante mit I2C, 995er Schieberegister etc. habe ich nicht erwähnt weil die nun mal mehr als einen freien Arduino-Pin brauchen... Weiß nicht ob der noch frei ist, klang aber anders.
MfG Mekanax

Na, das scheints doch zu sein! Danke! :slight_smile:

Ein I2C Expander braucht nur 2 Pins ( A4 und A5) SDA und SCL
Grüße Uwe

MCP23017 :smiley:
2-3 pins am arduino, wie uwe sagte a4 und a5 sowie D2 wegen interrupt ... et voilà und du hast 16 digitale eingänge.

Hast du die analogen auch schon alle belegt?

#define BUZZER 2

#define PIN_DISPLAY_LED 3
#define PIN_DISPLAY_SCLK 4
#define PIN_DISPLAY_SDIN 5
#define PIN_DISPLAY_DC 6
#define PIN_DISPLAY_RESET 7
#define PIN_DISPLAY_SCE 8

#define BUTTON_1 12 // RH
#define BUTTON_2 A4 // LH
#define BUTTON_3 11 // RA
#define BUTTON_4 A5 // LA
#define BUTTON_5 10 // RI
#define BUTTON_6 9 // LI

#define AXIS_RY A2 // LX
#define AXIS_LY A0 // LY
#define AXIS_LX A1 // RX
#define AXIS_RX A3 // RY

dann nimm den MCP23017, mach z.b. bank A output und Bank B input.
dan haste je 8 mehr, dann kannste A4 (UNO) / D2 (SDA Micro/Leonardo) und A5 (UNO) / D3 (SCL Micro/Leonardo) frei räumen und weiter oben auch die LEDs da mit dranhängen.
wenn du noch mehr analoges brauchst musste eben noch nen z.b. PCF8591 auch via i²c nehmen ...
kannst von beiden chips an die gleichen leitungen je 8 stk. hängen. sollte reichen :wink:

Achtung: Es geht hier um den Micro. Das ist die kleine Version des Leonardo. Bei ihm sind die I2C-Pins nicht A4&A5, sondern Pin 2 (SDA) und 3 (SCL). Der Leonardo hat außerdem noch zusätzliche analog Inputfähigkeiten A6 - A11 auf den Digital Pins 4, 6, 8, 9, 10, und 12.

Wenn ich seine definition und deinen post dann richtig deute hat er dann genug analoge frei und kann den 23017 o.ä. rein für digital i/o nehmen.
meinen letzten post hab ich dann mal angepasst, damit niemand verwirrt wird.