Masalah modul Bluetooth (HC 05)

Oct 19 2020

Saya mencoba membuat robot 4WD yang dikendalikan Bluetooth. saya mengikuti tutorial yang saya temukan online (https://howtomechatronics.com/tutorials/arduino/arduino-robot-car-wireless-control-using-hc-05-bluetooth-nrf24l01-and-hc-12-transceiver-modules/). Setelah berhasil menghubungkan modul Bluetooth 2 HC 05 saya, saya menggunakan skrip dari tutorial dan memodifikasinya sedikit sehingga akan berfungsi untuk pengaturan saya. Kode untuk robot:

//Code for Slave
#define enA 9
#define in1 8
#define in2 7
#define enB 10
#define in3 6
#define in4 5
int xAxis, yAxis;
unsigned int  x = 0;
unsigned int  y = 0;
int motorSpeedA = 0;
int motorSpeedB = 0;
void setup() {
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  Serial.begin(9600); // Default communication rate of the Bluetooth module
}
void loop() {
  // Default value - no movement when the Joystick stays in the center
  x = 510 / 4;
  y = 510 / 4;
  // Read the incoming data from the Joystick, or the master Bluetooth device
  while (Serial.available() >= 2) {
    x = Serial.read();
    Serial.print("X: ");
    Serial.println(x);
    delay(10);
    y = Serial.read();
    Serial.print("Y: ");
    Serial.println(y);
  }
  delay(10);
  // Convert back the 0 - 255 range to 0 - 1023, suitable for motor control code below
  xAxis = x*4;
  yAxis = y*4;
  // Y-axis used for forward and backward control
  if (yAxis < 470) {
    backMov;
    // Convert the declining Y-axis readings for going backward from 470 to 0 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(yAxis, 470, 0, 0, 255);
    motorSpeedB = map(yAxis, 470, 0, 0, 255);
  }
  else if (yAxis > 550) {
    fowardMov;
    // Convert the increasing Y-axis readings for going forward from 550 to 1023 into 0 to 255 value for the PWM signal for increasing the motor speed
    motorSpeedA = map(yAxis, 550, 1023, 0, 255);
    motorSpeedB = map(yAxis, 550, 1023, 0, 255);
  }
  // If joystick stays in middle the motors are not moving
  else {
    motorSpeedA = 0;
    motorSpeedB = 0;
  }
  // X-axis used for left and right control
  if (xAxis < 470) {
    // Convert the declining X-axis readings from 470 to 0 into increasing 0 to 255 value
    int xMapped = map(xAxis, 470, 0, 0, 255);
    // Move to left - decrease left motor speed, increase right motor speed
    motorSpeedA = motorSpeedA + xMapped;
    motorSpeedB = motorSpeedB - xMapped;
    // Confine the range from 0 to 255
    if (motorSpeedA > 255) {
      motorSpeedA = 255;
    }
    if (motorSpeedB < 0) {
      motorSpeedB = 0;
    }
  }
  if (xAxis > 550) {
    // Convert the increasing X-axis readings from 550 to 1023 into 0 to 255 value
    int xMapped = map(xAxis, 550, 1023, 0, 255);
    // Move right - decrease right motor speed, increase left motor speed
    motorSpeedA = motorSpeedA - xMapped;
    motorSpeedB = motorSpeedB + xMapped;
    // Confine the range from 0 to 255
    if (motorSpeedA < 0) {
      motorSpeedA = 0;
    }
    if (motorSpeedB > 255) {
      motorSpeedB = 255;
    }
  }
  // Prevent buzzing at low speeds (Adjust according to your motors. My motors couldn't start moving if PWM value was below value of 70)
  if (motorSpeedA < 70) {
    motorSpeedA = 0;
  }
  if (motorSpeedB < 70) {
    motorSpeedB = 0;
  }
  analogWrite(enA, motorSpeedA); // Send PWM signal to motor A
  analogWrite(enB, motorSpeedB); // Send PWM signal to motor B
}
void fowardMov(){
  digitalWrite(in2,HIGH);
  digitalWrite(in4,HIGH);
  digitalWrite(in1, LOW);
  digitalWrite(in3, LOW);
}

void backMov(){
  digitalWrite(in1,HIGH);
  digitalWrite(in3,HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in4, LOW);
}

Kode untuk Pengendali:

#define Xaxis A0
#define Yaxis A1

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
 Serial.write(analogRead(Xaxis)/4);
 Serial.write(analogRead(Yaxis)/4);
 delay(20);
}

Setelah mengupload kode saya mencoba untuk memindahkannya tetapi tidak berhasil jadi saya meletakkan pernyataan cetak untuk melihat nilai X dan Y. awalnya tidak berhasil jadi saya menukar modul Bluetooth yang saya miliki dan menghubungkannya kembali. saya juga mengubah baris ini.

 while (Serial.available() >= 2)

Untuk ini

 if (Serial.available() > 0)

saya mulai menerima nilai dari master hingga budak tetapi saya perhatikan nilainya sama untuk x dan y jadi saya mencari tutorial lain di internet dan menemukan ini (https://create.arduino.cc/projecthub/andriy-baranov/arduino-4wd-rc-car-639953?ref=similar&ref_id=18369&offset=3) membaca kodenya, saya bertanya-tanya bagaimana budak itu bekerja. Menurut dokumentasi resmi Arduino Serial.read () tidak mengambil argumen apa pun tetapi saya masih mencobanya dan tidak berhasil. Saya memutuskan untuk mencoba lagi kode dari tutorial pertama yang saya periksa kali ini sepertinya berfungsi jadi saya mencoba memindahkan joystick dan monitor serial mencetak nilai yang benar untuk keduanya pada awalnya kemudian menukar nilai mereka lalu membeku. Bagaimana cara menghentikannya agar tidak membekukan dan menukar nilai? Juga mengapa while loop tidak berjalan selamanya bukankah jumlah data dalam buffer serial selalu lebih tinggi dari 2? Terima kasih.

Jawaban

user3765883 Oct 20 2020 at 22:02

Penyiapan Anda JAUH terlalu rumit! Sederhanakan pengaturan Anda ke titik di mana ia hanya berurusan dengan bagian yang memberi Anda masalah; dalam kasus Anda komunikasi port serial antara master dan slave. Pecahkan masalah HANYA ITU, lalu lanjutkan