Arduino сервопривод управления с 2 LDRS - PullRequest
0 голосов
/ 17 октября 2019

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

Я пробовал устанавливать диапазоны (если они находятся в этом диапазоне друг от друга). Я попытался округлить значения LDR до ближайшей сотни, это помогло, но это все еще слишком много. Я попытался избавиться от всех функций задержки, на случай, если они все испортили, но потом он начал дергаться повсюду. Изменение значения резисторов, которые я использую (в настоящее время 220 Ом, но пробовал другие, безрезультатно).

 #include <Servo.h>
//Setup the integers and servo
int leftLightSensor = A1;
int rightLightSensor = A0;
int leftAnalogValue = 0;
int rightAnalogValue = 0;
int leftRoundedValue = 0;
int rightRoundedValue = 0;
int servoPin = 8;
Servo myServo;

//Attach the servo to the digital pin
void setup() {
  // put your setup code here, to run once:
  myServo.attach(servoPin);
  Serial.begin(9600);  // doing this just to be able to see the values I'm working with
}

//Do all the things
void loop() {
  // put your main code here, to run repeatedly:
  leftAnalogValue = analogRead(leftLightSensor);
  rightAnalogValue = analogRead(rightLightSensor);
  leftRoundedValue = 100*((leftAnalogValue + 50) / 100);  //rounding the values to the nearest hundred(ex. 342 = 300)
  rightRoundedValue = 100*((rightAnalogValue + 50) / 100); // same thing here
  delay(100);


  Serial.println(leftRoundedValue); 
  Serial.println(rightRoundedValue);

  if(leftRoundedValue > rightRoundedValue){
    myServo.write(0);
  }
  else if(leftRoundedValue < rightRoundedValue){
    myServo.write(180);
  }
  else{
    myServo.write(92);
  }
}

Цель состоит в том, чтобы сервопривод вращался в направлении наиболее яркогоисточник света и остановить, когда он указывает на него. Но вместо этого он просто делает то, что кажется случайным движением. Иногда он едва работает примерно секунду, а затем возвращается к случайным движениям.

1 Ответ

0 голосов
/ 18 октября 2019

Я вижу две большие проблемы,

  1. это строка:

    if (leftRoundedValue> rightRoundedValue) {myServo.write (0);} else if (leftRoundedValue

Вы говорите ему двигаться до крайности, если свет с одной стороны ярче, чем с другой. Из вашего описания видно, что вы действительно хотите немного подвинуться и снова проверить свет. Если индикатор находится в положении 120, этот код никогда не сможет его найти. Он перейдет к 180, увидит, что свет находится слева, затем перейдет к 0 и увидит, что свет направо, а затем перейдет к 180. Он никогда не сможет перейти в любую другую позицию.

Что еще хуже, если он обнаружил, что свет и два значения равны, вы не говорите ему оставаться там, вы говорите, чтобы он переместился на 92, что, опять же, может быть не там, где свет,

Другой является эта строка:

leftRoundedValue = 100*((leftAnalogValue + 50) / 100); 

Первая часть этого может переполниться, если аналоговое значение больше, чем 277. Поскольку все, что есть int, математика будет выполнена в 16математика с битами со знаком и 100 * 328 будут переполнены и int и даст отрицательный результат. Вместо этого сделайте это следующим образом:

leftRoundedValue = 100ul*((leftAnalogValue + 50) / 100); 

Это приведет к тому, что правая сторона будет обрабатываться как 32-битная беззнаковая. Он не будет переполнен, и тогда результат должен помещаться в int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...