Automation GO: Arduino e realidade virtual com o Unity- parte 1

Font Size

Já pensou em ser capaz de criar um mundo virtual  onde todos os ambientes, objetos e mesmo as leis da física foram feitas por você?  No mundo dos jogos eletrônicos esses conceitos são bem comuns, mas agora começam a surgir também no campo da automação. Diante dos novos desafios da pandemia, a realidade virtual  e a realidade aumentada são a melhor forma de reforçar o aprendizado de forma lúdica e criativa. Ao passo que podemos inserir sensores, controladores e atuadores sem nenhum custo, como se fossem personagens de um jogo. A seguir vamos detalhar um procedimento de utilização de uma planta virtual bem simples capaz de comunicar com qualquer microcontrolador. Nossa prática vai usar o Arduino e a realidade virtual com o Unity utilizando a comunicação serial. Este exemplo será um dos pilares para criação de projetos avançados em realidade virtual e automação.  

Ideia principal

A realidade virtual tem despertado interesse em diversas áreas de conhecimento a medida que quebra as barreiras de tempo e espaço. De fato, muitas são as áreas onde esta tecnologia: projeto de jogos, visualização científica, arquitetura, projeto de automóveis, pesquisa médica e educação. Pois é justamente na área de educação que encontramos uma vasta gama de aplicações e em particular na área de automação. Fazer um  treinamento em plantas industriais reais, onde antes já  existia um viés  problemático em relação a segurança, se tornou um desafio maior agora nos tempos de pandemia.

Que tal então resolvermos este problema? Em vez de utilizarmos uma planta industrial real para executar um programa de CLP ou microcontrolador, por exemplo, vamos desenvolver técnicas de modelagem 3d e definir as interações físicas entre todos os elementos do ambiente  virtual. Desta forma, fica em evidência que devemos ter conhecimentos básicos de física para podermos construir um mundo que simule as relações entre as variáveis básicas presentes nas plantas industriais como vazão, temperatura, velocidade, pressão e nível.

A planta virtual

O mais interessante da realidade virtual é que podemos interagir com ela como se estivéssemos realmente dentro do computador. Vamos aprender hoje  a comunicar uma planta industrial  através da comunicação serial, proveniente de um microcontrolador ou mesmo um simulador de circuitos eletrônicos.

A ideia principal é controlar a válvula de entrada  utilizando um controlador realimentado pelo sinal de volume do tanque. Desta forma podemos implementar no futuro um controle de nível ON-OFF ou mesmo um controle PI ou PID. Se você não sabe o que é isso não se preocupe porque estes assuntos serão explorados em novas publicações. Na figura  1 vemos a representação da nossa prática de forma simplificada.

Figura 1 – Controle de nível de tanque usando realidade virtual

Ambiente Virtual em Unity 3D

Para criar o ambiente virtual de simulação e a comunicação com o microcontrolador vamos utilizar a plataforma Unity 3d, sendo gratuito na versão personal. A programação tem como pano de fundo o programa Visual Studio que permite desenvolver aplicativos para Android, iOS, Mac, Windows, Web e nuvem.

Se você tem alguma experiência com o Unity 3D e programação em C#, o código fonte da planta se encontra neste link para você entender todos os detalhes no programa. A figura 2 mostra o ambiente de programação da planta virtual em Unity 3d versão 2020.1.6f1.

Figura 2 – Visão geral do do ambiente de criação de jogos Unity.

Interações físicas da planta Virtual

Tentaremos  então reconstruir as leis da física que governam a relação entre os objetos virtuais, permitindo com isso um comportamento semelhante ao  mundo real comunicando o arduino e a realidade virtual com o Unity utilizando a comunicação serial. Conforme podemos ver na figura 3, nosso sistema possui duas válvulas para controlar o nível do tanque, sendo uma é responsável pela entrada de água e a outra pela saída.

Figura 3 – Representação ilustrativa das válvulas de entrada e saída do tanque na planta virtual

A abertura da válvula superior é a variável manipulada e responsável pela ação de controle da planta, permitindo a abertura e fechamento em uma faixa vazão igual a 100l/s. Em contrapartida, a válvula inferior (dreno) responde pelo esvaziamento e pra facilitar a simulação definimos um valor fixo de vazão igual a 50l/s. Concluímos então que de acordo com a abertura da válvula superior o tanque pode aumentar ou diminuir o seu volume.

Fórmulas do sistema

Fórmulas matemáticas descrevem muito bem a maioria dos fenômenos físicos e um programador  precisa ter algumas noções da “física” do ambiente. Quem trabalha com automação sabe que  em um sistema supervisório ou SCADA os detalhes da planta são apenas refletidos para a tela computador, mas na realidade virtual a situação muda e todas  as interações precisam ser recriadas para reproduzir fielmente tudo no universo virtual.

No caso do nosso exemplo, a variável principal é o volume do tanque de água. Podemos relacionar o volume do tanque ao logo do tempo através da seguinte equação 1.

Volume = Vazão efetiva x tempo (Eq. 1)

Calculamos a vazão efetiva pela diferença entre a vazão de entrada e a vazão de saída:

Vazão efetiva= Vazão de entrada – vazão de saída (Eq. 2)

Como temos a vazão de saída fixa, consequentemente a vazão máxima de entrada vai ser 100 l/s menos 50 l/s que é igual a 50l/s positivo. De forma contrária, calculamos a vazão mínima com a válvula de entrada fechada e consequentemente teremos uma vazão negativa de 50l/s.

Por exemplo: se abrirmos a válvula de entrada 80% (80l/s), a vazão efetiva será 80l/s menos 50l/s que é igual a 30l/s. Como o tanque possui 3000 litros então nesta configuração podemos calcular o tempo de enchimento pela seguinte fórmula:

Tempo (segundos)= Volume(litros) ÷ Vazão (litros/segundo) ⇒  3000/30=100 segundos

Caso você tenha conhecimento em linguagem C# do Visual Studio a seguir são destacados no código fonte do programa 1 com destaque para a equação 2 (linha  41) e a integração da vazão para o cálculo do volume (linha 42). Destacamos também as linhas 43 e 44 que funcionam como limitadores para que o tanque não acumule volumes  negativos e acima  de 3000l litros, respectivamente.

 

// Programa para interação planta virtual - Prof. Fábio IFCE - campus Maracanaú
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.IO.Ports;
using UnityEngine.UI;
using System.Globalization;

public class Serial : MonoBehaviour
{
    public GameObject Porta, Conectar, Desconectar, Fechar, Tanque, Texto, Receb;
    SerialPort stream = new SerialPort();
    private bool serial_ok = false, conta_tempo = false;
    public float countdown = 1.0f, countdown2 = 1.0f, vefetiva, vsaida=50, volume=1500;
    public string recebido="0", recebido0 = "0";
    Vector3 escala;


    public void serial()
    {
        
            stream.BaudRate = 9600;
            stream.PortName = "COM" + Porta.GetComponent<Text>().text;
            stream.Open(); //Open the Serial Stream.  
        
    }


        void Start()
    {

        Desconectar.SetActive(false);
        Tanque = GameObject.FindWithTag("t1");
        CultureInfo us = CultureInfo.GetCultureInfo("en-US");
   
    }
    
    public void Atualiza()
    {
        vefetiva = (float.Parse(recebido) - vsaida);
        volume = volume + vefetiva;
        if (volume <= 0) { volume = 0; }
        if (volume >= 3000) { volume = 3000; }
        Texto.GetComponent<Text>().text = " Volume Real: " + volume.ToString() + " litros";
        Receb.GetComponent<Text>().text = " Recebido: " + recebido.ToString();
        escala = new Vector3(1.8f,volume*0.0004f, 1.8f);
    Tanque.transform.localScale = escala;
    Tanque.transform.position = new Vector3(0, -1*(1.2f-(volume * 0.0004f)), 0.01f);
     
    }
    
    public void desconecta()
    {
        stream.Close();
        serial_ok = false;
        Desconectar.SetActive(false);
        Conectar.SetActive(true);
    }

    
    public void conecta()
    {
        Desconectar.SetActive(true);
        Conectar.SetActive(false);
        conta_tempo = true;
    }

    public void Sair()
    {
          Application.Quit();
    }

    void Update()
    {

        if (conta_tempo == true) { countdown -= Time.deltaTime; }
        if (countdown <= 0.0f)
        {
            serial();
            serial_ok = true;
            conta_tempo = false;
            countdown = 1.0f;
        }


        { countdown2 -= Time.deltaTime; } //ciclo de atualização
        if (countdown2 <= 0.0f)
        {
            if (serial_ok == true) { Atualiza(); stream.Write(volume.ToString() + "\r\n"); 
        }
            countdown2 = 1.0f;
        }

        if (serial_ok == true)
            {
            if (stream.BytesToRead > 0) { recebido0 = stream.ReadLine();
                if ((float.Parse(recebido0) >= 0) && (float.Parse(recebido0) <= 100)) { recebido = recebido0; }
                stream.BaseStream.Flush(); 
                Debug.Log(recebido);}
            
            if (recebido == "q") { serial_ok = false; Application.Quit(); }
            }


        if (Input.GetKeyDown("escape"))
        {
            serial_ok = false;
            stream.Close(); //Close the Serial Stream.  
            Application.Quit();


        }

    }
}

Arduino e a realidade virtual com o Unity utilizando comunicação serial

O programa executável da planta virtual é disponibilizado neste link e pode ser testado com qualquer microcontrolador, simulador ou CLP que possuam comunicação serial. Porém, antes de conectar você deve verificar qual o número da porta serial (virtual ou não) que  correspondente a outra ponta do controle no mundo real, conforme vemos na figura 4.

Figura 4 – Comunicação arduino  com plataforma Unity simulando um controle de nível pela porta com6

O programa a seguir envia um valor numérico pela porta serial do arduino equivalente ao valor de entrada analógica sendo ajustada para uma faixa de 0 a 100 conforme linha em destaque. 

<span style="font-size: 16px;">const int potenciometro = 0; // pino de entrada do potenciômetro
int valor = 0;
 
void setup() {
Serial.begin(9600);//taxa de transmissão
}

void loop() {
valor = analogRead(potenciometro);
valor=(valor/10.23);//valor máximo transmitido 100 l/s
Serial.println(valor);
delay(100);
}</span>

O circuito 

O circuito elétrico é feito através da ligação de um potenciômetro na entrada analógica zero do arduino, representando a abertura da válvula de entrada do tanque, ou seja, o valor de tensão 2,5V (metade do Vdd do arduino) irá representar exatamente a metade da faixa de ajuste, que corresponde a 50 l/s (100l/s dividido por 2). Em resumo, a abertura da válvula vai ser ajustada virtualmente pelo potenciômetro ligado na placa do microcontrolador, que no nosso exemplo é o arduino, mas poderia ser qualquer outro como PIC ou ARM. Contudo, caso você precise comunicar o arduino sem fios com a planta virtual, utilize um conversor wifi/serial descrito neste link.

Figura – Ajuste da válvula da planta virtual pelo arduino

Não tenho o hardware, e agora?

Uma outra opção de testar a planta virtual sem um microcontrolador é a utilização de uma porta virtual. As portas virtuais simulam as portas seriais reais, ou seja, você não precisa comunicar com um placa microcontrolada física para poder simular o funcionamento do sistema virtual. Como resultado o custo é otimizado e podemos também utilizar simuladores de circuitos eletrônicos durante as práticas de comunicação serial com a planta virtual. Segue uma lista de programas para criação de porta virtual no computador com os respectivos links.

Após criada a porta virtual  basta usar um simulador que você achar mais apropriado que permita comunicação em tempo real com a porta serial. Foram realizados os testes no programa SimulIDE, conforme pode ser visto no vídeo 1. 

Video 1 – Exemplo de ajuste de comunicação com a planta virtual por simulador.

Conforme calculado anteriormente com base na equação 2 e demostrado na prática durante o vídeo 1, para valores do potenciômetro abaixo de 2,5V (50l/s) fazem a vazão efetiva ficar negativa e o volume do tanque diminui. Em contrapartida, valores acima de 2,5V no canal do AD do arduino fazem o tanque aumentar o seu volume com um destaque especial é o valor de retorno (feedback) do volume do tanque. Consequentemente, este valor é enviado pela própria planta virtual sendo utilizado futuramente para o nosso controle automático de nível, mas que pode ser capturado pela própria IDE no arduino, conforme o video 2.

Video 2 – Captura do sinal de retorno (feedback) do volume do tanque através da própria IDE do arduino.

Conclusão

Vimos ao longo de nossa prática uma breve introdução à utilização de ambientes virtuais como forma de alavancar o aprendizado no campo da automação através de um controle  de nível de um tanque podendo ser utilizado em Android, iOS, Mac, Windows, Web e nuvem. O uso de simuladores tornou o aprendizado independente de equipamentos reais que possuem um elevado valor agregado e exigem cuidados especiais em relação à segurança pessoal.

Por fim, gostaria de reforçar que a característica de realimentação da planta permite a utilização  de estratégias de controle automático. Em outras palavras, isso  permite o uso de controlador ON-OFF ou um controlador PID que serão explicados em nossos próximos posts.

Até a próxima. 

Referência

Crédito das imagens não autorais:

www.pixabay.com (155036,2168193,158675,576755)

Posts relacionados

Mensagem de Alerta para Whatsapp com ESP8266

por autocore
4 anos ago

Como Construir sua Primeira CNC – Parte 1

por Davi Colares
4 anos ago

Conhecendo o Circuito Integrado LM324N

por Luan Fernandes
3 anos ago
Sair da versão mobile