HC-05 - Moduł bluetooth dla Arduino i nie tylko

Konfiguracja i podłączenie modułu HC-05

Moduł bluetooth HC-05

Niewielki, gotowy do podłączenia do płytki stykowej. Najważniejsze cechy to:

Test połączenia

Najpierw proste połączenie - na komputerze będziemy odbierać dane wysłane z komórki. Potrzebne elementy:

Arduino jako konwerter USB/Serial

Arduino UNO może posłużyć jako konwerter USB/Serial. W tym celu przewodem łączymy gniazda RESET i GND na Arduino. By teraz skorzystać z konwertera USB/Serial na Arduino wejście TX na Arduino łączymy z TX na adapterze USB.

UWAGA Normalnie spotykasz się z połączeniem TX/RX na krzyż, czyli TX na modemie podłączamy z RX na Arduino. Ale to wtedy gdy chcesz skomunikować moduł Bluetooth z ATMegą na Arduino. Teraz chcemy wysyłać dane do komputera, wiec TX na Arduino (transmit, czyli nadawanie) jest miejscem gdzie jest podłączmy RX (receive, odbieranie) konwertera USB/Serial. A tam właśnie chcemy wysłać dane z modułu Bluetooth.

Połączenia:

Jako pierwsze GND na Arduino łączysz z RESET na Arduino. Ważne by to było pierwsze połączenie, jeśli łączysz na włączonym Arduino.

Moduł Bluetooth HC-05 Arduino
GND GND
Vcc 5V
TX TX

Konwerter USB/Serial

Moduł USB/Serial podłączamy do modułu BT nieco inaczej (tutaj jest połączenie na krzyż):

Moduł Bluetooth HC-05 Konwerter USB/Serial
GND GND
Vcc Vcc
TX RX

Parowanie telefonu

Po podłączeniu zasilania dioda na module BT miga szybko (2-3 razy na sekundę). Oznacza to że urządzenie nie jest sparowane. W telefonie włączasz Bluetooth i wyszukujesz urządzenia. Domyślna nazwa modułu to "HC-05". Sparuj telefon z urządzeniem, jeśli spyta się o PIN, to domyślny PIN jest "1234".
Na telefonie zainstaluj aplikację terminala szeregowego. My do tego celu użyliśmy Serial Bluetooth Terminal.

Po sparowaniu telefonu dioda na module miga o wiele rzadziej, co 2, 3 sekundy.

Test działania

Na komputerze uruchamiamy Arduino IDE i włączamy monitor portu szeregowego (menu Tools/Serial Monitor lub Ctrl+Shift+M), wybieramy prędkość 9600 bodów. Teraz uruchamiamy aplikację Serial Bluetooth Terminal.

Wybieramy opcje i moduł HC-05 w menu Bluetooth Devices

Aplikacja gotowa do podłączenia

Klikamy w ikonkę dwóch złącz, obok kosza, na górze ekranu. Aplikacja spróbuje nawiązać połączenie.
Połączenie nawiązane

Teraz wpisujemy testowy tekst i wysyłamy go do modułu
Wysyłamy dane

Na monitorze portu szeregowego powinno się pojawić, to co wysłaliśmy do modułu. Komunikacja nawiązana, moduł przetestowany.

Komunikacja dwustronna

Moduł HC-05 pracuje z napięciami do 3.6V na wszystkich swoich portach I/O. Podanie większej wartości może uszkodzić moduł. W internecie możesz znaleźć przykłady, że ludzie podłączają piny RX HC-05 bezpośrednio do Arduino i im działa, ale ryzykujesz uszkodzenie modułu.
Najlepiej jest skorzystać z konwertera poziomów logicznych (np. któryś z konwerterów poziomów w ofercie Nettigo), lub zrobić taki samemu z dwóch rezystorów. Komunikacja UART jest na każdej linii jednokierunkowa, dlatego tak prosty konwerter z dwóch rezystorów będzie wystarczający.

Jak działa taki konwerter? Używając dwóch rezystorów możemy obniżyć napięcie. Jeśli weźmiemy dwa takie same rezystory, to korzystając ze schematu poniżej uzyskamy obniżenie napięcia o połowę. Czyli dla sygnału wejściowego 5V otrzymamy 2.5V, które jest jednocześnie bezpieczne dla HC-05 i jednoznacznie odczytywane jako logiczna jedynka.
UWAGA Tak obniżać napięcie możemy tylko przy bardzo niskich prądach przepływających przez dzielnik. Jeżeli ten warunek nie będzie spełniony, podział napięcia będzie zależał od chwilowego obciążenia i nie będzie się dało łatwo przewidzieć napięcia wyjściowego. Czyli taki dzielnik nie nadaje się do budowy zasilacza, ale jako jednokierunkowy konwerter sygnału będzie w sam raz. Staraj się użyć dużych rezystorów (rzędu 10kΩ i więcej) do budowy takiego dzielnika, by minimalizować prąd płynący przez taki dzielnik.

Dzielnik napięcia jako konwerter poziomu sygnału

Szkic na Arduino

Podłączenie modułu do Arduino z użyciem dzielnika

W celu testu komunikacji dwukierunkowej, każdy odebrany znak zamienimy na znak z kodem ASCI o jeden większym (czyli 'a' na 'b', 'x' na 'y', 'A' na 'B') i odeślemy. Podłączamy układ jak schemacie powyżej i wgrywamy szkic:

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

}

char c;
void loop() {

  if (Serial.available()) {
    c = Serial.read() + 1;
    Serial.print(c);
  }

}

UWAGA - podczas programowania musisz odłączyć moduł HC-05. Z dwóch powodów. Na linii TX modułu może się pojawić napięcie 5V (bo programowanie odbywa się właśnie przez TX/RX na ATmega328). Drugim powodem jest to, że UART jest szyną dla dwóch urządzeń. W przypadku gdy są trzy urządzenia podpięte do linii TX/RX komunikacja i tak się może nie udać (trzy urządzenia to ATMega328 w Arduino UNO, HC-05 oraz ATmega16u2 w Arduino UNO.)

Podłączamy znowu telefon do modułu BT i przykład komunikacji między telefonem i Arduino:

Trochę bardziej użyteczny kod - podajemy numer portu analogowego a Arduino odsyła nam odczyt z tego portu. Pamiętajmy by w opcjach terminala portu szeregowego nie zapomnieć wyłączyć wysyłania znaków nowej linii na koniec. Nasz kod będzie próbował znaki nowej linii odczytać jako numer wejścia analogowego...

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

}

char c;
unsigned int resp;
void loop() {

  if (Serial.available()) {
    c = Serial.read() - 48;
    if (c >= 0 && c < 6) {
      resp = analogRead(A0);
      Serial.print("Odczyt z portu A");
      Serial.print(c, DEC);
      Serial.print(": ");
      Serial.println(String(resp));

    } else {
      Serial.println("Podaj numer portu analogowe od 0 do 5");
    }
  }

}

Jeśli nie podepniesz czegoś pod porty analogowe, otrzymasz losowe wartości

Zmiana konfiguracji modułu

Domyślne ustawienia transmisji modułu bluetooth to:

Ustawienia te można zmienić. Wymaga to przejście w tzw tryb pracy AT. W tym trybie moduł nie przesyła dalej otrzymanych znaków tylko można wydawać komendy, które zmienią parametry pracy. Tryb ten wywołujemy utrzymując w stanie wysokim pin KEY34 podczas startu modułu.

Pin KEY34 jest wyprowadzony na płytkę PCB zgodnie z opisem na zdjęciu. Uwaga, nie jest wyprowadzony na nóżkę modułu. By skutecznie się do niego dostać, potrzebny jest przylutowany do tego pola przewód. Pole na zdjęciu opisane jako zasilanie to jest napięcie zasilające moduł Bluetooth ze stabilizatora napięcia. Można bezpiecznie je użyć jako napięcie do podania na KEY34. Nie jest to napięcie z pinu VCC, jeśli podasz na pin VCC napięcie 5V, to na polu zaznaczonym strzałką będzie bezpieczne 3.3V.

Po podaniu napięcia na KEY34 można zasilić cały moduł, wystartuje w trybie komend AT. Można poznać to po wolno migającej diodzie. Normalnie po włączeniu zasilania miga kila razy na sekundę. W trybie komend AT miga raz na 2 lub 3 sekundy. Zamiast włączać zasilanie całego układu (co jest czasem kłopotliwe), można na chwilę zewrzeć do masy (GND) pole lutownicze z lewej strony modułu. Na zdjęciu to pole lutownicze opisane jest jako RESET.

Opis dodatkowych pól HC-05 potrzebnych do wejścia w tryb komend AT

Gdy moduł znajduje się w trybie pracy komend AT, jego port szeregowy pracuje z prędkością 38400 bodów. Tym razem pokażemy jeszcze jedną możliwość nawiązania komunikacji z modułem, gdzie Arduino będzie komunikować się z UART modułu korzystając z biblioteki SoftwareSerial a z komputerem przez UART. Wgraj szkic na Arduino:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
void setup() {
  Serial.begin(9600);
  pinMode(9,OUTPUT); digitalWrite(9,HIGH);
  Serial.println("Enter AT commands:");
  mySerial.begin(38400);
}
void loop()
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

Po wgraniu szkicu, podłącz moduł HC-05 do pinów 10 i 11 na Arduino (TX modułu HC-05 do pinu 10 a RX do pinu 11 pamiętając o konwerterze napięcia z rezystorów w tym drugim połączeniu). Wprowadzamy moduł HC-05 w tryb komend AT i otwieramy monitor portu szeregowego. Ustawiamy go na prędkość 9600 (prędkość 38400 jest pomiędzy Arduino a HC-05) tryb końca linii na CR+LF i możemy wydawać komendy: