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_PULLUP
und 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 INPUT
oder eingestellt sein INPUT_PULLUP
. Wenn der erste Pin lautet LOW
, wissen Sie, dass eine Verbindung besteht. Wenn dies angezeigt wird, sind HIGH
die 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 if
durch 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 INPUT
anstatt gesetzt INPUT_PULLUP
werden. Andernfalls können mehrere parallele Pullups mit dem Serienwiderstand konkurrieren.
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.
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:
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 = 10k
undC = 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:
simulieren Sie diese Schaltung - Schema erstellt mit CircuitLab
Edit # 2:
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.
simulieren Sie diese Schaltung
quelle