12 agosto 2016

Tutorial Genuino 101 com Bluetooth LE

No post Genuino 101 com Intel® Curie™ mostramos as principais características da placa, sendo que um dos seus grandes diferenciais é o Bluetooth LE (Bluetooth Low Energy) integrado. Vamos então mostrar neste post como acionar portas do Genuino 101 com bluetooth LE.

Tutorial Genuino 101 com Bluetooth LE
Mas antes de entrar no assunto Bluetooth e Genuino 101, vamos dar uma olhadinha na instalação da placa na IDE do Arduino.

Instalando a placa Genuino 101 na IDE


Ao instalar a IDE do Arduino (no momento em que escrevo este post estou usando a versão 1.6.10 da IDE), não temos a Genuino 101 na lista de placas instaladas, como podemos ver na imagem abaixo:

IDE Arduino


Para que a placa e os respectivos exemplos apareçam na IDE, clique em Gerenciador de Placas, no mesmo caminho do menu anterior:

IDE Gerenciador de Placas


Em seguida, procure na lista a Intel Curie Boards by Intel com a indicação Arduino/Genuino 101 e clique em Instalar:

Instalação placa Genuino 101

Ao final da instalação, entre novamente na lista de placas e verifique que a Arduino/Genuino 101 já aparece na lista:

Genuino 101 Instalada


Selecione a placa e a porta serial correspondente no menu Ferramentas. Nesse momento, novas opções de exemplos de programas, relativos à Intel Curie serão mostradas no menu Arquivo - Exemplos:

Exemplos Intel Curie

Temos então exemplos para utilização com Bluetooth LE, acelerômetro e interfaces, entre outros.

Genuino 101 com Bluetooth LE


No Genuino 101, o Bluetooth está incorporado ao Intel® Curie™, e o mais comum é utilizá-lo para acionar o bom e velho led ligado à porta 13. Então para ficar um pouco diferente, vamos usar no nosso circuito dois leds. :-)

Monte o circuito abaixo, observando a polaridade dos leds ligados nas portas digitais 5 e 7 do Genuino:

Circuito Genuino 101 e Bluetooth LE

Programa Bluetooth LE com Genuino 101


O programa que vamos utilizar é baseado no exemplo da própria IDE (o programa CurieBLE/LED), que usa a biblioteca CurieBLE. Esse programa controla a porta 13 do Genuino 101, mas vamos fazer algumas alterações no código para controlar os leds das portas digitais 5 e 7.

Na linha 7 é criado um objeto chamado Controle_LED, com um ID (UUID, ou Universally Unique Identifier) de 16 bytes correspondente. Esse UUID vai aparecer posteriormente no celular, quando fizermos a conexão para acionar o led.:

BLEService Controle_LED("19B10000-E8F2-537E-4F6C-D104768A1214")

Com o comando abaixo podemos atribuir "características" ao objeto Controle_LED criado anteriormente. Esse comando pode receber uma UUID própria (note que ela tem um dígito diferente da UUID do objeto Controle_LED) e ter as propriedades de Readable (podemos ler essas características), Writable (podemos alterar essas características), ou as duas propriedades ao mesmo tempo:

BLEUnsignedCharCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite)


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//Programa: Genuino 101 e Bluetooth LE
//Autor: Arduino e Cia

#include <CurieBLE.h>

BLEPeripheral blePeripheral;  //BLE Peripheral Device (the board you're programming)
BLEService Controle_LED("19B10000-E8F2-537E-4F6C-D104768A1214"); // BLE LED Service

//BLE LED Switch Characteristic - custom 128-bit UUID, read and writable by central
BLEUnsignedCharCharacteristic switchCharacteristic1("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite);

const int ledPin1 = 5; //Pino Led 1
const int ledPin2 = 7; //Pino Led 2

void setup()
{
  Serial.begin(9600);
  //Define os pinos dos leds como saida
  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);

  // set advertised local name and service UUID:
  blePeripheral.setLocalName("Genuino_LED");
  blePeripheral.setAdvertisedServiceUuid(Controle_LED.uuid());

  // add service and characteristic:
  blePeripheral.addAttribute(Controle_LED);
  blePeripheral.addAttribute(switchCharacteristic1);

  // set the initial value for the characeristic:
  switchCharacteristic1.setValue(0);

  // begin advertising BLE service:
  blePeripheral.begin();

  Serial.println("BLE LED com Genuino 101");
}

void loop()
{
  //Aguarda a conexao por Bluetooth
  BLECentral central = blePeripheral.central();

  //Se ocorrer a conexao
  if (central)
  {
    Serial.print("Conectado a central: ");
    //Mostra o MAC address do dispositivo conectado
    Serial.println(central.address());

    //Executa enquanto o dispositivo estiver conectado
    while (central.connected()) {
      //Aguarda o valor enviado pelo dispositivo conectado
      //e aciona o led correspondente
      if (switchCharacteristic1.written())
      {
        //Caso receba o valor 1, aciona o led 1
        if (switchCharacteristic1.value() == 1)
        {
          Serial.println("LED 1 ligado");
          digitalWrite(ledPin1, HIGH);
        }

        //Caso receba o valor 2, aciona o led 2
        if (switchCharacteristic1.value() == 2)
        {
          Serial.println("LED 2 ligado");
          digitalWrite(ledPin2, HIGH);
        }

        //Caso receba o valor 0, apaga todos os leds
        if (switchCharacteristic1.value() == 0)
        {
          Serial.println(F("LEDs desligador"));
          digitalWrite(ledPin1, LOW);
          digitalWrite(ledPin2, LOW);
        }
      }
    }
  }

  //Quando ocorrer desconexao, mostra mensagem
  Serial.print(F("Desconectado da central: "));
  Serial.println(central.address());
}

Após a configuração dos parâmetros do Bluetooth do Genuino 101 e das portas dos leds, o que fazemos é aguardar a conexão pela "central" (no caso, um aplicativo no smartphone) e testar o valor que foi enviado pelo aplicativo.

Você pode acompanhar o status da conexão pelo serial monitor. No aplicativo vamos enviar um valor para o Genuino e caso seja o valor 1 ele acende o led da porta 5, caso seja o valor 2 ele acende o led da porta 7, e caso seja 0 (zero), apaga os dois leds.

Controlando o Genuino 101 pelo celular


Vamos usar um smartphone com Android e Bluetooth 4.0. O aplicativo utilizado é o nRF Connect for Mobile, disponivel neste link do Google Play.

Ao entrar no aplicativo, clique em SCAN, na parte superior, para que os dispositivos bluetooth sejam exibidos. Em seguida, clique em CONNECT:

nRF Connect

Na tela seguinte, selecione Unknown Service, onde ao lado você deve visualizar o UUID do serviço Controle_LED (destacado em vermelho) que foi setado no programa do Genuino. Logo abaixo, temos o UUID das características (destacado em azul) com as respectivas propriedades (read/write).

nRF Connect Genuino 101

Selecione agora a seta para cima, no lado direito da tela, conforme imagem abaixo:

nRF Connect - Detalhe

Na tela seguinte é onde vamos digitar os valores que serão enviados para o Genuino. Digite o valor desejado no campo New value, selecione UINT 8 no botão do lado direito e em seguida selecione SEND:

nRF Connect - Enviando valor

Relembrando: envie o valor 1 para acender o led da porta 5, o valor 2 para acender o led da porta 7 e o valor 0 para apagar os dois leds.

Curioso para utilizar o acelerômetro embutido no Intel® Curie™ ? Aguarde o próximo post sobre o Genuino 101 aqui no Arduino e Cia!

Nenhum comentário:

Postar um comentário