Объединение проектов Матрешки "9. Миксер" и "17.Пантограф"

Тема в разделе "Arduino & Shields", создана пользователем super.ivan192837465, 19 янв 2017.

  1. Добрый день!
    Пытаемся объединить проекты "9. Миксер" и "17.Пантограф": для установки на лодку. Регулирование скорости мотора (миксер) и управление рулем (пантограф).
    Собрали обе схемы на одной макетке (pin 3 вместо 9-го для проекта Пантограф). По отдельности все работает.Но вместе реакция не верная - нажимаем кнопку для миксера, но "дергается" пантограф.
    Если в скетче закомментировать myServo.attach(3); то миксер начинает работать.
    Видимо, что-то пересекается-накладывается в модуле Servo.
    Что поправить?
    Скетч ниже:
    // константы "миксера"
    #define MOTOR_PIN 9 //вывод для мотора
    #define FIRST_BUTTON_PIN 5 //пин первой кнопки
    #define BUTTON_COUNT 3 //количество кнопок
    #define POT_MAX_ANGLE 270.0 //максимальный угол отклонения

    #define SPEED_STEP (255 / (BUTTON_COUNT - 1))
    #include <Servo.h>
    Servo myServo;
    void setup()
    {
    myServo.attach(3); // привязываем серву пантографа к выходу 3

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

    }

    void loop()
    {
    //читаем положение переменного резистора с пина А0
    int val = analogRead(A0);
    // формируем угол отклонения пантографа пропорционально потенциометру
    int angle = int(val / 1024.0 * POT_MAX_ANGLE);
    angle = constrain(angle, 0, 180);

    //вывод на пин 3 пантографа
    myServo.write(angle);


    for (int i = 0; i < BUTTON_COUNT; ++i) //проверяем три кнопки управления скоростью мотора
    {

    if (digitalRead(i + FIRST_BUTTON_PIN))
    continue; //первая - стоп
    int speed = i * SPEED_STEP; //вторая - половина скорости, третья - полная скорость
    analogWrite(MOTOR_PIN, speed); //выдаем ШИМ на мотор, пин 9
    }
    }
     
    Последнее редактирование: 19 янв 2017
  2. sslobodyan

    sslobodyan Гик

    Очень тяжело читать код без тэгов "Код". Опишите более понятно что такое миксер и пантограф. Не заставляйте лазить по сайту и искать другие проекты. Я правильно понимаю, что вы хотите изменять напряжение на А0 переменником и при этом должна повернуться серва на 3 пине? А нажатием одной из трех кнопок на пинах 5,6,7 должна выбраться одна из трех скоростей на пине 9?
     
  3. Отредактировал скетч. Выделенное жирным курсивом - относится к проекту "пантограф" (совершенно верно - управление сервой,на пине 3, пропорционально положению потенциометра вход А0).
    Обычный текст - проект "миксер". управление скорости мотора по нажатию трех кнопок пины 5, 6,7 (стоит, половинка скорости, полная скорость - вывод на пин 9).
    По отдельности (если комментарить) каждый работает. Вместе нет, причем пантограф (серва на пине 3) управляется своим потенциометром (А0). А при нажатии кнопок мотора - мотор стоит, а серва (которая из другого проекта и электрически не связана ни с кнопками, ни с выводами этого проекта) начинает "подергиваться". Предполагаю, что есть пересечение программно в модуле Servo. Либо что-то не так делаю.
     
  4. ostrov

    ostrov Гуру

    Под элементарным оформлением имелось ввиду вот это:
    Код (C++):
    // константы "миксера"
    #define MOTOR_PIN 9 //вывод для мотора
    #define FIRST_BUTTON_PIN 5 //пин первой кнопки
    #define BUTTON_COUNT 3 //количество кнопок
    #define POT_MAX_ANGLE 270.0 //максимальный угол отклонения

    #define SPEED_STEP (255 / (BUTTON_COUNT - 1))
    #include <Servo.h>
    Servo myServo;
    void setup()
    {
      myServo.attach(3);

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

    }

    void loop()
    {
      //читаем положение переменного резистора с пина А0
      int val = analogRead(A0);
      // формируем угол отклонения пантографа пропорционально потенциометру
      int angle = int(val / 1024.0 * POT_MAX_ANGLE);
      angle = constrain(angle, 0, 180);
      //вывод на пин 3 пантографа
      myServo.write(angle);

      for (int i = 0; i < BUTTON_COUNT; ++i) //проверяем три кнопки
      {

        if (digitalRead(i + FIRST_BUTTON_PIN))
          continue; //первая - стоп
        int speed = i * SPEED_STEP; //вторая - половина скорости, третья - полная скорость
        analogWrite(MOTOR_PIN, speed); //выдаем ШИМ на мотор
      }
    }
     
  5. Проект Миксер.
    [​IMG]
     
  6. Проект Пантограф. В моем случае пин 9 заменен на пин 3
    [​IMG]
     
  7. Jedi

    Jedi Гик

    Правильно полагаете, причина в servo.

    "Ограничение по количеству подключаемых сервоприводов
    На большинстве плат Arduino библиотека Servo поддерживает управление не более 12 сервоприводами, на Arduino Mega это число вырастает до значения 48. При этом есть небольшой побочный эффект использования этой библиотеки: если вы работаете не с Arduino Mega, то становится невозможным использовать функцию analogWrite() на 9 и 10 контактах независимо от того, подключены сервоприводы к этим контактам или нет. На Arduino Mega можно подключить до 12 сервоприводов без нарушения функционирования ШИМ/PWM, при использовании большего количества сервоприводов мы не сможем использовать analogWrite() на 11 и 12 контактах."

    Более подробно тут:
    http://wiki.amperka.ru/робототехника:сервоприводы
     
    super.ivan192837465 и arkadyf нравится это.
  8. Спасибо, большое!
    Поменял местами пин мотора и сервы (3 и 9) и все получилось!
    analogWrite() на 3 пине работает без вопросов.

    Код (C++):
    #define MOTOR_PIN        3
    #define FIRST_BUTTON_PIN 5
    #define BUTTON_COUNT     3
    #define POT_MAX_ANGLE 270.0

    #define SPEED_STEP  (255 / (BUTTON_COUNT - 1))
    #include <Servo.h>
    Servo myServo;
    void setup()
    {
      myServo.attach(9);
     
       pinMode(MOTOR_PIN, OUTPUT);
       for (int i = 0; i < BUTTON_COUNT; ++i)  
        pinMode(i + FIRST_BUTTON_PIN, INPUT_PULLUP);  
     
    }

    void loop()
    {
          int val = analogRead(A0);
          int angle = int(val / 1024.0 * POT_MAX_ANGLE);
          angle = constrain(angle, 0, 180);
          myServo.write(angle);
       
     
      for (int i = 0; i < BUTTON_COUNT; ++i)
      {
        if (digitalRead(i + FIRST_BUTTON_PIN))
        continue;
        int speed = i * SPEED_STEP;
        analogWrite(MOTOR_PIN, speed);
      }
    }
     
  9. Кстати, хороший пример для того, чтобы Амперка включила в список проектов Матрешки. Во-первых "со смыслом" - реальное управление моторной лодочкой (руль и скорость движения), во-вторых проясняется использование модуля серво.