Запуск сервоприводов один раз в программе

vlasov-serg-27
Offline
Зарегистрирован: 21.06.2014

Требуется запустить сервоприводы (работают синхроно) только при наличии сигнала с датчика линии. То есть если есть линия они запускаются поворачиваются: первый - от 0 до 50 градусов, второй - от 60 до 0; и возвращаются в начальное положение: первый - о градусов, второй - 60 градусов.
Текст программы:


#include <VarSpeedServo.h> 
VarSpeedServo myservo1;
VarSpeedServo myservo2;
const int servoPin1 = 30; // Серва с поворотом 0-50
const int servoPin2 = 31; // серва с поворотом 60-0
int lDSL1=25; // датчик линии
void setup() 
{ 
myservo1.attach(servoPin1);
myservo1.write(0,0,true);
myservo2.attach(servoPin2); 
myservo2.write(60,0,true);
} 
void loop() 
{
int val_lDSL1=digitalRead(lDSL1);
if (val_lDSL1==HIGH)
{
myservo1.write(0,30);
myservo2.write(60,40);
delay(2000);
myservo1.write(50,30);
myservo2.write(0,40);
delay(2000);
}
}

Поэтому тексту сервопривода работают постоянно, мне нужно что бы они запустились один раз из положения: первый - от 0 до 50 градусов, второй - от 60 до 0; и возвратились в начальное положение: первый - о градусов, второй - 60 градусов. Кто нибудь может помочь с решение проблемы, очень срочно нужно. Буду очень сильно благодарен.

Araris
Offline
Зарегистрирован: 09.11.2012

То есть val_lDSL1==HIGH остается, и if (val_lDSL1==HIGH) срабатывает при каждом проходе loop() ?

Если так, то заведите переменную-флажок и пользуйтесь. Как-то так :

#include <VarSpeedServo.h>
VarSpeedServo myservo1;
VarSpeedServo myservo2;
const int servoPin1 = 30; // Серва с поворотом 0-50
const int servoPin2 = 31; // серва с поворотом 60-0
int lDSL1=25; // датчик линии

boolean do_it_once = true;
void setup()
{
myservo1.attach(servoPin1);
myservo1.write(0,0,true);
myservo2.attach(servoPin2);
myservo2.write(60,0,true);
}
void loop()
{
int val_lDSL1=digitalRead(lDSL1);
if (val_lDSL1 && do_it_once)
{
do_it_once = false;

myservo1.write(0,30);
myservo2.write(60,40);
delay(2000);
myservo1.write(50,30);
myservo2.write(0,40);
delay(2000);
}
}

А если надо, добавте еще и

if (!val_lDSL1) do_it_once = true;

тогда сервы будут срабатывать на изменения val_lDSL1

inspiritus
Offline
Зарегистрирован: 17.12.2012

Если нужно однократное исполнение кода , поместите его в секцию "setup" , секция "loop" при этом может оставаться пустой, или например в ожидании нажатия кнопки для программного ресета.