Непонятные сигналы

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

  1. Vetrinus

    Vetrinus Гик

    Здравствуйте.
    Имеется какое-то странное поведение двух цифровых входов.
    Проверял следующим образом:
    Код (C++):

    void setup()
    {
      Serial.begin(9600);
      pinMode (C1, INPUT);
      pinMode(C2, INPUT);
      byte i = 0;
      for(byte i =0; i < 10; i++) {pinMode (pinLed[i], OUTPUT);};
    }


    void loop()
    { byte K1 = digitalRead(C1);
      byte K2 = digitalRead(C2);
      byte CaseState = (K1*10)+(K2*20);

      delay(PAUSE_MES);
      Serial.println(CaseState);
    }
    COM выглядит вот так
    [​IMG][/URL]]
    Разумеется, физически на контактах никаких действий не происходит. Что это?
     
  2. AlexU

    AlexU Гуру

    Что за плата? Какие значения C1, C2, pinLed? Что подключено к входам C1, C2?
    Исходя из предположений: плата Arduino UNO, пины C1 и C2 цифровые пины 2..13 ни куда не подключенные, массив pinLed не содержит пины C1, C2.
    Ответ: это шумы. Что бы устранить надо подтянуть пины или к "земле" через резистор, или к +5V с помощью установки режима pinMode (C1, INPUT_PULLUP);
     
  3. Mestniy

    Mestniy Гуру

    А что ознчает это значение?

     
  4. AlexU

    AlexU Гуру

    В контроллерах обычно пины имеют подтягивающие резисторы, управляемые через ключи. Пины ATmega328P в Arduino UNO имеют по одному подтягивающему резистору (20..50 кОм), которые подключают пины к +5V.
    После "подтягивания", функция digitalRead(), будет возвращать HIGH, если пин ни к чему не подключен.
    "Подтянуть" пин к +5V можно несколькими способами:
    Код (C++):
    pinMode (pin, INPUT_PULLUP);
    Код (C++):
    pinMode (pin, INPUT);
    digitalWrite(pin, HIGH);
     
    Mestniy нравится это.
  5. Mestniy

    Mestniy Гуру

    Прикольно!
     
  6. Vetrinus

    Vetrinus Гик

    Принял во внимание существование подтягивающих резисторов, учел это в коде
    Код (C++):
    void setup()
    {
    Serial.begin(9600);
    pinMode (C1, INPUT);
    [B]digitalWrite (C1, HIGH);[/B]
    pinMode(C2, INPUT);
    [B]digitalWrite(C2, HIGH);[/B]
    byte i = 0;
    for(byte i =0; i < 10; i++) {pinMode (pinLed[i], OUTPUT);}; // настраиваем все LED-пины на OUTPUT
    } // конец setup

    void loop()
    { bool K1 = digitalRead(C1);
    bool K2 = digitalRead(C2);
    Serial.print(K1);
    Serial.print("  ");
    Serial.println(K2);
    if (K1 == LOW && K2 == LOW) ledOperate(4); // условие №1 - подаем на пины маску №1
    if (K1 == HIGH && K2 == LOW) ledOperate(3);
    if (K1 == LOW && K2 == HIGH) ledOperate(2);
    if (K1 == HIGH && K2 == HIGH) ledOperate(1);
    delay(PAUSE_MES); // задержка перед следующим измерением
    } // конец loop
    Но теперь у меня на C1 и С2 всегда плюсовой сигнал. Как управлять-то?))
     
  7. Mestniy

    Mestniy Гуру

    Ну тогда подтягивающий резистр ставте... к "-" на 10 kOm(например)
     
  8. Mestniy

    Mestniy Гуру

    И переменную K1 можно было int сделать...
     
  9. Mestniy

    Mestniy Гуру

    А это зачем?
     
  10. Vetrinus

    Vetrinus Гик

     
  11. Vetrinus

    Vetrinus Гик

    А зачем? она хранит состояние цифрового порта. Есть ток, нет тока, + и -. Boolean идеально подходит
     
  12. Mestniy

    Mestniy Гуру

    Ну. А зачем вы ставите значение лед в HIGH в функции Setup. Он у Вас всегда гореть будет, по моему)
     
  13. Vetrinus

    Vetrinus Гик

    А при подтяжке к минусу происходит вот что
    Код (C++):
    0  0
    0  1
    1  1
    1  1
    1  1
    1  1
    1  1
    1  1
    1  1
    1  1
    1  1
    1  1
    1  0
    1  1
    1  0
    1  1
    0  0
    1  1
    0  0
    0  1
    0  0
    0  0
    0  0
    0  0
     
    Задержка между измерениями - 150 мс
    физически контакт был только в течение 2х циклов
     
  14. Mestniy

    Mestniy Гуру

    ledOperate - а что у вас это?
     
  15. Mestniy

    Mestniy Гуру

    А что, если не секрет, вы хотите добиться кодом?
     
  16. Vetrinus

    Vetrinus Гик

    Код (C++):
    #define PAUSE_LED 25
    #define PAUSE_MES 150
    #define C1 2
    #define C2 3
    const byte pinLed [10] = {13, 12, 11, 10, 9, 8, 7, 6, 5, 4}; // массив с адресами пинов

    const bool stateLed[4][10] = { // маска состояний: ноль- выключен, единица- включен
    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // для условия №1
    {1, 1, 1, 1, 1, 0, 0, 0, 0, 0}, // для условия №2
    {0, 0, 0, 0, 0, 1, 1, 1, 1, 1},
    {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
    };

    void setup()
    {
    Serial.begin(9600);
    pinMode (C1, INPUT);
    digitalWrite (C1, LOW);
    pinMode(C2, INPUT);
    digitalWrite(C2, LOW);
    byte i = 0;
    for(byte i =0; i < 10; i++) {pinMode (pinLed[i], OUTPUT);}; // настраиваем все LED-пины на OUTPUT
    } // конец setup

    void loop()
    { bool K1 = digitalRead(C1);
    bool K2 = digitalRead(C2);
    Serial.print(K1);
    Serial.print("  ");
    Serial.println(K2);
    //Serial.println ("delay 150");
    if (K1 == LOW && K2 == LOW) ledOperate(4); // условие №1 - подаем на пины маску №1
    if (K1 == HIGH && K2 == LOW) ledOperate(3);
    if (K1 == LOW && K2 == HIGH) ledOperate(2);
    if (K1 == HIGH && K2 == HIGH) ledOperate(1);
    delay(PAUSE_MES); // задержка перед следующим измерением
    } // конец loop

    void ledOperate(byte state) // функция включения-отключения соответствующих LED по номеру условия
    {
     
    byte i = 0;
    while(pinLed[i])
    {
    digitalWrite (pinLed[i], stateLed[state-1][i]);
    delay(PAUSE_LED); // задержка перед зажиганием следующего LED
    i++;
    }
    } // конец ledOperate
     
  17. Mestniy

    Mestniy Гуру

    Попробуйте void ledOperate поставить перед void loop.
     
  18. Mestniy

    Mestniy Гуру

    И что вы этим хотите добиться?
     
  19. Vetrinus

    Vetrinus Гик

    1Мне нужно организовать систему постепенного включения диодов так, чтобы:
    1)одна из двух групп диодов включалась по сигналу со своего канала, а потом в течение времени PAUSE_MES
    не запрашивала состояние каналов
    2) Диоды загорались с задержкой PAUSE_LED
    3) Можно было добавить задержку PAUSE_DO, которая отодвигает начало реализации постепенного включения светодиодов, но не влияла на периодичность опроса состояния канала PAUSE_MES
    Реализованы только первые два пункта
     
    Последнее редактирование: 22 сен 2015
  20. Mestniy

    Mestniy Гуру

    СДЕЛАЛИ?