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:Arduino é uma plataforma microcontrolada
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.
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.
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.
Existem vários pinos GND no Arduino, qualquer um dos quais pode ser usado para aterrar seu circuito.
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.
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.
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.
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).
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.
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.
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.
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.
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.
/*
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
}
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.
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.
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:
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
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.
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.
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
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.
A seguir, tem-se os resultados obtidos pelo MATLAB:
// 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;
}
}
}
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.
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!
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.