Сравнение цифровых сигналов. помощь нубу

Тема в разделе "Arduino & Shields", создана пользователем AlexxandroQ, 21 фев 2022.

  1. AlexxandroQ

    AlexxandroQ Нуб

    Доброго дня! Имею кривые руки и скудный ум, но большое желание написать одну штуку важную. Есть плата, для прозвонки кабелей, логика работы проста, цепляю кабель на пару разъемов, разъемы подключены к цифровым пинам ардуины, на одну сторону с ардуины подаю высокий сигнал, со второй стороны его ловлю и сравниваю уровни, МК должен их сравнить и выдать результат или пришел сигнал на вторую сторону или нет. На словах просто, на деле не могу. Прилагаю свои потуги в виде кода, может кто даст пару советов, как делать правильно.
    P.S. Уроки различные смотрел, но, видимо, не усвоил. Извините.
    Код (C++):

    bool pin_st;
    bool pin_5v;
    void setup() {
      pinMode(22, INPUT_PULLUP);
      pinMode(45, OUTPUT);
      Serial.begin(9600);
    }
    void loop() {
      digitalWrite (45, HIGH);
      bool pin_5v = digitalRead (45);
      bool pin_st = digitalRead (22);
      if ( !pin_st == pin_5v) {
        Serial.println ("ok");
      }
      else {
        Serial.println ("eror");
      }
    }
     
  2. Andy16

    Andy16 Нерд

    Код (Text):
    void loop() {
      digitalWrite (45, HIGH);
      if (digitalRead (22)) {
        Serial.println ("ok");
      }
      else {
        Serial.println ("eror");
      }
    }
    А зачем вообще 45 пин использовать, если там всегда логическая единица? И зачем вообще ардуина, если достаточно тестера? Или батарейки и пьезика.
     
    Ariadna-on-Line нравится это.
  3. AlexxandroQ

    AlexxandroQ Нуб

    Затем, что кабеля, которые необходимо прозванивать имеют 24 жилы, один комплект состоит из трех таких кабелей, комплектов таких делаем не мало и хочется процесс прозвонки немного облегчить. Чтобы ардуина сама сверяла сигналы и выдавала на экранчик результат, ок кабель или нет.
    На данный момент как раз таки пользуемся цешкой и это есть не совсем производительно.
     
  4. b707

    b707 Гуру

    ну для этого кабель к ардуине сначала придется подключить, аж 24 * 3 * 2 контакта - и не ошибиться - что совсем не быстро.
    А сама по себе задачка простейшая.
     
    Ariadna-on-Line нравится это.
  5. Andy16

    Andy16 Нерд

    Ну почему, можно сделать прибор, который будет сам составлять таблицу подключения, а подключать можно в произвольном порядке.
     
  6. AlexxandroQ

    AlexxandroQ Нуб

    Эххх... На кабеля надеваются разъемы, вручную, и так как, от человеческого фактора никто не застрахован, необходим контроль качества изделия. Отчего и требуется плата-тестер. Разъемы в плату вставил, ардуинку запустил, она последовательность проверила, что каждый провод на своем месте и все, все спокойны. Плату я развел, заказали-изготовили, запаял, осталось МК запрограммировать, на этом весь процесс и встал. Поэтому, мне не требуются приборы, не подходит прозвонка тестером и другое возможное, требуются лишь советы, как можно воплотить в жизнь мою задумку. Не прошу выдать мне код, прошу советов, как сделать, направите на нужные статьи, сайты, литературу, буду благодарен. Пока в обучалках не нашел решение своей задачи.
     
  7. Andy16

    Andy16 Нерд

    Ну, как я ж твой код поправил. А дальше - просто циклы по всем жилам.
    Я не пойму, ты сколько же собираешься пинов задействовать на ардуине (или расширители юзать)?
     
  8. SergeiL

    SergeiL Оракул Модератор

    А почему 24 * 3 * 2 ?
    Я так понимаю нужно 24 * 2 (два разъема по 24 контакта). Нет?
     
  9. Andy16

    Andy16 Нерд

    "24 жилы, один комплект состоит из трех таких кабелей" (с)
     
  10. SergeiL

    SergeiL Оракул Модератор

    Так кабели то можно тестировать по очереди, как я понял.
    У нас такой тестер был, когда кабели на производстве собирали.

    UPD: Тут сам процесс тестирования простой, вопрос как планируется отображать результаты.
    Если просто ОК/ERROR то все совсем просто, а если указывать некорректные проводники - то все зависит от отображения.
    Для варианта ОК/ERROR - можно сделать два массива с указанием выводов.
    И пробегаться по ним последовательно.
     
    Последнее редактирование: 21 фев 2022
  11. Andy16

    Andy16 Нерд

    Я бы так сделал:
    Цикл по 24 жилам с записью в массив. Подаем единицу на 1 пин, пробегаем (второй цикл) по 25-48 и записываем в массив где появилась единица. Потом 2 пин и т.д. по циклу.
    В итоге при исправном кабеле получится таблица:
    1 - 25
    2 - 26
    ...
    24 - 48
    Если же получились ошибки, типа: 1 - 0 или 2 - 3,4,5, выводим их количество на экранчик и даем возможность кнопками (энкодером) их полистать. Вот и все.
     
  12. parovoZZ

    parovoZZ Гуру

    Кабели прозванивают с помощью заземляющего проводника. Поочерёдно. Сперва постоянным замыканием на землю, затем "морганием". Таким образом проверяется целостность жилы и отсутствие металлического контакта на "землю". По факту на том конце должен быть ответчик, либо же устройство, которое будет также отображать очерёдность сигналов. Задача решается сдвиговыми регистрами без всяких контроллеров.
    Ну и как это будет выглядеть для кабелей с 24 моножилами по квадрату-полтора (меньше в поле не бывает)???

    в поле никто этим заниматься не будет.
     
  13. AlexxandroQ

    AlexxandroQ Нуб

    Использую 24 пина, 12 на выход, 12 на вход, кабель по полам как раз делиться разъемами, два разъема по 12 пин. На плате они разведены так, что 12 входов\выходов дублируются на все разъемы, чтобы не задействовать сдвиговые регистры ибо как с ними себя вести вообще не представляю.
    Код, что вы предложили, работает, но когда открываю монитор порта, вижу очень много ошибок, наводок, т.е. сигнал на читаемом пине есть, но периодически в порт выводятся как сообщения "ок" так и "eror", с этим как то можно бороться?
    Идея с массивами мне понравилась, в дальнейшем буду разбираться, как ее реализовать.
     
  14. AlexxandroQ

    AlexxandroQ Нуб

    Добавил задержку (delay) после вывода сообщения, работать стало четко, однако задержка вешает систему, думаю как сделать через (millis).
     
  15. Andy16

    Andy16 Нерд

    Так не надо измерять непрерывно. Меряй раз в секунду, например. delay или millis используй.
     
  16. AlexxandroQ

    AlexxandroQ Нуб

    Господа, всем спасибо за советы и помощь, вчера доделал наконец плату и дописал код. Выкладываю, что получилось, не знаю сам зачем)
    Код (C++):
    //---------------Библиотеки---------------

    #include <LiquidCrystal.h>

    //---------------Переменные---------------

    const uint8_t btn = 7;                             // пин подключения кнопки
    const uint8_t led_ok = 46;                         // пин подключения зеленого светодиода
    const uint8_t led_done = 47;                       // пин подключения красного светодиода
    const uint16_t tim1 = 100;                         // задержка тестера
    const uint16_t tim2 = 1500;                        // задержка дисплея
    const uint16_t tim3 = 5000;                        // задержка светодиода
    uint8_t p_out;                                     // переменная пинов выходных
    uint8_t p_in;                                      // переменная пинов входных
    int8_t led_O;                                      // переменная светодиода
    int8_t led_X;                          

    LiquidCrystal lcd (12, 13, 8, 9, 10, 11);          // объявление дисплея

    void setup() {

      pinMode (btn, INPUT_PULLUP);                     // подключение кнопки
      for ( p_out = 22; p_out <= 44; p_out += 2) {     // счетчик для задания входных пинов
        pinMode ( p_out, OUTPUT);
      } for ( p_in = 23; p_in <= 45; p_in += 2) {      // счетчик для задания выходных пинов
        pinMode ( p_in, INPUT);
      }

      Serial.begin(9600);                              // открыть монитор порта

      lcd.begin (16, 4);                               // начало работы с дисплеем
      lcd.setCursor (5, 1);
      lcd.print ("WITCHEL");
      lcd.setCursor (3, 2);
      lcd.print ("KPL-tester");
    }

    void loop() {
      if (! digitalRead (btn)) {                       // обработка кнопки
        lcd.clear();
        lcd.setCursor (1, 1);
        lcd.print ("Initialization");
        lcd.setCursor (6, 2);
        lcd.print ("....");
        delay (tim2);
        test ();
        delay (tim3);
        digitalWrite (led_ok, LOW);
        digitalWrite (led_done, LOW);
      }
    }
    void test () {                                     // функция теста кабеля
      uint8_t pin_o = 22;
      uint8_t pin_i = 45;
      lcd.clear ();
      lcd.setCursor (0, 0);
      lcd.print ("Testing:");
      delay (tim2);
      lcd.setCursor (0, 1);
      led_O = 0;
      led_X = 0;
      for (pin_o, pin_i; pin_o <= 44, pin_i >= 23; pin_o += 2, pin_i -= 2) {
        digitalWrite (pin_o, HIGH);
        if (digitalRead (pin_i) == HIGH) {
          lcd.print ("O");
          led_O++;
        } else {
          lcd.print ("X");
          led_X++;
        }
        if (led_O == 12 && led_X == 0) {
          Serial.println ("Green led");
          digitalWrite (led_ok, HIGH);
        } else if (led_O != 12 && led_X >= 1) {
          Serial.println ("Red led");
          digitalWrite (led_done, HIGH);
        }
      }
    }