сервопривод на жалюзи

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

  1. teeny_engels

    teeny_engels Нуб

    Друзья, помогите начинающему ардуинщику.
    Пытаюсь впихнуть в код отключение сервопривода после установки на заданный угол. Но почему-то после отработки, и паузы в 3 секунды больше не работает((( Ниже скетч управления жалюзями.

    Код (Text):

    /*Управляем сервой в зависимости от освещенности
      Используем фотосопротивление, может быть любой аналоговый сенсор
    */
    #include <Servo.h> //Подключаем библиотеку Servo
    Servo motor1;
    //Servo motor2;
    int sensePin1 = 0;//Обьявляем 0 аналоговый пин
    //int sensePin2 = 1;//Обьявляем 1 аналоговый пин
    void setup()
    {
      analogReference(DEFAULT); //Объявляем диапазон чтения с аналогового порта.Необязательное
      /* Будем смотреть вывод на сериальном мониторе с Ардуино, для чего его инициализируем
        Заодно можно посмотреть диапазон работы датчика чтобы в этом диапазоне поворачивать серву*/
      Serial.begin(9600);
      motor1.attach(10); // Подключаем серву на 10 пин
      //motor2.attach(9); // Подключаем серву на 10 пин
    }

    void loop()
    {
      motor1.attach(10);
      // Печатаем на монитор
      Serial.println(analogRead(sensePin1));
      //Serial.println(analogRead(sensePin2));
      int val1 = analogRead(sensePin1);// Создаем переменную val1 для чтения analogRead
      //int val2 = analogRead(sensePin2);// Создаем переменную val2 для чтения analogRead
      val1 = constrain(val1, 0 , 1023); // Ограничиваем диапазон работы датчика посмотрев его на мониторе
      //                                    (200 - что бы свет из комнаты не мешал,
      //                                     900 чтобы и в пасмурную погоду жалюзи были открыты на полную)
      //val2 = constrain(val2, 400 , 900); // Ограничиваем диапазон работы датчика посмотрев его на мониторе
      int motor1Angl = map(val1, 0, 1023, 150, 0); //Преобразуем диапазон выдаваемый датчиком в диапазон углов сервы
      //int motor2Angl = map(val1, 900, 400, 5, 170); //Преобразуем диапазон выдаваемый датчиком в диапазон углов сервы
      motor1.write(motor1Angl);// Устанавливаем серву на угол который получаем через преобразование
      //motor2.write(motor2Angl);// Устанавливаем серву на угол который получаем через преобразование
      //motor1.detach();
      delay (3000); //делаем  задержку 300000 - 5 минут (что бы сервы не трещали)
      motor1.detach();
    }

     
     
  2. rkit

    rkit Гуру

    Вы не можете знать, в каком положении сейчас сервопривод. Вы не можете его отключить без дополнительных ключей. И если его отключить, то он не будет удерживать положение.
     
  3. teeny_engels

    teeny_engels Нуб

    Подскажите, а как лучше тогда реализовать мою задумку? Вы можете помочь?!
     
  4. rkit

    rkit Гуру

    ну для начала было бы неплохо озвучить задумку
     
  5. teeny_engels

    teeny_engels Нуб

    Итак задумка такова: ардуино опрашивает датчик света раз в 5 минут, далее включает сервопривод и поворачивает на определённый угол в зависимости от показания датчика. Потом сервопривод засыпает, но угол поворота держит.
    Насколько я понимаю должен быть какой-то массив где записывается показания датчика. Потом при опросе ардуино смотрит изменились ли показания, И на основе этих данных прибавляется либо убавляется угол. Заранее извиняюсь если коряво объяснил. Обязательно научусь всё делать правильно.
     
  6. teeny_engels

    teeny_engels Нуб

    то есть мы регулируем угол открытия жалюзей в зависимости от освещенности.
    Крайние значения: на улице светло - жалюзи полностью открыты, на улице темно - жалюзи полностью закрыты.
    данные с датчика света от 0 до 1023 мы преобразовываем в угол от 0 до 180 сервы (там я уже примерно подобрал значения подходящие мне)
    в принципе мне не критично будет ли ВСЕ засыпать на 5 минут или только серва (может сейчас и глупость сморозил). Мне главное что бы серва раз в 5 минут просыпалась (на нее подавалось напряжение) поворачивалась на определенный градус (в зависимости от количества света) и опять засыпала на 5 минут
     
  7. rkit

    rkit Гуру

    Сервоприводы работают постоянно. Нету никакого "заснуть" и "проснуться".
     
  8. teeny_engels

    teeny_engels Нуб

    а нельзя как то снимать с них напряжение? что бы они не трещали?
     
  9. rkit

    rkit Гуру

    Сервоприводы не должны просто так трещать. Это либо износ, либо помехи, либо плохая калибровка.
     
  10. Onkel

    Onkel Гуру

    Можно. Но тогда они могут "уехать", а в момент включения и выключения питания на них могут себя непредсказуемо вести... А могут и не уехать. Если две причины "трещания" сервопривода- фича (а по большому счету глюк) библиотеки servo.h и несовершенство самих сервомашинок. Если можете поставить цифровые сервомашинки, то можно посылать команду установки угла один раз,ну два для надежности, и сервомашинка будет стоять как вкопанная. Аналоговая может "отъезжать" , зато дешевле. Ну а если "трещат" сервомашинки даже при идеальном сигнале управления - то только менять. Есть еще вариант смазать специальной графитовой смазкой потенциометр внутри сервомашинки, но это для ювелиров. По поводу убрать треск как-то писал несколько рецептов, извините что не кликабельно [​IMG]