Как различить несколько цепей?

Я создаю головоломку для квест-комнаты. Я хочу дать пользователю 6 проводов и 6 клемм, а затем подтвердить, что он подключил правильные провода к правильным клеммам (один к одному).

Моя первая (успешная) попытка реализовать эту головоломку состояла в том, чтобы подключить провода к 6 аналоговым выходам ШИМ, установленным на разные уровни, и подключить клеммы к 6 аналоговым входным контактам. Усреднив по времени показания на входных контактах, я смог определить, какие провода подключены к каким контактам, если таковые имеются.

В настоящее время в моих цепях нет резисторов.

В текущем состоянии головоломки пользователь может делать странные вещи, например:

  • Подключите несколько проводов к одной клемме.
  • Соедините несколько проводов вместе, не подключая их ни к одной клемме.
  • Прикасаться к нескольким оголенным проводам и/или клеммам.

Мои вопросы сводятся к двум:

  • Опасен ли мой текущий подход для Arduino или моих пользователей, и есть ли рекомендуемые меры предосторожности, которые мне следует предпринять?
  • Есть ли лучший (более безопасный, простой или надежный) способ реализации головоломки?

Я инженер-программист, но полный новичок в настоящей электронике и Arduino, так что, пожалуйста, не стесняйтесь предполагать, что я ничего не знаю.

, 👍7


2 ответа


Лучший ответ:

4

Во-первых, давайте рассмотрим логику вашей программы. У вас есть две группы контакты: 6 контактов, подключенных к проводам, и 6 контактов, подключенных к терминалы. Первое, что я бы сделал, это забыл, что это два разные группы. Предположим, у вас есть всего 12 пинов, которые у пользователя есть подключаться определенным образом. Таким образом, большинство «странных вещей» пользователь могли бы сделать, например, соединить провода вместе, не являются особым случаем больше. Они просто еще одна недействительная комбинация. Теперь то, что вам нужно сделать, это для каждой пары контактов среди этих 12 определить, есть ли не они соединены вместе. Если какая-то пара соединена, то не должна быть, у вас недействительная комбинация. Если какая-либо пара не подключена, пока так и должно быть, это снова недопустимая комбинация. Если каждая пара является ожидаемое состояние (либо подключено, либо не подключено), затем пользователь сделал разгадайте головоломку.

Теперь, что касается аппаратной части. Простой способ узнать, являются ли два контакта соединенных вместе, нужно установить один из них в INPUT_PULLUP, а другой один на ВЫХОД НИЗКИЙ. Этот второй вывод должен быть единственным доступны пользователю, который выводит LOW. Все остальные открытые контакты должен быть установлен как INPUT или INPUT_PULLUP. Теперь, если первый вывод читает LOW, вы знаете, что есть соединение. Если он читает HIGH, два контакта не связаны между собой.

Вот пример программы, демонстрирующей этот принцип. Он проходит по циклу 66 возможных пар для проверки, связаны они или нет. Вам просто нужно заменить внутренний if на ваш код, который проверяет комбинация.

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

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

    // Установить все контакты в состояние INPUT_PULLUP.
    for (int i = 0; i < PIN_COUNT; i++)
        pinMode(pins[i], INPUT_PULLUP);
}

void loop() {
    // Цикл по всем парам контактов (pins[i], pins[j]).
    // Установите контакты [i] на ВЫХОДНОЙ НИЗКИЙ уровень, затем считайте контакты [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);
    }
}

Что касается безопасности, то все должно быть в порядке, если только пользователи не имеют доступ к любому низкоомному заземлению или источнику напряжения. В частности, Контакты GND и 5V не должны быть доступны пользователю. Для дополнительной защиты вы можно было бы подключить резистор сопротивлением 1 кОм последовательно с каждым штифтом, но тогда все Контакты, которые не тестируются активно, следует установить на INPUT, а не чем INPUT_PULLUP, в противном случае несколько подтягиваний параллельно могут начать конкурировать с последовательным резистором.

,

3

Я бы также подключил клеммы к 6 аналоговым входным контактам и имел бы 6 уникальных напряжений, по одному на провод. Arduino будет обеспечивать выход только тогда, когда 6 проводов будут размещены на правильных клеммах. Другими словами, это происходит, когда Arduino видит правильное аналоговое напряжение на соответствующих контактах.

Лично я бы добавил RC-фильтр нижних частот к выходу ШИМ. Дополнительная информация здесь. Ваш выход ШИМ будет поступать на Vin, а затем Vout будет поступать на ваш провод (т. е. аналоговый вход). Один фильтр на канал.

Базовый RC-фильтр

RC-фильтр защитит Arduino от замыканий на +ve, Gnd и другие контакты, а также обеспечит некоторую защиту от статики. Он также упростит ваш код.

В данный момент вам приходится реализовывать замысловатый код для усреднения напряжения на этих аналоговых выводах. RC-фильтр по сути сделал бы этот код ненужным.

Для расчета номинала резистора и конденсатора вам необходимо: Есть очень хорошая статья на сайте All About Circuits, в которой эта тема рассматривается подробно.

Для расчета значения нам нужно знать частоту:

Частота сигнала ШИМ на большинстве выводов составляет приблизительно 490 Гц. На платах Uno и подобных им выводы 5 и 6 имеют частоту приблизительно 980 Гц. - Arduino Analog Write

Я использовал http://sim.okawa-denshi.jp/en/PWMtool.php для расчета значений R и C, необходимых при очень низкой пульсации (< 60 мВ) с использованием обычных значений. Я основывал свои расчеты на 490 Гц, поскольку более низкие частоты хуже всего работают с фильтрами нижних частот.

Я предлагаю вам использовать значения R = 10k и C = 4.7uF. Вы можете поиграть с этими значениями, пока не получите желаемый результат.

Последнее, что я бы рассмотрел, — это установить защиту на клеммы, которые подключаются к аналоговым контактам. Это может быть небольшое сопротивление последовательно или стабилитрон на 5,1 В параллельно (может, он уже есть на контакте?) или какая-то параллельная емкость.


РЕДАКТИРОВАТЬ:
Мне только что пришла в голову блестящая идея: вам не нужно использовать ШИМ для вывода различных аналоговых значений — вместо этого вы можете использовать схему делителя напряжения. Не нужен RC-фильтр. Например:

схема


Правка №2:

Джонатан написал:
Единственный небольшой недостаток, который я заметил, заключается в том, что если у пользователя два провода подключены к одному и тому же терминалу, это влияет на все напряжения, считываемые на других терминалах, что затрудняет предоставление пользователю дополнительной обратной связи о том, сколько проводов подключено правильно.

Это можно легко решить, предоставив 6 отдельных сетей делителей напряжения, как показано ниже. Обратите внимание, что каждый делитель напряжения имеет разное отношение.

схема

,