Вопрос по значения пинов

Тема в разделе "Arduino & Shields", создана пользователем Elemo, 29 апр 2018.

  1. Elemo

    Elemo Нерд

    Приветствую посетителей форума.

    При отладке своего скетча столкнулся с непонятной ситуацией. В процессе поиска проблем столкнулся с тем, что с пинов Ардуино приходят разные значения. В итоге набросал такой скетч:
    Код (C++):
    #define BUTTON_PIN13  13
    #define BUTTON_PIN12  12
    #define BUTTON_PIN11  11
    #define BUTTON_PIN10  10
    #define BUTTON_PIN09  9
    #define BUTTON_PIN08  8
    #define BUTTON_PIN07  7
    #define BUTTON_PIN06  6
    #define BUTTON_PIN05  5
    #define BUTTON_PIN04  4
    #define BUTTON_PIN03  3
    #define BUTTON_PIN02  2
    #define BUTTON_PIN01  1
    #define BUTTON_PIN00  0
    void setup()
    {
      // открываем монитор Serial-порта
      Serial.begin(9600);
      // настраиваем пин в режим входа
      pinMode(BUTTON_PIN13, INPUT);
      pinMode(BUTTON_PIN12, INPUT);
      pinMode(BUTTON_PIN11, INPUT);
      pinMode(BUTTON_PIN10, INPUT);
      pinMode(BUTTON_PIN09, INPUT);
      pinMode(BUTTON_PIN08, INPUT);
      pinMode(BUTTON_PIN07, INPUT);
      pinMode(BUTTON_PIN06, INPUT);
      pinMode(BUTTON_PIN05, INPUT);
      pinMode(BUTTON_PIN04, INPUT);
      pinMode(BUTTON_PIN03, INPUT);
      pinMode(BUTTON_PIN02, INPUT);
      pinMode(BUTTON_PIN01, INPUT);
      pinMode(BUTTON_PIN00, INPUT);
    }
    void loop()
    {
      int buttonState13 = digitalRead(BUTTON_PIN13);
      int buttonState12 = digitalRead(BUTTON_PIN12);
      int buttonState11 = digitalRead(BUTTON_PIN11);
      int buttonState10 = digitalRead(BUTTON_PIN10);
      int buttonState09 = digitalRead(BUTTON_PIN09);
      int buttonState08 = digitalRead(BUTTON_PIN08);
      int buttonState07 = digitalRead(BUTTON_PIN07);
      int buttonState06 = digitalRead(BUTTON_PIN06);
      int buttonState05 = digitalRead(BUTTON_PIN05);
      int buttonState04 = digitalRead(BUTTON_PIN04);
      int buttonState03 = digitalRead(BUTTON_PIN03);
      int buttonState02 = digitalRead(BUTTON_PIN02);
      int buttonState01 = digitalRead(BUTTON_PIN01);
      int buttonState00 = digitalRead(BUTTON_PIN00);

      Serial.print("13 - ");
      Serial.println(buttonState13);
      Serial.print("12 - ");
      Serial.println(buttonState12);
      Serial.print("11 - ");
      Serial.println(buttonState11);
      Serial.print("10 - ");
      Serial.println(buttonState10);
      Serial.print("09 - ");
      Serial.println(buttonState09);
      Serial.print("08 - ");
      Serial.println(buttonState08);
      Serial.print("07 - ");
      Serial.println(buttonState07);
      Serial.print("06 - ");
      Serial.println(buttonState06);
      Serial.print("05 - ");
      Serial.println(buttonState05);
      Serial.print("04 - ");
      Serial.println(buttonState04);
      Serial.print("03 - ");
      Serial.println(buttonState03);
      Serial.print("02 - ");
      Serial.println(buttonState02);
      Serial.print("01 - ");
      Serial.println(buttonState01);
      Serial.print("00 - ");
      Serial.println(buttonState00);

      delay(1000);
    }
    И вот какой результат он выдает:

    13 - 1
    12 - 1
    11 - 1
    10 - 0
    09 - 0
    08 - 0
    07 - 0
    06 - 0
    05 - 0
    04 - 0
    03 - 0
    02 - 1
    01 - 1
    00 - 1

    И вот тут мне непонятно, так и задумано, что с пинов 00-02 и 11-13 - приходит по умолчанию единица, а не ноль?
     
  2. Arduino_man

    Arduino_man Гик

    Схема подключения?
     
  3. Elemo

    Elemo Нерд

    Нулевая - в том смысле, что не подключено ничего. Просто захотел в итоге проверить, что же по умолчанию выдаю пины.
     
  4. Daniil

    Daniil Гуру

    А значения постоянны во времени или шумят?
    Посмотрите на схему используемой платы на наличие "подтяжек" как явных (резисторы), так и не явных (через другие компоненты).
    + стоит обратить внимание как конфигурируются пины.
    Очень интересный курс написал Dihalt, посмотрите эту статью по вашему вопросу.
     
  5. Daniil

    Daniil Гуру

    Вы используете ардуину или голый мк? Надо смотреть разводку платы. Да, для большинства выводов так можно сказать, но у D13 должен быть светодиод, уже что-то.
     
  6. Elemo

    Elemo Нерд

    Я использую Arduino Uno, родную купленную в Амперке.
     
  7. Elemo

    Elemo Нерд

    Показания стабильные. Но т.к. плата - родная Arduino Uno, то на абсолютно голой плате таких показания как мне кажется быть не должно. Т.е. Если я читаю цифровой пин, на котором нет сигнала (даже ничего не подключено) то я ожидаю там ноль. А у меня на разных пинах - разные значения. Пол дня убил пытаясь понять почему у меня одна функция вызывается которая вызываться должна была по кнопке. В итоге разобрал всю схему и читая показания с пустых пинов наткнулся на описанную ситуацию.
     
  8. Daniil

    Daniil Гуру

    Посмотрите тут пункт Notes and Warnings.
    Там говорится о том, что если пин ни к чему не подключён, то функция digitalRead может возвращять случайное значение, что и я ожидал)

    Попробуйте опрашивать только 1 пин.
    Попробуйте подключать к нему провод (по-длинее) (другой конец провода никуда не подключён). (Во время подключения должен появиться шум). Наверное дам нехороший совет, но попробуйте его ещё и потрогать пальцами. Должны быть наводки и он должен шуметь.
     
    arkadyf нравится это.
  9. Daniil

    Daniil Гуру

    На случай "ничего не подключено" ответ - наводки всегда есть, вот они то и должны давать шум.

    Более явно Вы этот шум должны наблюдать если будете работать с analogRead
     
    arkadyf нравится это.
  10. Elemo

    Elemo Нерд

    Хм... а это интересно. Спасибо. Обязательно попробую.
    Но тогда возникает интересный вопрос. Допустим я хочу повесить некий цикл или условие на нажатие кнопки. По умолчанию кнопка - разрывает цепь. С точки зрения контроллера - к пину ничего не подключено. И тогда получается что при разомкнутой цепи у меня условие выполнится....
     
  11. ostrov

    ostrov Гуру

    Почитайте тут как правильно подключать кнопку.
     
    arkadyf и Daniil нравится это.
  12. Daniil

    Daniil Гуру

    Ещё посмотрите Datasheet п. 32.2. Common DC Characteristics табл. 32-2.
    Интересует позиции V_OL и V_OH - диапазоны напряжений для логического нуля и единицы.
    ATmega328p интерпретирует диапазон напряжений на выводе от 0 до 0.9 В (при питании 5 В) как ноль, а напряжение в диапазоне от 4.2 до 5 В как единица.
    Если напряжение от 0.9 до 4.2 В, то как интерпретирует это напряжение микросхема неизвестно. Могу предположить, Если предыдушее состояние было лог. 1, а тут бац напряжение вышло в неопределённую зону, то digitalRead всё равно вернёт лог. 1, аналогично с нулём.
    Вот тут можете пробежаться по картинкам и посмотреть как изменение напряжения на выводе (зелёное) меняет интерпретируемое значение микроконтроллером (красное).
    Да, поэтому логичный ответ=) Вы должны сами сделать схемотехнику так, чтобы при замкнутой/разомкнутой кнопке было заранее известное напряжение. ostrov дал ссылку=)
     
    arkadyf нравится это.
  13. ostrov

    ostrov Гуру

    Кстати, перепишите программку в 4 строки используя оператор for. Мы против "китайского кода".
     
    arkadyf нравится это.
  14. parovoZZ

    parovoZZ Гуру

    Подтяжку кто будет включать? Раз уж залезли в даташит, то почитайте в нем рекомендации атмела по неподключенным пинам.
     
    arkadyf и Airbus нравится это.
  15. Airbus

    Airbus Радиохулиган Модератор

    Эт точно!Без неё будут рандомные значения.
     
    arkadyf нравится это.
  16. Elemo

    Elemo Нерд

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

    Спасибо всем кто откликнулся и дал советы. Узнал кое-что новое, а это всегда полезно.
    Спасибо!
     
  17. Daniil

    Daniil Гуру

    Кнопка от амперки - резисторы находятся на правом углу, судя по фото, 10 кОм должны быть ближе к краю, если есть тестер, то померьте.
    Если все верно, то проверьте припаена ли она. Припой может и есть, но контакта нет, это можно проверять режимом прозвонки светодиодов или сопротивлений от контакта резистора до контакта другого элемента на плате (должно быть около нуля).
    Есть вариант, что нажимая щупами тестера вы получите, что всё исправно(надавите и получите замыкание), поэтому аккуратны будьте.

    Даже если сейчас не в этом дело, всё равно напомню, что война с контактами очень страшная штука - не доверяйте разъёмам, пайкам пока их не проверите или проверяйте в первую очередь.
     
  18. Elemo

    Elemo Нерд

    Проверил. Резистор действительно на 10кОм. Между ним и соседним - сопротивление ноль.

    В принципе как только стало ясно, что дело в кнопке то стянул резистором на землю сигнал и теперь все работает. Но за науку - спасибо.
     
    Daniil нравится это.
  19. b707

    b707 Гуру

    Странная у вас логика. Прототип делаете из "рассыпухи", а для чистового устройства - покупаете "детские кубики" от Амперки. Обычно люди поступают наоборот.
     
    Airbus нравится это.
  20. Elemo

    Elemo Нерд

    Мы, нелюди - загадочные :)
    На самом деле говоря о чистовой сборке я наверное немного слукавил. Все равно устройство собрано по сути навесным монтажом. Потом, когда-нибудь, может и перенесу это на нормальный монтаж, если итоговое устройство покажет свою полезность. Сейчас, например, корпус сделан из пластикового продуктового контейнера. И обычный микрик прицепить к нему - проблема. А вот врезать кнопку от Амперки - легко.
    Если проще, то текущая чистовая сборка - прототип. До этого был макет. Вот как-то так... :)