Помогите оптимизировать!

Dimidrol
Offline
Зарегистрирован: 19.02.2016

Делаю схему 

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

Так же хотелось бы уточнить. при подаче питаия серво приводы сразу же поворачиваютя на 90 граусов не зависемо от того нажата кнопка или нет. Я подозреваю это из за того что питане приводит серво приводы в тонус. или я ошибюсь?

Код

// библиотека с коммандами для сервоприводов
#include <Servo.h> 
//описание библиотеки по ссылке - arduino.cc/en/Reference/Servo
int knopka = 8; //Объявляем переменую кнопки и цепляем на пин 8
Servo servo1;  // объект сервопривод №1
Servo servo2; // серво привод №2 
void setup()
{
  pinMode(knopka, INPUT); //указываем пин на вход
  servo2.attach(11); // Серво привод подключен к пину 11
  servo1.attach(9); // Сервопривод подключен к цифровому выходу 9
  //servo1.detach() для расслабления мотора сервопривода
}
 
void loop()
{
if(digitalRead(knopka) == HIGH) //проверяем нажата кнопка или нет. если да выполняем код ниже
{
  //Код движения сервоприводов
  servo1.write(90);    // повернись на 90 град.
  delay(1000);         // пауза чтобы он успел повернуться
  servo2.write(90);		//второй серво привод поворот 90 град
  delay(1000);			//пуза второго
  servo1.write(180);   // повернись на 180 град.
  delay(1000);         // пауза
  servo2.write(180);	//поворот второго привода на 180 град
  delay(1000);			//пауза второго
  servo1.write(0);     // повернись до уровня 0 град.
  delay(1000);         // пауза
  servo2.write(0);		//поворот второго на 0 град
  delay(1000);			//пауза второго

 }
  
}

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Как-то так:

void loop()
{
 if(digitalRead(knopka) == HIGH) //проверяем нажата кнопка или нет. если да выполняем код ниже
 {
  //Код движения сервоприводов
  if (millis()-time > 1000)
  {
    time=millis();
    switch (st)
    {
    case 0: servo1.write(90); st++; break;
    case 1: servo2.write(90); st++; break;
    case 2: servo1.write(180); st++; break;
    case 3: servo2.write(180); st++; break;
    case 4: servo1.write(0); st++; break;
    case 5: servo2.write(0); st=0; break;
    }
  }
 }
}

 

Dimidrol
Offline
Зарегистрирован: 19.02.2016

Если можно коментарий бы еще. Для большей понятности.

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Надо объявить пару переменных:

unsigned long time;
byte st=0;

Что еще комментировать не знаю... millis() что ли?

Dimidrol
Offline
Зарегистрирован: 19.02.2016

Не могу понять зачем нужны 6.7.8 строки? Зачем вычисять милисикунды? Логику объясните пожалуйста!

vvadim
Offline
Зарегистрирован: 23.05.2012

Dimidrol пишет:

 

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

Так же хотелось бы уточнить. при подаче питаия серво приводы сразу же поворачиваютя на 90 граусов не зависемо от того нажата кнопка или нет. Я подозреваю это из за того что питане приводит серво приводы в тонус. или я ошибюсь?

Код

// библиотека с коммандами для сервоприводов
#include <Servo.h> 
//описание библиотеки по ссылке - arduino.cc/en/Reference/Servo
int knopka = 8; //Объявляем переменую кнопки и цепляем на пин 8
Servo servo1;  // объект сервопривод №1
Servo servo2; // серво привод №2 
void setup()
{
  pinMode(knopka, INPUT); //указываем пин на вход
  servo2.attach(11); // Серво привод подключен к пину 11
  servo1.attach(9); // Сервопривод подключен к цифровому выходу 9
  //servo1.detach() для расслабления мотора сервопривода
}
 
void loop()
{
if(digitalRead(knopka) == HIGH) //проверяем нажата кнопка или нет. если да выполняем код ниже
{
  //Код движения сервоприводов
  servo1.write(90);    // повернись на 90 град.
  delay(1000);         // пауза чтобы он успел повернуться
  servo2.write(90);		//второй серво привод поворот 90 град
  delay(1000);			//пуза второго
  servo1.write(180);   // повернись на 180 град.
  delay(1000);         // пауза
  servo2.write(180);	//поворот второго привода на 180 град
  delay(1000);			//пауза второго
  servo1.write(0);     // повернись до уровня 0 град.
  delay(1000);         // пауза
  servo2.write(0);		//поворот второго на 0 град
  delay(1000);			//пауза второго

 }
  
}

 

 

вы бы начали с более точного определения алгоритма работы кнопки и серв

потом запустили кнопку правильно (с антидребезгом)

ну и полностью уйти от делеев чтобы всю вашу прграмму не тормозило

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Dimidrol пишет:
Не могу понять зачем нужны 6.7.8 строки? Зачем вычисять милисикунды? Логику объясните пожалуйста!

Что бы раз в секунду, что нибудь делать с сервами, собственно, как и в твоем коде... жду когда разница между счетчиком millis и переменной time будет равна 1000 (т.е. 1 сек), а все остальное время опрашиваю кнопку, как ты и хотел.

Dimidrol пишет:
Нажал кнопку серва привоы заработали. Отпустил остановились.

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Приведённый код работает как конечный автомат, меняя состояния - шаги (STep). Автомат состояний работает только когда нажата кнопка, при этом состояния перебираются раз в секунду. В остальное время ничего не происходит.

Dimidrol
Offline
Зарегистрирован: 19.02.2016

vvadim пишет:

вы бы начали с более точного определения алгоритма работы кнопки и серв

потом запустили кнопку правильно (с антидребезгом)

ну и полностью уйти от делеев чтобы всю вашу прграмму не тормозило

Тоесть более точно? 

А как избавится от делай если нужно немного замедлить ход Сервомотора?

Dimidrol
Offline
Зарегистрирован: 19.02.2016

Andy Спасибо!

AS31979
Offline
Зарегистрирован: 22.12.2015

Недавно ковырялся искал опрос кнопок в фоне, нашол http://robotosha.ru/arduino/multi-tasking-arduino.html

100% ответ на ваш вопрос :)