Làm thế nào tôi có thể phân biệt giữa nhiều mạch?


7

Tôi đang xây dựng một câu đố cho một phòng thoát. Tôi muốn cung cấp cho người dùng 6 dây và 6 thiết bị đầu cuối, sau đó xác nhận rằng họ đã kết nối đúng dây với các thiết bị đầu cuối chính xác (một-một).

Nỗ lực đầu tiên (thành công) của tôi để thực hiện câu đố này là kết nối dây với 6 đầu ra analog PWM được đặt ở các mức khác nhau và kết nối các đầu nối với 6 chân đầu vào tương tự. Bằng cách tính trung bình thời gian các số đọc trên các chân đầu vào, tôi có thể xác định (các) dây nào được kết nối với thiết bị đầu cuối nào, nếu có.

Tôi hiện không có điện trở trong các mạch.

Vì câu đố hiện đang được thiết kế, người dùng có thể làm những điều kỳ lạ như:

  • Kết nối nhiều dây với cùng một thiết bị đầu cuối.
  • Kết nối nhiều dây với nhau, mà không kết nối chúng với bất kỳ thiết bị đầu cuối.
  • Chạm vào nhiều dây tiếp xúc và / hoặc thiết bị đầu cuối.

Câu hỏi của tôi sôi lên đến hai:

  • Cách tiếp cận hiện tại của tôi có nguy hiểm không, đối với Arduino hoặc người dùng của tôi và tôi có nên thực hiện các biện pháp phòng ngừa nào không?
  • Có cách nào tốt hơn (an toàn hơn hay đơn giản hơn hay mạnh mẽ hơn) để thực hiện câu đố không?

Tôi là một kỹ sư phần mềm, nhưng là một người hoàn toàn mới khi nói đến điện tử và Arduino thực sự , vì vậy xin vui lòng cho rằng tôi không biết gì.

Câu trả lời:


5

Đầu tiên, hãy xem xét logic của chương trình của bạn. Bạn có hai nhóm chân: 6 chân được kết nối với dây và 6 chân được kết nối với các thiết bị đầu cuối. Điều đầu tiên tôi sẽ làm là quên rằng đây là hai nhóm khác nhau. Hãy xem xét bạn chỉ có 12 chân mà người dùng phải kết nối theo một kiểu cụ thể. Bằng cách này, hầu hết những điều kỳ lạ của người dùng mà người dùng có thể làm, như kết nối các dây với nhau, không còn là trường hợp đặc biệt nữa. Họ chỉ là một sự kết hợp không hợp lệ. Bây giờ, những gì bạn phải làm là, đối với mỗi cặp chân trong số 12 chân đó, hãy xác định xem chúng có được kết nối với nhau hay không. Nếu bất kỳ cặp nào được kết nối không nên, bạn có một kết hợp không hợp lệ. Nếu bất kỳ cặp nào không được kết nối trong khi nó cần, thì đó lại là một kết hợp không hợp lệ. Nếu mỗi cặp là trạng thái mong đợi (kết nối hoặc không kết nối),

Bây giờ, cho phần cứng. Một cách đơn giản để biết liệu hai chân có được kết nối với nhau hay không là đặt một trong số chúng INPUT_PULLUPvà một chân còn lại OUTPUT LOW. Pin thứ hai này phải là pin duy nhất có thể truy cập được cho người dùng xuất ra a LOW. Tất cả các chân tiếp xúc khác nên được thiết lập như là một trong hai INPUThoặc INPUT_PULLUP. Bây giờ, nếu pin đầu tiên đọc LOW, bạn biết có kết nối. Nếu nó đọc HIGHhai chân không được kết nối với nhau.

Dưới đây là một chương trình ví dụ chứng minh nguyên tắc đó. Nó vòng qua 66 cặp có thể để kiểm tra xem chúng có được kết nối hay không. Bạn chỉ cần thay thế bên trong ifbằng mã của bạn để xác nhận sự kết hợp.

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

Về sự an toàn, bạn sẽ ổn miễn là người dùng không có quyền truy cập vào bất kỳ nguồn điện áp hoặc mặt đất có trở kháng thấp nào. Đặc biệt, các chân GND và 5V không được người dùng truy cập. Để bảo vệ thêm, bạn có thể đặt một điện trở 1 kΩ nối tiếp với mỗi chân, nhưng sau đó tất cả các chân không được kiểm tra tích cực nên được đặt thành INPUTthay vì INPUT_PULLUP, nếu không, nhiều bộ kéo song song có thể bắt đầu cạnh tranh với điện trở nối tiếp.


1
Đây chính xác là phương pháp tôi sử dụng để thử nghiệm các bảng phát triển mà tôi thực hiện. Một tấm khiên được gắn vào để liên kết 50% các chân với các điện trở 50% khác thông qua 100r. Quét các chân bằng một bộ kiểm tra thấp cho cả tính liên tục thích hợp cũng như quần short đến các chân khác.
Majenko

1
Xinh đẹp. Đây là mô thức tôi đã mất tích. Điều đó hoàn toàn xảy ra với tôi rằng tôi thực sự có thể đo theo các cấu hình khác nhau liên tiếp. Lựa chọn của tôi để xây dựng mọi thứ chỉ bùng nổ. Tôi se thử no.
Jonathan Dautrich

Điều này làm việc tuyệt vời. Tôi rất thích nó hơn phương pháp tương tự của tôi, vì tôi không cần phải lo lắng về việc xác định phạm vi điện áp dự kiến ​​cho mỗi đầu vào. Và tất nhiên, tôi không cần kiểm tra tất cả các kết hợp 12 * 11/2, vì tôi thực sự chỉ cần biết dây nào được kết nối với mỗi thiết bị đầu cuối (kiểm tra 6 * 6) - nếu hai đầu nối hoặc hai dây được kết nối, nó sẽ nhất thiết dẫn đến sự kết hợp sai của các dây kết nối với một thiết bị đầu cuối nhất định. Tuy nhiên, điều quan trọng là phải kiểm tra nhiều hơn 6 kết nối dự kiến, để xử lý trường hợp người dùng bằng cách nào đó bắc cầu tất cả các thiết bị đầu cuối. Cảm ơn!
Jonathan Dautrich

3

Tôi cũng sẽ kết nối các thiết bị đầu cuối với 6 chân đầu vào tương tự và có 6 điện áp duy nhất, mỗi điện áp một dây. Arduino sẽ chỉ cung cấp đầu ra khi 6 dây được đặt trên các đầu nối chính xác. Nói cách khác, đó là khi Arduino nhìn thấy điện áp tương tự chính xác trên các chân tương ứng.

Cá nhân tôi sẽ thêm bộ lọc thông thấp RC vào đầu ra của các PWM. Thêm thông tin ở đây. Đầu ra PWM của bạn sẽ đi vào Vin và sau đó Vout sẽ đi đến dây của bạn (tức là đầu vào tương tự). Một bộ lọc cho mỗi kênh.

Bộ lọc RC cơ bản

Bộ lọc RC sẽ bảo vệ Arduino từ quần short đến + ve, Gnd và các chân khác cũng như cung cấp một chút bảo vệ khỏi tĩnh. Nó cũng sẽ đơn giản hóa mã của bạn.

Tại thời điểm này, bạn phải thực hiện mã ưa thích để lấy trung bình điện áp trên các chân analog đó. Bộ lọc RC về cơ bản sẽ làm cho mã đó không cần thiết.

Để tính giá trị của điện trở và tụ điện bạn cần: Có một bài viết rất hay trên All About Circuits đi sâu vào chủ đề này một cách chi tiết .

Để tính giá trị chúng ta cần biết tần số:

Tần số của tín hiệu PWM trên hầu hết các chân là khoảng 490 Hz. Trên bảng Uno và các bảng tương tự, chân 5 và 6 có tần số xấp xỉ 980 Hz. - Viết tương tự Arduino

Tôi đã sử dụng http://sim.okawa-denshi.jp/en/PWMtool.php để tính toán các giá trị R & C cần thiết với độ gợn rất thấp (<60mV) bằng các giá trị chung. Tôi dựa trên các tính toán của mình xung quanh 490Hz vì tần số thấp hoạt động kém nhất với các bộ lọc thông thấp.

Tôi đề nghị bạn sử dụng các giá trị của R = 10kC = 4.7uF. Bạn có thể chơi với các giá trị này cho đến khi bạn có được đầu ra mà bạn mong muốn.

Một điều cuối cùng tôi sẽ xem xét là đặt một số bảo vệ trên các thiết bị đầu cuối kết nối với các chân tương tự. Đây có thể là một điện trở nhỏ nối tiếp hoặc song song với zener 5.1V (chân có thể đã có điều này?) Hoặc một số điện dung song song.


EDIT:
Tôi vừa mới có sóng não - Bạn không cần sử dụng các tín hiệu của PWM để xuất các giá trị tương tự khác nhau - thay vào đó bạn có thể sử dụng mạch phân chia điện áp. Không cần bộ lọc RC. Ví dụ:

sơ đồ

mô phỏng mạch này - Sơ đồ được tạo bằng CircuitLab


Chỉnh sửa # 2:

Jonathan Wrote:
Nhược điểm nhỏ duy nhất tôi nhận thấy là nếu người dùng có hai dây được kết nối với cùng một thiết bị đầu cuối, nó sẽ ảnh hưởng đến tất cả các điện áp được đọc trên các thiết bị đầu cuối khác, khiến người dùng khó có thể phản hồi gia tăng về số lượng dây. kết nối chính xác.

Điều này có thể dễ dàng được giải quyết bằng cách cung cấp 6 mạng chia điện áp riêng lẻ, như hình dưới đây. Lưu ý cách mỗi bộ chia điện áp có tỷ lệ khác nhau.

sơ đồ

mô phỏng mạch này


1
@ sa-leinad Ý tưởng tuyệt vời về mạch chia điện áp.
raddevus

Mát mẻ. Vì vậy, kỳ vọng là với ý tưởng thứ hai của bạn, tôi sẽ có thể thấy các điện áp (ổn định) thực tế khác nhau trên các dây khác nhau, loại bỏ sự cần thiết của thời gian trung bình, phải không? Tôi se thử no.
Jonathan Dautrich

Tôi đã thử nó, và điều này (ý tưởng thứ hai với mạch phân chia điện áp) dường như hoạt động tốt. Nhược điểm nhỏ duy nhất tôi nhận thấy là nếu người dùng có hai dây được kết nối với cùng một thiết bị đầu cuối, nó sẽ ảnh hưởng đến tất cả các điện áp được đọc trên các thiết bị đầu cuối khác, khiến người dùng khó có thể phản hồi gia tăng về số lượng dây được kết nối chính xác. Cảm ơn một lần nữa!
Jonathan Dautrich

Ahhh, tôi đã không nhận thức được sự cần thiết phải cung cấp phản hồi gia tăng. Trong trường hợp đó, bạn sẽ cần 6 mạng chia điện áp khác nhau. Tôi sẽ chỉnh sửa câu trả lời của tôi để bao gồm điều này.
sa_leinad
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.