Серво не отвечает, как ожидалось - PullRequest
1 голос
/ 07 мая 2019

Я впервые использую Arduino для управления воротами пересечения уровня на моей модельной железной дороге, используя LDR и два сервопривода. Я хочу, чтобы поезд переехал через фоторезистор (LDR). На этом мероприятии ворота должны закрыться. Когда поезд пройдет, должна быть задержка, и тогда ворота должны открыться. Код, представленный здесь, упрощен, чтобы просто открыть ворота и закрыть их без необходимых задержек. Поскольку LDR посылает постоянные показания, сервоприводы должны реагировать только на первоначальные изменения, так как я не хочу управлять сервоприводами, тянущими или толкающими ворота после того, как они переместились.

Я пытался использовать глобальный для удержания состояния ворот. Теперь я изменил код для передачи переменной.

#include <Servo.h>
Servo myservo;
int sensorPin = A0; // select the input pin for LDR
int sensorValue = 0; // variable to store the value coming from the sensor
int pos = 1;
int barState;

void setup() {
  Serial.begin(9600); //sets serial port for communication
  myservo.attach(9);
  barState = 0;
}

int upMove(int bs)

bs = 0;
for (pos = 0; pos <= 60; pos += 1) { // goes from 0 degrees to 60 degrees
  // in steps of 1 degree
  myservo.write(pos);              // tell servo to go to position in variable 'pos'
  delay(30);                       // waits 30ms for the servo to reach the position

}
return bs;
}

int downMove(int bs)
{

  bs = 1;
  for (pos = 60; pos >= 0; pos -= 1) { // goes from 60 degrees to 0 degrees
    // in steps of 1 degree
    { myservo.write(pos);              // tell servo to go to position in variable 'pos'
      delay(30);                    // waits 30ms for the servo to reach the position
    }
    return bs;
  }

  int up(int bs)

  {
    if ( bs = 1) {
      bs =  upMove(bs);
    }
    return bs;
  }

  int down(int bs)

  {
    bs = downMove(bs);
  }
  return bs;
}

void loop() {
  { sensorValue = analogRead(sensorPin);                    //define photocellReading as pin 0 input from LDR
    sensorValue = map(sensorValue, 0, 1023, 0, 179);      //map the LDR input to a value between 1-180 so the servo can understand it
    if (sensorValue > 90)         //if the LDR is showing less than half light intensity
    {
      up(barState);
    }
    else if (sensorValue <= 90)   //if the LDR is showing more than half light intensity
    {
      down(barState);   //then tell the servo to rotate forwards at a steady rate
    }
  }
}

Код работает для Вверх, но не для Вниз. Up работает один раз, но Down постоянно сбрасывает и управляет сервоприводом.

1 Ответ

0 голосов
/ 07 мая 2019

Я отточил код, чтобы сделать его немного проще. Теперь он работает, как и ожидалось, за исключением того, что он продолжает работать сервоприводом, а не один раз для каждого изменения LDR

#include <Servo.h>
Servo myservo;
int sensorPin = A0; // select the input pin for LDR
int sensorValue = 0; // variable to store the value coming from the sensor
int pos = 1;
int barState;

void setup() {
  Serial.begin(9600); //sets serial port for communication
  myservo.attach(9);
  barState = 0;
}

void upMove()
{
Serial.print( " In upMove ");Serial.println(barState);

for (pos = 0; pos <= 60; pos += 1) { // goes from 0 degrees to 60 degrees
  // in steps of 1 degree
  myservo.write(pos);              // tell servo to go to position in variable 'pos'
  delay(30);                       // waits 30ms for the servo to reach the position
barState = 0;
}
}

void downMove()
{
Serial.print( " In downMove ");Serial.println(barState);

for (pos = 60; pos >= 0; pos -= 1) { // goes from 0 degrees to 60 degrees
  // in steps of 1 degree
  myservo.write(pos);              // tell servo to go to position in variable 'pos'
  delay(30);                       // waits 30ms for the servo to reach the position
barState = 0;
}


}

void up()

  {
    Serial.print( " In UP 1 ");Serial.println(barState);
    {
     if (barState = 1) upMove();
    }
    Serial.print( " In UP 2 ");Serial.println(barState);
  }

void down()
{
    Serial.print( " In DOWN 1 ");Serial.println(barState);
 {
     if (barState = 1) downMove();
  }

    Serial.print( " In DOWN 2 ");Serial.println(barState);

}

void loop() {
  { sensorValue = analogRead(sensorPin);                    //define photocellReading as pin 0 input from LDR
    sensorValue = map(sensorValue, 0, 1023, 0, 179);      //map the LDR input to a value between 1-180 so the servo can understand it
    if (sensorValue > 90)         //if the LDR is showing less than half light intensity
    {
      up();
    }
    else if (sensorValue <= 90)   //if the LDR is showing more than half light intensity
    {
      down();   //then tell the servo to rotate forwards at a steady rate
    }
  }
}
...