Utilizando módulo relé de Arduino no Raspberry Pi com Tkinter

Eletrônica Raspberry Pi 17 de Novembro de 2019 às 10:34

Introdução

Os projetos de domótica estão cada vez mais populares entre as pessoas que procuram os benefícios da tecnologia em suas casas, como a segurança e conforto. Normalmente a automação residencial destaca-se pelo controle de iluminação do ambiente, aparelhos de ar condicionado e até mesmo eletrodomésticos. As soluções para controle possuem diversas formas de desenvolvimento embarcado e IoT, como por exemplo a famosa plataforma Arduino, NodeMCU e Raspberry Pi.

Os primeiros passos para a domótica e controle de iluminação foram apresentados no artigo de como ligar uma lâmpada no Arduino Uno, ensinando as partes essenciais de elétrica e eletrônica do projeto.

O computador embarcado Raspberry Pi 3 é um forte aliado aos projetistas, oferecendo inúmeras formas de desenvolvimento de soluções em softwares do tipo desktop e web, podendo entregar sistemas mais robustos e interfaces ricas que aumentam a experiência do usuário. Neste vídeo abaixo você pode apreciar alguns desses projetos focados em aplicações web utilizando Raspberry Pi 3 e NodeMCU.

Em aplicações desktop simples podemos utilizar a linguagem de script Python com GUI (Graphical User Interface), desenvolvendo sistemas ágeis para controle diário.

Raspberry Pi e módulo relé

Projetos com a plataforma Raspberry Pi carecem de uma maior atenção nas GPIOs em seus valores máximos de tensão e corrente permitidos. Os módulos relés comercializados para Arduino, são projetados para receberem 5V nos acopladores ópticos, responsáveis em realizar o acionamento isolado do relé. A GPIO do RbPi possui uma tolerância de 3.3V e 16mA, e se esta tensão é aplicada na entrada do módulo, o LED interno do acoplador não será acionado, consequentemente não vamos conseguir um resultado eficiente dos relés. Além disso existem módulos que possuem alimentação externa de 5V utilizando um jumper, se o RbPi não possuir uma proteção adequada para este tipo de situação, você pode dar um "adeus" para a GPIO, pois este jumper faz a conexão entre o VCC de 5V com o acoplador, LED externo e a entrada conforme o esquema abaixo, sendo uma situação não desejada em dispositivos 3.3V, mesmo se as GPIOs estão configuradas como Output.

Para contornar estes problemas utilizando o módulo relé de 2 canais como da imagem acima, é necessário adicionar dois acopladores ópticos e seus respectivos resistores limitadores de corrente, assim acionamos o LED interno do acoplador extra com 3.3V, e seu transistor interno receberá 5V para acionar o módulo, assim compatibilizamos e isolamos a GPIO da entrada do módulo relé.

Uma outra alternativa é você deixar de lado este módulo de Arduino e criar o seu próprio módulo de relé compatível com qualquer plataforma de desenvolvimento embarcado!

Como montar

Depois de apresentar os problemas e a solução da utilização de módulos relés de Arduino com o computador Raspberry Pi, separamos uma lista de materiais para montar o projeto com os acopladores ópticos extras.

  • 1 Raspberry Pi 3 B+ com fonte de alimentação 5V de 3A
  • 1 Protoboard
  • 1 Módulo relé de 2 canais
  • 2 Acopladores ópticos PC814
  • 2 Resistores de 1KΩ
  • 2 Resistores de 220Ω
  • Fios jumpers
  • Kit de prototipagem para Raspberry Pi 3 (Opcional)
Circuito de proteção para Raspberry Pi e módulo relé de 2 canais.
Montagem do projeto para acionar relé de 5V com Raspberry Pi 3 B+ com kit de prototipagem.

Os valores dos resistores para os LEDs internos dos acopladores ópticos foram obtidos a partir de um cálculo utilizando a Lei de Ohm, com os valores típicos de V1, tensão e corrente do LED conforme datasheet, então:

Fórmula para resistor LED de acoplador óptico PC814.

O resultado do cálculo é um resistor de 105Ω, porém é recomendável a utilização de um resistor comercial com um valor maior, como 220Ω. O valor do resistor para o Coletor do transistor interno é de 1KΩ,  típico para tensão de 5V.

Software GUI em Python

Realizando a montagem com os acopladores ópticos extras conforme o esquema, vamos iniciar a fase de desenvolvimento do software para controlar o módulo de dois relés com uma interface amigável utilizando botões, menus e textos para interação com o usuário. Em aplicações simples em Python a melhor escolha é utilizar a biblioteca nativa chamada Tkinter. Porém existem outras frameworks e toolkits disponíveis para diferentes necessidades de projeto, se você é iniciante nesta área é recomendável que comece com a biblioteca Guizero, ela possui uma estrutura baseada em uma Tkinter mais semântica de fácil aprendizagem, além disso sua documentação explana alguns conceitos básicos de GUI.

Para utilizar a biblioteca Tkinter em um projeto não é necessário instalar nenhum pacote adicional, pois ela é nativa ao interpretador e ao Python 3 IDLE de seu sistema operacional, como no caso do Raspbian. Então basta importar a biblioteca no arquivo Python para começar a desenvolver interfaces gráficas de sua preferência.

O Tkinter utiliza conceitos básicos de GUI, como Containers, Widgets e Eventos. Os containers é o conceito de uma organização, ele "guarda" os elementos gráficos da tela, como um botão ou um texto qualquer, conhecidos como widgets. Para representar uma ação ou comportamento do botão "ao clicar no botão X execute o processo Y", este processo é chamado de event handler. Para este evento funcionar corretamente é necessário implementar um método que seja capaz de "ouvir" constantemente a chamada dos processos no sistema para serem executados, denominado de event loop.

Com os conceitos de GUI explanados podemos colocar em prática no Raspberry Pi. O primeiro passo é criar um arquivo Python para começar a escrita do código, então crie um arquivo vazio chamado "controle_rele.py" na área de trabalho, abra este arquivo utilizando o software Python 3 IDLE, com o arquivo aberto cole este código abaixo, altere os nomes dos relés e do aplicativo para o seu projeto, salve e execute pressionando F5.

#
# Controle de relé em Python (IDLE 3.5.3) e Tkinter para Raspberry Pi.


# Data: 29/04/2019
# --------------------------------------------------------------------

from tkinter import *
import RPi.GPIO as GPIO

# Configuração das GPIOs (BCM)
pino_rele_1 = 20
pino_rele_2 = 21

GPIO.setmode(GPIO.BCM)
GPIO.setup(pino_rele_1, GPIO.OUT)
GPIO.setup(pino_rele_2, GPIO.OUT)

class App:
    def __init__(self, master=None):
        
        #Configurar nomes dos relés e app de sua preferência
        self.tituloRele1 = "Externo"
        self.tituloRele2 = "Cozinha"
        self.tituloApp = "Controle de relé - Tec Dicas"
        self.fonteApp = ("Calibri", "12")
        
        #Container e widget Título
        self.containerTitulo = Frame(master)
        self.containerTitulo["pady"] = 10
        self.containerTitulo["padx"] = 50
        self.containerTitulo.pack()
        
        self.tituloApp = Label(self.containerTitulo, text=self.tituloApp, font=self.fonteApp)
        self.tituloApp.pack()

        #Container e widgets Relé 1
        self.containerRele1 = Frame(master)
        self.containerRele1["padx"] = 50
        self.containerRele1["pady"] = 5
        self.containerRele1.pack()
        
        self.tituloRele1 = Label(self.containerRele1, text=self.tituloRele1, font=self.fonteApp)
        self.tituloRele1.pack(side=LEFT)
  
        self.btnRele1 = Button(self.containerRele1, font=self.fonteApp)
        self.btnRele1["text"] = "Status"
        self.btnRele1["width"] = 12
        self.btnRele1["command"] = self.rele1
        self.btnRele1.pack()

        #Container e widgets Relé 2
        self.containerRele2 = Frame(master)
        self.containerRele2["padx"] = 50
        self.containerRele2["pady"] = 5
        self.containerRele2.pack()
        
        self.tituloRele2 = Label(self.containerRele2, text=self.tituloRele2, font=self.fonteApp)
        self.tituloRele2.pack(side=LEFT)
  
        self.btnRele2 = Button(self.containerRele2, font=self.fonteApp)
        self.btnRele2["text"] = "Status"
        self.btnRele2["width"] = 12
        self.btnRele2["command"] = self.rele2
        self.btnRele2.pack()

        self.lerStatus()

    def rele1(self):
        if(GPIO.input(pino_rele_1) == 0):
            GPIO.output(pino_rele_1,1)
            self.btnRele1["text"] = "Desligar"
            self.btnRele1["bg"] = "#ef5350"
        elif(GPIO.input(pino_rele_1) == 1):
            GPIO.output(pino_rele_1,0)
            self.btnRele1["text"] = "Ligar"
            self.btnRele1["bg"] = "#66BB6A"

    def rele2(self):
        if(GPIO.input(pino_rele_2) == 0):
            GPIO.output(pino_rele_2,1)
            self.btnRele2["text"] = "Desligar"
            self.btnRele2["bg"] = "#ef5350"
        elif(GPIO.input(pino_rele_2) == 1):
            GPIO.output(pino_rele_2,0)
            self.btnRele2["text"] = "Ligar"
            self.btnRele2["bg"] = "#66BB6A"

    def lerStatus(self):
        if(GPIO.input(pino_rele_1) == 1):      
            self.btnRele1["text"] = "Desligar"
            self.btnRele1["bg"] = "#ef5350"
        elif(GPIO.input(pino_rele_1) == 0):    
            self.btnRele1["text"] = "Ligar"
            self.btnRele1["bg"] = "#66BB6A"
            
        if(GPIO.input(pino_rele_2) == 1):   
            self.btnRele2["text"] = "Desligar"
            self.btnRele2["bg"] = "#ef5350"
        elif(GPIO.input(pino_rele_2) == 0):
            self.btnRele2["text"] = "Ligar"
            self.btnRele2["bg"] = "#66BB6A"

root = Tk()
App(root)
# Título do app
root.title('Controle de relé | Tkinter')
# Bloquear janela
root.resizable(width=False, height=False)
# Tamanho da janela
root.geometry("400x200")
root.mainloop()
# Limpa as GPIOs
GPIO.cleanup()
Software baseado em Tkinter para controlar dois relés em um Raspberry Pi 3.

Referências

  1. MALVINO, A, P; Eletrônica: volume 1. 4 ed. Makron Books, 1997.