Bluetooth Auto Probleme

Hallo,

Ich möchte für eine Schule ein kleines Projekt machen, bei dem wir ein Auto mit 2 Joysticks via Bluetooth steuern wollen.
Habe hierzu einige tutorials und codes auf youtube gefunden, jedoch funktioniert das alles nicht ganz. Ich konnte HC05 Module koppeln und habe soweit auch alles richtig verdrahten aber meine Motoren bewegen sich sobald die HC05 sich verbunden haben unkontrolliert und steuern ist nicht möglich.
Könntet ihr mir bitte helfen? Bin jetzt auch kein Arduino Genie.
Habe auch mal das Git Hub Projekt was ich gefunden habe mit angeheftet

GitHub - aslam-Hossain-YT/Joystick-Control-Bluetooth-Car

Transmitter als Master mit Joysticks



#include<SoftwareSerial.h>

SoftwareSerial btSerial(2, 3); // RX | TX

struct PacketData 
{
  byte lxAxisValue;
  byte lyAxisValue;
  byte rxAxisValue;
  byte ryAxisValue;
};

int value;

PacketData data;

void setup()
{
  btSerial.begin(38400); 
  Serial.begin(9600);  
}

//This function is used to map 0-1023 joystick value to 0-254. hence 127 is the center value which we send.
//It also adjust the deadband in joystick.
//Jotstick values range from 0-1023. But its center value is not always 511. It is little different.
//So we need to add some deadband to center value. in our case 500-530. Any value in this deadband range is mapped to center 127.
int mapAndAdjustJoystickDeadBandValues(int value, bool reverse)
{
  //Serial.println(value);
  if (value >= 550)
  {
    value = map(value, 550, 1023, 127, 254);
  }
  else if (value <= 480)
  {
    value = map(value, 480, 0, 127, 0);  
  }
  else
  {
    value = 127;
  }

  if (reverse)
  {
    value = 254 - value;
  }
  return value;
}

void loop()
{
  data.lxAxisValue    = mapAndAdjustJoystickDeadBandValues(analogRead(A3), false);
  data.lyAxisValue    = mapAndAdjustJoystickDeadBandValues(analogRead(A4), false);
  
  data.rxAxisValue    = mapAndAdjustJoystickDeadBandValues(analogRead(A5), false);
  data.ryAxisValue    = mapAndAdjustJoystickDeadBandValues(analogRead(A6), false);



  String dataString;
  dataString = dataString 
               + data.lxAxisValue + "," 
               + data.lyAxisValue + ","  
               + data.rxAxisValue + ","  
               + data.ryAxisValue + "\n";
  
  btSerial.print(dataString);
  delay(10);
}

Receiver als Slave und L298N Motor Shield

//YouTube: Aslam Hossain, https://www.youtube.com/channel/UCdaQfJEKvpoAPIzQNwFGlHw
//Facebook Page: https://www.facebook.com/aslamhossain3852
//For Any Help, Feel Free to knock me through what's App: 01877543825


#include <SoftwareSerial.h>

SoftwareSerial btSerial(2, 3); // RX | TX

struct PacketData {
  byte lxAxisValue;
  byte lyAxisValue;

  byte rxAxisValue;
  byte ryAxisValue;
};

PacketData data;

// Right motor
int enableRightMotor = 6;
int rightMotorPin1 = 12;
int rightMotorPin2 = 11;

// Left motor
int enableLeftMotor = 5;
int leftMotorPin1 = 10;
int leftMotorPin2 = 9;

unsigned long lastRecvTime = 0;

void setup() {
  pinMode(enableRightMotor, OUTPUT);
  pinMode(rightMotorPin1, OUTPUT);
  pinMode(rightMotorPin2, OUTPUT);

  pinMode(enableLeftMotor, OUTPUT);
  pinMode(leftMotorPin1, OUTPUT);
  pinMode(leftMotorPin2, OUTPUT);

  Serial.begin(9600);
  btSerial.begin(38400);
}

void loop() {
  String dataString;
  if (btSerial.available()) {
    dataString = btSerial.readStringUntil('\n');
    sscanf(dataString.c_str(), "%d,%d,%d,%d", &data.lxAxisValue, &data.lyAxisValue, &data.rxAxisValue, &data.ryAxisValue);

    int throttle = map(data.lyAxisValue, 254, 0, -255, 255); // Left stick - y axis - forward/backward car movement
    int steering = map(data.rxAxisValue, 0, 254, -255, 255); // Right stick - x axis - left/right car movement



    int rightMotorSpeed = 0, leftMotorSpeed = 0;

    if (throttle >= 0) {
      rightMotorSpeed = throttle - steering;
      leftMotorSpeed = throttle + steering;
    } else {
      rightMotorSpeed = throttle + steering;
      leftMotorSpeed = throttle - steering;
    }

    rightMotorSpeed = constrain(rightMotorSpeed, -250, 250);
    leftMotorSpeed = constrain(leftMotorSpeed, -250, 250);

    int rightMotorDirection = (rightMotorSpeed >= 0) ? 1 : -1;
    int leftMotorDirection = (leftMotorSpeed >= 0) ? 1 : -1;

    // Control right motor
    if (rightMotorSpeed > 0) {
      digitalWrite(rightMotorPin1, HIGH);
      digitalWrite(rightMotorPin2, LOW);
    } else if (rightMotorSpeed < 0) {
      digitalWrite(rightMotorPin1, LOW);
      digitalWrite(rightMotorPin2, HIGH);
    } else {
      digitalWrite(rightMotorPin1, LOW);
      digitalWrite(rightMotorPin2, LOW);
    }

    // Control left motor
    if (leftMotorSpeed > 0) {
      digitalWrite(leftMotorPin1, HIGH);
      digitalWrite(leftMotorPin2, LOW);
    } else if (leftMotorSpeed < 0) {
      digitalWrite(leftMotorPin1, LOW);
      digitalWrite(leftMotorPin2, HIGH);
    } else {
      digitalWrite(leftMotorPin1, LOW);
      digitalWrite(leftMotorPin2, LOW);
    }

    analogWrite(enableRightMotor, abs(rightMotorSpeed));
    analogWrite(enableLeftMotor, abs(leftMotorSpeed));

    lastRecvTime = millis();
  } else {
    unsigned long now = millis();
    if (now - lastRecvTime > 1000) {
      // Signal lost after 1 second. Stop the motors
      analogWrite(enableRightMotor, 0);
      analogWrite(enableLeftMotor, 0);
    }
  }
}

Gehen denn die Motoren ohne bluetooth richtig ?

Falls ja, was wird über bluetooth gesendet/empfangen?

Wenn was im Internet mit der Methode MalenNachZahlen nicht auf Anhieb funktioniert, kannst du

  • beim Autor nachfragen (meist erfolglos)
  • weitersuchen nach anderen Projekten
  • blind Fehler suchen
  • das Gefundene zu verstehen versuchen, um nicht so blind beim Fehlersuchen zu bleiben.

Jedes Projekt mit mehr als 5 Zeilen Code kann in Einzelteile zerlegt werden, die meist einzeln besser zu analysieren sind.

//Master sketch
#include<SoftwareSerial.h>
SoftwareSerial btSerial(2, 3); // RX | TX

void setup() {
  btSerial.begin(38400);
}
void loop() {
  const byte Pins[2] = {A4, A5};

  for (byte i = 0; i < 2; i++) {
    byte b = analogRead(Pins[i]) >> 2;
    btSerial.write(b);
  }
  btSerial.print('\n');
  delay(10);
}
//Slave sketch
#include <SoftwareSerial.h>
SoftwareSerial btSerial(2, 3); // RX | TX

// Right motor
const byte enableRightMotor = 6;
const byte rightMotorPin1 = 12;
const byte rightMotorPin2 = 11;

// Left motor
const byte enableLeftMotor = 5;
const byte leftMotorPin1 = 10;
const byte leftMotorPin2 = 9;

void setup() {
  pinMode(enableRightMotor, OUTPUT);
  pinMode(rightMotorPin1, OUTPUT);
  pinMode(rightMotorPin2, OUTPUT);

  pinMode(enableLeftMotor, OUTPUT);
  pinMode(leftMotorPin1, OUTPUT);
  pinMode(leftMotorPin2, OUTPUT);

  btSerial.begin(38400);
  while (btSerial.available() < 3)btSerial.readStringUntil('\n');
}

void loop() {
  static uint32_t lastRecvTime = 0;
  static int lyAxisValue, rxAxisValue;
  if (btSerial.available() > 2) {
    lastRecvTime = millis();
    lyAxisValue = btSerial.read();
    lyAxisValue = btSerial.read();
    while (btSerial.read() != '\n');

    int throttle = map(lyAxisValue, 255, 0, -255, 255); // Left stick - y axis - forward/backward car movement
    int steering = map(rxAxisValue, 0, 255, -127, 127); // Right stick - x axis - left/right car movement
    int rightMotorSpeed = 0, leftMotorSpeed = 0;

   
      rightMotorSpeed = throttle - steering;
      leftMotorSpeed = throttle + steering;
  

    rightMotorSpeed = constrain(rightMotorSpeed, -255, 255);
    leftMotorSpeed = constrain(leftMotorSpeed, -255, 255);

    // Control right motor
    if (rightMotorSpeed > 20) {
      digitalWrite(rightMotorPin1, HIGH);
      digitalWrite(rightMotorPin2, LOW);
    } else if (rightMotorSpeed < -20) {
      digitalWrite(rightMotorPin1, LOW);
      digitalWrite(rightMotorPin2, HIGH);
    } else {
      digitalWrite(rightMotorPin1, LOW);
      digitalWrite(rightMotorPin2, LOW);
    }

    // Control left motor
    if (leftMotorSpeed > 20) {
      digitalWrite(leftMotorPin1, HIGH);
      digitalWrite(leftMotorPin2, LOW);
    } else if (leftMotorSpeed < -20) {
      digitalWrite(leftMotorPin1, LOW);
      digitalWrite(leftMotorPin2, HIGH);
    } else {
      digitalWrite(leftMotorPin1, LOW);
      digitalWrite(leftMotorPin2, LOW);
    }

    analogWrite(enableRightMotor, abs(rightMotorSpeed));
    analogWrite(enableLeftMotor, abs(leftMotorSpeed));

  } else {
    if (millis() - lastRecvTime > 1000) {// Signal lost after 1 second. Stop the motors
      digitalWrite(enableRightMotor, LOW);
      digitalWrite(enableLeftMotor, LOW);
      digitalWrite(leftMotorPin1, LOW);
      digitalWrite(leftMotorPin2, LOW);
      digitalWrite(rightMotorPin1, LOW);
      digitalWrite(rightMotorPin2, LOW);
    }
  }
}

Wozu hast du das in deinem Slave Sketch? Nutze es!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.