Come mettere in pausa Arduino per 1 millisecondo tramite MATLAB?


8

Sono stato in grado di connettere MATLAB al mio Uno con questa riga di codice: a = arduino('COM4');attraverso questo pacchetto: pacchetto di supporto Matlab per Arduino .

In questo momento, MATLAB è il mio script principale che sincronizzerà tutti i componenti [come Arduino].

Sono in grado di inviare impulsi al mio motore passo-passo semplicemente usando:

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

Funziona bene e fa muovere il motore circa ogni 2 millisecondi. Il mio problema è che non riesco a trovare un modo per produrre questo stesso ritardo attraverso l'interfaccia di MATLAB. So che MATLAB ha una pause()funzione, ma quando imposto un ciclo in MATLAB in questo modo:

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

Ogni passaggio richiede MODO più lungo - circa 200 millisecondi ciascuno.

Quali sono le altre opzioni per creare la pausa tra High / Low digitale inviata ad Arduino? Sarebbe bello se potessi controllare l'esito di Matlab, attraverso Arduino.


Sembra che tu abbia bisogno di qualcosa come GRBL . È un programma autonomo per una scheda arduino che interpreta un linguaggio di comando e produce movimenti coordinati del motore passo-passo. È in gran parte destinato alla lavorazione CNC, ma probabilmente può fare ciò di cui hai bisogno.
Connor Wolf,

Risposte:


6

L'aumento del ritardo osservato è dovuto al tempo impiegato per inviare il comando da MATLAB ad Arduino affinché il suo codice esegua il comando richiesto. Nel tuo caso a.digitalWrite. Quindi il tempo effettivo tra gli impulsi che utilizzano il ritardo di MATLAB è 0,001 di pausa più il tempo di baud rate per la dimensione del pacchetto e la decodifica, quindi l'esecuzione.

Consiglierei di non perseguire da remoto questa soluzione del MATLAB che controlla i tempi di Step Motors. Poiché questo accoppiamento latente sarà una limitazione frustrante. Notando che per i motori passo-passo i tempi non possono permettersi un'esecuzione così latente. Quindi tutte le stampanti 3D e molti CNC con motori passo-passo usano Arduino che ottengono il codice G (comandi di spostamento del motore con destinazioni) e il firmware in tempo reale gestisce lo stepping, entro le tolleranze.

Suggerirei di usare qualcosa come firmware grbl con protezione motore passo-passo e quindi fare in modo che MATLAB invii il codice G necessario. Dove ce ne sono altri con molte più funzioni ma su misura per la stampa 3D. grbl è più semplice e diretto al punto di spostare i motori.


0

Non è chiaro dalla tua domanda se stai cercando di ottenere un'esecuzione in tempo reale senza latenza o se desideri semplicemente regolare il tempo di ritardo del motore da MATLAB. In quest'ultimo caso, un buon modo è inviare i dati di ritardo (ad es. Un numero che rappresenta il tempo desiderato tra gli impulsi) via seriale, che il programma Arduino riceverà e aggiornerà il ritardo del motore come desiderato. Oppure, tenendo conto delle limitazioni della RAM, è possibile inviare un'intera sequenza di ritardi che possono essere eseguiti uno dopo l'altro con una tempistica precisa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.