Ajuda com velocidade e interface para Arduino


#1

Boa tarde a todos,

Estou trabalhando em um projeto onde tenho que ler tensões e correntes senoidais através de sensores analógicos ligados a um Arduino Mega 2560. São ondas com frequência de aproximadamente 60Hz, o que quer dizer que num período de 16,667ms eu preciso ter pelo menos 10 leituras. Pois bem, ai vai o primeiro desafio:
Ler e enviar através da porta COM em tempo hábil. Como fazer isso da maneira mais eficiente possível? Que funções usar? Ler um pacote de dados e mandar tudo de uma vez ou mandar um a um?
O segundo desafio envolve receber os dados e plotar, em tempo real. Não me preocupo muito com a interface, apenas quero que contenha um gráfico que mostre em tempo real as tensões e correntes lidas. Tentei ler os dados com um programa bem arcaico que desenvolvi no MatLab, mas os dados são plotados com delays muito grandes.

Alguém poderia me dar uma ajudinha? Imagino que já existam projetos parecidos, se alguém conhecer algum e puder me indicar eu ficarei eternamente grato!

Muito obrigado!


#2

@Caique_Urtado,

Com este tipo, e devido a quantidade de leituras em um intervalo curto eu sugiro usar um buffer onde você armazena as leituras e de tempos em tempos a serial envia os pacotes.

Isso utilizando interrupção e não timer.


#3

Oi Wagner! A parte do buffer eu entendi! Como eu poderia usar interrupção? (não entendi muito bem essa parte).


#4

Caique me desculpe, mas quando falei da interrupção eu quis alerta-lo para o uso de funções de delay do Arduino (delay(), milis(), micros(), etc.), essas funções não são muito precisas e dependem do que o controlador estiver fazendo no momento. Pode ser que eu esteja muito enganado, mas é minha impressão sobre elas.

A serial é uma interface lenta e o tempo decorrido entre a aquisição da amostra e a apresentação em gráficos ou tabelas pode ser grande. O importante é não perder amostra alguma. O uso de um buffer de armazenamento ajuda nesse sentido e o interessante é que o envio e a amostra podem ocorrer de forma assíncrona. E importante também ter precisão na regularidade do envio das amostras para a aplicação.

Como citei na mensagem anterior e definido por você, para 10 leituras (supondo leituras de 8 bits) em 16 ms cada amostra deve ocorrer em 1,8 ms aproximadamente. Se a velocidade de transmissão pela serial estiver setada em 115200 bps (8,n,1) você teria que:

1 leitura = 8 bits

O tempo para a serial enviar esses 8 bits seria de pouco mais de 70 us (microsegundos), que é muito menor do que o intervalo entre as aquisições (1,8 ms) e daria tempo o suficiente para enviar o dado para a aplicação.

Se preferir enviar pacotes de 10 leituras de 8 bits o tempo seria em torno de 700 us para enviar o pacote, estando a serial setada em 115200 bps, que também é bem menor que o intervalo das leituras que é de 1,8 ms. Esses tempos de envio tem que ser bem precisos para que a janela de aquisição não escorregue e assim comprometer as próximas amostragens.

Se o seu inglês estiver melhor do que o meu esse tuto pode te ajudar a entender a interrupção dos timers do Arduino Mega.

Devem existir códigos mais fáceis de entender por ai na Internet, eu mesmo usei um código assim:

setup() {
.
Timer1.initialize(500000);
Timer1.attachInterrupt(trataTimer);
.
.
.
}

// trata a interrupção do timer1
void trataTimer() {
.
.
.
}

Espero que agora eu tenha consiga ajuda-lo, porque da primeira só com Jesus na causa, rsrs.

Estamos ai se precisar.

Abraços.


#5

Oi Wagner!

Me ajudou muito a iluminar as idéias!
Vou ler este material que me passou, e tentar aplicar, assim q conseguir algum progresso eu posto aqui!

Muito obrigado!!