sábado, 17 de setembro de 2016

Partida de motor com Arduino e C#

Relés


Relés eletromecânicos são componentes simples formados por um eletroímã e diversos contatos. O conceito de sinal discreto dos primeiros computadores usava relé para implementar as funções booleanas.
De composição simples, os relés de contato são formados basicamente por 4 partes: eletroímã, mola, armadura e contatos.


fonte: http://www.pearltrees.com

Os circuitos que compõe os reés são formados por circuitos independentes e isolados, sem contato em seu estado de repouso. Um switch controla a potência sobre o eletroimã que quando ligado atrai a armadura abrindo ou fechando (depende de sua configuração N/A ou N/F) o circuito para ativar uma carga. Com o eletroimã desenergizado, a mola puxa a armadurae o circuito não se completa.
Por meio do relé é possível controlar diversas variáveis do processo de chaveamento:
·        Tensão e corrente necessárias para ativar armadura;
·        Número de armaduras;
·        Número de contatos da armadura;
·        Se o contato está Normalmente Aberto (NA) ou Normalmente Fechado (NF).

Funcionamento


Quando uma chave ou interruptor é acionado, uma pequena quantidade de energia elétrica transforma a bobina em um eletroímã que move a armadura, permitindo a passagem de uma tensão muito maior do que a usada somente para chaveamento. Essa capacidade suportada pelo mecanismo, e o valor de trabalho da bobina, está geralmente descrito na face do componente.


fonte: http://www.tallertecno.com


fonte: http://engenheirando.com/eletronica/reles/

Acionamento com Arduino Uno

O acioamento de relés com o Microcontrolador Arduino é muito fácil, onde deve ser alterado os estados das portas digitais do Modulo Relé: IN1 e IN2.


fonte: blog.filipeflop.com

fonte: blog.filipeflop.com

Controlando o acionamento e desacionamento de uma lâmpada:

O controle do relé é feito pela saída 3 da placa Arduino, alternando entre acionar e desacionar a carga (lâmpada).

fonte: próprio autor


/*
Projeto Arduino controlando uma lampada via relé
by: TonY EmersoN MariM
--------------------------------------------
--=<| www.mecatronizar.blogspot.com.br |>=--
--------------------------------------------
*/
 
//Porta ligada ao pino IN1 do modulo
int rele1 = 3;

  
void setup()
{
  //Define pinos para o rele como saida
  pinMode(rele1, OUTPUT); 

}
   
void loop()
{
  digitalWrite(rele1, LOW);  //Liga rele 1
  delay(2000);
  digitalWrite(rele1, HIGH); //Desliga rele 1
  delay(2000);
}

O código tem um tempo pré-estabelecido de dois segundos que o estado do relé comuta, até o desligamento do usuário.

Acionamento e controle de um motor monofásico (via serial e C#)


Também é possível acionar outro dispositivo com os relés e implementar junto um controle de supervisão por meio de um aplicativo construído no Visual Studio, conforme os códigos abaixo:
Inserido todos os componentes para elaboração do Form, as funções devem ser aplicadas:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Motor_AppArduino
{
    public partial class Form1 : Form
    {
        int Data = 0;

        public Form1()
        {
            InitializeComponent();
            textBox3.Text = "Motor Desligado!";
            pictureBox1.Visible = true;
            timer1.Enabled = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            byte[] mensagem = new byte[1];

            mensagem[0] = 0x4C; //L

            try
            {
                serialPort.Write(mensagem, 0, mensagem.Length);
                rtHistorico.AppendText("Ligado:");
                rtHistorico.AppendText(mensagem[0].ToString());
                rtHistorico.AppendText("\n");
            }
            catch (Exception erro)
            {
                rtHistorico.AppendText(erro.Message);
                rtHistorico.AppendText("\n");
            }
            if (textBox1.BackColor == Color.Red && textBox2.BackColor == Color.Red)
            {
                Data += 1;
                textBox2.BackColor = Color.Green;
                textBox3.Text = "Motor Ligado: Horário!";
                pictureBox2.Visible = false;
                pictureBox3.Visible = true;
                pictureBox1.Visible = false;
                button2.Visible = false;
            }
       
        }


        private void button2_Click(object sender, EventArgs e)
        {
            byte[] mensagem = new byte[1];

            mensagem[0] = 0x44; //D

            try
            {
                serialPort.Write(mensagem, 0, mensagem.Length);
                rtHistorico.AppendText("Ligado:");
                rtHistorico.AppendText(mensagem[0].ToString());
                rtHistorico.AppendText("\n");
            }
            catch (Exception erro)
            {
                rtHistorico.AppendText(erro.Message);
                rtHistorico.AppendText("\n");
            }

            if (textBox2.BackColor == Color.Red && textBox1.BackColor == Color.Red)
            {
                Data += 2;
                textBox1.BackColor = Color.Green;
                textBox3.Text = "Motor Ligado: Anti-horário!";
                pictureBox1.Visible = false;
                pictureBox3.Visible = false;
                pictureBox2.Visible = true;
                button1.Visible = false;

            }

        }

            private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {

            this.Invoke(new EventHandler(leituraPorta));
        }


        public void leituraPorta(object sender, EventArgs e)
        {
            //leitura da porta

            byte[] dados = new byte[1];
            int retorno;

            try
            {
                retorno = serialPort.Read(dados, 0, 1);

                if (retorno != 0)
                {
                    rtHistorico.AppendText("Recebido:");
                    rtHistorico.AppendText(dados[0].ToString());
                    rtHistorico.AppendText("\n");

                    if (dados[0] == 76)
                        toolStripStatusLabel1.Text = "Status Atual: Motor ligado";
                    else if (dados[0] == 68)
                        toolStripStatusLabel1.Text = "Status Atual: Motor desligado";
                    else
                        toolStripStatusLabel1.Text = "Status Atual: Desconhecido";

                    serialPort.DiscardInBuffer();
                    serialPort.DiscardOutBuffer();
                }
            }
            catch (Exception erro)
            {
                rtHistorico.AppendText(erro.Message);
                rtHistorico.AppendText("\n");
            }

    }

        private void sairToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Data = 0;
            textBox1.BackColor = Color.Red;
            textBox2.BackColor = Color.Red;

            DialogResult atencao;
            MessageBoxButtons bot = MessageBoxButtons.OKCancel;
            MessageBoxIcon icon = MessageBoxIcon.Warning;
            atencao = MessageBox.Show("Deseja realmente sair?", "ATENÇÃO!", bot, icon);
            switch (atencao)
            {
                case DialogResult.OK:
                    Application.Exit();
                    break;
                case DialogResult.Cancel:
                    break;
            }
        }

        private void sobreToolStripMenuItem_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Aplicativo de Comunicação Serial com Acionamento de Motor Monofásico");
        }

        private void statusStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void btAbrirFechar_Click(object sender, EventArgs e)
        {
            if (btAbrirFechar.Text == "Abrir")
            {
                try
                {
                    if (txPorta.Text != "")
                    {
                        serialPort.PortName = txPorta.Text;
                        serialPort.Open();
                        btAbrirFechar.Text = "Fechar";
                        txPorta.Enabled = false;
                        gbMotor.Enabled = true;
                        toolStripStatusLabel1.Text = "Status Atual: Comunicação Aberta";
                        rtHistorico.AppendText("Porta Aberta");
                        rtHistorico.AppendText("\n");
                    }
                }
                catch (Exception erro)
                {
                    rtHistorico.AppendText(erro.Message);
                    rtHistorico.AppendText("\n");
                }
            }
            else if (btAbrirFechar.Text == "Fechar")
            {
                try
                {
                    serialPort.Close();
                    btAbrirFechar.Text = "Abrir";
                    txPorta.Clear();
                    txPorta.Enabled = true;
                    gbMotor.Enabled = false;
                    toolStripStatusLabel1.Text = "Status Atual: Comunicação Fechada";
                    rtHistorico.AppendText("Porta Fechada");
                    rtHistorico.AppendText("\n");
                }
                catch (Exception erro)
                {
                    rtHistorico.AppendText(erro.Message);
                    rtHistorico.AppendText("\n");
                }
            }
        }

        private void textBox3_TextChanged(object sender, EventArgs e)
        {

        }

       
        private void timer1_Tick(object sender, EventArgs e)
        {

        }

        private void button3_Click(object sender, EventArgs e)
        {
            byte[] mensagem = new byte[1];

            mensagem[0] = 0x50; //P

            try
            {
                serialPort.Write(mensagem, 0, mensagem.Length);
                rtHistorico.AppendText("Parado:");
                rtHistorico.AppendText(mensagem[0].ToString());
                rtHistorico.AppendText("\n");
            }
            catch (Exception erro)
            {
                rtHistorico.AppendText(erro.Message);
                rtHistorico.AppendText("\n");
            }
            if (textBox1.BackColor == Color.Red && textBox2.BackColor == Color.Green)
            {
                Data -= 1;
                textBox2.BackColor = Color.Red;
                textBox3.Text = "Motor Desligado!";
                pictureBox2.Visible = false;
                pictureBox1.Visible = true;
                pictureBox3.Visible = false;
                button1.Visible = true;
                button2.Visible = true;
            }
            else if (textBox1.BackColor == Color.Green && textBox2.BackColor == Color.Red)
            {
                Data -= 2;
                textBox1.BackColor = Color.Red;
                textBox3.Text = "Motor Desligado!";
                pictureBox1.Visible = true;
                pictureBox2.Visible = false;
                pictureBox3.Visible = false;
                button1.Visible = true;
                button2.Visible = true;
            }

        }
    }
}

Como sugestão o aplicativo pode ficar com essa forma depois de compilado:


fonte: próprio autor

Depois disso deve ser gravado no Arduino o código para que o funcionamento ocorra de forma correta.

/*
Projeto Arduino liga e desliga motor universal
via serial aplicativo C#
by: TonY EmersoN MariM
----------------------------------------
--=<| www.mecatronizar.blogspot.com.br |>=--
----------------------------------------
*/
int RELE1 = 5;//Porta ligada ao pino IN1 do modulo relé
int RELE2 = 7;//Porta ligada ao pino IN2 do modulo relé
int CHAVE = 9;//Porta ligada ao pino IN3 do modulo relé
char dado;// variável que recebe os dados

void setup(){
  Serial.begin(9600);
  
  pinMode(RELE1, OUTPUT);//Definem os pinos do relé como saída
  pinMode(RELE2, OUTPUT);
  pinMode(CHAVE, OUTPUT);
  
  digitalWrite(RELE1,HIGH);//Definem os estado iniciais dos relés
  digitalWrite(RELE2,HIGH);
  digitalWrite(CHAVE,HIGH);
}

void loop(){
  if(Serial.available()){//define comunicação serial da placa
    dado = Serial.read();
    
    switch(dado){ //Faz acionamento dos relés segundo os dados recolhidos
      case 'L':
        digitalWrite(RELE1, HIGH);
        delay(100);
        digitalWrite(CHAVE, LOW);
        delay(100);
        digitalWrite(RELE2, LOW);
        delay(1000);
        Serial.println("L");
      break;
      case 'D':
        digitalWrite(RELE2, HIGH);
        delay(100);
        digitalWrite(CHAVE, LOW);
        delay(100);
        digitalWrite(RELE1, LOW);
        delay(1000);
        Serial.println("D");
      break;
      case'P':
        digitalWrite(RELE1, HIGH);
        digitalWrite(RELE2, HIGH);
        digitalWrite(CHAVE, HIGH);
        Serial.println("P");
        break;  
    }
  }
}

Na montagem do circuito com o motor foi utilizado um motor universal de um processador de alimentos. O importante é que para conseguir que o motor execute movimentos de rotações em dois sentidos, horário e anti-horário, a solda que liga as escovas com o enrolamento deve ser desfeito e sair dois pares de variações diferentes.









fonte: próprio autor

É no momento em que os relés que estão recebendo os sinais da escova que ocorrem as comutações do sentido de rotação e para quando o sinal (tensão) que vem da rede passa de fechado para aberto que o motor para de ser acionado.

O vídeo abaixo demonstra o funcionamento de todo o projeto.




Nesse projeto deixo um agradecimento ao meu amigo Gilmar Léo, pela ajuda com o motor.


Caso necessite, o projeto completo pode ser baixado por esse LINK, se necessário entre em contato, para dúvidas, elogios e críticas.

Bons estudos! 




ATENÇÃO: O relé trabalha com oque chama-se normalmente de lógica inversa, então é necessário que para ser acionado ele receba o sinal baixo (LOW, 0). O recurso de trabalhos realizados com lógica inversa é necessário para que a segurança do acionamento do dispositivo seja garantida, em um ambiente de aterramento prejudicado, ou interferências eletromagnéticas pode fazer com que seja captado um ruído e o sinal seja entendido como sinal alto e o dispositivo atuado, causando funcionamento desnecessário e até mesmo acidentes.




Nenhum comentário:

Postar um comentário