Проблема скорости робота-автомобиля
Если я подключаю его таким образом, у меня нет проблем, и я могу контролировать скорость.
вот видео
const int speedMotorA = 9;
const int speedMotorB = 3;
const int motorPin1 = 4;
const int motorPin2 = 7;
const int motorPin3 = 12;
const int motorPin4 = 13;
void setup() {
Serial.begin(9600);
pinMode(speedMotorA, OUTPUT);
pinMode(speedMotorB, OUTPUT);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
}
void loop(){
TurnMotorA();
TurnMotorB();
}
void TurnMotorA() {
int Speed = analogRead(A2);
Speed = Speed*0.24926686;
Serial.println(Speed);
analogWrite(speedMotorA,Speed);
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
}
void TurnMotorB() {
int Speed = analogRead(A2);
Speed = Speed*0.24926686;
analogWrite(speedMotorB,Speed);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
}
Сейчас я пытаюсь расширить свой мини-проект с помощью сервопривода и ультразвукового датчика.
С помощью этого кода и проводки я перепробовал много способов управления скоростью, но они не работают должным образом. При увеличении скорости двигатель A реагирует, но двигатель B остается выключенным, пока я не достигну максимальной скорости 255. Двигатель B начинает работать.
вот видео
#include <NewPing.h>
#include <Servo.h>
#define TRIG_PIN A4
#define ECHO_PIN A5
#define MAX_DISTANCE 200
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);
Servo myservo;
const int laser = 8;
int distance = 0;
const int speedMotorA = 9;
const int speedMotorB = 3;
const int motorPin1 = 4;
const int motorPin2 = 7;
const int motorPin3 = 12;
const int motorPin4 = 13;
int hitlaser(){
digitalWrite(laser, HIGH);
delay(200);
digitalWrite(laser, LOW);
}
void setup() {
pinMode(laser, OUTPUT);
pinMode(speedMotorA, OUTPUT);
pinMode(speedMotorB, OUTPUT);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
myservo.attach(5);
myservo.write(65);
delay(2000);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
}
void loop() {
int distanceR = 0;
int distanceL = 0;
delay(40);
digitalWrite(laser, HIGH);
if(distance<=50)
{
moveStop();
delay(100);
moveBackward();
delay(300);
moveStop();
delay(200);
distanceR = lookRight();
delay(200);
distanceL = lookLeft();
delay(200);
if(distanceR>=distanceL)
{
turnRight();
moveStop();
}else
{
turnLeft();
moveStop();
}
}else
{
moveForward();
}
distance = readPing();
}
int lookRight()
{
myservo.write(5);
delay(500);
int distance = readPing();
delay(100);
myservo.write(65);
return distance;
}
int lookLeft()
{
myservo.write(150);
delay(500);
int distance = readPing();
delay(100);
myservo.write(65);
return distance;
delay(100);
}
int readPing() {
delay(70);
int cm = sonar.ping_cm();
if(cm==0)
{
cm = 250;
}
return cm;
}
void moveStop() {
analogWrite(speedMotorA, 0);
analogWrite(speedMotorB, 0);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
}
void moveForward() {
int Speed = analogRead(A2);
Speed = Speed*0.24926686;
Serial.println(Speed);
analogWrite(speedMotorA,Speed);
analogWrite(speedMotorB,Speed);
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
}
void moveBackward() {
int Speed = analogRead(A2);
Speed = Speed*0.24926686;
Serial.println(Speed);
analogWrite(speedMotorA,Speed);
analogWrite(speedMotorB,Speed);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
}
void turnRight() {
int Speed = analogRead(A2);
Speed = Speed*0.24926686;
Serial.println(Speed);
analogWrite(speedMotorA,Speed);
analogWrite(speedMotorB,Speed);
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay(300);
moveForward();
}
void turnLeft() {
int Speed = analogRead(A2);
Speed = Speed*0.24926686;
Serial.println(Speed);
analogWrite(speedMotorA,Speed);
analogWrite(speedMotorB,Speed);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(300);
moveForward();
}
обновление:
После удаления сервопривода из проекта он, кажется, работает, но как мне использовать сервопривод в этом проекте? Спасибо Majenko♦ обновление 2 После подключения сервопривода к контакту 9 я теперь могу контролировать скорость, но все еще есть некоторые проблемы, например, когда у роботизированной машины есть препятствия, она должна делать обратный ход >> проблема в том, что >> только один мотор движется назад!.
#include <NewPing.h>
#include <Servo.h>
#define TRIG_PIN A4
#define ECHO_PIN A5
#define MAX_DISTANCE 200
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);
Servo myservo;
const int laser = 8;
int distance = 0;
const int speedMotorA = 11;
const int speedMotorB = 3;
const int motorPin1 = 4;
const int motorPin2 = 7;
const int motorPin3 = 12;
const int motorPin4 = 13;
int hitlaser(){
digitalWrite(laser, HIGH);
delay(200);
digitalWrite(laser, LOW);
}
void setup() {
pinMode(laser, OUTPUT);
pinMode(speedMotorA, OUTPUT);
pinMode(speedMotorB, OUTPUT);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
myservo.attach(9);
myservo.write(65);
delay(2000);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
}
void loop() {
int distanceR = 0;
int distanceL = 0;
delay(40);
digitalWrite(laser, HIGH);
if(distance<=50)
{
moveStop();
delay(100);
moveBackward();
delay(1000);
moveStop();
delay(200);
distanceR = lookRight();
delay(200);
distanceL = lookLeft();
delay(200);
if(distanceR>=distanceL)
{
turnRight();
moveStop();
}else
{
turnLeft();
moveStop();
}
}else
{
moveForward();
}
distance = readPing();
}
int lookRight()
{
myservo.write(5);
delay(500);
int distance = readPing();
delay(100);
myservo.write(65);
return distance;
}
int lookLeft()
{
myservo.write(150);
delay(500);
int distance = readPing();
delay(100);
myservo.write(65);
return distance;
delay(100);
}
int readPing() {
delay(70);
int cm = sonar.ping_cm();
if(cm==0)
{
cm = 250;
}
return cm;
}
void moveStop() {
analogWrite(speedMotorA, 0);
analogWrite(speedMotorB, 0);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
}
void moveForward() {
int Speed = analogRead(A2);
Speed = Speed*0.24926686;
Serial.println(Speed);
analogWrite(speedMotorA,Speed);
analogWrite(speedMotorB,Speed);
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
}
void moveBackward() {
int Speed = analogRead(A2);
Speed = Speed*0.24926686;
Serial.println(Speed);
analogWrite(speedMotorA,Speed);
analogWrite(speedMotorB,Speed);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
}
void turnRight() {
int Speed = analogRead(A2);
Speed = Speed*0.24926686;
Serial.println(Speed);
analogWrite(speedMotorA,Speed);
analogWrite(speedMotorB,Speed);
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
delay(300);
moveForward();
}
void turnLeft() {
int Speed = analogRead(A2);
Speed = Speed*0.24926686;
Serial.println(Speed);
analogWrite(speedMotorA,Speed);
analogWrite(speedMotorB,Speed);
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
delay(300);
moveForward();
}
Ценю вашу поддержку
@Ahmed Younes, 👍0
Обсуждение1 ответ
Лучший ответ:
Проблема здесь в конфликте ресурсов. И библиотека Servo, и PWM для пина 9 требуют один и тот же таймер.
Библиотека Servo поддерживает до 12 двигателей на большинстве плат Arduino и 48 на Arduino Mega. На платах, отличных от Mega, использование библиотеки отключает функциональность analogWrite() (PWM) на контактах 9 и 10, независимо от того, есть ли на этих контактах Servo.
Вам следует выбрать другой контакт ШИМ (не контакт 10) вместо контакта 9.
для сервопривода я использую только один пин myservo.attach(5);, @Ahmed Younes
myservo.attach(8); (я изменил его на вывод 8, но все равно не работает)., @Ahmed Younes
Хорошо, я удалил сервопривод из проекта, и он, кажется, работает, так как мне исправить эту проблему и позволить ему работать с сервоприводом? Вопрос обновлен Спасибо! @https://arduino.stackexchange.com/users/4143/majenko, @Ahmed Younes
Еще одно обновление2, пожалуйста, проверьте, @Ahmed Younes
@ahmedyounes Неважно, где сервопривод. Нужно менять штифт 9 pwm для мотора - как ясно сказано в моем ответе., @Majenko
да, я больше не использую вывод 9 для двигателя, я обновил код в разделе обновлений, единственная проблема в том, что когда он работает в обратном направлении, работает только один двигатель, выложу видео, @Ahmed Younes
Если вы вырежете из своей программы весь код, кроме кода, который заставляет ее всегда работать в обратном порядке, будет ли это работать?, @Majenko
Большое спасибо, Majenko, теперь все работает. Есть ли какая-либо документация по отключению этих выводов при использовании библиотеки сервопривода?, @Ahmed Younes
- Tower Pro MG996R сервопривод с высоким крутящим моментом 180 °, управляющий с помощью Arduino
- Как управлять 4 двигателями постоянного тока с помощью Arduino?
- Как преобразовать ШИМ 0-5В в ШИМ 0-12В
- Аккумуляторы LiPo с контроллером L298N
- Как сделать электронную присоску?
- Регулятор скорости для потолочного вентилятора 220 В переменного тока 100 Вт
- Максимальная скорость SPI для ведомого Uno/clone?
- Линия, следующая за проблемами робота
Отсутствуют некоторые заземляющие соединения., @gre_gor
да, но на видео он подключен, забыл добавить это на чертеже. (провод заземления сервопривода), @Ahmed Younes