Problemas com comunicação serial e velocidade - Arduino

Boa noite 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,667 ms 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!

Exibições: 1099

Anexos

Responder esta

Respostas a este tópico

Bom dia Caiaque,

Anexe aqui um arquivo com o Código que você já fez, mesmo que não funcione.

Anexe ou post um desenho das ligações dos sensores para que possamos entender melhor seu projeto.

RV

Bom dia!

Coloquei os arquivos dos códigos acima. Com relação às ligações, utilizarei apenas dois divisores de tensão nas portas analógicas A0 e A1. No meu código, utilizo apenas a A0. Envio uma onda senoidal gerada pelas funções de seno do próprio arduino e o tempo, apenas para teste e ver se chega direitinho. Mas, na maioria das vezes ocorrem perdas, e o MatLab nunca consegue plotar "em tempo real", ou seja, não é que ele esteja atrasado, é que para uma recepção de 1s, ele demora mais de 10s para plotar todos os dados.
Em fim, acho q não fui muito objetivo nas minhas dúvidas kkk, então é o seguinte:
Preciso de uma maneira de enviar os dados ordenadamente, sem perdas, através da porta COM. Um detalhe que esqueci de dizer, é que atualmente utilizo a conexão arduino-usb, mas pretendo utilizar um módulo Xbee para enviar e receber.

Depois disso, com os dados já no pc, preciso armazenar e plotar um gráfico, em tempo real (não importa se houver delays menores que meio segundo por exemplo).
Tenho a limitação de não conhecer muitas linguagens de programação, programo apenas em #C, MatLab, Arduino, mas posso aprender uma nova linguagem caso ela possa me trazer uma solução boa.
Sei que as dúvidas são muito extensas haha, por isso pedi algum tutorial para poder aprender mais sobre.
Por hora, muito obrigado!

Caique,

só como sugestão:

Remova o code que "colou" no seu tópico.

Deixa só o arquivo que anexou.

Att.

RV

Vc quer ler com o Arduino e transferir para um PC ?

Cuidados: 

- O PC não trabalha bem com comunicação ininterrupta. Ele tem um buffer de entrada que não pode ser lotado. Se lota perde dados e gera delay (vc le agora o que entrou no buffer a 5 segundos, por ex). Vc faz tudo certo mas o antivirus entra, dá uma ampulheta e gera um atraso...Para evitar o entupimento do windows por dados convém fazer um protocolo com requisição. Cada vez que o windows quer um bloco de dados ele pede. Se vc fizer um loop que manda, manda, manda, vai lotar o buffer.

- A comunicação serial fica melhor de forma binária, mais eficiente. 2 bytes por leitura (parte alta+parte baixa), por ex. Contra uns 6 bytes de mandar texto ("12345"+separador). Desconheço bibliotecas para isso (nunca usei, o que não significa que não tenha). Só fazer na unha. Vc cria um cabeçalho e depois manda parte alta e baixa de um monte de amostras, depois manda um fim de bloco.

- Vc vai usar fio e RS232 mesmo ? ou vai usar serial virtual em USB, TTL, etc. ? Usando uma mais eficiente (por ex um conversor USB-Serial) vc consegue velocidades maiores. Em RS232 as velocidades são limitadas pela distancia. Basicamente a velocidade maxima em RS232 é 115200bps que não se comporta bem em fios longos. Com o USB-Serial vc chega a 921600bps.

Acho que é isso.

Para poder falar mais alguma coisa é preciso saber mais sobre o q vc pretende, linguagem no PC, etc.

Faça as contas aí: Quantos canais, de quantos bytes, a 10x ciclo, com 60 ciclos /segundo.

Por ex: 

6 canais x 2 bytes x 10 x  60= 7.200 bytes/s só de dados, fora perdas nas lerdezas do PC e bytes de protocolo.

Para passar isso vc precisa de algo como 72.000 bps (baud != bit).

Para passar isso no mínimo 115.200bps.

Se não errei contas é isso. Mas só vai funcionar em uma linguagem no PC que seja compilada, com código enxuto, etc.

Bom dia Eduardo!

Muito obrigado pelas dicas! Realmente, eu estou enviando de forma ininterrupta, e assim acho q os dados se perdem, e o windows não ajuda muito na comunicação. Com relação ao tipo de meio de transferência, atualmente utilizo a usb direto no arduino, mas pretendo utilizar módulos Xbee para transferencia sem fio, e no caso, o arduino vai ligado no xbee pela Rx Tx, e o outro Xbee vai ligado no pc por um conversor RS232/USB.
Imagino eu que meu maior problema atualmente seja como receber os dados no pc de maneira síncronizada e como plotar isso em tempo real. Saberia me recomendar algum lugar onde possa aprender sobre? Ou mesmo alguma linguagem ou software que eu possa utilizar no windows para plotar tudo isso?


Por hora, Muito obrigado!

Fiz com sucesso no velho Delphi 7, em pascal.

Por ser enxuto (roda até em XP) e compilado de verdade, sem enganação, é super rápido.

O que pesa um pouco contra é que não tem um componente para Serial. As pessoas que usam delphi se viciam em componentes assim como as que usam Arduino se viciam em Bibliotecas.

Basta abrir a serial usando os comandos de abertura de arquivo, como quem abre um arquivo no disco (usando a API diretamente).

Para a comunicação vc cria uma função disparada por um timer, por ex 10x segundo. Nela transfere tudo que estiver no buffer para um buffer proprio (array).

Ref:

http://activedelphi.com.br/forum/viewtopic.php?t=32296&sid=4887...

A Borland, fornecedora do Delphi, fechou. O produto bifurcou. Existe a versão free, chamada Lazarus (Raiz) , a versão paga (Nutela) e a versão do tempo que a Borlad ainda era quem fazia (Ogra).

Gosto da Ogra... A Nutela faz maravilhas, mas pesa... Inclusiva compila mobile..

Ref:

https://lazarus-ide.org/index.php?page=downloads

https://embarcadero.com/br/products/delphi

Outra solução de compilador bom para coisas que lidam com imagem em tempo real e serial é o processing.

Moderninho, não sei opinar, não usei muito ainda, mas respeito muito:

https://processing.org

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço