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:
- Raspberry PI 3
- Um módulo relé 5V 2 canais
- Protoboard de 830 pontos
- Dois transistores BC337
- Quatro resistores de 2k 1/4W
- Uma fonte ajustável protoboard
- Jumpers diversos
- Dispositivos diversos com Bluetooth (celulares, computadores, módulos HC05, etc.)
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.
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:
- 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.
- Ligue o Bluetooth da Raspberry PI (através da interface gráfica da Raspbian).
- 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
- 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.
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:
- Coloque o endereço MAC de dois dispositivos nas variáveis MACPermitido1 e MACPermitido2, no formato indicado no código-fonte.
- 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.
sudo apt install python3-pip
sudo pip3 install pybluez
python3
import bluetooth
Para o Pi Zero W:
usermod -aG bluetooth [nome de usuário]
e ainda assim se não funcionar:
sudo rpi-update
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
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 ” “
Desformatou ao publicar aqui. Mas tem que recuar a identação.
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.
Alessandro, infelizmente nunca interagi com o controle do PS3. Sendo assim, não sei te dizer como fazer isso.
Boa Tarde. Muito o tutorial, estou tento problema, pois o python não reconhecer a biblioteca import bluetooth, o que pode ser corrigido?
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
No meu caso, consegui implementando mais um comando:
sudo python3 -m pip install pybluez
Funcionou.
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 .
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.makerhero.com/forum/
Sobre a automação automotiva vou passar a ideia pro povo aqui e ver o que eles acham.
Abraços!
André – Equipe MakerHero
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?
Tenho supervisório feito em C#, é possível rodar no Raspberry PI 3
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
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?
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, 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