Ir ao conteúdo
  • Cadastre-se

Arduino Arduino / Matlab - Comunicação Serial


Posts recomendados

Fala galera!! Vou deixar de forma bem esquemática a minha situação para facilitar:

 

  • O que preciso??

Fiz um código no arduino para enviar dados de 2 sensores ultrasom via serial. Preciso de um código no Matlab para receber os valores dos dois sensores e plotar um ou dois (só um de preferência) gráficos com os resultados pelo tempo.

 

  • O que tenho??

Como falei, já fiz o código no arduino. Também tenho um código no Matlab onde só consigo receber 1 valor, ou seja, o código é útil quando envio apenas 1 dado pelo serial (seria de 1 sensor). Detalhe: o código do Matlab também salva os dados em um arquivo .txt .

 

  • Código no arduino (apenas o trecho com o envio dos dados via serial):
void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println(sensor1);
  Serial.println(sensor2);
}

 

  • Código no Matlab:
delete(instrfindall);    %limpa todos os instrumentos anterioarmente abertos na serial
clear all;
close all;
clc;

s = serial('COM5');    % atribui o objeto à porta serial

set(s, 'InputBufferSize', 16);    % Número de bytes no buffer de entrada
set(s, 'FlowControl', 'hardware');
set(s, 'BaudRate', 9600);
set(s, 'Parity', 'none');
%s.ReadAsyncMode = 'continuous';

set(s, 'DataBits', 8);    % Procura por "Serial Configurada" no help
set(s, 'StopBit', 1);
set(s, 'Timeout', 1000); % Tempo em segundos que o matlab aguarda por novos dados.

disp(get(s, 'Name')); % Mostra o nome "Serial - COM5" 

prop(1) = (get(s, 'BaudRate')); % Prop é apenas um vetor de strings que nesse caso tem 4 posições
prop(2) = (get(s, 'DataBits'));
prop(3) = (get(s, 'StopBit'));
prop(4) = (get(s, 'InputBufferSize'));

disp(['Port Setup Done!!', num2str(prop)]); % help num2str: converte numeros para uma string

fopen(s);    % Abre a porta serial.
t=1;
disp('Running');

while(t <= 5)    % Executa 100 ciclos - se você não consegue ver o símbolo, isto é sinal de "menos de"
    a = fgetl(s);    % fread(a, 4, 'single');% ('SIZE', 16.000, 'PRECISION','%f');%Reads the data from
        fprintf('%s', a);
    x(t) = t*0.100;    % Multiplicando pela taxa de amostragem % x(t) e y(t) são para construir um
    y(t) = str2double(a);    % a é uma string, srt2num converte uma string para um número

    t = t+1;
    a = 0; % Limpa o buffer
end

time = clock;
adress = 'D:\Matlab\Dados_';
dia = num2str(time(3));
mes = num2str(time(2));
ano = num2str(time(1));
horas = num2str(time(4));
minutos = num2str(time(5));
nome_do_arquivo = strcat(adress,dia,'-',mes,'-', ano,'-',horas,'-',minutos,'.txt.');
id_do_arquivo = fopen(nome_do_arquivo,'wt'); % wt=write, refere-se à ação que se deseja fazer
t=1;

while(t <= 5)
    fprintf(id_do_arquivo,'\t%5.2f\t%8.2f\n',x(t),y(t));
    t = t+1;
end

fclose(id_do_arquivo);
fclose(s);
plot(x,y)

 

Agradeço muito se alguém puder ajudar!!

Link para o comentário
Compartilhar em outros sites

Ainda não peguei para fazer comunicação entre o matlab e arduino, mas já vi alguns códigos...

 

Ops to confundindo com outro módulo heeheh não precisa colocar a biblioteca serial, precisa definir os pinos X)

https://www.theengineeringprojects.com/2015/02/interfacing-multiple-ultrasonic-sensor-arduino.html

 

Fora isso, do fato de você não estar alimentando o serial com os dois valores dos sensores, você não está identificando de quem a informação é do jeito que tá ai... você vai mandar a informação via serial para o PC, mas ele vai ó ver dados sendo passados e sem dizer que sensor passou o que. Então você também tem que identificar de que dados pertence na entrada serial e fazer o programa do matlab identificar essa chave que pode ser como você quiser para depois ele criar dois gráficos.

adicionado 4 minutos depois

 

Corrigido... erro que fiz T_T

adicionado 11 minutos depois

Correção da correção huahuahuauhahuahua

dá para fazer por software serial e eu não estava doido a final das contas uhahuahua

 

https://arduibots.wordpress.com/page/6/

 

Dá para fazer dos dois jeitos ^^

adicionado 12 minutos depois

/\ mas isso é no uso de um X)

Link para o comentário
Compartilhar em outros sites

3 horas atrás, Bommu Perneta disse:

"você não está identificando de quem a informação é do jeito que tá ai..."

 

Exatamente, man! Não estou conseguindo identificar os dados do sensor 1 e do sensor 2 no serial (preciso separá-los). No código do Arduíno estou simplesmente encaminhando os dados dos dois sensores um abaixo do outro para o serial, mas quando o Matlab lê, ele enxerga como sendo apenas um dado e por isso não consigo fazer um gráfico. Saberia como fazer a identificação de cada valor no Matlab???

 

Já me falaram que posso fazer um separador na saída serial do Arduíno, por exemplo, colocando uma barra " / " entre os valores, que assim o Matlab iria conseguir identificar cada um.. mas não estou conseguindo implementar isso.

 

Obs.: Não coloquei o código completo do Arduíno para deixar a postagem menor, mas no código tá com as leituras dos sensores tudo certinho, com o trigger, echo etc.

Link para o comentário
Compartilhar em outros sites

  • 3 meses depois...

Estou com o mesmo problema. Tenho dois sensores para o matlab ler os dados e gerar um arquivo .xls com os dados lidos na porta serial, e não faço ideia como separar estes dados para o matlab reconhecer e separa-los.

Observacão: com um sensor apenas, tudo roda perfeito. 

Alguma técnica para isso? 

 

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

olha já vi isso na comunicação com o java, e ele utilizava sim um carácter separador para identificar quando trocava de dados.

 

package arduinosupervisorio.serial;

public class Protocolo {
    
    private String tipoMensagem;
    private String temperatura;
    private String umidade;
    private String distancia;
    private String alarme;
    private String servo;
    private String mensagem;
    private String potenciometro;

    public String getMensagem() {
        return mensagem;
    }

    public void setMensagem(String mensagem) {
        System.out.println("Setando mensagem..." + mensagem);
        this.mensagem = mensagem;
        interpretaMensagem();
    }
    
    private void interpretaMensagem(){
        System.out.println("Interpretacao...");
        String[] vetorMensagem = mensagem.split(",");
        tipoMensagem = vetorMensagem[0];
        temperatura = vetorMensagem[1];
        umidade = vetorMensagem[2];
        potenciometro = vetorMensagem[3];
        alarme = vetorMensagem[4]; 
        distancia = vetorMensagem[5];

 

 

vai ser algo parecido porém em C

 

 

 

Link para o comentário
Compartilhar em outros sites

  • 5 anos depois...

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!