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.
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:
Para que a placa e os respectivos exemplos apareçam na IDE, clique em Gerenciador de Placas, no mesmo caminho do menu anterior:
Em seguida, procure na lista a Intel Curie Boards by Intel com a indicação Arduino/Genuino 101 e clique em Instalar:
Ao final da instalação, entre novamente na lista de placas e verifique que a Arduino/Genuino 101 já aparece na lista:
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:
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:
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.:
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)
//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:
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).
Selecione agora a seta para cima, no lado direito da tela, conforme imagem abaixo:
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:
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!