Проблема с автомобильным ботом Arduino, серводвигатель движется случайным образом и довольно быстро нагревается

Я пытаюсь создать Arduino, избегающую препятствий. Использование Arduino Uno +shield (sensor sheild v5.0). Проблема в том, что когда я загружаю код, сервопривод двигается случайным образом (не вращается вправо) и быстро нагревается, это SG90 с 5v. Я уже проверял несколько раз, и с оборудованием все в порядке.

Я пытался изменить угол сервопривода, несколько раз проверял штифты - много раз загружал код. Я также использовал serial.prints. исследовал в интернете.

#include <NewPing.h>        //Библиотека функций ультразвукового датчика. Вы должны установить эту библиотеку

//наши управляющие контакты L298N
const int LeftMotorForward = 5;
const int LeftMotorBackward = 4;
const int RightMotorForward = 1;
const int RightMotorBackward = 0;

//контакты датчика
#define trig_pin A1 //аналоговый вход 1
#define echo_pin A2 //аналоговый вход 2

#define maximum_distance 200
boolean goesForward = false;
int distance = 100;

NewPing sonar(trig_pin, echo_pin, maximum_distance); //функция датчика
Servo servo_motor; //имя нашего сервопривода

void setup(){

  pinMode(RightMotorForward, OUTPUT);
  pinMode(LeftMotorForward, OUTPUT);
  pinMode(LeftMotorBackward, OUTPUT);
  pinMode(RightMotorBackward, OUTPUT);

  servo_motor.attach(11); //наш сервопривод

  servo_motor.write(90);
  delay(2000);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
  distance = readPing();
  delay(100);
}

void loop(){

  int distanceRight = 0;
  int distanceLeft = 0;
  delay(50);

  if (distance <= 20){
    moveStop();
    delay(300);
    moveBackward();
    delay(400);
    moveStop();
    delay(300);
    distanceRight = lookRight();
    delay(300);
    distanceLeft = lookLeft();
    delay(300);

    if (distance >= distanceLeft){
      turnRight();
      moveStop();
    }
    else{
      turnLeft();
      moveStop();
    }
  }
  else{
    moveForward(); 
  }
    distance = readPing();
}

int lookRight(){  
  servo_motor.write(10);
  delay(500);
  int distance = readPing();
  delay(100);
  servo_motor.write(90);
  return distance;
}

int lookLeft(){
  servo_motor.write(170);
  delay(500);
  int distance = readPing();
  delay(100);
  servo_motor.write(90);
  return distance;
  delay(100);
}

int readPing(){
  delay(70);
  int cm = sonar.ping_cm();
  if (cm==0){
    cm=250;
  }
  return cm;
}

void moveStop(){

  digitalWrite(RightMotorForward, LOW);
  digitalWrite(LeftMotorForward, LOW);
  digitalWrite(RightMotorBackward, LOW);
  digitalWrite(LeftMotorBackward, LOW);
}

void moveForward(){

  if(!goesForward){

    goesForward=true;

    digitalWrite(LeftMotorForward, HIGH);
    digitalWrite(RightMotorForward, HIGH);

    digitalWrite(LeftMotorBackward, LOW);
    digitalWrite(RightMotorBackward, LOW); 
  }
}

void moveBackward(){

  goesForward=false;

  digitalWrite(LeftMotorBackward, HIGH);
  digitalWrite(RightMotorBackward, HIGH);

  digitalWrite(LeftMotorForward, LOW);
  digitalWrite(RightMotorForward, LOW);

}

void turnRight(){

  digitalWrite(LeftMotorForward, HIGH);
  digitalWrite(RightMotorBackward, HIGH);

  digitalWrite(LeftMotorBackward, LOW);
  digitalWrite(RightMotorForward, LOW);

  delay(500);

  digitalWrite(LeftMotorForward, HIGH);
  digitalWrite(RightMotorForward, HIGH);

  digitalWrite(LeftMotorBackward, LOW);
  digitalWrite(RightMotorBackward, LOW);



}

void turnLeft(){

  digitalWrite(LeftMotorBackward, HIGH);
  digitalWrite(RightMotorForward, HIGH);

  digitalWrite(LeftMotorForward, LOW);
  digitalWrite(RightMotorBackward, LOW);

  delay(500);

  digitalWrite(LeftMotorForward, HIGH);
  digitalWrite(RightMotorForward, HIGH);

  digitalWrite(LeftMotorBackward, LOW);
  digitalWrite(RightMotorBackward, LOW);
}

Предполагалось, что сервопривод повернется на 90 градусов, но сейчас сервопривод движется хаотично.

, 👍0

Обсуждение

Если двигатель быстро нагревается, значит что-то сломано или неправильно подключено. Пожалуйста, покажите нам свою схему. Вы уверены в полярности напряжения питания сервоприводов?, @chrisl


1 ответ


1

Я думаю, вам нужно тщательно протестировать отдельные функции вашего бота.

Шаг 1: переименуйте функцию цикла в "loop_temp", что означает, что она не будет выполняться, но будет сохранена на потом.

Шаг 2: напишите новую "циклическую" функцию, которая устанавливает LeftMotorForward на 1 секунду, а затем останавливает на 1 секунду. И наблюдать за результатами.

Шаг 3: повторите шаг 2 с параметрами LeftMotorBackward, RightMotorForward и т. д.

Шаг 4. Используя последовательную печать, поэкспериментируйте с выводом сонара, чтобы убедиться, что он дает ожидаемые результаты.

Шаг 5: по одной вводите свои функции и убедитесь, что каждая из них работает правильно.

Шаг 6: надеюсь, вы где-то обнаружили ошибку/ошибку и можете снова ввести свою первоначальную функцию "цикла". В противном случае проблема может заключаться в этой функции.

Я просмотрел ваш код, но не вижу ничего явно неправильного. Поэтому я боюсь, что это может быть процесс исключения.

,