Comment mettre en pause Arduino pendant 1 milliseconde via MATLAB?


8

J'ai pu connecter MATLAB à mon Uno avec cette ligne de code: a = arduino('COM4');grâce à ce package: package de support Matlab pour Arduino .

À l'heure actuelle, MATLAB est mon script principal qui synchronisera tous les composants [comme l'Arduino].

Je peux envoyer des impulsions à mon moteur pas à pas simplement en utilisant:

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

Cela fonctionne bien et fera bouger le moteur environ une fois toutes les 2 millisecondes. Mon problème est que je ne peux pas trouver un moyen de produire ce même retard via l'interface de MATLAB. Je sais que MATLAB a une pause()fonction, mais quand je mets en place une boucle dans MATLAB comme ceci:

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

Chaque étape prend beaucoup plus de temps - environ 200 millisecondes chacune.

Quelles sont les autres options pour créer la pause entre l'envoi numérique haut / bas à l'Arduino? Ce serait bien si je pouvais contrôler le résultat de Matlab, via Arduino.


Il semble que vous ayez besoin de quelque chose comme GRBL . Il s'agit d'un programme autonome pour une carte Arduino qui interprète un langage de commande et produit des mouvements de moteur pas à pas coordonnés. Il est principalement destiné à l'usinage CNC, mais il peut probablement faire ce dont vous avez besoin.
Connor Wolf

Réponses:


6

L'augmentation du délai observé est due au temps qu'il faut pour envoyer la commande de MATLAB à l'Arduino pour que son code exécute la commande demandée. Dans votre cas, l'a.digitalWrite. Le temps réel entre les impulsions utilisant le retard de MATLAB est donc de 0,001 pause plus le temps du débit en bauds multiplié par la taille du paquet et le décodage puis l'exécution.

Je recommanderais de ne pas poursuivre cette solution du MATLAB contrôlant à distance le timing des moteurs pas à pas. Comme ce couplage latent sera une limitation frustrante. Notant que pour les moteurs pas à pas, le timing ne peut pas permettre une telle exécution latente. Par conséquent, toutes les imprimantes 3D et de nombreuses CNC avec moteurs pas à pas utilisent des Arduino qui obtiennent le G-Code (commandes de déplacement du moteur avec les destinations) et le micrologiciel en temps réel gère le pas, dans les tolérances.

Je suggérerais d'utiliser quelque chose comme le firmware grbl avec le bouclier du moteur pas à pas, puis de demander au MATLAB d'envoyer le code G nécessaire. Là où il y en a d'autres avec beaucoup plus de fonctionnalités mais adaptées à l'impression 3D. grbl est plus simple et direct au point de déplacer des moteurs.


0

Il ne ressort pas clairement de votre question si vous essayez d'obtenir une exécution en temps réel sans latence ou si vous souhaitez simplement ajuster le temps de retard du moteur à partir de MATLAB. Dans ce dernier cas, un bon moyen consiste à envoyer des données de retard (par exemple un nombre qui représente la durée souhaitée entre les impulsions) en série, que votre programme Arduino recevra et mettra à jour le retard du moteur comme vous le souhaitez. Ou, compte tenu des limitations de la RAM, vous pouvez envoyer toute une séquence de retards qui peuvent s'exécuter les uns après les autres avec un timing précis.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.