¿Cómo pausar Arduino durante 1 milisegundo a través de MATLAB?

8

He podido conectar MATLAB a mi Uno con esta línea de código: a a = arduino('COM4');través de este paquete: paquete de soporte de Matlab para Arduino .

En este momento, MATLAB es mi script principal que sincronizará todos los componentes [como el Arduino].

Puedo enviar pulsos a mi motor paso a paso simplemente usando:

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

Esto funciona bien y hará que el motor se mueva aproximadamente una vez cada 2 milisegundos. Mi problema es que no puedo encontrar una manera de producir este mismo retraso a través de la interfaz de MATLAB. Sé que MATLAB tiene una pause()función, pero cuando configuro un bucle en MATLAB como este:

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

Cada paso tarda MUCHO más, unos 200 milisegundos cada uno.

¿Cuáles son otras opciones para crear la pausa entre el envío de alta / baja digital al Arduino? Sería bueno si pudiera controlar el resultado de Matlab, a través de Arduino.

Filósofo torpe
fuente
Parece que necesitas algo como GRBL . Es un programa independiente para una placa arduino que interpreta un lenguaje de comando y produce movimientos coordinados de motor paso a paso. Está destinado en gran medida al mecanizado CNC, pero probablemente puede hacer lo que necesita.
Connor Wolf

Respuestas:

6

El aumento en el retraso observado se debe al tiempo que lleva enviar el comando desde MATLAB al Arduino para que su código ejecute el comando solicitado. En su caso el a.digitalWrite. Entonces, el tiempo real entre pulsos usando el retraso de MATLAB es 0.001 pausa más el tiempo de velocidad de transmisión multiplicado por el tamaño del paquete y la decodificación y luego la ejecución.

Yo recomendaría no buscar esta solución de MATLAB controlando el tiempo de Step Motors de forma remota. Como este acoplamiento latente será una limitación frustrante. Observando que para los motores paso a paso, el tiempo no puede permitirse una ejecución tan latente. Por lo tanto, todas las impresoras 3D y muchos CNC con motores paso a paso usan Arduino's que obtienen el código G (comandos de movimiento del motor con destinos) y el firmware en tiempo real maneja los pasos, dentro de las tolerancias.

Sugeriría usar algo como firmware grbl con escudo de motor paso a paso y luego hacer que MATLAB envíe el código G necesario. Donde hay otros con muchas más funciones pero adaptados a la impresión 3D. grbl es más simple y directo al punto de mover motores.

mpflaga
fuente
0

No queda claro a partir de su pregunta si está tratando de obtener una ejecución en tiempo real sin latencia o simplemente desea ajustar el tiempo de retraso del motor de MATLAB. Si es esto último, una buena manera es enviar datos de demora (por ejemplo, un número que represente cuánto tiempo desea entre pulsos) en serie, que su programa Arduino recibirá y actualizará la demora del motor según lo desee. O, teniendo en cuenta las limitaciones de RAM, puede enviar una secuencia completa de retrasos que pueden ejecutarse uno tras otro con una sincronización precisa.

MichaelT
fuente