1. Уважаемый Гость! При написании вопросов в раздел форума [ArduCopter] Вопросы, проблемы и решения обязательно придерживаться шаблона сообщения, оговоренного в правилах раздела! Если сообщение не будет оформлено должным образом, то и ответ на вопрос будет с наименьшим приоритетом. Старайтесь дать максимально полную информацию по вашей проблеме, чтобы можно было более детально рассматривать вопрос!
    Скрыть объявление
  2. Уважаемый Гость! Хотите получать кэшбэк с покупок в online-магазинах? Сервис "Zozi.ru" дает такую возможность!
    Скрыть объявление
  3. Друзья! Для нашего ресурса необходим дополнительный объем пространства в облаке Dropbox. Подробнее.
    Скрыть объявление

Управление ШД

Тема в разделе "Уголок любителей паяльника", создана пользователем Игорюшка Владимирович, 26 авг 2017.

Реклама. Купить это место.
  1. LampGraph

    LampGraph Кандидат наук

    Регистрация:
    16 ноя 2015
    Сообщения:
    1.229
    Город:
    Абакан
    Имя:
    Вячеслав
    Если я правильно понял, ты хочешь сделать так:
    Проверяем нажата ли кнопка (if...)
    Если нажата -> считываем потенциометр и крутим двиг
    Если не нажата -> останавливаем двиг.
    Все верно?
    Тогда делай так:

    Объявляем функцию в шапке программы:
    Код:
    void Start_Mot();
    Сама функция:
    Код:
    void Start_Mot()
    {
      int Speed = analogRead(A0); // Читаем значение потенциометра
      int SpeedMapped = map(Speed, 0, 1023, 100,1300); // Пропорция значения резистора от 0 to 1023 в скорость (100 to 1300)
      //Serial.println(Speed);Serial.println(SpeedMapped); - очень сильно тормозит двиг!
      stepper.setSpeed(SpeedMapped);
      stepper.runSpeed();
    }
    Ну и вызов функции в обработчике кнопки:
    Код:
    if (buttonState == HIGH)
    {
      Start_Mot();
    ...
    
     
  2. Игорюшка Владимирович

    Игорюшка Владимирович Кандидат наук

    Регистрация:
    8 апр 2015
    Сообщения:
    1.176
    Город:
    г Орёл
    Имя:
    Игорь
    Спасибо, Вячеслав! Я кака лошадь : ВСЁ понимаю, а сказать не могу. :D Т.е - не зная синтаксиса языка, объяснить ардушке что-то не возможно.
    А дело было так (технология "производства"):

    1.Вручную набираю шприТЦ (значит вторая кнопка надо нажать и она поднимет толкатель вверх с большой скоростью, чтобы быстрее заряжать).
    2. Вставляем шпритц , с выдвинутым поршнем, в "приготовленное место".
    3. Начинает работать "основная" программа.

    Итак.
    Программа "ждёт", пока не сработает датчик опускания всей "конструкции", закреплённой на оси Z . Т.е. уп-программы, написанные в Арткаме "влезают как родные".

    1. Датчик срабатывает на высоте "жижеизвержения".
    Первый этап (первый режим программы) -
    на высокой (регулируемой потенциометром) скорости,
    опредёлённое время (например, регулируемая потенциометром дистанция - количество шагов)
    - жижка быстро сжимается ДО состояния выхода из сопла и "на глазок оператора" тормозится, НО ...
    2. Тут же программа переходит во второй режим - постоянного и медленного выдавливания ДО отпускания датчика (т.е, когда каретка ось Z пошла вверх - закончилась линия) . В этом режиме регулируется только скорость.
    3. Линия закончилась... каретка поехала вверх, но "подпружиненная" жижка то всё ещё выдавливается...:cautious: Так вот третье "состояние" - следующий этап программы - она "подтягивает соплю" : на регулируемой резистором скорости и на заданное время или расстояние-обороты-шаги.
    В результате в шприце не только сбрасывается "первоначальное" (от первого этапа) давление, но и подтягивается "сопля". :eek::D
    --- Сообщения объединены, 5 окт 2017 ---
    В итоге блок-схема программы режимов ШД состоит из трёх частей:
    1. Если нажата кнопка №1 (датчик)
    То ШД крутит вперёд 100 (изменяемых) шагов с изменяемой скоростью. Два резистора № 1 и №2 управления.
    2. Далее, (второй блок программы ШД), когда закончились "вступительные" шаги, ШД просто крутит с изменяемой скоростью резистор №3 - пока нажата кноПка-датчик, а программа ждёт отпускания датчика.
    3. Если кнопку отпустить, то программа ШД переходит в режим "поддёргивания сопли" - двиг меняет направление, и крутит 100 шагов (потенциометр №4) со скоростью (потенциометр №5).

    Всё.
    Отработала "цикл" и ждёт
    - либо следующего Z - новая линия,
    - либо кноПку №2 - "зарядка шприца".
    --- Сообщения объединены, 5 окт 2017 ---
    Почему и хотел программу оформить в виде трёх "раздельных функций", а затем связать их IF-ом.
    Будет проще отладить - добавить-убавить... :) Но...
    ... не зная синтаксиса...:(
     
  3. Игорюшка Владимирович

    Игорюшка Владимирович Кандидат наук

    Регистрация:
    8 апр 2015
    Сообщения:
    1.176
    Город:
    г Орёл
    Имя:
    Игорь
    Тогда так. Будут:
    void Start_Mot() - старт впрыска,
    void Xod_Mot() - режим подачи,
    void Otkat_Mot() - откат,
    void Dom_Mot() - зарядка.
    :thumbsup:
     
  4. Игорюшка Владимирович

    Игорюшка Владимирович Кандидат наук

    Регистрация:
    8 апр 2015
    Сообщения:
    1.176
    Город:
    г Орёл
    Имя:
    Игорь
    Первые наброски
    Код:
    // примеры вкучке - диспенсор-дозатор-автоподача
    
    #include <AccelStepper.h> // грузим библиотеку
    
    AccelStepper stepper (1, 8, 9); // ШД тип №1, 8пин сигнал step, 9пин сигнал dir
    
        //Задаём функции режимов
    void Start_Mot(); //функция - старт впрыска,
    void Xod_Mot();   //функция - режим подачи(рабочий Ход),
    void Otkat_Mot(); //функция - откат,
    void Dom_Mot();   //функция - зарядка (толкатель в начальное положение).
    
        //цифровые выходы Индикация режимов
    const int led1 = 6; //индикатор - старт впрыска,
    const int led2 = 5; //индикатор - режим подачи,
    const int led3 = 4; //индикатор - откат,
    const int led4 = 3; //индикатор - зарядка. 
    
         //цифровые входы
    #define K1 11 // кнопка КН1 "вперед"
    #define K2 12 // кнопка КН2 "назад"
       
    int Speed,SpeedMapped; // назначаем переменные скорости 
       
       
    void setup()
    {
    
    pinMode(K1, INPUT_PULLUP);
    pinMode(K2, INPUT_PULLUP);
         
    pinMode(led1, OUTPUT);
    pinMode(led2, OUTPUT);
    pinMode(led3, OUTPUT);
    pinMode(led4, OUTPUT);
    
      stepper.setMaxSpeed(1300);
    //stepper.setAcceleration(110.0);
    
    }
    
    void loop()
    
          // основная программа
    {
       
      if (digitalRead(K1) == LOW)    //если сработал датчик старта K1
         { digitalWrite(led1, HIGH); //включаем индикацию режима старт
           Start_Mot();              //включаем функцию режима старт
           digitalWrite(led1, LOW);  //вЫключаем индикацию режима старт
       
           digitalWrite(led2, HIGH); //включаем индикацию режима рабочий ход
           Xod_Mot();                //включаем функцию режима рабочий ход
           digitalWrite(led1, LOW);  //вЫключаем индикацию режима рабочий ход
         
           digitalWrite(led3, HIGH); //включаем индикацию режима откат
           Otkat_Mot();              //включаем функцию режима откат
           digitalWrite(led1, LOW);  //вЫключаем индикацию режима старт
         
         }
    
      if (digitalRead(K2) == LOW)    //если сработал выключатель возврата толкателя
         { digitalWrite(led4, HIGH); //включаем индикацию режима возврат
         Dom_Mot();                  //включаем функцию режима ДОМОЙ
         digitalWrite(led4, LOW);    //вЫключаем индикацию режима возврат
         }
    }
    
          //stepper.runToNewPosition(500);
          //delay(500);
          //stepper.moveTo(500);
          //stepper.distanceToGo(500);
    
    void Start_Mot()
    {
      int Speed = analogRead(A0); // Читаем значение потенциометра
      int SpeedMapped = map(Speed, 0, 1023, 100,1300); // Пропорция значения резистора от 0 to 1023 в скорость (100 to 1300)
      stepper.setSpeed(SpeedMapped);
      stepper.runSpeed();
    
    }
    void Xod_Mot()
    {
      int Speed = analogRead(A3); // Читаем значение потенциометра
      int SpeedMapped = map(Speed, 0, 1023, 100,1300); // Пропорция значения резистора от 0 to 1023 в скорость (100 to 1300)
      stepper.setSpeed(SpeedMapped);
      stepper.runSpeed();
    
    } void Otkat_Mot()
    {
      int Speed = analogRead(A0); // Читаем значение потенциометра
      int SpeedMapped = map(Speed, 0, 1023, 100,1300); // Пропорция значения резистора от 0 to 1023 в скорость (100 to 1300)
      stepper.setSpeed(SpeedMapped);
      stepper.runSpeed();
    
    } void Dom_Mot()
    {
      int Speed = analogRead(A4); // Читаем значение потенциометра
      int SpeedMapped = map(Speed, 0, 1023, 100,1300); // Пропорция значения резистора от 0 to 1023 в скорость (100 to 1300)
      stepper.setSpeed(-SpeedMapped);
      stepper.runSpeed();
    
    }
    Код работает пока от двух кнопок и регулируются скорости подачи и возврата.
    Остаётся придумать режимы старта и отката - найти их функции в библиотеке.
     
  5. Игорюшка Владимирович

    Игорюшка Владимирович Кандидат наук

    Регистрация:
    8 апр 2015
    Сообщения:
    1.176
    Город:
    г Орёл
    Имя:
    Игорь
    Только со стартовым IF засада будет :
    ...надо вычистить сначала момент нажатия (переход между состояниями кнопки - логически отпущенной и нажатой ) - это будет условие для функции старт и функции ход.
    ...надо вычистить сначала момент отпускания (переход между состояниями кнопки - логически нажатой и отпущенной) - это будет условие для функции откат. :cautious:
     
Реклама. Купить это место.