Wie kann man Arduino über MATLAB für 1 Millisekunde anhalten?

8

Ich konnte MATLAB mit dieser Codezeile mit meinem Uno verbinden: a = arduino('COM4');über dieses Paket: Matlab-Support-Paket für Arduino .

Im Moment ist MATLAB mein Hauptskript, das alle Komponenten [wie das Arduino] synchronisiert.

Ich kann Impulse an meinen Schrittmotor senden, indem ich Folgendes verwende:

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

Dies funktioniert einwandfrei und lässt den Motor etwa alle 2 Millisekunden einmal laufen. Mein Problem ist, dass ich keinen Weg finden kann, dieselbe Verzögerung über die MATLAB-Schnittstelle zu erzeugen. Ich weiß, dass MATLAB eine pause()Funktion hat, aber wenn ich eine Schleife in MATLAB wie folgt einrichte:

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

Jeder Schritt dauert viel länger - jeweils etwa 200 Millisekunden.

Welche anderen Optionen gibt es, um die Pause zwischen dem Senden von digitalem High / Low an das Arduino zu erzeugen? Es wäre schön, wenn ich das Ergebnis von Matlab über Arduino kontrollieren könnte.

Fehlerhafter Philosoph
quelle
Es hört sich so an, als ob Sie so etwas wie GRBL brauchen . Es ist ein eigenständiges Programm für ein Arduino-Board, das eine Befehlssprache interpretiert und koordinierte Schrittmotorbewegungen erzeugt. Es ist hauptsächlich für die CNC-Bearbeitung gedacht, kann aber wahrscheinlich das tun, was Sie brauchen.
Connor Wolf

Antworten:

6

Die erhöhte beobachtete Verzögerung ist auf die Zeit zurückzuführen, die benötigt wird, um den Befehl von MATLAB an das Arduino zu senden, damit sein Code den angeforderten Befehl ausführt. In Ihrem Fall das a.digitalWrite. Die tatsächliche Zeit zwischen Impulsen mit MATLABs Verzögerung beträgt also 0,001 Pause plus der Zeit der Baudrate multipliziert mit der Paketgröße und der Decodierung und Ausführung.

Ich würde empfehlen, diese Lösung des MATLAB nicht zu verfolgen, um das Timing von Step Motors aus der Ferne zu steuern. Da diese latente Kopplung eine frustrierende Einschränkung darstellt. Es ist zu beachten, dass sich das Timing für Schrittmotoren eine solche latente Ausführung nicht leisten kann. Daher verwenden alle 3D-Drucker und viele CNCs mit Schrittmotoren Arduinos, die G-Code (Motorbewegungsbefehle mit Zielen) erhalten, und die Echtzeit-Firmware übernimmt das Schrittmachen innerhalb von Toleranzen.

Ich würde vorschlagen, etwas wie grbl-Firmware mit Schrittmotorabschirmung zu verwenden und dann das MATLAB den erforderlichen G-Code senden zu lassen. Wo es andere gibt, die viel mehr Funktionen bieten, aber auf den 3D-Druck zugeschnitten sind. grbl ist einfacher und direkt zum Bewegen von Motoren.

mpflaga
quelle
0

Aus Ihrer Frage geht nicht hervor, ob Sie versuchen, eine Echtzeitausführung ohne Latenz zu erhalten, oder einfach die Motorverzögerungszeit von MATLAB anpassen möchten. In letzterem Fall ist es eine gute Möglichkeit, Verzögerungsdaten (z. B. eine Zahl, die angibt, wie lange Sie zwischen den Impulsen möchten) seriell zu senden, die Ihr Arduino-Programm empfängt und die Motorverzögerung wie gewünscht aktualisiert. Unter Berücksichtigung der RAM-Einschränkungen können Sie auch eine ganze Reihe von Verzögerungen senden, die mit genauem Timing nacheinander ausgeführt werden können.

MichaelT
quelle