Проблема скорости робота-автомобиля

robotics speed

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

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();
}  

Ценю вашу поддержку

, 👍0

Обсуждение

Отсутствуют некоторые заземляющие соединения., @gre_gor

да, но на видео он подключен, забыл добавить это на чертеже. (провод заземления сервопривода), @Ahmed Younes


1 ответ


Лучший ответ:

0

Проблема здесь в конфликте ресурсов. И библиотека 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