Como pausar o Arduino por 1 milissegundo no MATLAB?

8

Consegui conectar o MATLAB ao meu Uno com esta linha de código: a = arduino('COM4');através deste pacote: Pacote de suporte Matlab para Arduino .

No momento, o MATLAB é o meu script principal que sincronizará todos os componentes [como o Arduino].

Sou capaz de enviar pulsos para o meu motor de passo usando:

void loop() {
    digitalWrite(2, HIGH);
    delay(1);
    digitalWrite(2, LOW);
    delay(1);
}

Isso funciona bem e fará com que o motor se mova uma vez a cada 2 milissegundos. Meu problema é que não consigo encontrar uma maneira de produzir esse mesmo atraso através da interface do MATLAB. Eu sei que o MATLAB tem uma pause()função, mas quando eu configuro um loop no MATLAB assim:

a = arduino('COM4');
for m = 1:400
    a.digitalWrite(2, 1);
    pause(0.001);
    a.digitalWrite(2, 0);
    pause(0.001);
end

Cada etapa leva MUITO mais tempo - cerca de 200 milissegundos cada.

Quais são as outras opções para criar a pausa entre alta / baixa digital sendo enviada ao Arduino? Seria bom se eu pudesse controlar o resultado do Matlab, através do Arduino.

Filósofo Desonesto
fonte
Parece que você precisa de algo como GRBL . É um programa independente para uma placa de arduino que interpreta uma linguagem de comando e produz movimentos coordenados de motor de passo. Destina-se principalmente à usinagem CNC, mas provavelmente pode fazer o que você precisa.
Connor Wolf

Respostas:

6

O aumento no atraso observado é devido ao tempo que leva para enviar o comando do MATLAB para o Arduino para que seu código execute o comando solicitado. No seu caso, o a.digitalWrite. Portanto, o tempo real entre pulsos usando o atraso do MATLAB é de 0,001 pausa mais o tempo da taxa de transmissão vezes o tamanho do pacote, a decodificação e a execução.

Eu recomendaria não buscar esta solução do MATLAB controlando o tempo dos motores de passo, remotamente. Como esse acoplamento latente será uma limitação frustrante. Observando que, para motores de passo, o tempo não pode permitir tal execução latente. Portanto, todas as impressoras 3D e muitos CNC com motores de passo usam o Arduino, que recebe o código G (comandos de movimentação do motor com destinos) e o firmware em tempo real lida com o passo, dentro das tolerâncias.

Eu sugeriria usar algo como firmware grbl com proteção do motor de passo e depois o MATLAB enviasse o código G necessário. Onde existem outros com muito mais recursos, mas adaptados à impressão 3D. O grbl é mais simples e direto ao ponto de mover motores.

mpflaga
fonte
0

Não está claro em sua pergunta se você está tentando obter uma execução em tempo real sem latência ou simplesmente deseja ajustar o tempo de atraso do motor do MATLAB. Neste último caso, uma boa maneira é enviar dados de atraso (por exemplo, um número que representa quanto tempo você deseja entre pulsos) através de série, que seu programa Arduino receberá e atualizar o atraso do motor conforme desejado. Ou, tendo em mente as limitações de RAM, você pode enviar uma sequência inteira de atrasos que podem ser executados um após o outro com tempo preciso.

MichaelT
fonte