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

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 Raspberry 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 MakerHero
#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.

Faça seu comentário

Acesse sua conta e participe

18 Comentários

  1. sudo apt install python3-pip
    sudo pip3 install pybluez
    python3
    import bluetooth

    1. Para o Pi Zero W:

      usermod -aG bluetooth [nome de usuário]

      e ainda assim se não funcionar:
      sudo rpi-update

      1. Importante observar que, nesse projeto, estamos utilizando, na verdade, o bluetooth clássico, e não o BLE. Para que usemos o BLE, devemos utilizar os seguintes comandos:
        sudo apt-get install python3-pip libglib2.0-dev
        sudo pip3 install bluepy
        E depois, no python3, executar o seguinte programa para fazer o scan dos dispositivos próximos:

        #*****************************************************************************
        #!/usr/bin/python
        from __future__ import print_function

        from time import gmtime, strftime, sleep
        from bluepy.btle import Scanner, DefaultDelegate, BTLEException
        import sys

        class ScanDelegate(DefaultDelegate):

        def handleDiscovery(self, dev, isNewDev, isNewData):
        print(strftime(“%Y-%m-%d %H:%M:%S”, gmtime()), dev.addr, dev.getScanData())
        sys.stdout.flush()

        scanner = Scanner().withDelegate(ScanDelegate())

        # listen for ADV_IND packages for 10s, then exit
        scanner.scan(10.0, passive=True)

        #*****************************************************************************

        Com isso, provamos que os dispositivos que apareciam no scan do Bluetooth clássico já não aparecem mais no scan do BLE.
        Para mais informações sobre a biblioteca utilizada, envio-lhes os seguintes links que entram em mais detalhes:
        Documentação da biblioteca:
        https://github.com/IanHarvey/bluepy/tree/master/docs
        Exemplos:
        https://github.com/IanHarvey/bluepy/tree/master/bluepy

  2. 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.

  3. 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.

  4. 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

      1. No meu caso, consegui implementando mais um comando:

        sudo python3 -m pip install pybluez

        Funcionou.

  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!
      Sobre a automação automotiva vou passar a ideia pro povo aqui e ver o que eles acham.

      Abraços!

      André – Equipe MakerHero

  6. 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?

  7. 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

  8. 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?

  9. 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

    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