HowTo Bluetooth - HC-05 und HC-06 koppeln/verbinden

Still work on it!

Einleitung:
Updates: Ein Update Verlauf befindet sich am im letzten Post.

Ich glaube doch, dass es mehrere Leute interessiert wie die Bluetooth Module HC-05 und HC-06 funktionieren.

Hier geht es ausschließlich um die Hardware Verbindung zwischen Arduino und HC-05/06. In #1 erkläre ich das HC-06 mit einem Slave Code welcher die LED (13) ein und ausschaltet. In #2 möchte ich die wichtisten AT Befehle des HC-05 erklären und wie man eine Koppelung und Verbindung aufbaut. #3 ist noch reserviert da die Smartphone spielt Master Variante auch erklärt werden möchte.

Wie ich es bereits sagte, werde ich das nicht auf einem Schlag hinbekommen. Leider habe ich auch nicht den Ganzen Tag Zeit (muss auch arbeiten). Bitte um Verständnis.

Inhaltsverzeichnis:

  • Einleitung
  • Hardware und Schaltplan
  • Konfigurieren und AT-Befehle
  • Arduino HC-05 <-> Arduino HC-06
  • Arduino HC-05/06 <-> Android Smartphone
  • Arduino HC-05/06 <-> Windows <- Vollständig

Bevor wir allerdings mit unseren Arduino Projekt anfangen können sollten wir uns die Bluetooth Module einmal anschauen und konfigurieren. Dazu brauchen wir im Grunde nur einen FTDI Adapter oder ein Arduino Uno mit einem Serial Passthrough Sketch. Das Arduino Leonardo/Micro kann über Pin0 und Pin1 (Serial1) als 2. Hardware Serial verwendet werden. Serial0 ist die direkte Verbindung über USB.

Anstelle des HC-05 kann man auch ein Smartphone hernehmen und eine Bluetooth Terminal App (die auch so heißen) installieren. Interressant ist hier auch die App Namens Bluetooth Electronics. Damit kann man einen Controller basteln, der sowohl Steuerungsbefehle sendet und Sensor Daten anzeigt.

Das Bluetooth Shield:
... braucht man natürlich nicht unbediengt aber den Spannungsteiler zwischen Arduino Rx und HC-x Tx sehrwohl. Leider findet man immer mehr Schaltpläne ohne Spannungsteiler. :confused:

Ich habe mir ein Wing Shield (kann auch ein ProtoSield oder einfach eine Lochrasterplatine sein) genommen und 6-pol. Anschluss drauf gelötet. Damit kann man beide HC-xx Module anschließen und konfigurieren bzw. verwenden.

Schaltplan kommt noch.
Arduino <-> HC-05/06
5V -> Vcc
GND -> GND
Rx <- Tx
Tx -> 5,2kOhm [Rx am HC-05/06] -> 10kOhm -> GND
3,3v -> Hardware Schalter -> EN

Der EN und State Pin ist nur beim HC-05 verfügbar. Wird EN mit 3,3v versorgt ist das Modul im Konfigurations Modus. Das WingShield hat eine zweite LED (rot), diese habe ich mit State verbunden. Leuchtet die rote LED so ist eine Verbindung hergestellt. Wenn man den Pin mit einem Arduino Pin (INPUT) verbindet kann das Arduino, softwareseitig auslesen und "weiß" dass eine Verbindung hergestellt ist.

Die Code Beispiele sind für das Arduino Uno zugeschnitten. Die Code Teile für ein Arduino Leonardo/Micro/Mega (eines mit einer zweiten Hardware Seriellen Schnittstelle hat) sind auskommentiert im Code.

HC-05/HC-06 Konfigurieren - SerialPassthrough

/*   HC-05/HC-06 Konfigurieren - SerialPassthrough  */
/*
 * Das Sketch baut lediglich ein Verbindung zum Bluetooth Modul auf.
 *
 * Beim HC-06 "kein Zeilenende" im SerialMonitor auswählen. Default Baud: 9600 bps
 * Beim HC-05 "Sowohl CR als auch LN" einstellen. Default Baud: 38400 bps
 *
 *  Erster AT Befehl (HC-06): "AT"
 *  Erwartete Antwort: OK
 *
 * AT+VERSION  version
 * AT+NAMEWildCat  Oksetname
 * AT+PIN1234  Oksetname
 * AT+BAUD4  OKsetBAUD4 // 4: 9600 bps ; 6:38400 bps ; 8: 115200
 *
 * Das Arduino Leonardo/Micro (32u4) braucht die while Schleife (siehe Setup), allerdings
 * kein SoftSerial, da eine zweite Serial1 auf Pin 0 und Pin 1 liegt! Serial0 ist USB.
 * Am Ende befindet sich ein Serial0 <-> Serial1 Passthrouth Beispiel.
 */

#define BTBAUD 9600 // Die Standard Geschwindigkeit von HC-06
//#define BTBAUD 384000   // Die Standard Geschwindigkeit von HC-05
#define BTRX 2  // SoftSerial RX Pin, wird mit TX am HC-05/06 angeschlossen
#define BTTX 3  // SoftSerial TX Pin
#include <SoftwareSerial.h>


//byte enPin; // Wen man das umschalten zwischen Konfigurieren und "Normal" Softwareseitig lösen möchte. (Siehe Kommentar oben)
//byte statePin; // Der Pin geht auf HIGH wenn eine Verbindung hergestellt wurde.

SoftwareSerial btSerial(BTRX, BTTX); // RX, TX

void setup() {
  Serial.begin(38400);

/*  Für native USB (zB: Leonardo/Micro)
 while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
*/

  Serial.println(F("Konfigurations Sketch für das HC-05/HC-06 \n\r"));
  Serial.println(F("HC-06: \n\r \"Kein Zeilenende\" für das HC-06 einstellen, das HC-06 erwartet \"AT\" und gibt \"OK\" zurück."));
  Serial.println(F("HC-05: \n\r \"CR und LN\" für das HC-05 einstellen.")); // oder /r/n anhängen

  // Initalisiert die BT Verbindung
  btSerial.begin(BTBAUD);
  // Hardware Serial (Für Leonardo/Micro/Mega usw.)
//  Serial1.begin(BTBAUD);  // am besten mit Suchen&Ersetzen alle btSerial durch Serial1 ersetzen.

}

void loop() {
  //  kein Lokales Echo!!
  
  if (btSerial.available()) {
    Serial.write(btSerial.read());
  }
  
  if (Serial.available()) {
    btSerial.write(Serial.read());
  }

/* ##########################################
   #
   #  Hardware Serial
   #  für das Arduino Leonardo/Micro oder das Arduino MEGA
*/
/*
   if (Serial.available()) {
    Serial1.write(Serial.read());
  }

  if (Serial1.available()) {
    Serial.write(Serial1.read());
  }
*/
  
}

Das Bluetooth Shield

Grüße,
Donny

HC-06:

Das HC-06 kann nur als Slave verwendet werden was für viele Anwendungsmöglichkeiten auch reicht. Mit einem Android Smartphone ist es keine große Hexerei eine Verbindung herzustellen. Davor muss das HC-06 konfiguriert werden.

Im Grunde reicht ein FTDI Adapter oder ein Arduino ohne Code (Setup() {}, loop() {}). Besser ist ein der unten passthrough Code aus #1. Die Standard Geschwindigkeit ist 9600 bps. Ausserdem muss am Seriellen Monitor ohne Zeilenende eingestellt werden. Der Standardmäßige Pin ist 1234.

Gib den Befehl ‘AT’ ein, als Antwort kommt ein OK.

Die AT Befehle für das HC-06.

AT // soll ein OK zurück kommen.
AT+VERSION

Befehl Antwort
AT+VERSION version
AT+NAMEtornado Oksetname
AT+PIN1234 Oksetname
AT+BAUD4 OKsetBAUD

Eine Liste aller möglichen Geschwindigkeiten:

1: 1200
2: 2400
3: 4800
4: 9600
5: 19200
6: 38400
7: 57600
8: 115200
9: 230400
A: 460800
B: 921600
C: 1382400

Ich werde den Code in Bluetooth und IR noch teilen.

/*  Bluetooth gesteuerte LED_13  */
/*
 * Bluetooth Befehle:
 * 10
 * 11
 * 
 * 1
 * 20
 * 21
 * 
 * 
 */
/* Included libs  */
//  Mindestdistanz in cm
#define BTBAUD 9600 // Die Standard Geschwindigkeit von HC-05
//#define BTBAUD 9600   // Die Standard Geschwindigkeit von HC-06

#include <SoftwareSerial.h> // Wird für das Bluetooth Modul beim Arduino Uno benötigt
SoftwareSerial BTserial(2, 4); // RX | TX

/*  Variablen deklarieren */

const byte ledPin = 13;

int BTcomMsg = 10;  // Die Zustandszahl der State Machine, 10 = Stopp
unsigned long previousTime;  // Excuse me for delay!

void setup() {
  previousTime = millis(); // Speichert die aktuelle Zeit

  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW); // LED soll ausgeschaltet sein
  
  //  Initialisiere Seriele verbindung:
  Serial.begin(9600);
  Serial.println("HC-05/06 Slave - Verbindungstest");

  // Initalisiere SoftSerial zum HC-06
  BTserial.begin(BTBAUD);  // default Baud Rate is 9600 bps
//  BTSerial.print("Hello BT Master");  // Wird über Bluetooth an den Master geschickt.

}
void loop() {
  
  //  ------> Bluetooth
  
  if (BTserial.available()) { // Kommt eine Zahl! über das Bluetooth modul herein
    int type = BTserial.read();
    BTcomMsg = BTserial.parseInt(); // Das Bluetooth Signal speichern
    //Serial.println(BTcomMsg);
  }

  // ------> Moves

  switch (BTcomMsg) { // Das

    case 0: BTcomMsg = 10; break; //  Wenn die Zustandszahl (BTcomMsg) 0 ist
  
    case 10: digitalWrite(ledPin, LOW); break; //  LED ausschalten

    case 11: digitalWrite(ledPin, HIGH); break; // LED einschalten

    case 19:  // Um den Wert einer State Maschine nochmal zu verdeutlichen
      digitalWrite(ledPin, HIGH);
      if (millis() - previousTime >= 1000) BTcomMsg = 10;  // 20 = LED ausschalten

      break;
    case 20:
      digitalWrite(ledPin, HIGH);
      if (millis() - previousTime >= 1000) BTcomMsg = 21;  // 21 = Led für eine Sekunde ausschalten
      
      break;
    case 21:
      digitalWrite(ledPin, LOW);
      if (millis() - previousTime >= 1000) BTcomMsg = 20;  // 20 = Led für eine Sekunde einschalten
      
      break;
    default:

      Serial.print("Code nicht erkannt, Eingehender Code: ");
      Serial.println(BTcomMsg);
      break;
  }
  
  previousTime = millis(); // Speichert die aktuelle Zeit
}

Fragen, Anregungen, Inputs??

HC-05:
Das HC-05 kann sowohl als Master also auch als Slave verwendet werden. Der AT-Interpreter ist zumindest benutzerfreundlicher. Im Gegensatz zum HC-06 kann man hinter jeden Befehl ein ? anhängen und bekommt auch eine Rückmeldung.
Im Seriellen Monitor muss auf Sowohl CR als auch NL eingestellt werden und die Standard Geschwindigkeit ist auf 384000 bps eingestellt.
Datenblatt - Wiki

Ein vollständige Liste der AT Befehle des HC-05. Die meisten AT-Befehle erwarten mehrere Parameter. (zB: Timeout, max. Versuche, etc.)

AT // Antowrt: OK
AT+RESET  // Reset
AT+VERSION?  // Version
AT+ORGL  // Werkseinstellungen wiederherstellen: Slave Mode, Pin:1234, BAUD 38400 bps

//  Konfigurieren:
AT+NAME?
AT+NAME:meinName
AT+ROLE?   // Master oder Slave
AT+ROLE:1  //  :0 = Slave, :1 = Master

AT+PSWD?
AT+PSWD:1234
AT+UART AT+UART=115200,1,2, //Parameter: BAUD, Stop Bit, Parity

AT+STATE?  // Antwortmöglichkeiten des HC-05: INITIALIZED, READY, PAIRABLE, PAIRED, INQUIRING, CONNECTING, CONNECTED, DISCONNECTED, NUKNOW

AT+BIND?  // Wenn das HC-05 einmal Konfiguriert ist(STATE?=INQUIRING), reicht der Befehl um eine Verbindung herzustellen. 

AT+DISC  // Verbindung Trennen, State=DISCONNECTED

AT+ADDR? NAP: UAP : LAP
AT+RNAME? Device address 00:02:72:od:22:24  < unbestätigt

// Init SPP Profile 
AT+INIT

AT+INQ
AT+INQC

AT+PAIR:deviceAdress , Timeout
AT+LINK:deviceName



AT+CLASS? ??
AT+IAC ??
AT+INQM ?? Set/Check Query access patterns

AT+CMODE?
AT+BIND? <- verbinden

AT+POLAR? <- LED
AT+PIO

AT+IPSCAN?
AT+SNIFF?
AT+SENM?

Delete Authenticated Device
AT+PMSAD =
AT+RMAAD =
AT+FSAD =
AT+ADCN?
AT+MRAD?

AT+STATE?

Energy-sving mode:
AT+ENSNIFF: deviceAdress

Exerts Energy saving mode
AT+ EXSNIFF: deviceAdress

Koppeln/Verbinden:

comming soon as possible

Grüße,
Donny

Verbinden mit Windows

  1. Einleitung:
    Die Nachfolgenden Screenshoots zeigen wie man unter Windows eine Verbindung mit einem HC-06 herstellt. Nach der Prozedur gibt es einen neuen COM Port. Startet man ein Terminal Programm oder den Seriellen Monitor in der Arduino IDE und wählt den mit "Bluetooth" gekennzeichneten COM Port aus, so versucht Windows eine Verbindung herzustellen.
    Erst hier fragt Windows nach dem Pin Code, wenn dieser noch nicht eingegeben wurde. Stimmt der Pin, steht auch die Verbindung. Zu erkennen, an der konstant leuchteten LED am HC-05/06.

  2. Die Windows Einstellungen öffnen. Unter Geräte, rechts auf Weitere Bluetooth Optionen klicken.

  3. Den Reiter COM-Anschlüsse wählen. Dann auf Hinzufügen klicken.

  4. Hier Ausgehend auswählen und durchsuchen anklicken.
    3-erwBTopt-hinzufügen.png

  5. Eine Liste aller Bluetooth Geräte. Hier wird auch unser HC-06 WildCat angezeigt. Das Bluetooth Modul wählen und auf OK klicken.
    4-kompletteGeräteAuswahl.png

  6. Nach der Bestätigung soll wird das hier angezeigt. Jeweils mit OK bestätigen.
    5-BT-Anschluss hinzufügen.png

  1. Nachdem alle Fenster mit OK bestätigt wurden, versucht Windows eine Verbindung aufzubauen, dabei fragt Windows auch nach dem Pin Code. Gibt man den flaschen Pin ein, speichert Windows den erstmal.
    Sobald man mit einer Terminal Software (siehe Punkt 8) eine Verbindung herstellen möchte, fragt Windows erneut nach den Pin.
    8-parringPin.png

  2. Sobald alles eingerichtet ist findet man das Modul im Geräte Manager. Unter Eigenschaften, Reiter Dienste:

8.)Screenshoot von TeraTerm. COM12 ist hier selbsterklärend. Beim auswählen und wird eine Verbindung zu dem Bluetooth Modul (HC-05/06) ausgebaut). Wenn die blinkende LED, konstant leuchtet wurde eine Verbindung hergestellt.
verbindung aufbauen.png

9)zu Beachten: Windows legt die Geschwindigkeit 9600bps fest. Deshalb muss man beim öfnnen des COM Port auch die Geschwindigkeit einstellen.
Im Geräte Manager (Ansicht -> Ausgebelendete Geräte) unter Anschlüsse (COM & LPT) findet man den gerade eingerichteten "Seriell-über-Bluetooth-Verbindung" COM Port, in den Eigenschaften kann man dies allerdings ändern, wichtig sind auch die anderen Einstellungen. Wenn diese nicht aufeinander Abgestimmt sind, kann man zwar eine Verbindung herstellen... auch TX Daten des HC-05/06 werden am Oszi sichtbar allerdings nicht in der Terminal Software.
BTCOM Einstellungen.png

Updates:
#1 30.04.2018: Minimal Optimal, sämtliche Codes wurdes auf das notwenigste gekürzt um die Übersicht zu bewahren.

#2 01.05.2018: Verbindung zu Windows hineingenommen.

#3 07.05.2018: Windows <-> HC-06 gelungen.

3-erwBTopt-hinzufügen.png

4-kompletteGeräteAuswahl.png

5-BT-Anschluss hinzufügen.png

8-parringPin.png

10-TeraTerm1.png

11-TeraTerm.png

verbindung aufbauen.png

BTCOM Einstellungen.png

Moin und Hallo aus dem Norden Deutschlands,

Ich steige gerade in das Thema HC-05 ein und eine Frage, dabei interessiert mich brennend.

auf welchen Hexcode wird empfohlen die Zeichenkette $00 welche vom HC kommt abzufragen, um das Komblette Datenpacket zu erhalten.

Wie man den Unterlagen entnehmen kann, liegt die Zeichenlänge gut und gerne bei bis zu 30 Zeichen.

Übrigens…
Ich arbeite Komblett unter fpcDeluex auf Raspberry Desktop, sollte aber an der Grundlage nichts ändern, ob free pascal oder C?!

Naja Pascal und C(++) unterscheiden sich schon erheblich. Sowohl in der Syntax, als auch im Verhalten (z.B. Pascal prüft Arraygrenzen, C(++) nicht).

Gruß Tommy

das die beiden sich unterscheiden liegt auf der hand. :smiley: :smiley:
Free Pascal kann ich blind lesen und C/C++ versteh ich nur Bahnhof und streckenweise Garnix.
ich meine im grunde hab ich kein problem ein array [0…100] of uint8 auszubauen und dies schreiben zu lassen.
im anschluß die erste Zelle auf $00 suchen und schon hab ich mein String, aber das empfinde ich egal in welcher Sprache als umständlich, oder sehe ich das falsch?

Wenn Du über ein Device (egal was) Einzelzeichen bekommst, musst Du die auch einzeln zusammen setzen. Egal in welcher Sprache.
Es gibt übrigens auch Lazarus für Arduinio, wenn Du bei Pascal eher zu Hause bist.
Ich selbst komme nach Z80 Assembler, X86 Assembler und Turbo Pascal auch aus der Ecke. Bin aber auch in C / C++ angekommen.

Gruß Tommy

Das Arduino auf f. Lazarus vorhanden ist weiß ich…
Aber für meine Zwecke ist selbst der Nano zu groß…
Also alles selber schreiben. :smiley: :smiley:

also macht die Abfrage auf $00 echt sin. :wink:

Was soll $00 sein? In C++ ist das unbekannt.

Gruß Tommy