Bluetooth: pilotiamo led RGB su Arduino con Android [parte 1]

I dispositivi bluetooth ormai sono ovunque, basti pensare agli auricolari che usiamo in macchina, alle cuffie per sentire la musica, gli speaker portatili fino ad arrivare alle più recenti smartband e smartwatch.
E’ chiaro quindi che siamo costantemente collegati a dispositivi bluetooth e allora vediamo come sia possibile realizzare una semplice applicazione per smartphone Android che ci permetta di scambiare dati con dispositivi remoti per esempio con Arduino.

Il progetto che andremo a creare oggi è una rivisitazione di un mio vecchio articolo,che permetteva di gestire led RGB attraverso un’applicazione desktop Java collegata via seriale con Arduino, se non l’avete ancora letto ecco il link, questa volta l’applicazione sarà per smartphone Android e la comunicazione bluetooth.

Modulo bluetooth HC-05

L’HC-05 è senza dubbio un modulo di trasmissione/ricezione bluetooth a basso costo circa 10 euro compreso di adattatore che ci permette di interfacciarlo ad Arduino (Fig.1).

hc-05
Fig.1 HC-05 + adattatore (sinistra) e HC-05 (destra)

Questo modulo permette di trasformare una comune porta seriale in una porta bluetooth, tipicamente con profilo SPP(Serial Port Profile).

In commercio esistono diversi versioni di questo modulo che differiscono per alcune caratteristiche relative alle impostazioni del protocollo bluetooth.
Fondamentalmente questo modulo si suddivide in due grandi famiglie:

  • Serie Industriale: le cui sigle sono HC-03,HC-04(HC-04-M,HC-04-S)
  • Serie Civile: le cui sigle sono HC-05, HC-06(HC-06-M,HC-06-S)

In entrambe le serie il numero finale indica l’impossibilità o meno di cambiare in maniera dinamica la modalità Master o Slave del protocollo bluetooth, nel caso in cui il numero finale sia 3 o 5 i moduli hanno la possibilità di poter cambiare la configurazione dinamicamente(attraverso i comandi AT), mentre per i moduli con numero finale pari bisogna far attenzione a che siano Master o Slave perché la loro configurazione non potrà essere cambiata.

Vediamo alcune caratteristiche del modulo HC-05:

  • Bluetooth v 2.0 + EDR.
  • La frequenza di funzionamento è 2.4GHz ISM band.
  • Il processore a bordo è un CSR Bluecore4.
  • Alimentazione 3,3 V 50mA.
  • La corrente richiesta in fase di accoppiamento è circa 30/40 mA mentre in fase di comunicazione è di circa 8 mA.
  • Velocità della seriale configurabili 4800, 9600, 19200, 38400, 57600, 115200, 234000, 460800, 921600, 1382400 bps.
  • Password 1234
  • Bluetooth di classe 2.

Le classi per i dispositivi Bluetooth sono 3:

    • Classe 1 : potenza in mW 100, potenza dBm 20, distanza metri circa 100.
    • Classe 2 : potenza in mW 2,5, potenza dBm 4, distanza metri circa 10.
    • Classe 3 :potenza in mW 1, potenza dBm 0, distanza metri circa 1.

Ora che conosciamo meglio questo modulo è arrivato il momento di collegarlo ad Arduino (Fig.2), dallo schema si nota la presenza di un partitore di tensione necessario in quanto i segnali TX e RX del modulo lavorano a 3.3v per cui si devono abbassare i 5v in trasmissione (TX) di arduino ad un livello accettabile per l’HC-05.

HC-05 Arduino
VCC 3.3v (5v)*
GND GND
TX RX
RX TX

*NOTA: Per quanto riguarda invece l’alimentazione Vcc, di 3.3v, si deve verificare sulla scheda del modulo se è possibile alimentarla anche a 5v altrimenti si deve collegare il Vcc dell’HC-05 ai 3.3v di Arduino.

schema_HC-05_arduino
Fig.2 Schema collegamento HC-05 ad Arduino

Prima di passare al codice bisogna accoppiare il modulo HC-05 al nostro smartphone Android, per far questo ci basta accendere il modulo e fare la ricerca dei dispositivi bluetooth tappare su HC-05 e inserire come password 1234.

Sketch Arduino

Il codice da caricare su Arduino è molto semplice non necessita di nessuna libreria bluetooth in quanto si utilizzano i pin seriali TX e RX per la comunicazione con il modulo HC-05.
Per info sul tipo di led RGB utilizzati e sulla libreria Adafruit_NeoPixel vi rimando al mio vecchio articolo che potete trovare qui.

#include <Adafruit_NeoPixel.h>

#define PIXEL_PIN 10 // pin IO used for pilot the Neopixel led
#define PIXEL_COUNT 20 // number Neopixel led present in strip
int valueRead = 0; // variable used for read the serial data
byte data_in[3] {0, 0, 0}; // variable used for write data read of the serial

// create the object strip of type Adafruit_NeoPixel
// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ400);

void setup() {
  Serial.begin(9600);
  // Initialize all pixels to 'off
  strip.begin();
  strip.show();
}
void loop() {
  // save data in data_in
  if (Serial.available() > 2) {
    for (int i = 0; i < 3; i++) {
      valueRead = Serial.read();
      data_in[i] = valueRead;
    }
  }
  single_color();
}

// animation signle color
void single_color() {
  for (int i = 0; i < PIXEL_COUNT ; i++)
    // strip.setPixelColor(n, red, green, blue);
    // The first argument — n in this example — is the pixel number along the strip, starting from 0 closest to the Arduino.
    // If you have a strip of 30 pixels, they’re numbered 0 through 29.
    // The next three arguments are the pixel color, expressed as red, green and blue brightness levels,
    // where 0 is dimmest (off) and 255 is maximum brightness.
    strip.setPixelColor(i, (int)data_in[0], (int)data_in[1], (int)data_in[2]);
  strip.show();
}

Il codice si basa semplicemente sulla lettura dei dati dalla seriale, in particolare ogni volta che sono disponibili più di due byte questi vengono letti e salvati nell’array data_in strutturato come segue:

  • data_in[0] presenta il valore del led Rosso
  • data_in[1] presenta il valore del led Verde
  • data_in[2] presenta il valore del led Blu

successivamente si richiama la funzione single_color() la quale permette di accendere i led con i colori ricevuti dal modulo bluetooth, ossia dall’applicazione Android.

Il link per scaricare il progetto è disponibile nella seconda parte di questo articolo.

Bluetooth: pilotare led RGB su Arduino con Android [parte 2]