Anhand eines Tasters entweder I²C oder SPI Steuerung beginnen

Hallo, als Erstes möchte ich mich bei euch bedanken für die vielen guten Tipps , die ihr mit gegeben habt, denn Sie haben sehr viel geholfen.

Nun habe ich erneut eine Frage und zwar, geht es darum, dass ich mit meinem Arduino Mega2560 I²C und SPI devices ansteuern möchte. nun möchte ich einen Taster am arduino anbringen, mit dem ich dem Arduino sage, dass er sich die Steuerparameter, die er von einer GUI empfängt aus der SD karte ausliest und diese den Devices sendet(ansteuern). Ich dachte mir, dass ich jeweils eine Datei für die I2C Steuerung und eine für die SPI Steuerung anlege, in der die Parameter gespeichert werden.
Nun die Frage, wie kann ich das so lösen, dass wenn ich den Taster drücke, dass arduino weiß, ob er nun aus Datei aus der I2c. datei oder spi.datei auslesen muss?

Mein Ansatz wäre 2 taster zu verwenden und dies ganz einfach über den Pin, an dem der Taster angeschlossen ist abzufragen oder gibt es eine bessere Variante?

Danke vielmals.

milito:
Mein Ansatz wäre 2 taster zu verwenden und dies ganz einfach über den Pin, an dem der Taster angeschlossen ist abzufragen oder gibt es eine bessere Variante?

Kippschalter?

Ein Kippschalter würde sogar nach einem zwischenzeitlichen Stromausfall mit Neustart des Arduino seine Schaltstellung beibehalten, ohne dass sie irgendwo gespeichert werden müßte.

Ok, wie frage ich ihn dann ab, hat er dann mehrere zustände`?

Bzw. wie müsste ich ihn anbringen (siehe vorwiderstand usw und kommt dieser an digitalPin oder analog)?

milito:
Ok, wie frage ich ihn dann ab, hat er dann mehrere zustände`?

Einen Kippschalter schließt Du genau so an und fragst Du genau so ab wie einen Taster.

Also entweder direkt und über pinMode INPUT_PULLUP mit dem eingebauten PullUp-Widerstand des Arduino oder mittels eines externen PullDown-Widerstands und pinMode INPUT und Abfrage mit digitalRead.

Der einzige Unterschied zum Taster ist, dass ein Kippschalter zwei stabile Schaltlagen hat, an und aus, während ein Taster immer wieder in die Ausgangslage zurückfedert.

Ok, danke dir hab es verstanden :D. Doch noch eine frage, hat dieser Kippschalter drei zustände oder wieviele.

Also entweder direkt und über pinMode INPUT_PULLUP mit dem eingebauten PullUp-Widerstand des Arduino oder mittels eines externen PullDown-Widerstands und pinMode INPUT und Abfrage mit digitalRead.

Warum input_pullup, um die internen pull_up widerstand zu aktivieren? Warum nicht nur INPUT?
siehe hier link: Arduino Playground - Eingang

Und kann man die internen pull-up widrstände auf einen bestimmten Wert einstellen oder wie funktioniert das, nehmen die selbst einen geeigneten wert an ? Laut Atmel Datenblatt(20k - 50k)

milito:
Warum input_pullup, um die internen pull_up widerstand zu aktivieren?

Weil Du damit ein Bauteil in der Schaltung einsparst.

Du sparst die Kosten für einen Widerstand. Und Du sparst Dir Zeit und Lötzinn zum Verdrahten eines Widerstands.

Brauchst Du natürlich nicht. Wenn Du gerne Widerstände verbastelst und gerne lötest, nimmst Du natürlich immer externe Widerstände extra und dann INPUT. Beides ist möglich.

milito:
Und kann man die internen pull-up widrstände auf einen bestimmten Wert einstellen oder wie funktioniert das, nehmen die selbst einen geeigneten wert an ? Laut Atmel Datenblatt(20k - 50k)

Nein, Aussuchen kannst Du Dir den Wert für die internen PullUp-Widerstände nicht.
Du kannst sie entweder benutzen. Oder Du kannst es bleiben lassen und externe Widerstände verbasteln, um einen Schalter auszuwerten.

Ah jetzt verstehe ich es. d.h. wenn ich einen internen Widerstand verwende , reicht nicht pinMode(...,INPUT), sondern wenn dann pinMode(...,input_pullup).
Wenn es aber ein extern ist dann input , stimmst? Warum war es in dem link dann anders beschrieben?
Also und die andere frage ist, ist der interne pullup dann immer 20k oder 50? wie funktioniert das intern, nehmen die immer den gleichen wert an?

milito:
Doch noch eine frage, hat dieser Kippschalter drei zustände oder wieviele.

Kippschalter sind oft als Umschalter mit 3 Anschlüssen ausgeführt. Man schließt aber in diesem Fall nur zwei davon an und hat dann einen Öffner oder Schließer. Den gemeinsamen Anschluss musst du mit einem Ohmmeter rausmessen (oder eventuell ins Datenblatt schauen) und den an den Digitalpin anschließen - ist oft, aber nicht immer, in der Mitte. Der andere kommt auf Masse.

Die internen Pullups können schon etwas streuen, aber sie liegen alle um den gleichen Wert herum. Das ist in diesem Fall aber egal. So genau muss das hier nicht sein. Der ist hier nur zur Strombegrenzung da.

wäre es möglich vllt eine skizze zu bekommen, wie ich diesen kippschalter an dem arduino anschliessen kann?
Ja mir wäre es lieber das man 3 zustände hätte, da er nicht immer auslesen muss aus den dateien., wäre es möglich?
Wäre euch sehr dankbar, wenn jemand vllt eine skizze zur verfügung stellen könnte.

Danke sehr für eure tipps

milito:
Ah jetzt verstehe ich es. d.h. wenn ich einen internen Widerstand verwende , reicht nicht pinMode(...,INPUT), sondern wenn dann pinMode(...,input_pullup).

Korrekt. Mit INPUT_PULLUP wird der interne Pullup-Widerstand aktiviert. Der Widerstandswert wird vom Controller vorgegeben und kann von Dir nicht beeinflußt werden.

Mit INPUT wird der interne Pullup-Widerstand NICHT aktiviert und Du kannst wahlweise einen externen PullUp- oder PullDown-Widerstand verwenden. Mit Wahlmöglichkeit für die Ohm-Zahl.

milito:
Wenn es aber ein extern ist dann input , stimmst?

Ja, mit pinMode INPUT benötigst Du einen externen Widerstand in der Schaltung für einen Taster/Schalter, weil damit der interne PullUp-Widerstand eben NICHT AKTIVIERT wird und Du ja irgendwie den offenen Taster auf HIGH oder LOW ziehen mußt, damit eine digitale Schalter die Spannung am Pin korrekt auswerten kann.

milito:
Also und die andere frage ist, ist der interne pullup dann immer 20k oder 50? wie funktioniert das intern, nehmen die immer den gleichen wert an?

Auf den genauen Wert kommt es nicht an. Die internen PullUp-Widerstände sind so bemessen, dass sie ausreichend sind, um Taster und Schalter "mit kurzen Leitungen" anzuschließen und das Signal zuverlässig auszuwerten. Wenn Du den Taster einige Meter weiter an einer langen Leitung anschließen möchtest, nimmst Du besser einen externen Widerstand mit einer kleineren Ohm-Zahl (1K bis 4.7K).

Noch zu Deiner Frage vorher:
Ein einfach nur als "Kippschalter" bezeichnetes Bauteil hat normalerweise immer 2 Schaltstellungen. Allerdings gibt es diese Kippschalter manchmal zweipolig und manchmal dreipolig angeboten. Einen zweipoligen Kippschalter kann man als Ein/Aus Schalter verwenden und für die Auswertung in Digitalschaltungen reicht das. Einen dreipoligen Kippschalter kann man dagegen auch in analogen Schaltungen direkt als Umschalter zwischen zwei Funktionen benutzen (z.B. Heizung an / Kühlung an).

Also der Schalter halt drei Anschlüsse und i.d.R einen Umschalter (die gibts aber auch anders. Das ist beim Einkauf aber angegeben). Das heißt in der einen Postion ist der eine Kontakt mit dem Gemeinsamen verbunden und in der anderen Position der andere. Den gemeinsamen Anschluss kann man mit dem Ohmmeter bestimmen wenn man misst welche Kontakte jeweils geschlossen sind.

Sieht man auch am Schaltzeichen:
http://grund-wissen.de/_images/schaltzeichen-schalter-wechselschalter.png

Der Gemeinsame kommt dann an den Digital-Eingang. Einer der anderen Anschlüsse kommt an Masse. Wenn der Schalter in der einen Position ist, liegt der Digital-Pin über den Pullup auf HIGH. Wenn du den Schalter auf Masse legst, ziehst du den Pin auf LOW runter. Wie herum der schaltet (d.h. ob du einen Öffner oder Schließer nimmst) ist in deinem Fall eigentlich egal, da man das im Programm entsprechend anpassen kann. Wegen dem Pullup brauchst du daher nicht den anderen Kontakt auf Plus zu legen!

ok danke jurs und Serenifly, bei mir wäre aber ein dreipoliger doch besser, weil ich ja je nachdem entweder diie i2c oder die spi datei auslesen möchte und auch mal garnichts. Deshalb dachte ich an 3 zustände. z.b linksstellung = i2c, mitte=tue nichts und rechtsstellung= spi.
mit nur zwei zuständen, würde er doch immer auslesen, entweder SPI oder I2C oder nicht? Und das möchte ich vermeiden.
Wie werden überhaupt diese Stellungen vom kippschalter abgefragt, hat jede stellung seinen namen?

Wenn du das willst musst du den Schalter an zwei Digital-Eingänge anschließen und dann abfragen welcher von den zwei LOW ist. Wenn beide HIGH sind ist er in Mittelstellung. Mit einem Eingang kannst du nur zwei Zustände abfragen (HIGH oder LOW).

Und Achtung: einen Schalter mit 3 Schaltstellungen nehmen! Die gibts auch. Aber normalerweise haben die nur 2. z.B. sowas:
http://www.reichelt.de/Kippschalter/MS-500C/3/index.html?;ACTION=3;LA=2;ARTICLE=13154;GROUPID=3275;artnr=MS+500C

Bei "Ausführung" steht da " EIN - AUS - EIN"

EDIT: Link angepasst. Das vorher war ein Taster mit 2 tastenden Positionen und fester Mittelstellung

Serenifly:
Wenn du das willst musst den Schalter an zwei Digital-Eingänge anschließen und dann abfragen welcher von den zwei LOW ist. Wenn beide HIGH sind ist er in Mittelstellung. Mit einem Eingang kannst du nur zwei Zustände abfragen (HIGH oder LOW).

Und Achtung: einen Schalter mit 3 Schaltstellungen nehmen! Die gibts auch. Aber normalerweise haben die nur 2. z.B. sowas:
MS 500E: Kippschalter 6A-125VAC, 1x (Ein)-Aus-(Ein) bei reichelt elektronik

Bei "Ausführung" steht da " (EIN) - AUS - (EIN)"

Danke sehr :D. so einen habe ich gesucht. Und das bedeutet also (EIN) links auf einem digitalpin , aus geht auf GND und (EIN) rechts auf ditialpin, stimmt so der anschluss?

jurs:
Allerdings gibt es diese Kippschalter manchmal zweipolig und manchmal dreipolig angeboten. Einen zweipoligen Kippschalter kann man als Ein/Aus Schalter verwenden und für die Auswertung in Digitalschaltungen reicht das.

Das ist nicht immer was "2-polig" heißt, auch wenn es eigentlich so sein sollte. Bei Reichelt z.B. haben "2-polige" Schalter 2 Ebenen und "3-polige" haben 3 Ebenen

milito:
wäre es möglich vllt eine skizze zu bekommen, wie ich diesen kippschalter an dem arduino anschliessen kann?

Du verbindest zwei Pole vom Kippschalter wie folgt:

  • ein Pol ==> GND
  • ein Pol ==> digitaler Pin, z.B. Pin D5

In die setup-Funktion schreibst Du dann die Zeile:
pinMode(5,INPUT_PULLUP);
und aktivierst damit nach dem Start des Controllers den eingebauten PullUp-Widerstand am gewünschten Pin.

milito:
Ja mir wäre es lieber das man 3 zustände hätte, da er nicht immer auslesen muss aus den dateien., wäre es möglich?

Nein, nicht mit einem Kippschalter.
Mit zwei Kippschaltern hättest Du insgesamt vier Schaltstellungen:

  • beide Kippschalter OBEN
  • linker Kippschalter OBEN, rechter Kippschalter UNTEN
  • linker Kippschalter UNTEN, rechter Kippschalter OBEN
  • beide Kippschalter UNTEN

milito:
Danke sehr für eure tipps

Zur Abfrage des Schalters noch ein Tipp:

Mit PullDown-Widerstand in der Schaltung hat ein offener Schalter LOW, ein geschlossener Schalter HIGH
Mit PullUp-Widerstand (auch dem internen) in der Schaltung hat ein offener Schalter HIGH, ein geschlossener Schalter LOW.

Wenn der Schalter irgendwas ein- oder ausschalten soll, habe ich es mir angewöhnt, die Konstanten EIN und AUS zu definieren, insbesondere wenn ich Schalter mit PullUp-Widerständen auswerte.
#define EIN LOW
#define AUS HIGH

So dass man dann bei "invertierter Logik" einfach abfragen kann:
if (digitalRead(5)==EIN) ...

Und falls man die Schaltung dann doch ändert und z.B. externe PullDown-Widerstände einbaut und verwendet statt interner PullUp-Widerstände, braucht man nur die Definitionen für EIN und AUS zu vertauschen.

jurs:
Nein, nicht mit einem Kippschalter.

Doch, es geht mit einem Wechselschalter mit 3 Schaltstellungen, den man an zwei Pins anschließt. Die sind dann HIGH wenn der Schalter in Neutralstellung ist und sonst ist einer von beiden LOW. Es sei den ich habe mich bei dem Schalter den ich vorhin angegeben habe geirrt und es ist kein Wechsler. Das Datenblatt ist da leider etwas verwirrend (wieso kann das nicht wie bei Relais sein, die i.d.R. die Kontakte einzeichnen?)

Der hier hat 3 Stellungen und ist meiner Meinung nach ein Umschalter:
http://www.reichelt.de/Kippschalter/MS-500C/3/index.html?;ACTION=3;LA=2;ARTICLE=13154;GROUPID=3275;artnr=MS+500C

Vielleicht habe ich mich auch geirrt, und wenn ja sollte es das trotzdem geben.

EDIT: Link angepasst. Der andere Schalter war ein Taster mit fester Mittelstellung :s

ok hmm jetzt hat mich das verwirrt, sorry warum denn jetzt 2 kippschalter?
ich brauche 3 zustande in dem sinne, dass wenn ich den links stelle , die i2c datei gelesen wird , wenn ich ihn rechts stelle liest er die spi datei und wenn er in der mitte ist, soll er nichts auslesen bzw. nichts tun.
Ist das nicht mit einem kippschalter möglich?

Wenn ja wie schliesse ich es an?

milito:
Ist das nicht mit einem kippschalter möglich?

Nicht mit einem Kippschalter, der nur zwei Schaltpositionen hat.
Und zwar egal ob Kippschalter zweipolig oder Kippschalter dreipolig.
Wenn der Schalter nur zwei Schalterstellungen hat, kannst Du nur zwei Schalterstellungen auswerten.

Wenn Du drei Schaltstellungen auswerten möchtest, benötigst Du einen Schalter mit drei Schaltstellungen.

Das richtige Bauteil dafür hieße dann "Kippschalter, dreifach" (und NICHT "Kippschalter, dreipolig")!

"Kippschalter, dreifach" gibt es auch. Sind aber sehr viel seltener als "Kippschalter, dreipolig".

Serenifly:
Der hier hat 3 Stellungen und ist meiner Meinung nach ein Umschalter:
MS 500C: Kippschalter 6A-125VAC, 1x Ein-Aus-Ein bei reichelt elektronik

Ja, so ein EIN-AUS-EIN Kippschalter von Reichelt sollte dasselbe sein wie ein "Kippschalter, dreifach" (wie ihn die Firma Graupner nennt).