Está sem MATLAB? Usa Arduino!

Imagine que um belo dia o seu computador resolve não funcionar mais e sua única alternativa é usar um outro computador, com uma capacidade de processamento menor. No entanto, seu professor de Métodos Numéricos exige que você resolva EDOs, EDPs, Integrais toda semana. Para piorar tudo, o seu professor utiliza o MATLAB em sala de aula, mas o seu computador, com um processador mais ou menos, não roda o programa nem com reza. E agora quem poderá te ajudar?

Você, triste, olha para sua bancada e vê, reluzente, sua placa de Arduíno. Naquele momento você percebe que nada está perdido, é só por a cabeça para funcionar um pouquinho que tudo vai dar certo. Só precisa descobrir uma forma de adaptar o código do MATLAB para o Arduino e seus problemas acabarão.

Diferentemente do MATLAB, a placa limita o espaço de memória disponível. Logo, é preciso ter em mente que o seu código precisará ser otimizado caso você queira resultados satisfatórios. O que parece ser um desafio, mas não é tão complicado asim quando se tem ajuda.

O objetivo deste repositório é auxiliar na tradução de um código do MATLAB para Arduíno. Aqui você encontrará conceitos básicos sobre Arduíno, códigos em MATLAB para diversas operações e resoluções e seus respectivos correspondentes para a placa.

No final da página você encontra arquivos de código de MATLAB e Arduino relacionados a diversos assuntos que envolvem métodos numéricos.

Caso queira ir direto aonde te interessa, clique em um dos links abaixo:

Primeiros Passos Com o Arduíno

Embarcando Métodos Numéricos No Arduino

Códigos em MATLAB

Códigos em Arduíno

Trabalho de ENGD04 - Métodos Numéricos na Engenharia

Referências

PRIMEIROS PASSOS COM O ARDUINO

O que é?

Arduino é uma plataforma microcontrolada tooltip open source Open-source: Uma ferramenta que não possui custo de licença é denominado como open-source. Na grande maioria dos casos, essas ferramentas são compartilhadas online pelos desenvolvedores, podendo ter acesso a elas qualquer pessoa, sem restrições. utilizada para criação de projetos eletro-eletrônicos. É composto pelo hardware, que é a placa programável e um software IDE (Integrated Development Environment) que é um ambiente que interage com o programador.

A plataforma Arduino se popularizou bastante. Diferente de outros microcontroladores o Arduino é de fácil manuseio físico, apenas com um cabo USB o programador consegue carregar um novo algoritmo e energizar a placa. Outra vantagem é a sua linguagem de programação que é uma versão simplificada do C++, aumentando seu potencial de alcance para cooptar novos entusiastas.

Uma das características marcantes do Arduino é a sua facilidade de manuseio, mas para um iniciante a placa pode parecer um bicho de sete cabeças. Para um primeiro contato é necessário algumas apresentações e esclarecimentos sobre a plataforma. Aqui será você conhecerá o layout da placa mais popular da família Arduino, a Arduino UNO.

Fonte de Energia

Toda placa Arduino precisa de uma fonte de energia, no caso da UNO ela pode ser feita pela entrada USB ou pelo Barrel Jack. Na imagem acima, a conexão USB é rotulada (1) e oBarrel Jack é rotulado (2).A conexão USB também é como você irá carregar o código no seu quadro Arduino.

OBS: A tensão recomendada para a maioria dos modelos Arduino é de 6 a 12 Volts. Tensões acima de 20V vai queimar a placa.

Pinos (5V, 3.3V, GND, Analógico, Digital, PWM, AREF)

Os pinos no Arduino são os lugares onde deve-se conectar os fios para construir um circuito eletrônico. O Arduino tem vários tipos diferentes de pinos, cada um dos quais é rotulado na placa e usado para diferentes funções.

(3) GND

Existem vários pinos GND no Arduino, qualquer um dos quais pode ser usado para aterrar seu circuito.

(4) 5V e (5) 3.3V

Como você pode imaginar, o pino 5V fornece 5 volts de energia e o pino 3.3V fornece 3.3 volts de energia. A maioria dos componentes simples usados com o Arduinoutilizam de 5 ou 3.3 volts.

(6) Analógico

A área dos pinos na etiqueta “Analog In” (A0 a A5 na UNO) são pinos analógicos. Esses pinos podem ler o sinal de um sensor analógico (como um sensor de temperatura) e convertê-lo em um valor digital que podemos ler.

(7) Digital

Do lado oposto aos pinos analógicos estão os pinos digitais (0 a 13 na UNO). Esses pinos podem ser usados para entrada ou saída.

(8) PWM

Ao lado de alguns dos pinos digitais existe um til (~) (3, 5, 6, 9, 10 e 11 na UNO). Esses pinos atuam como pinos digitais normais, mas também podem ser usados para algo chamado Modulação de largura de pulso (PWM).

(9) AREF(Stands for AnalogReference)

Na maioria das vezes você pode deixar este pino sozinho. Às vezes é usado para definir uma tensão de referência externa (entre 0 e 5 Volts) como o limite superior para os pinos de entrada analógicos.

Botão de Reset

O Arduino possui um botão de reinicialização (10). Pressionado, ele gera um curto circuito e reinicia qualquer código carregado no Arduino. Isso pode ser muito útil se você quiser testar o código várias vezes.

LEDS(indicador de energia; TX e RX)

Ao lado da palavra ‘ON’ (11) há um pequeno LED. Este LED deve acender sempre que o Arduinoligar. Se esta luz não ligar, há uma boa chance de algo errado.TX(12) é o LED que sinaliza a transmissão, o RX(12) é o LED da recepção.

CI (Circuito Integrado) e Regulador de Tensão

O chip preto no localizado no centro da placa é um circuito integrado (13). É o microcontrolador, como se fosse uma espécie de cérebro do Arduino. O regulador de tensão (14) está do lado do Barrel Jack.

Teste Básico

Apenas com a placa de arduino e o seu respectivo cabo USB é possível interagir com o hardware. Existe um LED integrado ao pino digital 13 da placa do Arduino UNO, através de um código simples é possível fazer um teste básico da placa do Arduino utilizando esse periférico no pino 13.

  1. Baixar Arduino IDE O primeiro passo é baixar o IDE do Arduino. No próprio site do Arduino é possível encontrar o software.
  2. Configuração inicial Após a instalação do IDE Arduino é necessário definir algumas configurações antes de iniciar a produção do código. Na aba “tools” você deve selecionar “Board” e marcar a opção que corresponde a sua placa. No caso deste exemplo deve-se marcar a opção “Arduino Uno”.
  3. Código O Arduino tem uma linguagem própria baseada na C++. Para um iniciante no mundo da programação isso pode parecer estranho no início, mas com a prática tudo vai se tornando mais fácil. A imagem abaixo contém o código do nosso exemplo.

/*
  Blink
  Liga o LED por um segundo, depois desliga por um segundo, repetidamente.
*/
void setup() {                
  // inicializa o pino digital 13 como uma saída.
  pinMode(13, OUTPUT);     
}

void loop() {
  digitalWrite(13, HIGH);       // liga o LED
  delay(1000);                        // aguarda um segundo
  digitalWrite(13, LOW);        // desliga o LED
  delay(1000);                        // aguarda um segundo
}
  1. Conecte o cabo USB no Arduino e em uma porta USB de seu PC. Como a imagem a seguir sugere.

Após a conexão você deve verificar em “Tools” -> “Serial Port”, se a porta USB que você conectou o Arduino está habilitada, se não estiver basta clicar para habilitá-la. Se todas as conexões estiverem Ok agora é só carregar o código clicando na seta perto do menu, como a imagem abaixo sugere.

  1. Observar o comportamento da placa.

    Depois do código carregado o LED do pino 13 deve passar a piscar uma vez por segundo, como foi projetado para piscar. Se o algum erro ocorrer verifique as etapas anteriores. Clique aqui para saber como a placa deve se comportar.

EMBARCANDO MÉTODOS NUMÉRICOS NO ARDUINO

DICAS, MACETES E CÓDIGOS ATALHOS.

Como foi abordado no documento “Primeiros Passos com o Arduino” a plataforma Arduino tem um potencial de aplicação enorme, existe iniciativas em diversas áreas. Na aplicação do Arduino como um processador de métodos numéricos é possível identificar algumas limitações e este tópico apresentará soluções e sugestões que vão facilitar a implementação do método no Arduino

Limitações, desafios e dificuldades:

  1. Gerenciamento de memória
  2. Tradução de funções residentes do Matlab
  3. Estruturação de sub-rotinas
  4. Interação com o usuário
  5. Apresentação de resultados

Gerenciamento de Memória

Restringindo o universo de aplicação aos métodos de diferenciação, integração, EDO e EDP.E tendo em mente que só serão solucionados problemas para fins didáticos,diferente da implementação em Matlab em que a memória não é um fator tão importante, o gerenciamento da memória passa a ser fundamental quando a plataforma de aplicação passa a ser o Arduino. Como o Arduino é uma placa microcontrolada ela tem uma memória bem limitada o que torna a aplicação dos métodos um desafio para o programador. Todo tipo de tooltip otimização de código Otimização de código: Basicamente otimizar um código é fazer com que um mesmo algoritmo seja executado requerendo menos desempenho. Existem diversos métodos na área de ciência da computação que permitem uma implementação robusta de uma otimização de algoritmo. Esse tipo de conceito é bastante utilizado quando se trata de plataforma embarcada. é bem-vinda, mas essa é uma abordagem que foge do objetivo deste material. O que deve ser pontuado é que na utilização do Arduino o método mais preciso nem sempre será o mais indicado para aplicação, deve-se ponderar qual método consome menor memória e que mantém uma boa precisão na resposta.

Tradução de Funções Residentes do Matlab

O Matlab é um software que tem um ramo especializado em métodos numéricos, existem diversas bibliotecas e funções dedicadas a implementação de métodos isso permite que o programador utilize funções residentes destes pacotes facilitando a produção de algoritmos, mas essa facilidade se torna um grande desafio quando se quer traduzir um código feito em Matlab para o Arduino. Muitas vezes uma função em Matlab é uma caixa preta para o programador e como no universo Arduino ainda não existem muitas bibliotecas voltadas para implementação de métodos numéricos, a reprodução se torna muito trabalhosa ou inviável.

A principal sugestão desse tópico é no momento em que o programador se deparar com uma função residente do Matlab ele deve entender qual o comportamento dela e tentar substituir por um pequeno algoritmo utilizando as operações básicas do Arduino, outra dica é que o programador tem que ter a sensibilidade que nem sempre o Arduino retornará resultados idênticos ao do Matlab, dentre outros motivos a dificuldade da tradução de funções residentes é um dos principais.

Estruturação de Sub-rotinas

A estrutura do Matlab permite que o programador crie documentos externos aos códigos que auxiliem o desenvolvimento do código, esses documentos são sub-rotinas, já no Arduino esse tipo de artifício não é utilizado. Essa dificuldade pode ser facilmente superada criando funções dentro do código que substituam essas sub-rotinas externas.

Interação com o Usuário e Apresentação de resultados

Tanto o Matlab como o Arduino têm diversas aplicações de interações com o usuário. O objetivo deste tópico é apresentar uma interação simples, de baixo custo e que satisfaz os problemas propostos. Será apresentado como solução a leitura do teclado como periférico para entrada de dados a partir do usuário. O Matlab tem uma gama enorme de possibilidades para representação de resultados via monitor, já o Arduino tem limitações quanto a isso. A solução apresentada será a utilização da serial monitor para apresentar os resultados dos algoritmos.

Segue abaixo o código referente a leitura do teclado e exibição na serial monitor com o Arduino:


intled = 13;

void setup() { 
pinMode(led, OUTPUT); 
Serial.begin(9600);
}

/**
 * Função que lê uma string da Serial
 * e retorna-a
 */
StringleStringSerial(){
Stringconteudo = "";
char caractere;

  // Enquanto receber algo pela serial
while(Serial.available() > 0) {
    // Lê byte da serial
caractere = Serial.read();
    // Ignora caractere de quebra de linha
if (caractere != '\n'){
      // Concatena valores
conteudo.concat(caractere);
    }
    // Aguarda buffer serial ler próximo caractere
delay(10);
  }

Serial.print("Recebi: ");
Serial.println(conteudo);

returnconteudo;
}

void loop() {
String recebido;
  // Se receber algo pela serial
if (Serial.available() > 0){
    // Lê toda string recebida
recebido = leStringSerial();
    //Serial.println(recebido);
  }  
}

Este código simula o comportamento da função tooltip scanf Scanf: Em geral a função scanf opera sobre um fluxo de caracteres oriundo do teclado. da linguagem C.

TUTORIAL

Este tutorial visa apresentar como traduzir um código de um método numérico em Matlab para o Arduino. Será utilizado como exemplo o código em Matlab “Exemplo_Derivacao” você pode baixar na pasta códigos em Matlab.

  1. Rode o código no software Matlab e observe o comportamento do algoritmo e seus resultados. Nosso objetivo é exibir os dados na serial monitor do Arduino de forma similar ao da figura a seguir.

A seguir, tem-se os resultados obtidos pelo MATLAB:

  1. Produza o código em Arduino. Uma boa dica é transformar o código em Matlab em um código em linguagem C e rodar em um compilador no PC, se o código em C estiver respondendo bem você terá grandes chances de obter sucesso no Arduino, sua maior dificuldade será o gerenciamento de memória.
  2. Carregue o código na sua placa. O código abaixo resolve o exemplo e pode ser utilizado como gabarito, este código pode ser encontrado na pasta códigos em Arduino.

// Traduzindo codigos de Matlab para o Arduino

//Exemplo Derivacao

/*
Exemplo Proposto:

Observar o comportamento das derivadas (primeira e segunda)dafuncao f = x.^3 - 12*x
     Intervalo: [0,20]
     Comparar resultado analitico com o resultado por diferencas finitas
*/

void setup() {
Serial.begin(9600);
}

floatfunc(float x){  //Funcao que calcula a funcao de interesse
return ((x*x*x) - 4*(x*x));
}

float analitica_1(float x){  //Funcao que calcula as derivadas analiticas de primeira ord
return (3*(x*x) - 8*x);
}

float analitica_2(float x){  //Funcao que calcula as derivadas analiticas de segunda ord
return (6*x - 8);
}

StringleStringSerial(){
Stringconteudo = "";
char caractere;

  // Enquanto receber algo pela serial
while(Serial.available() > 0) {
    // Lê byte da serial
caractere = Serial.read();
    // Ignora caractere de quebra de linha
if (caractere != '\n'){
      // Concatena valores
conteudo.concat(caractere);
    }
    // Aguarda buffer serial ler próximo caractere
delay(10);
  }

returnconteudo;
}

void loop() {

float h;

Serial.print("Entre com o valor do passo 'h': ");

while(1){ //leitura do valor de reset
if (Serial.available() > 0){
      // Lê toda string recebida
h = leStringSerial().toFloat();
break;
      }
    }
Serial.println(h);

float x0 = 0;
floatxf = 20;
int N = 0;
float som = x0;

while(1){
      N = N + 1;
som = som + h;
if(som == xf){
break;
        }
    }

    N = N + 1;
Serial.print("Numero de pontos = ");
Serial.println(N);
float x[N];
float y[N];
float y1[N];
float y2[N];
float ydf1[N];
float ydf2[N];
int i = 0;

som = x0;    

for(i = 1; i<=N; i++){
x[i] = som;
y[i] = func(x[i]);
y1[i] = analitica_1(x[i]);
y2[i] = analitica_2(x[i]);
som = som + h;
    }

    // CALCULANDO POR DIFERENCAS FINITAS DE ORDEM 1

    // Progressiva 3pts
ydf1[1] = (-3*y[1] + 4*y[2] - y[3])/(x[3] - x[1]);

    // Central
for (i = 2; i<=(N-1); i++){
ydf1[i] = (y[i+1] - y[i-1])/(x[i+1]-x[i-1]);
    }

    // Regressiva 3pts
ydf1[N] = (3*y[N] - 4*y[N-1] + y[N-2])/(x[N]-x[N-2]);

    // CALCULANDO POR DIFERENCAS FINITAS DE ORDEM 2

    // Primeiro Ponto
ydf2[1] = (y[3]- 2*y[2]+ y[1])/((x[2]-x[1])*(x[2]-x[1]));
    // Pontos 2 ao N-1
for (i = 2; i<=(N-1); i++){
ydf2[i] = (y[i+1]- 2*y[i]+ y[i-1])/((x[i+1]-x[i])*(x[i+1]-x[i]));
    }
    // Ultimo ponto
ydf2[N] = (y[N]- 2*y[N-1] +y[N-2])/((x[N]-x[N-1])*(x[N]-x[N-1]));

for(i = 1; i<=N; i++){
Serial.print("\nVariavelidenpendente 'x' = ");
Serial.println(x[i]);
Serial.print("Funcao 'y' = ");
Serial.println(y[i]);
Serial.print("1ª derivada analitica = ");
Serial.println(y1[i]);
Serial.print("1ª derivada diferencas finitas = ");
Serial.println(ydf1[i]);
Serial.print("2ª derivada analitica = ");
Serial.println(y2[i]);
Serial.print("2ª derivada diferencas finitas = ");
Serial.println(ydf2[i]);
    }

float reset;

Serial.println("\nEnvie qualquer caracter para reiniciar o codigo!!!\n");

while(1){ //leitura do valor de reset
if (Serial.available() > 0){
      // Lê toda string recebida
reset = leStringSerial().toFloat();
break;
      }
    }

}
  1. Observe e compare os resultados. Utilizando o passo ‘h’ igual a 2, encontraremos resultados idênticos aos do Matlab.

CÓDIGOS EM MATLAB

Ao clicar aqui você terá acesso a códigos de MATLAB que tratam de Derivação, Integração, EDP e Sistemas de EDO. Você pode utilizar esse códigos para ter idéias de como criar os seus próprios códigos, ou adaptá-los de acordo com a sua necessidade.

CÓDIGOS EM ARDUÍNO

Ao clicar aqui você terá acesso a códigos de ARDUINO que tratam de Derivação, Integração, EDP e Sistemas de EDO. Você pode utilizar esse códigos para ter idéias de como criar os seus próprios códigos, ou adaptá-los de acordo com a sua necessidade.Aproveite e observe a maneira como o código foi adaptado do MATLAB para a placa. Isso pode te ajudar muito em suas programações futuras!

TRABALHOS DE ENGD04 - MÉTODOS NUMÉRICOS NA ENGENHARIA

Ao clicar aqui você terá acesso a trabalhos que objetivaram resolver problemas numéricos utilizando a placa Arduíno UNO. Estão disponíveis os códigos de resolução, tanto do MATLAB quando do Arduino. Vale a pena conferir, afinal, nunca se sabe quando você terá um problema parecido com um desses que já foi resolvido.

REFERÊNCIAS