Проблема с автомобильным ботом 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 градусов, но сейчас сервопривод движется хаотично.
@chengzhi wu, 👍0
Обсуждение1 ответ
Я думаю, вам нужно тщательно протестировать отдельные функции вашего бота.
Шаг 1: переименуйте функцию цикла в "loop_temp", что означает, что она не будет выполняться, но будет сохранена на потом.
Шаг 2: напишите новую "циклическую" функцию, которая устанавливает LeftMotorForward на 1 секунду, а затем останавливает на 1 секунду. И наблюдать за результатами.
Шаг 3: повторите шаг 2 с параметрами LeftMotorBackward, RightMotorForward и т. д.
Шаг 4. Используя последовательную печать, поэкспериментируйте с выводом сонара, чтобы убедиться, что он дает ожидаемые результаты.
Шаг 5: по одной вводите свои функции и убедитесь, что каждая из них работает правильно.
Шаг 6: надеюсь, вы где-то обнаружили ошибку/ошибку и можете снова ввести свою первоначальную функцию "цикла". В противном случае проблема может заключаться в этой функции.
Я просмотрел ваш код, но не вижу ничего явно неправильного. Поэтому я боюсь, что это может быть процесс исключения.
- PCA9685 сервоэкран не работает
- НУЖНА помощь с серводвигателем
- Как использовать этот конкретный экран arduino
- SD-карта не инициализируется
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Как заставить сервопривод вращаться на угол больше 180°
- Как отправить данные из Arduino Uno с SIM900 GPRS в Firebase
- Отправка текстового сообщения через Wi-Fi-shield Arduino
Если двигатель быстро нагревается, значит что-то сломано или неправильно подключено. Пожалуйста, покажите нам свою схему. Вы уверены в полярности напряжения питания сервоприводов?, @chrisl