top of page

Embarque Arduino - Parte 2

Voltando de onde paramos na parte 1 da implementação com Arduino, o  próximo passo agora é garantir a configuração correta dos dados da porta serial a ser utilizada, taxa de transmissão de dados, tipo da placa utilizada para o embarque , segue abaixo o exemplo da configuração aqui utilizada, lembrando que a porta configurada é a porta 3, a placa do exemplo é a MEGA2560 e a taxa de transmissão é de 9600:

Segue abaixo os passos utilizados na sequência para definir a porta,  tipo da placa utilizada e taxa de tranmissão:

A Taxa de transmissão também deve ser igual a setada no programa do matlab e  a velocidade de transmissão é setada ao iniciar a comunicação no Arduino veja a linha abaixo, código será disponibilizado para visualização completa.

 

void setup()

{

  Serial.begin(9600);             // Abre a comunicação serial

 

 

é realizado o loop de leitura, com a lógica de separação das variáveis conforme enviado pelo matlab, que neste exemplo separando variáveis pelo caractere n e a ultima escrita do ciclo finaliza com o caracteres \n;

 

Leitura(6,0) = aux1.toFloat();

    x(0,0)=Leitura(0,0);

    x(1,0)=Leitura(1,0);

    x(2,0)=Leitura(2,0);

    x(3,0)=Leitura(3,0);

    sp(0,0)=Leitura(4,0);

    sp(1,0)=Leitura(5,0);

    sp(2,0)=Leitura(6,0);

 

Conforme alertado no início do tutorial foi mencionado a importância da biblioteca Basic Linear Álgebra, é necessário inclui-la no programa, conforme código abaixo, a linha abaixo dela customiza a declaração das matrizes,, a declaração de matrizes no Arduino difere da declaração de matrizes no matlab. As matrizes podem ser declaradas conforme exemplo abaixo:

 

 

#include <BasicLinearAlgebra.h>

  using namespace BLA;

 

Matrix<3,4> kpd= {-1.5261614, 0.092431487,  0.038880843, 0.00011588971,//Ganho reg disc

                                -0.10987882, 0.086258538,  0.060673381, 0.00011617022,

                                 0.000059962042,   6.8055106, -0.029512317,  -0.013836149};

Existem várias maneiras de otimizar os cálculos e de realizar operações , sugerimos que seja consultada os exemplos disponibilizados em caso de dúvida na manipulação das matrizes segue

exemplo de consulta abaixo:

 

Abaixo segue o loop utilizado para ler os dados enviados pelo Arduino, que pode ser implementado de várias maneiras diferentes, ele concatena char por char até encontrar o final da variável(p) e até receber o ultimo parâmetro do ciclo(\n).

 

Realiza as operações necessárias e envia para o matlab os valores das entradas “ corrigidos” de acordo com os cálculos executados.

Referências:

 

void loop()

{

  // Read serial input:

  while (Serial.available()>0){    // Se existir algum sinal no buffer, prossiga                              

    int aux = Serial.read();      // Variável auxiliar que salva o valor de cada caracterer mandado

    if (aux != '\n'){             // Se a escrita não tiver terminado, prossiga

      if (aux!='p'&&aux!='\n'){   // Se não achar um marcador ou não tiver terminado

        aux1+=(char)aux;}          // concatene os caracteres recebidos.

      else{

       Leitura(i,0) = aux1.toFloat();   // Se a escrita tiver terminado, salve x(i,0) transforma string em float

                aux1 = "";               // Zera a variável aux1 para receber o novo x(i,0)

        i+=1;}                   // Incrementa i

    }

    else{

     

      Leitura(6,0) = aux1.toFloat();

    x(0,0)=Leitura(0,0);

    x(1,0)=Leitura(1,0);

    x(2,0)=Leitura(2,0);

    x(3,0)=Leitura(3,0);

    sp(0,0)=Leitura(4,0);

    sp(1,0)=Leitura(5,0);

    sp(2,0)=Leitura(6,0);

 

%%%%%

 

u =((-kid*I) - (kpd*x));// calcula ação de controle u = kid*I - kpd*x

  

    

     Serial.println(u(0,0),8);

     Serial.println(u(1,0),8);// envia os U's corrigidos

     Serial.println(u(2,0),8);

 

Abaixo estão plotados os gráficos dos estados controlados do sistema embarcado para verificação e confirmação que para fins didáticos a realização da proposta da simulação foi bem aceita, e apresentou resultados satisfatórios,  é bom ressaltar que estamos tratando de uma planta linearizada, e que ainda sim na implementação pode aparecer incógnitas que a simulação apenas computacional, não se manifeste, como capacidade de cálculo, limite de variação da entrada, limite máximo e mínimo do valor da entrada, tempo de discretização dentre outros, que merecem atenção e que podem ser previstos de maneira mais ativa quando tratamos um sistema como o proposto.

Segue abaixo o código comentado para implementar no do MATLAB

Por fim, segue abaixo o arquivo PDF que contém o código que é compilado no Arduino. Bons estudos!!!

Escola politécnica - Universidade Federal da Bahia

Engenharia de controle e automação

  • Facebook Clean Grey
  • Twitter Clean Grey
  • LinkedIn Clean Grey

2018 Grupo de alunos da Universidade Federal da Bahia

bottom of page