Wie kann ich zwischen mehreren Schaltkreisen unterscheiden?


7

Ich baue ein Puzzle für einen Fluchtraum. Ich möchte dem Benutzer 6 Drähte und 6 Klemmen geben und dann bestätigen, dass er die richtigen Drähte an die richtigen Klemmen angeschlossen hat (eins zu eins).

Mein erster (erfolgreicher) Versuch, dieses Rätsel zu implementieren, bestand darin, die Drähte an 6 PWM-Analogausgänge anzuschließen, die auf verschiedene Pegel eingestellt waren, und die Anschlüsse an 6 Analogeingangspins anzuschließen. Durch zeitliche Mittelung der Messwerte an den Eingangspins konnte ich feststellen, welche Drähte an welche Klemmen angeschlossen sind, falls vorhanden.

Ich habe derzeit keine Widerstände in den Schaltkreisen.

Da das Puzzle derzeit entworfen wird, kann der Benutzer seltsame Dinge tun wie:

  • Schließen Sie mehrere Drähte an denselben Anschluss an.
  • Verbinden Sie mehrere Drähte miteinander, ohne sie an eine Klemme anzuschließen.
  • Berühren Sie mehrere freiliegende Drähte und / oder Klemmen.

Meine Fragen beschränken sich auf zwei:

  • Ist mein aktueller Ansatz gefährlich, entweder für den Arduino oder meine Benutzer, und gibt es empfohlene Vorsichtsmaßnahmen, die ich treffen sollte?
  • Gibt es eine bessere (sicherere oder einfachere oder robustere) Möglichkeit, das Rätsel zu implementieren?

Ich bin ein Software-Ingenieur, aber ein absoluter Neuling, wenn es um echte Elektronik und Arduino geht. Nehmen Sie also bitte an, ich weiß nichts.

Antworten:


5

Betrachten wir zunächst die Logik Ihres Programms. Sie haben zwei Gruppen von Stiften: 6 Stifte, die an die Drähte angeschlossen sind, und 6 Stifte, die an die Klemmen angeschlossen sind. Das erste, was ich tun würde, ist zu vergessen, dass dies zwei verschiedene Gruppen sind. Angenommen, Sie haben nur 12 Pins, die der Benutzer auf eine bestimmte Weise verbinden muss. Auf diese Weise sind die meisten „seltsamen Dinge“, die der Benutzer tun könnte, wie das Anschließen von Drähten, kein Sonderfall mehr. Sie sind nur eine weitere ungültige Kombination. Jetzt müssen Sie für jedes Paar von Stiften unter diesen 12 bestimmen, ob sie miteinander verbunden sind oder nicht. Wenn ein Paar verbunden ist, das nicht verbunden sein sollte, haben Sie eine ungültige Kombination. Wenn ein Paar nicht verbunden ist, während es sein sollte, ist es wieder eine ungültige Kombination. Wenn jedes Paar den erwarteten Status hat (entweder verbunden oder nicht verbunden),

Nun zur Hardwareseite. Eine einfache Möglichkeit, um festzustellen, ob zwei Pins miteinander verbunden sind, besteht darin, einen auf INPUT_PULLUPund den anderen auf zu setzen OUTPUT LOW. Dieser zweite Pin sollte der einzige sein, auf den der Benutzer zugreifen kann, der a ausgibt LOW. Alle anderen freiliegenden Stifte sollten entweder INPUToder eingestellt sein INPUT_PULLUP. Wenn der erste Pin lautet LOW, wissen Sie, dass eine Verbindung besteht. Wenn dies angezeigt wird, sind HIGHdie beiden Pins nicht miteinander verbunden.

Hier ist ein Beispielprogramm, das dieses Prinzip demonstriert. Es durchläuft die 66 möglichen Paare, um zu überprüfen, ob sie verbunden sind oder nicht. Sie müssen nur das Innere ifdurch Ihren Code ersetzen, der die Kombination validiert.

const int PIN_COUNT = 12;
const uint8_t pins[PIN_COUNT] = {...};

void setup() {
    Serial.begin(9600);

    // Set all pins to INPUT_PULLUP.
    for (int i = 0; i < PIN_COUNT; i++)
        pinMode(pins[i], INPUT_PULLUP);
}

void loop() {
    // Loop over all pin pairs (pins[i], pins[j]).
    // Set pins[i] to OUTPUT LOW, then read pins[j].
    for (int i = 0; i < PIN_COUNT - 1; i++) {
        pinMode(pins[i], OUTPUT);
        digitalWrite(pins[i], LOW);
        for (int j = i+1; j < PIN_COUNT; j++) {
            if (digitalRead(pins[j]) == LOW) {
                Serial.print("pins ");
                Serial.print(pins[i]);
                Serial.print(" and ");
                Serial.print(pins[j]);
                Serial.println(" are connected together.");
            }
        }
        pinMode(pins[i], INPUT_PULLUP);
    }
}

Aus Sicherheitsgründen sollten Sie in Ordnung sein, solange die Benutzer keinen Zugang zu einer niederohmigen Masse oder Spannungsquelle haben. Insbesondere sollten die GND- und 5V-Pins nicht für den Benutzer zugänglich sein. Für zusätzlichen Schutz können Sie einen 1-kΩ-Widerstand mit jedem Pin in Reihe schalten. Dann sollten jedoch alle Pins, die nicht aktiv getestet werden, auf INPUTanstatt gesetzt INPUT_PULLUPwerden. Andernfalls können mehrere parallele Pullups mit dem Serienwiderstand konkurrieren.


1
Dies ist genau die Methode, die ich zum Testen von Entwicklungsboards verwende, die ich herstelle. Eine Abschirmung ist angebracht, die 50% der Stifte über 100r-Widerstände mit den anderen 50% verbindet. Durch Scannen der Stifte mit einem niedrigen Satz wird sowohl die ordnungsgemäße Kontinuität als auch die Kurzschlüsse zu anderen Stiften überprüft.
Majenko

1
Wunderschönen. Dies ist das Paradigma, das mir gefehlt hat. Mir war überhaupt nicht in den Sinn gekommen, dass ich tatsächlich schnell hintereinander unter verschiedenen Konfigurationen messen konnte. Meine Möglichkeiten, Dinge zu bauen, sind explodiert. Ich werde es ausprobieren.
Jonathan Dautrich

Das hat wunderbar funktioniert. Ich ziehe es meinem analogen Ansatz vor, da ich mir keine Gedanken über die Definition der erwarteten Spannungsbereiche für jeden Eingang machen muss. Und natürlich musste ich nicht alle 12 * 11/2-Kombinationen überprüfen, da ich wirklich nur wissen muss, welche Drähte an die einzelnen Klemmen angeschlossen sind (6 * 6-Prüfungen) - wenn zwei Klemmen oder zwei Drähte angeschlossen waren, ist dies der Fall Dies würde zwangsläufig zu einer falschen Kombination von Drähten führen, die an einen bestimmten Anschluss angeschlossen sind. Es ist jedoch wichtig, nach mehr als den erwarteten 6 Verbindungen zu suchen, um den Fall zu behandeln, in dem der Benutzer irgendwie alle Terminals überbrückt. Vielen Dank!
Jonathan Dautrich

3

Ich würde auch die Klemmen an die 6 analogen Eingangspins anschließen und 6 eindeutige Spannungen haben, eine pro Draht. Der Arduino liefert den Ausgang nur, wenn die 6 Drähte an den richtigen Anschlüssen angebracht sind. Mit anderen Worten, dann sieht der Arduino die richtige analoge Spannung an den jeweiligen Pins.

Ich persönlich würde dem Ausgang der PWMs einen RC-Tiefpassfilter hinzufügen . Weitere Informationen hier. Ihr PWM-Ausgang würde in den Vin gehen und dann würde der Vout in Ihr Kabel (dh den Analogeingang) gehen. Ein Filter pro Kanal.

Grundlegender RC-Filter

Der RC-Filter schützt den Arduino vor Kurzschlüssen zu + ve, Gnd und den anderen Pins und bietet ein wenig Schutz vor statischer Aufladung. Es wird auch Ihren Code vereinfachen.

Im Moment müssen Sie ausgefallenen Code implementieren, um die Spannung an diesen analogen Pins zu mitteln. Der RC-Filter würde diesen Code im Wesentlichen nicht benötigt.

Um den Wert des Widerstands und des Kondensators zu berechnen, den Sie benötigen: Es gibt einen sehr guten Artikel bei All About Circuits, der sich ausführlich mit diesem Thema befasst .

Um den Wert zu berechnen, müssen wir die Häufigkeit kennen:

Die Frequenz des PWM-Signals an den meisten Pins beträgt ungefähr 490 Hz. Auf der Uno-Karte und ähnlichen Karten haben die Pins 5 und 6 eine Frequenz von ungefähr 980 Hz. - Arduino Analog Write

Ich habe http://sim.okawa-denshi.jp/en/PWMtool.php verwendet , um die erforderlichen R & C-Werte mit einer sehr geringen Welligkeit (<60 mV) unter Verwendung gemeinsamer Werte zu berechnen. Ich habe meine Berechnungen auf 490 Hz gestützt, da die niedrigeren Frequenzen bei Tiefpassfiltern am schlechtesten abschneiden.

Ich schlage vor, Sie verwenden Werte von R = 10kund C = 4.7uF. Sie können mit diesen Werten spielen, bis Sie die gewünschte Ausgabe erhalten.

Eine letzte Sache, die ich in Betracht ziehen würde, ist, die Klemmen, die mit den analogen Pins verbunden sind, etwas zu schützen. Dies kann ein kleiner Widerstand in Reihe oder ein paralleler 5,1-V-Zener (der Pin hat diesen möglicherweise bereits?) Oder eine Kapazität parallel sein.


EDIT:
Ich hatte gerade eine Gehirnwelle - Sie müssen die PWMs nicht verwenden, um die verschiedenen analogen Werte auszugeben - Sie könnten stattdessen eine Spannungsteilerschaltung verwenden. Kein RC-Filter erforderlich. Zum Beispiel:

schematisch

simulieren Sie diese Schaltung - Schema erstellt mit CircuitLab


Edit # 2:

Jonathan schrieb:
Der einzige kleine Nachteil, den ich bemerke, ist, dass wenn der Benutzer zwei Drähte an denselben Anschluss angeschlossen hat, dies alle an den anderen Anschlüssen gelesenen Spannungen beeinflusst, was es schwierig macht, dem Benutzer eine inkrementelle Rückmeldung über die Anzahl der Drähte zu geben richtig angeschlossen.

Dies kann leicht gelöst werden, indem 6 einzelne Spannungsteilernetzwerke bereitgestellt werden, wie unten gezeigt. Beachten Sie, dass jeder Spannungsteiler ein anderes Verhältnis hat.

schematisch

simulieren Sie diese Schaltung


1
@ sa-leinad Coole Idee zur Spannungsteilerschaltung.
Raddevus

Cool. Die Erwartung ist also, dass ich mit Ihrer zweiten Idee in der Lage sein sollte, tatsächlich unterschiedliche (stabile) Spannungen an den verschiedenen Drähten zu sehen, wodurch die Notwendigkeit einer zeitlichen Mittelung entfällt, oder? Ich werde es ausprobieren.
Jonathan Dautrich

Ich habe es ausprobiert und dies (zweite Idee mit der Spannungsteilerschaltung) scheint gut zu funktionieren. Der einzige kleine Nachteil, den ich bemerke, ist, dass wenn der Benutzer zwei Drähte an denselben Anschluss angeschlossen hat, dies alle an den anderen Anschlüssen gelesenen Spannungen beeinflusst, was es schwierig macht, dem Benutzer eine inkrementelle Rückmeldung darüber zu geben, wie viele Drähte korrekt angeschlossen sind. Danke noch einmal!
Jonathan Dautrich

Ahhh, ich war mir der Notwendigkeit nicht bewusst, inkrementelles Feedback zu geben. In diesem Fall benötigen Sie 6 verschiedene Spannungsteilernetzwerke. Ich werde meine Antwort so bearbeiten, dass sie dies enthält.
sa_leinad
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.