наконец то набрался желания перенести расчет времени вкл. двигателей на ардуино. благо есть функция
millis()Код:
unsigned long previousMillis = 0;
unsigned long currentMillis = 0;
boolean running1 = false;
boolean running2 = false;
byte interval_1 = 30;
byte interval_2 = 30;
int charg = 4;
boolean lastchart = false;
void setup() {
Serial.begin(128000);
Serial.println("TURRET ON");
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, INPUT); // сигнал заряда на входе 4
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
}
void loop()
{ //контроль вкл зарядки
if (digitalRead(charg) == HIGH && lastchart == false)
{ lastchart = true;
Serial.println("chart on"); }
//контроль выклл зарядки
if (digitalRead(charg) == LOW && lastchart == true)
{ lastchart = false;
Serial.println("chart off"); }
if(Serial.available() > 8)
{
byte a,b,c,d,e,f,g,h,i; // принимаем байты и разбиваем их
a = Serial.read(); // питание турели
b = Serial.read(); // лево-1 \ право-0
c = Serial.read(); // шим л\п
d = Serial.read(); // время л\п
e = Serial.read(); // верх-1 \ низ-0
f = Serial.read(); // шим в\н
g = Serial.read(); // время в\н
h = Serial.read(); //выстрел
i = Serial.read(); //лазер
interval_1 = d; //запоминаем длительность вкл л\п
interval_2 = g; //запоминаем длительность вкл в\н
previousMillis = millis();// запоминаем время
if(interval_1 == 0)
running1 = false;
else
running1 = true; //устанавливаем флаг л\п
if(interval_2 == 0)
running2 = false;
else
running2 = true; //устанавливаем флаг в\н
//вкл выкл
if(a == 1)
{ digitalWrite(2, HIGH); Serial.println("power on"); }
if(a == 0)
{ digitalWrite(2, LOW); Serial.println("power off"); }
//выстрел
if(h == 1)
{ digitalWrite(3, HIGH); Serial.println("shot on"); }
if(h == 0)
{ digitalWrite(3, LOW); Serial.println("shot off"); }
//лазер
if(i == 1)
{ digitalWrite(7, HIGH); Serial.println("laser on"); }
if(i == 0)
{ digitalWrite(7, LOW); Serial.println("laser off"); }
//влево
if(b == 1)
{ analogWrite(6, 0);
analogWrite(5, c); Serial.print("left ");Serial.println(c); }
//вправо
if(b == 0)
{ analogWrite(5, 0);
analogWrite(6, c); Serial.print("right ");Serial.println(c); }
//верх
if(e == 1)
{ analogWrite(11, 0);
analogWrite(10, f); Serial.print("up "); Serial.println(f); }
//вниз
if(e == 0)
{ analogWrite(10, 0);
analogWrite(11, f); Serial.print("down "); Serial.println(f); }
Serial.flush();
}
if (running1 == true)
{
currentMillis = millis();
if(currentMillis - previousMillis > interval_1)
{
analogWrite(6, 0);
analogWrite(5, 0);
running1 = false;
Serial.println("time off 1");
}
}
if (running2 == true)
{
currentMillis = millis();
if(currentMillis - previousMillis > interval_2)
{
analogWrite(10, 0);
analogWrite(11, 0);
running2 = false;
Serial.println("time off 2");
}
}
}
число байт выросло до 9. хотел по началу оставить 7,но потом прикинул сколько гемороя будет на стороне labview (вплоть до очереди команд с проверкой пропуска) и забил. разницы все равно не видно.
А вот что действительно заметно, так это появившееся "машинная" точность времени вкл. Минимальное время вкл теперь вплоть до 1мс (+ШИМ). минимальный угол поворота турели снизился (предельная точность наведения повысилась). При значении задержки "0", управление идет как было до этого (крутим до поступления команды на выкл). Теперь в ПО Labview код существенно упростится. Если раньше я извращался вкл\выкл с компа с минимальным доступным промежутком (5мс и как оказалось ужасно скачет), то теперь после обработки кадра, будет отправляться одна команда с вкл. двигателя или без ограничения времени (до обработки следующего кадра) или на заданное время.