Актуатор

Тема в разделе "Arduino & Shields", создана пользователем Aizek, 20 май 2016.

  1. Aizek

    Aizek Нуб

    Подключаю по такой схеме,ардуинка сгорела-вообще не отвечает.если вместо ардуинки подавать на мосфет 9v кроной ,то все щелкает отлично.если вместо батареи использовать крону то сил у актуатора не хватает.батарея от ибп 12в 7ач. Подскажите как сделать правильно.
     

    Вложения:

    • 66.png
      66.png
      Размер файла:
      173,9 КБ
      Просмотров:
      846
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

  3. Mifodiay

    Mifodiay Нуб

    Решил не создовать новой темы, решил выложить тут. Долго искал как управлять линейным приводом (актуатор), в режиме отрыть, закрыть по времени. Вот скетч может кому-то будет полезно

    Код (C++):
    const int actuator_OP = 36;  
    const int actuator_CL = 27;  

    static byte cleaning; // необходимо создать счётчик переменную до цикла
    unsigned long previousMillis = 0;
    boolean opening = false; //флаг
    boolean stopping = false;


    void setup() {
    pinMode(actuator_OP, OUTPUT);
    pinMode(actuator_CL, OUTPUT);
    Serial.begin(9600);
    }

    void extendActuator() {
        digitalWrite(actuator_OP, HIGH);
        digitalWrite(actuator_CL, LOW);
    }

    void retractActuator() {
        digitalWrite(actuator_OP, LOW);
        digitalWrite(actuator_CL, HIGH);
    }

    void stopActuator() {
        digitalWrite(actuator_OP, LOW);
        digitalWrite(actuator_CL, LOW);
    }
    void loop() {
     
      if (millis() - previousMillis >= 1000) {// начало пауза, а потом работа
        cleaning++;
         Serial.println(cleaning);
         Serial.println(millis());
          Serial.print("counter");
        if (cleaning >= 5) { //interval *5 этап 1
         extendActuator();
         opening = true;
         Serial.print("OPEN");}
         //cleaning=0;}
      if((cleaning >= 7) && (opening == true) ) {//interval +5 +2 этап 2
         stopActuator();
         stopping = true;
         Serial.print("STOP");}  
      if ((cleaning >= 12)&& (stopping == true)) {//interval +5 +2+5 этап 3 (этап 1= этап 3)
         retractActuator();
         Serial.print("CLOSE");
        cleaning =0; }    
        previousMillis = millis();
       
        }
    }
    и второй код, где действие повторяется несколько раз подряд

    Код (C++):
    const int actuator_OP = 36;  //назначаем контакт для открытия
    const int actuator_CL = 27;  //назначаем контакт для закрытия

    byte cleaning=0; // необходимо создать переменную до цикла
    unsigned long previousMillis = 0;


    void setup() {
    pinMode(actuator_OP, OUTPUT);
    pinMode(actuator_CL, OUTPUT);
    }

    void extendActuator() {
        digitalWrite(actuator_OP, HIGH);
        digitalWrite(actuator_CL, LOW);
    }

    void retractActuator() {
        digitalWrite(actuator_OP, LOW);
        digitalWrite(actuator_CL, HIGH);
    }

    void stopActuator() {
        digitalWrite(actuator_OP, LOW);
        digitalWrite(actuator_CL, LOW);
    }
    void loop() {
       //~~~~~~~~~~~~~~~~~~~~~~~работает нужно ~~~~~~~~~~~~~~~~~~~~~~~~~~~
       while (cleaning<3){ // цикл выполняется, пока i меньше 3
     
       extendActuator(); //сначало работа, а потом пауза
        delay(6000);

        stopActuator();
        delay(3000);

        retractActuator();
        delay(6000);
       
        stopActuator();
        delay(3000);
    cleaning++; // изменение переменной
       }
    }
    Если кто подскажет как избавиться от delay() в последнем скетче буду очень признателен
     
  4. b707

    b707 Гуру

    в первом скетче как раз и показано, как избавится от delay
     
  5. Un_ka

    Un_ka Гик

    Может так?
     
  6. Mifodiay

    Mifodiay Нуб

    да я в курсе про это, но если я из первого скетча дело перенесу во второй, он Заработает или придется немного допилить?
    В прошлой рас что-то пошло не так.
    Так и цель второго скетча бала в том что бы повторить тело кода n-количество раз
     
  7. Mifodiay

    Mifodiay Нуб

    за ссылку спасибо буду пробывать
     
  8. b707

    b707 Гуру

    так "попробывай" сам, че спрашивать то?
     
  9. Mifodiay

    Mifodiay Нуб

    я попробывал ,и не заработало
    Код (C++):
    const int actuatori_OP = 36;  //назначаем контакт для открытия
    const int actuator_CL = 27;  //назначаем контакт для закрытия
    byte operating=0; // необходимо создать переменную до цикла

    static byte cleaning; // необходимо создать счётчик переменную до цикла
    unsigned long previousMillis = 0;
    boolean opening = false; //флаг
    boolean stopping = false;


    void setup() {
    pinMode(actuator_OP, OUTPUT);
    pinMode(actuator_CL, OUTPUT);
    Serial.begin(9600);
    }

    void extendActuator() {
        digitalWrite(actuator_OP, HIGH);
        digitalWrite(actuator_CL, LOW);
    }

    void retractActuator() {
        digitalWrite(actuator_OP, LOW);
        digitalWrite(actuator_CL, HIGH);
    }

    void stopActuator() {
        digitalWrite(actuator_OP, LOW);
        digitalWrite(actuator_CL, LOW);
    }
    void loop() {
     
    while (operating<3){ // цикл выполняется, пока i меньше 3
       
      if (millis() - previousMillis >= 1000) {
        cleaning++;
         Serial.println(cleaning);
         Serial.println(millis());
          Serial.print("counter");
        if (cleaning >= 5) { //interval *5 этап 1
         extendActuator();
         opening = true;
         Serial.print("OPEN");}
         //cleaning=0;}
      if((cleaning >= 7) && (opening == true) ) {//interval +5 +2 этап 2
         stopActuator();
         stopping = true;
         Serial.print("STOP");}  
      if ((cleaning >= 12)&& (stopping == true)) {//interval +5 +2+5 этап 3 (этап 1= этап 3)
         retractActuator();
         Serial.print("CLOSE");
        cleaning =0; }    
        previousMillis = millis();
       
        }
        operating++;
    }
    }
    не кидайте тапками, пока я это вижу так. но это не работает. поэтому и прошу подсказать