[частично решено] Проблема с экспериментом 9 (миксер) в Матрёшка Z. Помехи от мотора.

Тема в разделе "Arduino & Shields", создана пользователем altex, 22 июл 2014.

  1. altex

    altex Гик

    Эксперимент 9. Миксер
    Ссылка - http://wiki.amperka.ru/конспект-arduino:миксер

    Есть три кнопки, одна включает моторчик на полную скорость (кнопка 2), одна включает на половину скорости (кнопка 1), и одна кнопка выключает мотор (кнопка 0).
    Сделал пример, возникла проблема.
    Если нажать на кнопку 2 или кнопку 1, то моторчик начинает вращаться с соответствующей кнопке скоростью, но через секунду-две-три отключается.

    Сделал debug, вот полный пример программы

    Код (Text):
    #define MOTOR_PIN        9
    #define FIRST_BUTTON_PIN 5
    #define BUTTON_COUNT    3
    // имена можно давать не только числам, но и целым выражениям.
    // Мы определяем с каким шагом (англ. step) нужно менять
    // скорость (англ. speed) мотора при нажатии очередной кнопки
    #define SPEED_STEP  (255 / (BUTTON_COUNT - 1))
    void setup()
    {
      pinMode(MOTOR_PIN, OUTPUT);
      // на самом деле, в каждом пине уже есть подтягивающий
      // резистор. Для его включения необходимо явно настроить пин
      // как вход с подтяжкой (англ. input with pull up)
      for (int i = 0; i < BUTTON_COUNT; ++i) {
        pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);
      }
      Serial.begin(9600);
    }
    void loop()
    {
      for (int i = 0; i < BUTTON_COUNT; ++i) {
        // если кнопка отпущена, нам она не интересна. Пропускаем
        // оставшуюся часть цикла for, продолжая (англ. continue)
        // его дальше, для следующего значения i
        int readed = digitalRead(i + FIRST_BUTTON_PIN);

        if (readed) {
          continue;
        }
       
        Serial.println("----------");
        Serial.print("Readed button=");
        Serial.print(i);
        Serial.print(" data=");
        Serial.println(readed);

      // кнопка нажата — выставляем соответствующую ей скорость
        // мотора. Нулевая кнопка остановит вращение, первая
        // заставит крутиться в полсилы, вторая — на полную
        int speed = i * SPEED_STEP;
        // подача ШИМ-сигнала на мотор заставит его крутиться с
        // указанной скоростью: 0 — стоп машина, 127 — полсилы,
        // 255 — полный вперёд!
        analogWrite(MOTOR_PIN, speed);
      }
    }
    Тоесть добавил
    Код (Text):
        Serial.println("----------");
        Serial.print("Readed button=");
        Serial.print(i);
        Serial.print(" data=");
        Serial.println(readed);
    В итоге вижу, что при каждом нажатии на кнопку, до её отпускания, срабатывает несколько раз эта кнопка (что логично).
    Но после отпускания кнопки, не сразу, через некоторое время (1-2-3 секунды примерно) срабатывает ошибочно какая-то ещё кнопка (допустим 1 или 2), так может происходить несколько раз, и в конце всегда срабатывает кнопка 0, что выключает мотор.

    Вот пример вывода, после того как кнопка была нажата и отпущена сразу же.
    Код (Text):
    ----------
    Readed button=2 data=0
    ----------
    Readed button=2 data=0
    ----------
    Readed button=2 data=0
    ----------
    Readed button=2 data=0
    ----------
    Readed button=1 data=0
    ----------
    Readed button=0 data=0
     
    Видно, что кто-то нажал на кнопку 2, подождал, потом нажал на кнопку 1, затем на 0.
    Хотя я нажал и отпустил кнопку 2, больше ничего не нажимал.

    Почему так происходит?
     
  2. Unixon

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

    Попробуйте добавить внешнюю подтяжку на кнопки.
     
  3. altex

    altex Гик

    Причём это лечится добавлением delay(100) после выполнения цикла for.
    Но я не понимаю почему.

    Тоесть по логике программы, после нажатия на кнопку 2
    функция digitalRead(7); возвращает 0 вместо 1 (так как pin mode INPUT_PULLUP, притянут к Vcc всегда)
    затем внезапно digitalRead(6) и digitalRead(5) тоже возвращают "0", хотя они продолжают быть притянутыми к Vcc, и кнопка на ноль не замыкалась.

    Причём я пробовал делать без INPUT_PULLUP, а просто INPUT и сам притягивал через резистор 10КОм к Vcc, но это не помогло никак, всё так же были фейковые срабатывания кнопки.
     
  4. altex

    altex Гик

    Да, попробовал сразу, ничего не поменялось, точно так же ложные срабатывания кнопок, которые не нажимал.
     
  5. altex

    altex Гик

    Собрал тоже всё правильно, вот схема [​IMG]
     
  6. altex

    altex Гик

    Причём если мотор отключить, то эффект пропадает (судя по логам дебага).
    Чую есть какая-то паразитная связь
     
  7. Unixon

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

    А от чего все это хозяйство питается?
     
  8. altex

    altex Гик

    Пробовал два варианта
    1) через USB 2.0 (500 мА)
    2) от батарейки Крона (9 В)

    Оба варианта дают одинаковый эффект - фейковые нажатия.
     
  9. подключи затвор мосфета через резистор на несколько Ом
     
  10. altex

    altex Гик

    Подключил через 55Ом
    Паразитный эффект сохранился.
     
  11. Unixon

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

    Если двигатель запитать просто от Vin, без транзистора, чтобы постоянно крутился, в таком состоянии он тоже будет мешать?
     
  12. altex

    altex Гик

    Подключил двигатель напрямую к Vin без транзистора.
    В режиме дебага вижу рандомный поток данных, как будто все подряд кнопки рандомно нажимаются.
     
  13. значит параллельно мотору надо конденсатор повесить, ~0,1 микрофарады.
     
  14. Unixon

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

    ... и запитать его через дроссель с ферритовым сердечником.
     
  15. altex

    altex Гик

    Подключил параллельно мотору 100нФ керамический кондей - ничего не поменялось.
     
  16. altex

    altex Гик

    Ой.
    Вот этого в наборе Матрёшка Z нету :(
    Я конечно могу дойти до радиодеталей, но не совсем понятно с какой индуктивностью нужно брать,
    или нужно расчитывать? Последний раз я этим занимался лет 10 назад, можете помочь с расчётами?
     
  17. CEMEH

    CEMEH Нуб

    У меня та же самая проблема.
    Причем добавление дебага с записью в последовательный порт решает проблему. :)
     
  18. altex

    altex Гик

    Замерил напряжение на кнопках при включенном моторе.
    После включения мотора оно падает с 4.8В до 4.7В потом выравнивается до 4.76В
     
  19. Установите подтягивающие резисторы на кнопки, у меня подобная проблема была
     

    Вложения:

  20. altex

    altex Гик

    Я пробовал делать без INPUT_PULLUP, а просто INPUT и сам притягивал через резистор 10КОм к Vcc, но это не помогло никак, всё так же были фейковые срабатывания кнопки.