Problemas com comunicação serial e velocidade - Arduino - Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
Problemas com comunicação serial e velocidade - Arduino
Publicado por Caique Urtado em 25 julho 2018 às 23:20 em Dúvidas
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:
Recebe_8_bits_02_03_2018_Real_Time_03_semarray.m, 5 KB
Teste_SerialWrite_27_02_2018.ino, 1 KB
Permalink Responder até mineirin RV em 26 julho 2018 at 9:36
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.
Permalink Responder até Caique Urtado em 26 julho 2018 at 12:18
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.
Permalink Responder até mineirin RV em 26 julho 2018 at 13:04
Remova o code que "colou" no seu tópico.
Deixa só o arquivo que anexou.
Permalink Responder até Eduardo Henrique Marcondes em 26 julho 2018 at 10:11
Vc quer ler com o Arduino e transferir para um PC ?
- 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.
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.
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.
Permalink Responder até Caique Urtado em 26 julho 2018 at 12:23
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?
Permalink Responder até Eduardo Henrique Marcondes em 26 julho 2018 at 23:21
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).
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..
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.