отключение сервоприводов

temnyi_engels
Offline
Зарегистрирован: 04.04.2017

Друзья, помогите начинающему ардуинщику.

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

[code]
/*Управляем сервой в зависимости от освещенности
  Используем фотосопротивление, может быть любой аналоговый сенсор
*/
#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();
}
 
[/code]
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Если Вам нужно просто пеиодически устанавливать сервопривод а различные положения без удержания, проще отказаться от servo.h и работать непосредственно с сервоприводом.

temnyi_engels
Offline
Зарегистрирован: 04.04.2017

Нет мне необходимо что бы сервопривод удерживал положение жалюзей постоянно и раз в 5 минут корректировал их наклон в зависимости от осещения. Как мне лучше реализовать свою задумку? вы можете мне помочь?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Сервопривод удерживает, когда работает, а вот когда отключен, он не удерживает. Как вам помочь я не знаю. Может сходите к специалистам,врачу например.

zDimaBY
Offline
Зарегистрирован: 10.06.2018

temnyi_engels пишет:

Нет мне необходимо что бы сервопривод удерживал положение жалюзей постоянно и раз в 5 минут корректировал их наклон в зависимости от осещения. Как мне лучше реализовать свою задумку? вы можете мне помочь?

void loop()
{
  if (millis() - timing > 10000){ // Вместо 10000 подставьте нужное вам значение паузы
  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();
  timing = millis(); 
 }
}

Сделать так.