Мой код не регулирует скорость одного из двигателей. И я не уверен, почему.
Я пытаюсь изменить скорость двигателей в зависимости от количества света, попадающего на 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 (хотя я не включил это в код).
@mymotordude, 👍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
- Управление скоростью вентилятора с помощью библиотеки Arduino PID
- Как устранить шум от вентилятора 12 В с ШИМ-управлением на низкой скорости
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Как заставить сервопривод вращаться на угол больше 180°
- Управлять двигателем с помощью кнопки
- Почему Adafruit motor shield не крутит моторы?
- Как управлять 6 шаговыми двигателями с помощью Arduino?
- Пропорциональный контроль расхода воды
Пусть
leftLDRread = aиrightLDRread = b. Два «if» не имеют логического смысла — вы уже охватываете случай «a > b», а в «else» — случай «a <= b». Еслиa > b, то это попадёт в код первого предложенияifи в предложениеelseвторого предложенияif, что приведёт к тому, что оба двигателя будут вращаться с одинаковой скоростью, что, вероятно, вы и видите. Можете ли вы более чётко описать, какое значение скорости двигателей следует установить, если leftLDRRead больше или меньше rightLDRread?, @Maximilian GerhardtВы всегда можете отредактировать свой вопрос, добавив пояснения, и удалить этот «ответ». И снова постарайтесь более чётко сформулировать желаемую логику. Если интенсивность света на левом датчике больше, чем на левом, какие скорости мотора следует назначить? Что, если интенсивность света на правом датчике больше? Что, если они оба одинаковы? Если вы отредактируете свой вопрос, добавив желаемое поведение, вы, вероятно, увидите, какой код нужно написать., @Maximilian Gerhardt