
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!!!





