Мой код не регулирует скорость одного из двигателей. И я не уверен, почему.

Я пытаюсь изменить скорость двигателей в зависимости от количества света, попадающего на LDR. Здесь я пытаюсь сделать так, чтобы если LDR имеет большее значение, чем другой, то двигатель, связанный с этим LDR, замедлялся, чтобы он поворачивался к свету.

const int motorDirectionA = 9;
const int motorEnableA = 10;
const int motorDirectionB = 5;
const int motorEnableB = 6;


const int leftLDR = A0;
const int rightLDR = A1;

int motorSpeedA = 250;
int motorSpeedB = 250;

void setup() 
{
  Serial.begin(9600);
  pinMode(motorDirectionA,OUTPUT);
  pinMode(motorEnableA, OUTPUT);
  pinMode(motorDirectionB,OUTPUT);
  pinMode(motorEnableB, OUTPUT);

  pinMode(leftLDR, INPUT);
  pinMode(rightLDR, INPUT);

}

void loop() 
{
  int ldrReadL = analogRead(leftLDR);
  int ldrReadR = analogRead(rightLDR);
  int leftLDRread = ldrReadL;
  int rightLDRread = ldrReadR;

  digitalWrite(motorDirectionA, LOW);
  analogWrite(motorEnableA, motorSpeedA);
  digitalWrite(motorDirectionB, HIGH);
  analogWrite(motorEnableB, motorSpeedB);

  Serial.print("Left LDR reading: ");
  Serial.println(ldrReadL);
  Serial.print("Right LDR reading: ");
  Serial.println(ldrReadR);

  if (leftLDRread > rightLDRread)
  {
    motorSpeedA = 80;
    motorSpeedB = 210;
  }
     else
     {
        motorSpeedA = 210;
        motorSpeedB = 210;
     }

  if (leftLDRread < rightLDRread)
  {
    motorSpeedB = 80;
    motorSpeedA = 210;
  }
      else
     {
       motorSpeedA = 210;
       motorSpeedB = 210;
     }
}

@Maximillian Gerhardt Если левый LDR улавливает больше света, чем правый LDR, то левому двигателю следует назначить «скорость» 80, а правому — 210. Если у правого больше интенсивности, то правому двигателю следует назначить скорость 80, а левому — 210.

Если они оба равны, каждый двигатель должен иметь скорость 210 (хотя я не включил это в код).

, 👍1

Обсуждение

Пусть leftLDRread = a и rightLDRread = b. Два «if» не имеют логического смысла — вы уже охватываете случай «a > b», а в «else» — случай «a <= b». Если a > b, то это попадёт в код первого предложения if и в предложение else второго предложения if, что приведёт к тому, что оба двигателя будут вращаться с одинаковой скоростью, что, вероятно, вы и видите. Можете ли вы более чётко описать, какое значение скорости двигателей следует установить, если leftLDRRead больше или меньше rightLDRread?, @Maximilian Gerhardt

Вы всегда можете отредактировать свой вопрос, добавив пояснения, и удалить этот «ответ». И снова постарайтесь более чётко сформулировать желаемую логику. Если интенсивность света на левом датчике больше, чем на левом, какие скорости мотора следует назначить? Что, если интенсивность света на правом датчике больше? Что, если они оба одинаковы? Если вы отредактируете свой вопрос, добавив желаемое поведение, вы, вероятно, увидите, какой код нужно написать., @Maximilian Gerhardt


1 ответ


1

Если левый LDR улавливает больше света, чем правый LDR, то левому двигателю следует назначить «скорость» 80, а правому — 210. Если правый имеет большую интенсивность, то правому двигателю следует назначить скорость 80, а левому — 210.

Если они оба равны, каждый двигатель должен иметь скорость 210 (хотя я не включил это в код).

В коде это можно выразить так

void loop() 
{
    int ldrReadL = analogRead(leftLDR);
    int ldrReadR = analogRead(rightLDR);
    int leftLDRread = ldrReadL;
    int rightLDRread = ldrReadR;

    digitalWrite(motorDirectionA, LOW);
    analogWrite(motorEnableA, motorSpeedA);
    digitalWrite(motorDirectionB, HIGH);
    analogWrite(motorEnableB, motorSpeedB);

    Serial.print("Left LDR reading: ");
    Serial.println(ldrReadL);
    Serial.print("Right LDR reading: ");
    Serial.println(ldrReadR);

    //предполагая, что motorSpeedA — это левый мотор
    // левое > правое
    if (leftLDRread > rightLDRread) {
        motorSpeedA = 80;
        motorSpeedB = 210;
    } else if( leftLDRread < rightLDRread ) {
        //левое < правое
        motorSpeedA = 210;
        motorSpeedB = 80;
    } else {
        // лево == право
        motorSpeedA = 210;
        motorSpeedB = 210;      
    }
}

Также следует отметить, что это довольно примитивная форма ПИД-регулятора. Вы хотите реагировать на влияние окружающей среды каким-то образом, для чего и предназначен ПИД.

Возможно, вам будут интересны эти видео:

  • https://www.youtube.com/watch?v=1pKJ-KcHZ8g
  • https://www.youtube.com/watch?v=VVOi2dbtxC0

Изменение: код был исправлен, использовалась неправильная переменная (номер контакта и считанное значение)

,

@mymotordude Повторите попытку. Отредактируйте свой вопрос, если хотите оставить комментарий (или зарегистрировать аккаунт?)., @Maximilian Gerhardt