Automação básica com bluetooth BLE na Raspberry Pi 14

A Raspberry Pi é, indiscutivelmente, uma das plataformas de desenvolvimento mais utilizadas no mundo. O motivo é que, além de sua comunidade muito ativa, a Raspberry Pi conta com muitos recursos de hardware, o que viabiliza uma grande gama de projetos. Um dos recursos mais interessantes dela é o fato de ter Bluetooth (BLE, no caso) já “nativa”. Aproveitando este recurso, este post mostrará como usar um scan bluetooth para fazer uma automação básica e simples usando bluetooth BLE na Raspberry Pi 3.

Material necessário

Para reproduzir este projeto, você precisará de:

Overview do projeto Bluetooth BLE na Raspberry Pi

O projeto de Automação básica com Bluetooth BLE na Raspberry Pi aqui abordado fará o seguinte: periodicamente, um scan do Bluetooth (BLE) será feito. Dele, serão obtidos os nomes dos dispositivos e endereços MAC de todos os dispositivos detectáveis / visíveis. Com base nos dispositivos descobertos, cada um passará por uma rotina de acionamentos, a qual tomará algumas ações dependendo de quem for detectado.

Bluetooth BLE na Raspberry Pi

No caso, as ações serão acionar canais de um módulo de 2 relés, o que poderá facilmente ser convertido em acionamento de quaisquer dispositivos com alimentação AC, como lâmpadas, por exemplo.

Instalação de bibliotecas necessárias

Antes de prosseguirmos, é necessário instalar o pybluez,  para assim conseguirmos interagir com o Bluetooth da Raspbery PI 3 através da linguagem de programação Python. Para isso, execute os seguintes comandos no terminal da Raspberry PI 3:

sudo apt-get update
sudo apt-get install python-pip python-dev ipython
sudo apt-get install bluetooth libbluetooth-dev
sudo pip install pybluez

Descobrindo os endereços MAC de seus dispositivos

Antes de partir para o projeto em si, precisaremos descobrir os endereços MAC dos dispositivos que você possui. Em resumo, o endereço MAC de um Bluetooth é um identificador único, permitindo diferenciar um dispositivo Bluetooth dentre todos os existentes. Portanto, identificar um dispositivo no projeto pelo seu endereço MAC é uma estratégia perfeita para acionamentos personalizados por dispositivo.

Para descobrir os endereços MAC dos seus dispositivos, foi elaborado o programa abaixo, feito em Python.

import time
import bluetooth

def search():
    devices = bluetooth.discover_devices(duration=20, lookup_names = True)
    return devices

#------------------
#Programa principal
#------------------
    while True:
        print "[SCAN] Scan BLE sendo realizado. Aguarde..."
        results = search()
        print "[SCAN] Fim do scan BLE."
        if (results!=None):
            for addr, name in results:
                print "Dispositivo encontrado: {0} - {1}".format(addr, name)
        time.sleep(1)
        print " "

Copie o código-fonte e salve-o como ScanBLE.py. Para utilizá-lo, siga as orientações:

  1. Ligue os dispositivos Bluetooth que deseja utilizar no projeto. Atente para deixá-los visíveis, caso contrário eles poderão não ser detectados.
  2. Ligue o Bluetooth da Raspberry PI (através da interface gráfica da Raspbian).
  3. Devido ao fato dos dados do Bluetooth na Raspberry PI 3B serem acessíveis somente a quem é super-usuário, execute o programa como sudo. Observe a chamada de execução abaixo:
    sudo python ScanBLE.py
  4. Os resultados podem demorar algumas dezenas de segundos para aparecer (pois, no programa, cada scan foi programado para durar 20 segundos). Eles aparecerão no formato “Endereço – nome do dispositivo”, conforme imagem a seguir. Anote os endereços e nomes de dispositivos descobertos.

Scan BLE

Circuito esquemático do projeto

O circuito esquemático do projeto pode ser visto abaixo.

Código-fonte do projeto

Abaixo segue o código-fonte do projeto.

#Projeto: Automacao usando Bluetooth BLE na Raspberry Pi (scan de dispositivos) 
#Autor: Pedro Bertoleti e FilipeFlop
#Data: Agosto/2017

#imports
import time
import bluetooth
import RPi.GPIO as GPIO

#variaveis globais
MACPermitido1="MM:MM:MM:MM:MM:MM"  #coloque aqui o endereco MAC de um dispositivo que devera acionar um dos canais do modulo de reles   
MACPermitido2="MM:MM:MM:MM:MM:MM"  #coloque aqui o endereco MAC de um dispositivo que devera acionar um dos canais do modulo de reles
ReleCanal1 = 23                    #controle do GPIO23 (este controla o canal 1 do modulo de reles)
ReleCanal2 = 24                    #controle do GPIO24 (este controla o canal 2 do modulo de reles)


#Implementacoes

#Funcao: verifica se alguma acao deve ser tomada para algum dispositivo encontrado
#Parametros: endereco MAC do dispositivo encontrado
#Retorno: nenhum
def VerificaDispositivosLista(MACDisp):
    global MACPermitido1
    global MACPermitido2
    DispositivoPermitidoDetectado = 0


    if (MACDisp == MACPermitido1):
         #dispositivo encontrado. Dispara acao correspondente
         DispositivoPermitidoDetectado = DispositivoPermitidoDetectado + 1
         GPIO.output(ReleCanal1, GPIO.LOW)
         

    if (MACDisp == MACPermitido2):
         #dispositivo encontrado. Dispara acao correspondente
         DispositivoPermitidoDetectado = DispositivoPermitidoDetectado + 1
         GPIO.output(ReleCanal2, GPIO.LOW)
         
    
    if (DispositivoPermitidoDetectado > 0):
        #se nenhum dispositivo permitido foi detectado, desaciona todos os canais
        GPIO.output(ReleCanal1, GPIO.HIGH)
        GPIO.output(ReleCanal2, GPIO.HIGH)          

    return


def search():
    devices = bluetooth.discover_devices(lookup_names = True)
    return devices

if __name__=="__main__":
    GPIO.setmode(GPIO.BCM) 
    GPIO.setup(ReleCanal1, GPIO.OUT)
    GPIO.setup(ReleCanal2, GPIO.OUT)
    
    #desaciona os reles
    GPIO.output(ReleCanal1, GPIO.HIGH)
    GPIO.output(ReleCanal2, GPIO.HIGH)
    
    
    while True:
        results = search()
        if (results!=None):
            for addr, name in results:
                VerificaDispositivosLista(addr)                
        else:
            print "Nenhum dispositivo BLE encontrado."

Copie o código e salve-o como “AutomacaoBLE.py”.

Observações:

  1. Coloque o endereço MAC de dois dispositivos nas variáveis MACPermitido1 e MACPermitido2, no formato indicado no código-fonte.
  2. Execute o programa como sudo. Observe a chamada de execução abaixo:
    sudo python AutomacaoBLE.py

Feito isso, basta chegar nas proximidades da Raspberry PI 3 para que um ou mais relés sejam acionados ou se afastar (ou desligar o Bluetooth do dispositivo) para que um ou mais relés sejam desligado. Enfim, hora da diversão!

Gostou? Deixe seu comentário logo abaixo. Em caso de dúvidas, caso queira trocar uma ideia, ou até mesmo dividir seu projeto, acesse nosso Fórum!

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

14 Comentários

  1. Boa tarde Pedro
    Estou tentando fazer alguma coisa relativo a isto mesmo, estou usando 1 beacon para tentar conseguir medir proximidade entre o beacon e o raspberrypi.
    Já fez alguma coisa parecida com isto?
    Obrigado
    Luciano

    Luciano Henrique Albano
    1. Luciano, boa tarde.

      Infelizmente, nunca fiz algo parecido com o que você deseja.
      Mas, dando um palpite, o princípio do que você deseja me parece ser o seguinte: obter a distância em função do RSSI medido no seu receptor (grosso modo, intensidade do sinal Bluetooth).

      Atenciosamente,
      Pedro Bertoleti

  2. Oi boa noite, você não teria nenhum projeto que envolva a linguagem Java ou

    JavaScript, CSS E HTML é por que n entendo nada Phyton?

    Marco Aureliuo Santos Cunha
  3. Tenho supervisório feito em C#, é possível rodar no Raspberry PI 3

    1. Olá, boa tarde.

      Eu não programo em C#, mas acredito que devam existir ferramentas que permitam isso (eu CHUTO que se você utilizar o mono consegue compilar e rodar).

      Atenciosamente,
      Pedro Bertoleti

  4. Olá Pedro!

    Estou desenvolvendo uma aplicação similar, porém no meu caso pode ocorrer de o RaspBerry PI 3 ter aproximadamente 100 unidades de Beacons BLE penduradas nele… Sabe qual é a quantidade máxima de dispositivos que eu consigo gerenciar no Rasp?

  5. Muito legal esse projeto mt bom mesmo , fico grato por postarem tanta coisa legal .
    Fiquei pensando se vcs ja tem algum artigo aqui no site sobre automação automotiva com o raspberry , se poderem compartilhar gostaria muito .
    Grato
    william oliveira .

    1. Olá Willian!

      Ficamos muito felizes em saber que nosso trabalho realmente ajuda as pessoas! Você pode compartilhar o seu projeto lá no nosso fórum? Lá você pode tirar algumas dúvidas e postar seus projetos. Colaborar e aproveitar a comunidade:

      https://www.filipeflop.com/forum/

      Sobre a automação automotiva vou passar a ideia pro povo aqui e ver o que eles acham.

      Abraços!

      André – Equipe FilipeFlop

  6. Boa Tarde. Muito o tutorial, estou tento problema, pois o python não reconhecer a biblioteca import bluetooth, o que pode ser corrigido?

    1. Eduardo, boa tarde.

      Você instalou todas as biblioteas necessárias? Por favor, confirme executando os comandos abaixo:

      sudo apt-get update
      sudo apt-get install python-pip python-dev ipython
      sudo apt-get install bluetooth libbluetooth-dev
      sudo pip install pybluez

      Atenciosamente,
      Pedro Bertoleti

  7. Boa tarde! Gostaria de uma ajuda, se possível.Eu gostaria de usar o controle do ps3 e acionar o direcional para girar um motor , gostaria de saber onde no sistema tem alguma biblioteca que possa alterar ou instalar para trabalhar com esses acionamentos.

    1. Alessandro, infelizmente nunca interagi com o controle do PS3. Sendo assim, não sei te dizer como fazer isso.

  8. Tive que tirar o espaço do While para poder funcionar
    De:
    #——————
    #Programa principal
    #——————
    while True:
    print “[SCAN] Scan BLE sendo realizado. Aguarde…”
    results = search()
    print “[SCAN] Fim do scan BLE.”
    if (results!=None):
    for addr, name in results:
    print “Dispositivo encontrado: {0} – {1}”.format(addr, name)
    time.sleep(1)
    print ” ”
    Para:
    #——————
    #Programa principal
    #——————
    while True:
    print “[SCAN] Scan BLE sendo realizado. Aguarde…”
    results = search()
    print “[SCAN] Fim do scan BLE.”
    if (results!=None):
    for addr, name in results:
    print “Dispositivo encontrado: {0} – {1}”.format(addr, name)
    time.sleep(1)
    print ” “

    1. Desformatou ao publicar aqui. Mas tem que recuar a identação.