Obter dados de sensores do Arduino, através do Matlab por comunicação TCP/IP

Olá garagistas!!!

Sou novo no fórum, mas já possuo alguma experiência em Arduino e programação. Estou desenvolvendo um projeto no qual me comunico com um Arduino através da rede ethernet. Para isso, utilizo um ethernet shield e roteador. Uma interface GUI em Matlab é capaz de enviar comandos para o Arduino, através do comando urlread('http://ip_do_Arduino/comando'). Para o comando urlread do Matlab funcionar, primeiro tive que desenvolver uma página HTML interna no Arduino, que realiza as mesmas tarefas que a interface GUI Matlab. O problema surge quando tento obter (e não enviar) informações do Arduino, como leitura de sensores, por exemplo. Como mencionei, não estou utilizando cabo USB, de forma que a comunicação é toda feita pela LAN - a alimentação do Arduino é feita por uma fonte externa ligada ao pino Vin da shield ethernet e do Arduino. Quando o cabo USB do Arduino está conectado no PC, eu consigo obter as informações que preciso via comunicação serial, pois o Matlab possui bibliotecas para isso. Já com a comunicação apenas via rede, ainda não consegui realizar a leitura de sensores. O Matlab possui bibliotecas para a criação de objetos tcpip, e é possível enviar e receber comandos de/para outros dispositivos através desse protocolo. Eu mesmo consigo comunicação excelente com um analisador de espectro eletromagnético e um gerador de sinais, através da rede, com comandos SCPI embarcados no código Matlab. Bom, em resumo, o que quero é obter a leitura de um sensor de temperatura LM35 no matlab, através de comunicação TCP/IP pura (sem cogitar a possibilidade de utilizar comunicação serial). Vale frisar, que o sensor está devidamente funcionando e a leitura da temperatura pode ser visualizada na página web desenvolvida no Arduino.

Agradeço pela Atenção. 

Exibições: 3184

Responder esta

Respostas a este tópico

Opa.

Fiz um teste rápido aqui com comunicação  TCP IP e funcionou perfeitamente. O mais simples de fazer seria usando oque já se tem pronto, ou seja, usando o protocolo modbus TCPIP. 

Se quiser seguir esse caminho posso te ajudar, só que precisa deixar o arduino rodando o modbus e  efetuar a leitura com algum master como o scadaBR, elipse ou qualquer outro afim de testar o sistema.

Com a alteração de duas linhas do mfile abaixo, já é possível ler seu LM35.

Fonte: http://www.mathworks.com/matlabcentral/fileexchange/11802-matlab-tc...

Precisando, estamos ai. :)

% MATLAB example using TCP/IP (matlab_tcpip_example.m)
% This simple code example demonstrates how you can use MATLAB to exchange data
% with a remote application not developed in MATLAB. This code example is taken
% from a MATLAB Digest technical article written by Edward J. Mayhew from
% George Mason University. While HTTP was used as the higher-level protocol in
% this example, you can use other protocols, as was the case in the project.
% MATLAB supports TCP/IP using Instrument Control Toolbox. Requires MATLAB and
% Instrument Control Toolbox.
%
% Copyright 2006 - 2014 The MathWorks, Inc.
%
% On line 14, substitute "www.EXAMPLE_WEBSITE.com" with an actual website with
% which you wish to communicate.

% Create TCP/IP object 't'. Specify server machine and port number.
t = tcpip('192.168.25.240', 502);

% Set size of receiving buffer, if needed.
set(t, 'InputBufferSize', 30000);

% Open connection to the server.
fopen(t);

% Transmit data to the server (or a request for data from the server).
% Aqui é onde vc deve descrever a trama de comunicaçao do protocolo
fprintf(t, '555286281666155');

% Pause for the communication delay, if needed.
pause(1)

% Receive lines of data from server
while (get(t, 'BytesAvailable') > 0)
t.BytesAvailable
DataReceived = fscanf(t)
end

% Disconnect and clean up the server connection.
fclose(t);
delete(t);
clear t

Legal Jucelei Freitas!!! Obrigado por responder. Testarei o seu código amanhã na faculdade. O projeto é para um posicionador automático de antenas de microfita, que utiliza motor de passo para girar a antena em teste. O sistema irá funcionar efetivamente por rede Ethernet, e uma interface GUI em Matlab controla todo esse sistema. De um modo genérico, se trata de uma rede de dispositivos conectados, como se fosse uma rede de computadores. A parte do Arduino é o controle do motor de passo e a leitura dos sensores. Como havia dito, consigo enviar comandos para o Arduino através do comando "urlread" do matlab. Porém, ainda não consegui obter os dados dos sensores para serem armazenados no Matlab. Assim que tiver resultados, posto aqui. Só mais uma dúvida, existe algum comando específico na programação do Arduino que eu deva fazer para enviar o valor da temperatura? Abraço.

Grande Jucelei,

to de olho. Olha que belo uso para o MODBUS.

Então pessoal! não estou familiarizado, aliás nem conhecia, esse protocolo MODBUS TCPIP. Pelo o que andei lendo, eu poderia excluir o código do Arduino que cria a página web, pois os comandos poderão ser enviados pelo Matlab via TCPIP. Eu utilizava o código da página web no Arduino, pois a função "urlread" do Matlab precisa de uma página web para funcionar. Meu pensamento está correto? Se sim, poderiam enviar-me um código para o Arduino que implemente a comunicação com o Matlab? A parte do Matlab enviada pelo Jucelei Freitas eu entendi perfeitamente, aliás, muitos dos comandos citados por ele, eu já havia testado. Não obtive sucesso pois acredito que faltava configurar o Arduino de maneira correta, no caso, com o MODBUS. Fico no aguardo. Abraços.

Opa.

Modbus do lado do Arduíno não tenho nada aqui comigo, não uso. Mais ta na mão o script que efetua a leitura de um endereço através do matlab, implementado a função 3 (read holding register) que é leitura de dados retentivos que pode vir a ser usado para ler uma entrada analógica. Da uma pesquisada na web que tem muita coisa relacionado a Arduíno com modbus tcpip.

%Jucelei Freita - 2016
%Simples socket cliente compativel como modbus TCPIP master.
%Scrip somente trata a parte baixa do endereço a ser lido, se
%for necessario tratar parte alta, contatenar posição 10 (parte alta)
%do vetor DataReceived com posição 11 (parte baixa)
clear;
%IP e porta onde ira se conectar com timeout de 1 segundo.
t = tcpip('192.168.25.240', 502, 'Timeout', 1);
% Set size of receiving buffer, if needed.
set(t, 'InputBufferSize', 300);
% Open connection to the server.
fopen(t);
while 1
%endereço do slave
slave = 1;
%Endereço a ser lido
address = 1;
% Transmit data na formataçao do protocolo modbus tcpip
fprintf(t,sprintf('%c%c%c%c%c%c%c%c%c%c%c%c',0,0,0,0,0,6,slave,3,0,address,0,1));
% Pause for the communication delay, if needed.
pause(1) ;
% Receive lines of data from server
while (get(t, 'BytesAvailable') > 0)
t.BytesAvailable ;
DataReceived = fscanf(t);
end
%sprintf('%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d',DataReceived(1),DataReceived(2),DataReceived(3),DataReceived(4),DataReceived(5),DataReceived(6),DataReceived(7),DataReceived(8),DataReceived(9),DataReceived(10),DataReceived(11))
%imprime valor lido, somente dados com valores entre 0 e 255, parte baixa
%do endeço lido.
sprintf('%d',DataReceived(11))
end
%end
% Disconnect and clean up the server connection.
fclose(t);
delete(t);
clear t

Ok Jucelei!!! Vou ver se consigo algum código para o Arduino, que sirva para eu testar o seu script Matlab. Não há muito material na internet quando o assunto é comunicação TCP/IP entre Arduino e Matlab. Encontra-se bastante material para a comunicação serial, aliás, com essa é possível fazer praticamente tudo entre Arduino e Matlab. Você havia mencionado, em seu primeiro post, que tinha conseguido comunicação entre ambos. Poderia me dizer qual o tipo de código que tinha no seu Arduino? Seria possível, por exemplo, fazer todo o controle e leitura do Arduino através de TCP/IP? 

Abraço.

Então cara, testei o script com um software simulador modbus slave  e em dois esp8266 rodando o protocolo modbus slave. Como o protocolo é padrão e  foi testado em dois sistemas diferentes, tenho 99% de certeza que ira funcionar com Arduíno sem qualquer ajuste. Da uma pesquisada de como integrar o arduino a sistema de supervisão como scadaBR, elipse, indusoft e PLC via tcpip que irar encontrar vários exemplos de sketch. Como ja disse, não tenho nada aqui relacionado a Arduíno e shield ethernet, logo por esse lado não posso ajudar com o sketch.

Se você ter algum esp8266 ai e ja tem noção de como atualizar o firmware, posso te enviar o firmware do modbus que desenvolvemos e por pra rodar.  

Ahh!!! entendi. Já pesquisei sobre MODBUS no Arduino, e tem uma biblioteca que deve ser baixada e adicionada ao mesmo. Também, encontra-se na internet, códigos de programação do Arduino para comunicação MODBUS TCP/IP. O que não se encontra, como já havia dito, é a integração desse código Arduino com o Matlab. Talvez com um pouco de teste e força bruta, eu obtenha sucesso. Quanto ao scadaBR, ele poderia sim servir, porém, eu quero integrar todo o sistema para ser controlado em uma única interface, no caso o Matlab. Não sei se o scadaBR seria capaz de controlar os outros dispositivos da rede, tais como analisador de espectro e gerador de sinais. Por ora, vou continuar com os testes aqui, se obtiver resultados positivos, posto o passo a passo aqui no fórum. Grande abraço Jucelei, e mais uma vez, obrigado pela ajuda.   

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço