Pytanie:
Jak rozróżnić wiele obwodów?
Jonathan Dautrich
2018-07-10 09:19:52 UTC
view on stackexchange narkive permalink

Tworzę puzzle do pokoju zagadek. Chcę dać użytkownikowi 6 przewodów i 6 zacisków, a następnie potwierdzić, że podłączył właściwe przewody do właściwych zacisków (jeden do jednego).

Moja pierwsza (udana) próba wdrożenia tego Zagadką było podłączenie przewodów do 6 wyjść analogowych PWM ustawionych na różnych poziomach i podłączenie zacisków do 6 analogowych pinów wejściowych. Uśredniając w czasie odczyty na pinach wejściowych, byłem w stanie określić, który przewód (przewody) są podłączone do których zacisków, jeśli w ogóle.

Obecnie nie mam rezystorów w obwodach.

Ponieważ układanka jest obecnie projektowana, użytkownik może wykonać dziwne rzeczy, takie jak:

  • Podłącz wiele przewodów do tego samego terminala.
  • Połącz kilka przewodów razem , bez podłączania ich do żadnego terminala.
  • Dotknij wielu odsłoniętych przewodów i / lub zacisków.

Moje pytania sprowadzają się do dwóch:

  • Czy moje obecne podejście jest niebezpieczne, zarówno dla Arduino, jak i dla moich użytkowników i czy istnieją zalecane środki ostrożności, które powinienem podjąć?
  • Czy istnieje lepszy (bezpieczniejszy, prostszy lub bardziej niezawodny) sposób implementacji łamigłówki?

Jestem inżynierem oprogramowania, ale kompletnym noobem, jeśli chodzi o prawdziwą elektronikę i Arduino, więc nie wahaj się założyć, że nic nie wiem.

Dwa odpowiedzi:
Edgar Bonet
2018-07-10 13:06:10 UTC
view on stackexchange narkive permalink

First, let's consider the logic of your program. You have two groups ofpins: 6 pins connected to the wires and 6 pins connected tothe terminals. The first thing I would do is forget that these are twodifferent groups. Consider you just have 12 pins that the user hasto connect in a specific fashion. This way most “weird things” the usercould do, like connecting wires together, are not a special caseanymore. They are just another invalid combination. Now what you have todo is, for every pair of pins among those 12, determine whether ornot they are connected together. If any pair is connected that shouldn'tbe, you have an invalid combination. If any pair is not connected whileit should be, it's again an invalid combination. If every pair is theexpected state (either connected or not connected), then the user didsolve the puzzle.

Now, for the hardware side. A simple way to know whether two pins areconnected together is to set one of them to INPUT_PULLUP and the otherone to OUTPUT LOW. This second pin should be the only oneaccessible to the user that outputs a LOW. All other exposed pinsshould be set as either INPUT or INPUT_PULLUP. Now, if the first pinreads LOW, you know have a connection. If it reads HIGH the two pinsare not connected together.

Here is an example program demonstrating that principle. It loops overthe 66 possible pairs to check whether they are connected or not.You just have to replace the inner if with your code that validatesthe combination.

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);    }}

As for the safety, you should be fine as long as the users do not haveaccess to any low-impedance ground or voltage source. In particular, theGND and 5V pins should not be user-accessible. For extra protection, youcould put a 1 kΩ resistor in series with each pin, but then all thepins that are not actively being tested should be set to INPUT ratherthan INPUT_PULLUP, otherwise multiple pullups in parallel may start tocompete with the series resistor.

To jest dokładnie ta metoda, której używam do testowania płyt programistycznych, które wykonuję. Dołączona jest tarcza, która łączy 50% pinów z pozostałymi 50% poprzez rezystory 100r. Skanowanie pinów przy jednym ustawionym niskim poziomie sprawdza zarówno prawidłową ciągłość, jak i zwarcia do innych pinów.
Piękny. To jest paradygmat, którego mi brakowało. Zupełnie nie przyszło mi do głowy, że właściwie mogę mierzyć w różnych konfiguracjach w krótkich odstępach czasu. Moje możliwości budowania rzeczy po prostu eksplodowały. Wypróbuję to.
To zadziałało cudownie. O wiele wolę to od podejścia analogowego, ponieważ nie muszę się martwić o definiowanie oczekiwanych zakresów napięcia dla każdego wejścia. I oczywiście nie musiałem sprawdzać wszystkich kombinacji 12 * 11/2, ponieważ naprawdę muszę wiedzieć, które przewody są podłączone do każdego zacisku (kontrole 6 * 6) - jeśli podłączone były dwa zaciski lub dwa przewody, to koniecznie skutkowałoby niewłaściwą kombinacją przewodów podłączonych do danego zacisku. Ważne jest jednak, aby sprawdzić więcej niż oczekiwane 6 połączeń, aby obsłużyć przypadek, w którym użytkownik w jakiś sposób łączy wszystkie terminale. Dzięki!
sa_leinad
2018-07-10 10:52:19 UTC
view on stackexchange narkive permalink

Podłączyłbym również zaciski do 6 analogowych pinów wejściowych i miałbym 6 unikalnych napięć, po jednym na przewód. Arduino zapewni wyjście tylko wtedy, gdy 6 przewodów zostanie umieszczonych na odpowiednich zaciskach. Innymi słowy, wtedy Arduino widzi prawidłowe napięcie analogowe na odpowiednich pinach.

Osobiście dodałbym filtr dolnoprzepustowy RC do wyjścia PWM. Więcej informacji tutaj. Twoje wyjście PWM trafiłoby do Vin, a następnie Vout do twojego przewodu (tj. wejścia analogowego). Jeden filtr na kanał.

Basic RC filter

Filtr RC chroni Arduino przed zwarciem do + ve, Gnd i innymi pinami, a także zapewniając trochę ochrony przed wyładowaniami elektrostatycznymi. Uprości to również twój kod.

W tej chwili musisz zaimplementować wymyślny kod, aby uśrednić napięcie na tych pinach analogowych. Filtr RC zasadniczo sprawiłby, że ten kod nie byłby potrzebny.

Aby obliczyć wartość potrzebnego rezystora i kondensatora: W All About Circuits omawiamy ten temat w szczegóły.

Aby obliczyć wartość, musimy znać częstotliwość:

Częstotliwość sygnału PWM na większości pinów wynosi około 490 Hz. Na płytach Uno i podobnych piny 5 i 6 mają częstotliwość około 980 Hz. - Arduino Analog Write

Do obliczenia użyłem http://sim.okawa-denshi.jp/en/PWMtool.php potrzebne wartości R & C przy bardzo niskim tętnieniu (< 60mV) przy użyciu wspólnych wartości. Oparłem swoje obliczenia na 490 Hz, ponieważ niższe częstotliwości działają gorzej z filtrami dolnoprzepustowymi.

Sugeruję użycie wartości R = 10k i C = 4.7uF . Możesz bawić się tymi wartościami, aż uzyskasz pożądane wyniki.

Ostatnią rzeczą, którą chciałbym rozważyć, jest zabezpieczenie terminali podłączonych do pinów analogowych. Może to być niewielka rezystancja szeregowa lub 5,1 V zenera równolegle (pin może już to mieć?) Lub pewna pojemność równoległa.


EDYCJA:
Właśnie miałem falę mózgową - Nie musisz używać PWM do wyprowadzania różnych wartości analogowych - zamiast tego możesz użyć obwodu dzielnika napięcia. Nie jest potrzebny filtr RC. Na przykład:

schematic

symuluj ten obwód - schemat utworzony za pomocą CircuitLab


Edycja nr 2:

Jonathan napisał:
Jedynym drobnym minusem, jaki dostrzegam, jest to, że jeśli użytkownik dwa przewody podłączone do tego samego zacisku, wpływa na wszystkie napięcia odczytywane na innych zaciskach, utrudniając użytkownikowi uzyskanie przyrostowej informacji zwrotnej o tym, ile przewodów jest prawidłowo podłączonych.

Można to łatwo rozwiązać, zapewniając 6 oddzielnych sieci dzielników napięcia, jak pokazano poniżej. Zwróć uwagę, że każdy dzielnik napięcia ma inny współczynnik.

schematic

Symuluj ten obwód

@sa-leinad Fajny pomysł na obwód dzielnika napięcia.
Fajne. Oczekuje się więc, że przy twoim drugim pomyśle będę mógł zobaczyć rzeczywiste różne (stabilne) napięcia na różnych przewodach, co eliminuje potrzebę uśredniania czasu, prawda? Wypróbuję to.
Wypróbowałem to i ten (drugi pomysł z obwodem dzielnika napięcia) wydaje się działać dobrze. Jedyną drobną wadą, którą zauważam, jest to, że jeśli użytkownik ma dwa przewody podłączone do tego samego zacisku, wpływa to na wszystkie napięcia odczytywane na innych zaciskach, co utrudnia udzielenie użytkownikowi przyrostowej informacji zwrotnej o tym, ile przewodów jest prawidłowo podłączonych. Dzięki jeszcze raz!
Ahhh, nie zdawałem sobie sprawy z potrzeby dostarczania coraz większej informacji zwrotnej. W takim przypadku będziesz potrzebować 6 różnych sieci dzielników napięcia. Zmienię odpowiedź, aby to uwzględnić.


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 4.0, w ramach której jest rozpowszechniana.
Loading...