Эксперимент 9

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Kampbell, 12 окт 2019.

  1. Kampbell

    Kampbell Нуб

    Добрый день!

    Проблема в следующем. Сегодня добрался до "эксперимент 9. Миксер" на вики Амперки. Суть в следующем - есть моторчик (в моем случае dc-130) и три кнопки. Нажимаешь первую, моторчик жужжит на полную силу, нажимаешь вторую - вполсилы, третья - стоп.

    Но дело в том, что моторчик работает только когда кнопка нажата, отпускаешь её и он останавливается.
    Вот код -

    Код (C++):
    void loop() {
      for (int i = 0; i < BUTTON_COUNT; ++i) {
        if (!(digitalRead(i + FIRST_BUTTON_PIN)))
          analogWrite(MOTOR_PIN, i * SPEED_STEP);
      }
    }
    Решение проблемы нашел случайно, пытаясь выяснить в чем проблема, вот так, работает, как надо, т.е. моторчик работает, пока не нажмешь кнопку остановки -

    Код (C++):
    void loop() {
      for (int i = 0; i < BUTTON_COUNT; ++i) {
        if (!(digitalRead(i + FIRST_BUTTON_PIN)))
          analogWrite(MOTOR_PIN, i * SPEED_STEP);
          Serial.println("speed = " + i);
      }
    }
    Почему?
     
  2. Kampbell

    Kampbell Нуб

    На всякий случай, arduino uno не оригинальная, заказана на али.
     
  3. BAR__MEN

    BAR__MEN Розбійник Администратор

    Удивительно, но код из вики и Ваш не совпадают!
    Тот, что в вики, рабочий 100%. По крайней мере работал 5 лет назад

    Ваш код:
    Код (Text):
    void loop() {
      for (int i = 0; i < BUTTON_COUNT; ++i) {
        if (!(digitalRead(i + FIRST_BUTTON_PIN)))
          analogWrite(MOTOR_PIN, i * SPEED_STEP);
      }
    }
    Вики:
    Код (Text):
    void loop()
    {
      for (int i = 0; i < BUTTON_COUNT; ++i) {
        if (digitalRead(i + FIRST_BUTTON_PIN))
          continue;
        int speed = i * SPEED_STEP;
        analogWrite(MOTOR_PIN, speed);
      }
    }
    Неужели разницы нет?
     
  4. Asper Daffy

    Asper Daffy Гуру

    Прости, за несколько личный вопрос, ты какую религию исповедуешь?

    Не то, чтобы я имел что-то против каких-то религий, просто мне интересно, которая из них не позволяет приводить код полностью.
     
    DetSimen, Andrey12 и BAR__MEN нравится это.
  5. Kampbell

    Kampbell Нуб

    2BAR__MEN: Код слегка изменен, да. Но тот, что в вики тоже не работает, как надо (по крайней мере у меня). Вероятно дело в китайской ардуино?

    2Asper Daffy: Вероятно именно та религия, которая предполагает, что в остальных частях ничего неизмененно и это не затронет тонких струн вашей нежной и легкоранимой души.
     
  6. BAR__MEN

    BAR__MEN Розбійник Администратор

    Все работает. Смотрите схему, возможно, в ней ошибка
    В таком случае, нужно оставлять ссылку на полный код. Искать специально мало кто будет.
    Да и вообще, нужно весь оставлять, мало ли...
     
  7. Kampbell

    Kampbell Нуб

    Это как? Если ошибка в схеме, то сгорело бы или не работало. А так прекрасно работает, кхм... когда Serial.println добавляешь. Да и перепроверял я эту схему уже десятки раз.

    Да и тестил я по всякому-переповсякому. Ставишь analogWrite(MOTOR_PIN, 125); в setup() (loop() пустой) - жужжит не переставая, переносишь в for, останавливается, как только кнопку отпускаешь ((

    Принято. Спасибо.
     
  8. BAR__MEN

    BAR__MEN Розбійник Администратор

    Ошибаетесь...
    А кроме этого ничего не трогаете?
     
  9. Kampbell

    Kampbell Нуб

    В том-то и дело. Эту строку добавляю (ну и Serial.begin(9600) в setup(), конечно же) - всё нормально, удаляю - попрежнему работает только при нажатой кнопке. Чудеса! ((
     
  10. BAR__MEN

    BAR__MEN Розбійник Администратор

    Дайте код в двух этих вариантах, попробую у себя...
     
  11. Kampbell

    Kampbell Нуб

    Итак, нерабочий вариант (у меня нерабочий), т.е. моторчик перестает работать, когда отпускаешь кнопку -
    Код (C++):
    #define MOTOR_PIN 9
    #define FIRST_BUTTON_PIN 5
    #define BUTTON_COUNT 3

    #define SPEED_STEP (255 / (BUTTON_COUNT - 1))

    void setup() {
      pinMode(MOTOR_PIN, OUTPUT);

      for (int i = 0; i < BUTTON_COUNT; ++i)
        pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);
    }

    void loop() {
      for (int i = 0; i < BUTTON_COUNT; ++i) {
        if (!(digitalRead(i + FIRST_BUTTON_PIN)))
          analogWrite(MOTOR_PIN, i * SPEED_STEP);
      }
    }
    Рабочий вариант -
    Код (C++):
    #define MOTOR_PIN 9
    #define FIRST_BUTTON_PIN 5
    #define BUTTON_COUNT 3

    #define SPEED_STEP (255 / (BUTTON_COUNT - 1))

    void setup() {
      Serial.begin(9600);
      pinMode(MOTOR_PIN, OUTPUT);

      for (int i = 0; i < BUTTON_COUNT; ++i)
        pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);
    }

    void loop() {
      for (int i = 0; i < BUTTON_COUNT; ++i) {
        if (!(digitalRead(i + FIRST_BUTTON_PIN)))
          analogWrite(MOTOR_PIN, i * SPEED_STEP);

        Serial.println("speed = " + i);
      }
    }
    Кстати, только что проверил. Если в коде от амперки добавить Serial.println, то ничего не изменится, вариант остается "нерабочим".
     
  12. BAR__MEN

    BAR__MEN Розбійник Администратор

    У меня все три кода работают...
     
  13. Kampbell

    Kampbell Нуб

    Значит и правда китайская ардуино виновата. Других причин не вижу.
     
  14. DetSimen

    DetSimen Спамовредитель Модератор

    А на ей нигде Wavgat не написано?
     
  15. Kampbell

    Kampbell Нуб

    Не-а! Абсолютный нонейм, обычный синий текстолит и надпись UNO. И в Arduino IDE никакого намека на Wavgat нет, в Инструменты -> Плата определилась, как Arduino/Genuino Uno. Это в версии 1.8.10. В 1.8.9 вроде Genuino не было, но уже точно не скажу, не помню.
     
  16. parovoZZ

    parovoZZ Гуру

    Она определяется по паре PID/VID. А она одинаковая у всех.
     
  17. Ariadna-on-Line

    Ariadna-on-Line Гуру

    В код, который без сериала, в местЕ вывода в сериал поставьте какой-либо delay(x).
     
  18. b707

    b707 Гуру

    Плату где покупали? - если на Алиэкспрессе - дайте ссылку конкретно на свой лот
     
  19. Airbus

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

    Да Вавгат это 100 пудов