Почему я не могу контролировать скорость двигателя? (М1 и Е1)
Когда комментируется myservo_1,myservo_2,myservo_3,myservo_4
, я не могу контролировать скорость своего двигателя M1. Но только когда я раскомментирую myservo_1
и так далее, я снова могу управлять скоростью двигателя.
Кто-нибудь может мне помочь? Мои коды перечислены ниже:
#include <Servo.h>
Servo myservo_1;
Servo myservo_2;
Servo myservo_3;
Servo myservo_4;
int SensorL = 0;
int SensorR = 0;
int SensorM = 0;
#define E1 10
#define M1 12
#define E2 11
#define M2 13
int pos = 0;
int incomingByte = 0;
void setup()
{
Serial.begin(9600);
myservo_1.attach(9);
myservo_2.attach(8);
myservo_3.attach(7);
myservo_4.attach(6);
pinMode(SensorL, INPUT);
pinMode(SensorR, INPUT);
pinMode(SensorM, INPUT);
pinMode(M1, OUTPUT);
pinMode(M2, OUTPUT);
// pinMode(E1, OUTPUT);
// pinMode(E2, OUTPUT);
}
void loop()
{
SensorR = digitalRead(2);
SensorL = digitalRead(3);
SensorM = digitalRead(5);
if (SensorL == LOW && SensorR == LOW && SensorM == HIGH)
{
digitalWrite(M1, HIGH);
digitalWrite(M2, HIGH);
analogWrite(E1, 255);
analogWrite(E2, 255);
Serial.println(" FORWARD ");
// задержка (1);
}
if (SensorL == HIGH && SensorR == LOW && SensorM == HIGH)
{
digitalWrite(M1, HIGH);
digitalWrite(M2, LOW);
analogWrite(E1, 255);
analogWrite(E2, 255);
Serial.println(" LEFT ");
// задержка (1);
}
if (SensorL == LOW && SensorR == HIGH && SensorM == HIGH) //движемся вправо
{
digitalWrite(M1, LOW);
digitalWrite(M2, HIGH);
analogWrite(E1, 255);
analogWrite(E2, 255);
Serial.println(" RIGHT ");
// задержка (1);
}
if (SensorL == HIGH && SensorR == HIGH && SensorM == HIGH) // стоп
{
digitalWrite(M1, HIGH);
digitalWrite(M2, HIGH);
analogWrite(E1, 0);
analogWrite(E2, 0);
Serial.println(" STOP ");
// задержка (1);
}
if (SensorL == HIGH && SensorR == LOW && SensorM == LOW) //движемся влево
{
digitalWrite(M1, HIGH);
digitalWrite(M2, LOW);
analogWrite(E1, 125);
analogWrite(E2, 125);
Serial.println(" LEFT ");
// задержка (1);
}
if (SensorL == LOW && SensorR == HIGH && SensorM == LOW) //движемся вправо
{
digitalWrite(M1, LOW);
digitalWrite(M2, HIGH);
analogWrite(E1, 125);
analogWrite(E2, 125);
Serial.println(" MoVE Right ");
// задержка (1);
}
if (Serial.available() > 0)
{
incomingByte = Serial.read();
{
{
if (incomingByte == 'J')//ОХРАНА ОТКРЫТА
{
myservo_1.write(0);
Serial.println(" ARM OPEN ");
}
if (incomingByte == 'L')//ВЗЯТИЕ ЗАКРЫТИЯ
{
myservo_1.write(180);
Serial.println(" ARM CLOSE ");
}
if (incomingByte == 'I')//ВООРУЖЕНИЕ
{
myservo_2.write(0);
myservo_3.write(180);
Serial.println(" ARM UP ");
}
if (incomingByte == 'K')//ВЗЯТИЕ
{
myservo_2.write(180);
myservo_3.write(0);
Serial.println(" ARM DOWN ");
}
if (incomingByte == 'U')//ПОВЕРНУТЬ ВЛЕВО
{
myservo_4.write(0);
Serial.println(" ROTATE LEFT ");
}
if (incomingByte == 'O')//ПОВЕРНУТЬ ВПРАВО
{
myservo_4.write(180);
Serial.println(" ROATE RIGHT ");
}
if (incomingByte == 'M')
{
myservo_1.write(90);
myservo_2.write(90);
myservo_3.write(90);
myservo_4.write(90);
Serial.println(" ALL STOP ");
}
if (incomingByte == 'N')//ARM STOP
{
myservo_1.write(90);
Serial.println(" ARM STOP ");
}
if (incomingByte == 'B')//ВВЕРХ ВНИЗ СТОП
{
myservo_2.write(90);
myservo_3.write(90);
Serial.println(" UP DOWN STOP ");
}
if (incomingByte == 'V')//СТОП ВРАЩЕНИЯ
{
myservo_4.write(90);
Serial.println(" ROTATION STOP ");
}
if (incomingByte == 'W')
{
digitalWrite(M1, HIGH);
digitalWrite(M2, HIGH);
analogWrite(E1, 200);
analogWrite(E2, 0);
Serial.println(" FORWARD ");
}
if (incomingByte == 'Z')
{
digitalWrite(M1, HIGH);
digitalWrite(M2, HIGH);
analogWrite(E1, 255);
analogWrite(E2, 255);
Serial.println(" FORWARD ");
delay(100);
}
if (incomingByte == 'S')
{
digitalWrite(M1, LOW);
digitalWrite(M2, LOW);
analogWrite(E1, 255);
analogWrite(E2, 255);
Serial.println(" REVERSE ");
}
if (incomingByte == 'A')
{
digitalWrite(M1, HIGH);
digitalWrite(M2, LOW);
analogWrite(E1, 255);
analogWrite(E2, 255);
Serial.println(" LEFT ");
}
if (incomingByte == 'D')
{
digitalWrite(M1, LOW);
digitalWrite(M2, HIGH);
analogWrite(E1, 255);
analogWrite(E2, 255);
Serial.println(" TURNING RIGHT ");
}
if (incomingByte == 'X')
{
digitalWrite(M1, LOW);
digitalWrite(M2, HIGH);
analogWrite(E1, 0);
analogWrite(E2, 0);
Serial.println(" STOP MANAUAL ");
}
if (incomingByte == 'w')
{
digitalWrite(M1, HIGH);
digitalWrite(M2, HIGH);
analogWrite(E1, 125);
analogWrite(E2, 125);
Serial.println(" SLOW FORWARD ");
}
if (incomingByte == 's')
{
digitalWrite(M1, LOW);
digitalWrite(M2, LOW);
analogWrite(E1, 125);
analogWrite(E2, 125);
Serial.println(" SLOW REVERSE ");
}
if (incomingByte == 'a')
{
digitalWrite(M1, HIGH);
digitalWrite(M2, LOW);
analogWrite(E1, 125);
analogWrite(E2, 125);
Serial.println(" SLOW LEFT ");
}
if (incomingByte == 'd')
{
digitalWrite(M1, LOW);
digitalWrite(M2, HIGH);
analogWrite(E1, 125);
analogWrite(E2, 125);
Serial.println(" SLOW RIGHT ");
}
}
}
}
}
@Eugene24Tab, 👍0
2 ответа
Библиотека Servo использует таймер 1
для отправки сигналов на сервоприводы. Но таймер 1
также используется для запуска ШИМ на контактах 9 и 10. Однако он не может работать одновременно.
Поскольку двигатель E1 использует контакт 10, а таймер 1
уже используется библиотекой сервоприводов, ШИМ и, соответственно, analogWrite
не работает. р>
E2 использует контакт 11, который использует таймер 2
для ШИМ, поэтому на него это не влияет.
Поэтому переместите E1 на один из контактов ШИМ, кроме 9 и 10, и все должно снова заработать.
Однако я не знаю, почему M1 не работает.
- Пожалуйста, исправьте свой код, есть несколько ошибок, например
- строки в начале цикла SensorR = digitalRead(2); SensorL = цифровое чтение (3); SensorM = цифровое чтение (5); нет никакого смысла.. как вы не определили 2,3,5 контакт как вход. И для приема аналогового ввода пожалуйста, измените контакты 2,3,5 и аналоговые контакты..
- Выводы двигателя M1 и M2 подключены 12,13, которые не являются контактами pwm, поэтому вы не можете использовать их для изменения скорости вашего двигателя. Пожалуйста, сделайте это код разумный....
E1 E2 используются контактами pwm для управления скоростью, а датчик ir определен как ввод выше., @Eugene24Tab
- Почему сервопривод вращается на 360 градусов?
- Как использовать фотодиод для arduino?
- Как повторить код
- Почему задержка более 64 миллисекунд останавливает вращение серводвигателя? Я не использую «Servo.h», вместо этого я просто управляю длиной импульса.
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Как заставить сервопривод вращаться на угол больше 180°
- (Код ультразвукового датчика: такого файла или каталога нет)
- Бесполезная проводка коробки и код
Я изменил контакт для моего сервопривода 2 3 5 6, поэтому это не повлияет на контакты 9 и 10, но у кого бы он ни был, он все еще не работает должным образом, но мой E2 M2 все еще работает нормально. Есть ли другой метод устранения неполадок? Кстати большое спасибо!, @Eugene24Tab
Это не то, что я сказал. Вы можете использовать как библиотеку сервоприводов (неважно, какие контакты вы используете для сервоприводов), так и ШИМ на контактах 9 и 10. Поскольку вам **нужна** библиотека сервоприводов, вы не можете использовать контакты 9 и 10 для ШИМ. Таким образом, вам нужно изменить контакт для этого двигателя, который в настоящее время подключен к контакту 10. Замена контактов сервопривода здесь **не** помогает., @Gerben