Ein per Bluetooth gesteuertes Fahrzeug selbst bauen

Hier die Details zu dem Video in dem ich zeige, wie einfach es ist, ein kleines funkgesteuertes Fahrzeug mit einem Arduino Nano, einem Bluetooth-Modul und einem Motortreiber-Modul zu bauen. Das Fahrzeug wird mit vier Gleichstrommotoren mit Doppelwellengetriebe angetrieben.

Für den ersten Teil der Verdrahtung und dem Quellcode war das Datenblatt des Herstellers MotoDriver2 hilfreich. Für die Steuerung per App über Bluetooth habe ich diese Informationsquellen verwendet:

Informationsquellen:
Datenblatt des Herstellers von MotoDriver2
Datenblatt für das Bloutooth Modul und weitere Details:
Bluetooth Modul HM-10
Steuerung App:
dabble bei thestempedia.com

Es wird mit der App dabble von Stempedia (die für Android oder IPhone kostenlos erhältlich ist) gesteuert werden.

Die App “dabble“, das Gamepad für das Smartphone:


Verdrahtung:

Hardware:
Arduino Nano
Getriebemotor (3-6V) inkl. Rad
MotoDriver2
HM-10 Bluetooth Modul

Quellcode für Motorentest:

const int rechterMotorAktiv = 5;
const int linkerMotorAktiv = 6;
const int linksvor = 7;
const int linksrueck = 8;
const int rechtsvor = 9;
const int rechtsrueck = 10;
const int speed = 180;

void setup()
{
  pinMode(rechterMotorAktiv, OUTPUT);
  pinMode(linkerMotorAktiv, OUTPUT);
  pinMode(linksvor, OUTPUT);
  pinMode(linksrueck, OUTPUT);
  pinMode(rechtsvor, OUTPUT);
  pinMode(rechtsrueck, OUTPUT);

  //wenn nichts gedrückt wird, setzte "0" STOP
  analogWrite(rechterMotorAktiv, 0);
  analogWrite(linkerMotorAktiv, 0);
  analogWrite(rechtsvor, 0);
  analogWrite(linksvor, 0);
  analogWrite(rechtsrueck, 0);
  analogWrite(linksrueck, 0);
}

void loop()
{
  // alle vier motoren 3 Sek vor
  analogWrite(rechterMotorAktiv, 255);
  analogWrite(linkerMotorAktiv, 255);
  analogWrite(rechtsvor, speed);
  analogWrite(linksvor, speed);

  analogWrite(rechtsrueck, 0);
  analogWrite(linksrueck, 0);
  delay(3000);
  // alle vier motoren 3 Sek rück
  analogWrite(rechterMotorAktiv, 255);
  analogWrite(linkerMotorAktiv, 255);
  analogWrite(rechtsrueck, speed);
  analogWrite(linksrueck, speed);
  analogWrite(rechtsvor, 0);
  analogWrite(linksvor, 0);

  delay(3000);
  // links drehend 3 Sek
  analogWrite(rechterMotorAktiv, 255);
  analogWrite(linkerMotorAktiv, 255);
  analogWrite(rechtsvor, speed);
  analogWrite(linksrueck, speed);
  analogWrite(linksvor, 0);
  analogWrite(rechtsrueck, 0);

  delay(3000);
  // rechts drehend 3 Sek
  analogWrite(rechterMotorAktiv, 255);
  analogWrite(linkerMotorAktiv, 255);
  analogWrite(rechtsrueck, speed);
  analogWrite(linksvor, speed);
  analogWrite(rechtsvor, 0);
  analogWrite(linksrueck, 0);
  delay(3000);
}

Quellcode 2, für erstes Testen mit App:

#define CUSTOM_SETTINGS
#define INCLUDE_GAMEPAD_MODULE
#include <Dabble.h>

const int rechterMotorAktiv = 5;
const int linkerMotorAktiv = 6;
const int linksvor = 7;
const int linksrueck = 8;
const int rechtsvor = 9;
const int rechtsrueck = 10;

void setup()
{
  pinMode(rechterMotorAktiv, OUTPUT);
  pinMode(linkerMotorAktiv, OUTPUT);
  pinMode(linksvor, OUTPUT);
  pinMode(linksrueck, OUTPUT);
  pinMode(rechtsvor, OUTPUT);
  pinMode(rechtsrueck, OUTPUT);

  Dabble.begin(9600, 2, 3); //(baudRate,Pin RX,Pin TX)
}

void loop()
{
  int speed = 180;
  //wenn nichts gedrückt wird, setzte "0" STOP
  analogWrite(rechterMotorAktiv, 0);
  analogWrite(linkerMotorAktiv, 0);    
  analogWrite(rechtsvor, 0);
  analogWrite(linksvor, 0);
  analogWrite(rechtsrueck, 0);
  analogWrite(linksrueck, 0);

  Dabble.processInput();
  if (GamePad.isUpPressed())
  {
    analogWrite(rechterMotorAktiv, 255);
    analogWrite(linkerMotorAktiv, 255);
    analogWrite(rechtsvor, speed);
    analogWrite(linksvor, speed);
    delay(200);
  }

  if (GamePad.isDownPressed())
  {
    analogWrite(rechterMotorAktiv, 255);
    analogWrite(linkerMotorAktiv, 255);
    analogWrite(rechtsrueck, speed);
    analogWrite(linksrueck, speed);
    delay(200);
  }

  if (GamePad.isLeftPressed())
  {
    analogWrite(rechterMotorAktiv, 255);
    analogWrite(linkerMotorAktiv, 255);
    analogWrite(rechtsvor, speed);
    analogWrite(linksrueck, speed);
    delay(200);
  }

  if (GamePad.isRightPressed())
  {
    analogWrite(rechterMotorAktiv, 255);
    analogWrite(linkerMotorAktiv, 255);
    analogWrite(rechtsrueck, speed);
    analogWrite(linksvor, speed);
    delay(200);
  }
}

Finale Quellcode Version:

#define CUSTOM_SETTINGS
#define INCLUDE_GAMEPAD_MODULE
#include <Dabble.h>

int rechterMotorAktiv=5; 
int linkerMotorAktiv=6;
int linksvor=7;
int linksrueck=8;
int rechtsvor=9;
int rechtsrueck=10;

void setup()
{
  pinMode(rechterMotorAktiv,OUTPUT);
  pinMode(linkerMotorAktiv,OUTPUT);
  pinMode(rechtsvor,OUTPUT);
  pinMode(rechtsrueck,OUTPUT);
  pinMode(linksvor,OUTPUT);
  pinMode(linksrueck,OUTPUT);

  motorTempo(0,0);      
  Dabble.begin(9600, 2, 3);
}

void loop()
{
  int rechtsTempo=0;
  int linksTempo=0;
  Dabble.processInput();
  if (GamePad.isUpPressed())
  {
    rechtsTempo = 255;
    linksTempo = 255;
  }

  if (GamePad.isDownPressed())
  {
    rechtsTempo = -255;
    linksTempo = -255;
  }

  if (GamePad.isLeftPressed())
  {
    rechtsTempo = 0;
    linksTempo = 255;
  }

  if (GamePad.isRightPressed())
  {
    rechtsTempo = 255;
    linksTempo = 0;
  }

  motorTempo(rechtsTempo, linksTempo);
}

void motorTempo(int rechtsTempo, int linksTempo)
{
  if (rechtsTempo < 0)
  {
    digitalWrite(rechtsvor,LOW);
    digitalWrite(rechtsrueck,HIGH);    
  }
  else if (rechtsTempo >= 0)
  {
    digitalWrite(rechtsvor,HIGH);
    digitalWrite(rechtsrueck,LOW);      
  }

  if (linksTempo < 0)
  {
    digitalWrite(linksvor,LOW);
    digitalWrite(linksrueck,HIGH);    
  }
  else if (linksTempo >= 0)
  {
    digitalWrite(linksvor,HIGH);
    digitalWrite(linksrueck,LOW);      
  }

  analogWrite(rechterMotorAktiv, abs(rechtsTempo));
  analogWrite(linkerMotorAktiv, abs(linksTempo));    
}

Grundplatte zum ausdrucken an einem 3D-Drucker:
Arduino Robot Car Chassis 4WD

Video:

Ergänzende Information:
Nicht im Video zu sehen, ist das entfernen der beiden Jumper des MotoDriver2 an Pin ENA und ENB.
Erst dann kann es mit einem Jumperkabel mit dem Arduino an Pin 5+6 verbunden werden, um ggf. die Motoren zu deaktivieren. Solltet ihr mit mehr als 12 Volt das MotoDriver2-Module versorgen, bitte den Hinweis im Datenblatt beachten, das noch ein Jumper gezogen werden muss.


, ,