Pin gegen Masse UND gegen andere Pins abfragen?

Ich habe folgendes Problem:

ich würde gerne einen Input Pin (z.B. 1) sowohl gegen Masse abfragen (noch kein Problem => INPUT_PULLUP => if 1 == LOW => usw.) als auch gegen andere Pins (z.B. 2 & 3).
Also: ist Pin1 mit Pin2 oder Pin1 mit Pin3 verbunden…?

Vielleicht als Beispiel zum besseren Verständnis das Prinzip des Spiels “heißer Draht”:
-der Draht, der nicht berührt werden darf ist GND (das ist unumgänglich)
-der Ring ist Pin1
-Start- und Zielkontakte sind Pin2 & 3

Kann ich durch einen Input-Pin eine HIGH/LOW-Statusänderung an einem anderen Input-Pin erreichen?

Habe zum Thema bisher nichts gefunden und frage liebe nochmal nach, bevor ich auf gut Glück Pins auf meinem Arduino miteinander verbinde…

Pin 0 und 1 solltest du dafür nicht verwenden. Warum willst du gegeneinander abfragen?

Dein Heißer Draht wird mit GND verbunden. An den Pin, mit dem du abfragen willst, setzt du einen EXTERNEN Pullup (interner Pullup kann hier in dem Beispiel zu Problemen führen). WENN PIN == LOW => GAME OVER

Die Pin Nummer war für die Theorie rein zugefällig gewählt, da bin ich nicht gebunden.

Ob interner oder externer PULLUP,… soll mir beides recht sein. Habe aber mit dem internen noch nie Probleme gehabt.

Kontakt Pin mit Draht(GND) … wie gesagt, kein Problem, das abzufragen… aber ich hätte gerne noch einen Zielkontakt, der unbedingt gegen den PIN abgefragt werden muss, bzw durch Kontakt mit dem Pin eine Statusänderung HIGH<->LOW erhält.

derGeppi:
… aber ich hätte gerne noch einen Zielkontakt, der unbedingt gegen den PIN abgefragt werden muss, bzw durch Kontakt mit dem Pin eine Statusänderung HIGH<->LOW erhält.

Du willst es demnach „doppelt gemoppelt“ :slight_smile: Das ist überflüssig. Bei den Arduinos kann man sich eigentlich immer darauf verlassen, dass sie genau das tun, was man programmiert. Es genügt, wenn Du den „Kurzschluss“ einmal behandelst/abfragst.

Gruß

Gregor

Fühle mich etwas missverstanden. Entschuldigt, falls ich mich unklar ausgedrückt habe...

Ich möchte mit dem zusätzlichen Kontakt gegen den anderen Pin keinen Kontakt mit dem Draht abfragen, sondern ob ich zum Beispiel eine bestimmte Etappe auf der Drahtstrecke oder den ZIEL-Kontakt erreicht habe und dann ein anderes Ereignis auslöse (Zeit stoppt, Tonausgabe, Lichtsignal etc.)..

Dann musst du diesen Kontakt/Etappe vom Heißen Draht selber isolieren. Mach erst einmal eine Skizze wie der ganze Ablauf sein soll.

derGeppi:
Fühle mich etwas missverstanden. Entschuldigt, falls ich mich unklar ausgedrückt habe…

Ich möchte mit dem zusätzlichen Kontakt gegen den anderen Pin keinen Kontakt mit dem Draht abfragen, sondern ob ich zum Beispiel eine bestimmte Etappe auf der Drahtstrecke oder den ZIEL-Kontakt erreicht habe und dann ein anderes Ereignis auslöse (Zeit stoppt, Tonausgabe, Lichtsignal etc.)…

Sorry, aber verstehen2kann ich das immer noch nicht.
Wie schon von sschultewolter geschrieben, solltest du unbedingt ein Schaltbild liefern.

Ich hoffe mal, daß das angehängte Bild die Problemetik ganz gut beschreibt:

gelb - Spieler-Ring (beliebiger PIN)
schwarz - Draht (GND)
blau - (Start-Kontakt zusammen mit gelb)
grün - (Ziel-Kontakt zusammen mit gelb)

Vielen Dank auch für alle alternativen Lösungsvorschläge, wie ich das Spiel umsetzen könnte, aber es geht mir nur um die Machbarkeit DIESER Vorgabe bzw. um meinen Lösungsansatz von Kombination Pullup <=> Pulldown…

Ich würde den Ring an GND anschliessen.
Dann kannst Du die anderen drei Punkte an drei Arduino-Pins mit PULLUP anschliessen und erkennst problemlos jeden Kontakt.
Start und Ende natürlich isoliert vom blauen Draht.

Absolut richtig... aber leider nicht die Antwort auf meine Frage :wink: Sorry..

Der Draht MUSS GND sein,.. daran führt (für mich) kein Weg vorbei.

Also nochmal weg von der Vorstellung "heißer Draht" und zum Kern. Meine Überlegung ist:
-Pin X ist Input mit Pullup(high)
-Pin Y ist Input mit Pulldown(low)
wenn die beiden nun Kontakt haben, bekomme ich dann bei Y eine Zustandsänderung von low => high?

Nach ein wenig überlegen bin ich nun auf folgende Lösung gekommen (siehe angehängtes Bild):

Einen Input_pullup einfach an einen NPN-Transistor hängen und mit dem zweiten Input_pullup gegen GND ziehen…

Kann/darf man das so machen oder stehen dem Elektroniker da die Haare zu Berge? :grinning:

#define in1 9
#define in2 A0

void setup() {
  pinMode (in1, INPUT_PULLUP);
  pinMode (in2, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  int in1state = digitalRead(in1);
  int in2state = digitalRead(in2);
  Serial.print("Input1 is: ");
  Serial.print(in1state);
  Serial.print("\t");
  Serial.print("Input2 is: ");
  Serial.println(in2state);
  delay(1000);
}

das Programm hat zumindest nix dagegen und der Arduino lebt auch noch :wink:

derGeppi:
Nach ein wenig überlegen bin ich nun auf folgende Lösung gekommen (siehe angehängtes Bild):

Einen Input_pullup einfach an einen NPN-Transistor hängen und mit dem zweiten Input_pullup gegen GND ziehen..

Das verstehe wer will, ich nicht.

Der interne Pullup dient dazu, den Eingang des Arduino auf ein definierten Zustand (HIGH) zu bringen.
Wie willst du die gleich zweifach und auch nochh gegen GND schalten ?

Die Frage ist warum muss der Draht Ground sein

Macht nix. Ich bin geduldig :wink:

Kommen wir doch nochmal zum Beispiel "heißer Draht"..

Abfrage 1: berührt PinX (der "Ring" im Prg-Beispiel A0) GND(den Draht)?
nein, A0 bleibt HIGH... ja, A0 wird LOW
Abfrage 2: berührt PinX den Kontakt von PinY (also die Base des Transistors / "Ziel"-Kontakt)?
nein, Pin9 ist HIGH... ja, PIN9 ist LOW

Somit kann ich sowohl einen Pin gegen GND als auch gegen einen anderen PIN abfragen. Das ist das, was ich wollte :slight_smile:

Natürlich ist jeder von Euch genannte Vorschlag einen heißen Draht umzusetzen bestimmt weniger kompliziert, aber ich muss den Draht(GND) noch um andere Dinge erweitern, die darauf aufbauen, daß er die Bezugsmasse ist.

Deswegen nur abschliessend die Frage: kann man wie im Bild so machen, fehlen noch Schutzwiderstände oder reichen die internen Pullups?

chefin:
Die Frage ist warum muss der Draht Ground sein

Er ist fest mit einem Metallgehäuse verbunden, das durch Netzanschluss (12V) bedingt GND hat

derGeppi:
Deswegen nur abschliessend die Frage: kann man wie im Bild so machen, fehlen noch Schutzwiderstände oder reichen die internen Pullups?

Ich verstehe deine Schaltung mit dem Transistor nicht.
Besser wäre ein richtiges Schaltbild, auch für dich zum lernen.

So in etwa :slight_smile:

Wie gesagt: A0 ist der Ring, GND der Draht und Pin9 ist Ziel.
A0 und 9 sind Input_pullup.
S1 und S2 simulieren den Kontakt Ring+Draht sowie Ring+Ziel.

Auf dem Breadboard funktioniert es ja bereits so… Aber vielleicht erkennt ja hier noch irgendjemand Gefahren für den kleinen Arduino :wink:

Leg doch einfach Input1 ans Gehäuse, Input 2-x an deine Zwischenschalter und GND auf den Ring.

Dem Gehäuse ist es egal. Deine Spannung sollte Potentialgetrennt sein. GND ist am Netzteil eigentlich nie physikalisch definiert, sondern willkürlich festgelegt. Wir benutzt in Europa fast überall den Minus als GND. Technisch kann man aber auch den Plus als GND benutzten. Man muss dann nur alle Schaltungen anders Zeichnen.

So wie wir mal Minus an Schalter legen und auf Low abfragen oder mal Plus an den Schalter legen und auf High abfragen. Funktionieren tut beides.

Also spricht von der technischen Seite her nichts mehr dagegen, es so zu machen wie im letzten angehängten Schaltbild (In1ToIn2)?

Der verwendete Transistor ist übrigens ein BC547, falls das noch irgendwie wichtig ist :wink:

Dann kann ich das Thema ja als gelöst betrachten.

Nochmal vielen Dank für alle Hilfeversuche! Auch wenn alle Ansätze, das Spielprinzip auf eine andere Weise zu lösen, bestimmt einfacher sind (das weiß ich), so widersprechen sie leider den mir gegebenen Rahmenbedingungen, die ich nicht einfach ignorieren und über den Haufen werfen kann/darf.

Es ging mir nur um die Frage, wie ich mit einem Input-Pin einen zweiten Input HIGH <=> LOW ziehen kann.
Das Warum diente nur zur besseren Vorstellung, aber sollte eigentlich nicht zum Thema gemacht werden :wink: