Проблемы с автомобильным проектом arduino bluetooth (с драйвером двигателя L298n)

Итак, сценарий таков: я делаю автомобиль, управляемый Bluetooth (голосовое управление) + функция предотвращения препятствий. Я использую Arduino Uno с драйвером двигателя L298n и модуль HC-05 BT в датчиках. Я использую ультразвуковой датчик и ИК-датчик для спины и серводвигатель также используются для вращения ультразвукового датчика. Поэтому проблема заключается в том, что когда я отправляю команду «повернуть налево» сервопривод движется влево, и ничего не происходит, а другая команда, например, повернуть направо, двигаться назад, двигаться вперед, вообще не работает.

схема и код даны, пожалуйста, ребята, подскажите, где чего не хватает, если я сделал что-то не так с кодом, или драйвер двигателя или проводка создают проблему

КОД: ''' #include <NewPing.h> #include<Servo.h> #define TRIGGER_PIN A1 #define ECHO_PIN A0 #define MAX_DISTANCE 300 #define ИК A2

Сонар NewPing(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

Сервопривод myservo;

Струнный голос;

недействительная установка() { Серийный.начать(9600); myservo.attach(8); myservo.write(90); pinMode (ИК, ВХОД); pinMode(12, ВЫХОД); pinMode(11, ВЫХОД); pinMode(10, ВЫХОД); pinMode(9, ВЫВОД);

void loop() { int расстояние = sonar.ping_cm();

если (Серийный.доступный() > 0) { голос = ""; задержка (2); голос = Serial.readString(); задержка (2); Serial.println(голос);

if (voice == "turn left") {
  left();
} else if (voice == "left") {
  left();
} else if (voice == "turn right") {

} else if (voice == "right") {

}

} в то время как (голос == "двигаться вперед") { вперед(); } в то время как (голос == "переместиться назад") { назад(); }

пусто вперед() { int расстояние = sonar.ping_cm();

если (расстояние <10) { цифровая запись (12, НИЗКИЙ); цифровая запись (11, НИЗКИЙ); цифровая запись (10, НИЗКИЙ); цифровая запись (9, НИЗКИЙ); голос = ""; } еще { цифровая запись (12, ВЫСОКИЙ); цифровая запись (10, ВЫСОКИЙ); } } недействительным назад () { int IR_Sensor = цифровое чтение (ИК); если (IR_Sensor == 0) { цифровая запись (12, НИЗКИЙ); цифровая запись (11, НИЗКИЙ); цифровая запись (10, НИЗКИЙ); цифровая запись (9, НИЗКИЙ); голос = ""; } еще { цифровая запись (11, ВЫСОКИЙ); цифровая запись (9, ВЫСОКИЙ); } } пустота слева () { myservo.write(180); delay(500); myservo.write(90); delay(500); int расстояние = sonar.ping_cm();

если (расстояние <10) { цифровая запись (12, НИЗКИЙ); цифровая запись (11, НИЗКИЙ); цифровая запись (10, НИЗКИЙ); цифровая запись (9, НИЗКИЙ); голос = ""; } еще { цифровая запись (12, ВЫСОКИЙ); delay(700); цифровая запись (12, НИЗКИЙ); цифровая запись (11, НИЗКИЙ); цифровая запись (10, НИЗКИЙ); digitalWrite(9, НИЗКИЙ);

}

пустое право() { myservo.write(0); delay(500); myservo.write(90); delay(500); { int расстояние = sonar.ping_cm();

if (distance < 10) {
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  voice = "";
} else {
  digitalWrite(10, HIGH);
}
delay(700);
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(10, LOW);
digitalWrite(9, LOW);

}

пусто Stop() { цифровая запись (12, НИЗКИЙ); цифровая запись (11, НИЗКИЙ); цифровая запись (10, НИЗКИЙ); цифровая запись (9, НИЗКИЙ); }'''

, 👍1

Обсуждение

начните с самого начала... напишите скетч, который запускает один двигатель в одном направлении в течение одной секунды, останавливает двигатель на одну секунду, затем повторяется, @jsotola


1 ответ


1

Кажется, в коде отсутствует несколько логических строк. Вот исправленная версия, насколько я понимаю.

#include <NewPing.h>

#include<Servo.h>

#define TRIGGER_PIN A1
#define ECHO_PIN A0
#define MAX_DISTANCE 300
#define IR A2

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

Servo myservo;

String voice;

void setup() {
  Serial.begin(9600);
  myservo.attach(8);
  myservo.write(90);
  pinMode(IR, INPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);

}

void loop() {
  int distance = sonar.ping_cm();

  if (Serial.available() > 0) {
    voice = "";
    delay(2);
    voice = Serial.readString();
    delay(2);
    Serial.println(voice);

    if (voice == "turn left") {
      left();
    } else if (voice == "left") {
      left();
    } else if (voice == "turn right") {
      right();
    } else if (voice == "right") {
      right();
    } else if(voice == "move forward"){
      forward();
    } else if(voice == "move backward"){
      backward();
    }
    
  }

}

void forward() {
  int distance = sonar.ping_cm();

  if (distance < 10) {
    digitalWrite(12, LOW);
    digitalWrite(11, LOW);
    digitalWrite(10, LOW);
    digitalWrite(9, LOW);
    voice = "";
  } else {
    digitalWrite(12, HIGH);
    digitalWrite(10, HIGH);
  }
}
void backward() {
  int IR_Sensor = digitalRead(IR);
  if (IR_Sensor == 0) {
    digitalWrite(12, LOW);
    digitalWrite(11, LOW);
    digitalWrite(10, LOW);
    digitalWrite(9, LOW);
    voice = "";
  } else {
    digitalWrite(11, HIGH);
    digitalWrite(9, HIGH);
  }
}
void left() {
  myservo.write(180);
  delay(500);
  myservo.write(90);
  delay(500);
  int distance = sonar.ping_cm();

  if (distance < 10) {
    digitalWrite(12, LOW);
    digitalWrite(11, LOW);
    digitalWrite(10, LOW);
    digitalWrite(9, LOW);
    voice = "";
  } else {
    digitalWrite(12, HIGH);
    delay(700);
    digitalWrite(12, LOW);
    digitalWrite(11, LOW);
    digitalWrite(10, LOW);
    digitalWrite(9, LOW);

  }
}

void right() {
  myservo.write(0);
  delay(500);
  myservo.write(90);
  delay(500); {
    int distance = sonar.ping_cm();

    if (distance < 10) {
      digitalWrite(12, LOW);
      digitalWrite(11, LOW);
      digitalWrite(10, LOW);
      digitalWrite(9, LOW);
      voice = "";
    } else {
      digitalWrite(10, HIGH);
    }
    delay(700);
    digitalWrite(12, LOW);
    digitalWrite(11, LOW);
    digitalWrite(10, LOW);
    digitalWrite(9, LOW);
  }
}

void Stop() {
  digitalWrite(12, LOW);
  digitalWrite(11, LOW);
  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
}
,