WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Schrittmotor Matlab/Arduino

 

_Johannes_

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.09.2014, 12:33     Titel: Schrittmotor Matlab/Arduino
  Antworten mit Zitat      
Moin,

folgendes mich zur Verzweifulung bringendes Problem:
Ich möchte mithilfe von Matlab und Arduino zwei Schrittmotoren steuern. Kenne mich aber bzgl Programmierung dessen nur sehr eingeschränkt aus. Eine Bibliothek, wie Adafruit, will ich nicht benutzen...

Ist glaub ich für Jemanden, der sich auskennt recht trivial...für mich ein Endgegner...Sollte mir also Jemand helfen, wäre ich sehr dankbar!

Im Moment bin ich so weit:

Ich habe die Function, die ich im Main Programm ablaufen lassen will als Schleife geschrieben; sieht so aus:

Code:
%Stepper A
function [n_control, nch] = move_motor_A(a, n_steps, n_direct)

ledPin = 2;      a.pinMode(ledPin2,'output');
ledPin = 3;      a.pinMode(ledPin3,'output');
ledPin = 4;      a.pinMode(ledPin4,'output');
ledPin = 5;      a.pinMode(ledPin5,'output');
ledPin = 6;      a.pinMode(ledPin6,'output');
ledPin = 7;      a.pinMode(ledPin7,'output');
ledPin = 8;      a.pinMode(ledPin8,'output');
ledPin = 9;      a.pinMode(ledPin9,'output');
ledPin = 10      a.pinMode(ledPin10,'output');
ledPin = 11;     a.pinMode(ledPin11,'output');
ledPin = 12;     a.pinMode(ledPin12,'output');
ledPin = 13;     a.pinMode(ledPin13,'output');


for i=1:n_steps
    a.digitalWrite(ledPin3, n_direct);
    a.digitalWrite(ledPin2, 0);
    pause(0,01);
    a.digitalWrite(ledPin3, n_direct);
    a.digitalWrite(ledPin2, 1);
    pause(0,01);
end

 


In den Workspace würd ich dann schreiben:

Code:
a=arduino('COM4');
 [n_control, nch] = move_motor_A(a, 10, 1)


Und dann die Schleife als .m file aufrufen.

Für den anderen Schrittmotor siehts genauso aus, nur mit anderen Pins.

Jetzt weiß ich nur nicht wie ich die Geschwindigkeit variieren kann; außerdem wollt ich die Oberfläche mit GUIDE machen...

Vielen Dank für Eure Hilfe!
Johannes


Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.09.2014, 21:22     Titel:
  Antworten mit Zitat      
Du solltest als Dezimaltrenner Punkte verwenden und keine Kommas. Wenn Du 0,01 Sekunden Pause willst, musst Du 0.01 übergeben.

Die Geschwindigkeit solltest Du genau durch das verändern dieser Pausenzeit einstellen können. Letztendlich ist das ja die Zeit, die Du zwischen zwei Schritten wartest.
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.09.2014, 10:36     Titel:
  Antworten mit Zitat      
Zitat:
Wie würde das dann aussehen, wenn ich die Pausenzeit verändere (werds in nen Punkt ändern)?
Weil ich will die Geschwindigkeit ja später über die Oberfläche ändern und nicht jedesmal die Schleife neu eingeben...
Welche Möglichkeiten habe ich da?


Du hast eine Funktionsdefinition, die so aufgebaut ist:

Code:
function [rueckgabewerte] = funktionsname(eingabewerte)


Du musst Deine Pausenzeit als zusätzlichen Eingabewert definieren und an der Stelle, wo die Pause gemacht wird eben nicht den festen Wert einsetzen, sondern deine zusätzliche Eingangsvariable.
Private Nachricht senden Benutzer-Profile anzeigen
 
_Johannes_
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 17.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.09.2014, 11:39     Titel:
  Antworten mit Zitat      
Okay, das heißt ich muss in der Schleife move_motor_A lediglich sowohl bei der Eingabe als auch bei der Ausgabe 'pause' als Variable deklarieren? Denn bisher war ja dann scheinbar der Pausenwert, der die Geschwingikeit festlegt, auf einen festen Wert fixiert?

Genügt es dazu, wenn ich 'pause' in die Klammerwerte schreibe oder muss ich auch den möglichen Umfang mit dazuschreiben?

Ich bin nämlich davon ausgegangen, dass in meiner obigen Schleife die Pause nur zur Funktionstrennung verantwortlich ist, weil das eine digital.write ja für vorwärts und das andere für rückwärts (oder cw und ccw) verantwortlich ist; erhöhe ich also den Pausenwert, würd der ganze Prozess in meinen Augen einfach nur länger dauern...?

Was kapier ich da nicht?
Private Nachricht senden Benutzer-Profile anzeigen
 
_Johannes_
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 17.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.09.2014, 09:26     Titel:
  Antworten mit Zitat      
So, ich habe nun noch im ArduinoIO Package das hier gefunden:

Code:
elseif nargin==2,
               
                if nargout==0,
                    % print speed value
                    disp(['The speed of stepper number ' num2str(num) ' is set to: ' num2str(a.sspd(num)) ' over 255']);
                else
                    % return speed value
                    val=a.sspd(num);
                end
               
            else
               
                if nargout==0,
                    % print speed value for each stepper
                    for num=1:2,
                        disp(['The speed of stepper number ' num2str(num) ' is set to: ' num2str(a.sspd(num)) ' over 255']);
                    end
                else
                    % return speed values
                    val=a.sspd;
                end
               
            end
           
        end % stepperspeed


Kann ich das in meinem Fall anwenden?
Private Nachricht senden Benutzer-Profile anzeigen
 
_Johannes_
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 17.09.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.09.2014, 10:27     Titel:
  Antworten mit Zitat      
wobei mir gerade aufgefallen ist, dass das ja nur mit dem motor shield geht...
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.09.2014, 22:07     Titel:
  Antworten mit Zitat      
_Johannes_ hat Folgendes geschrieben:
Okay, das heißt ich muss in der Schleife move_motor_A lediglich sowohl bei der Eingabe als auch bei der Ausgabe 'pause' als Variable deklarieren?

Als Eingang sollte reichen.

_Johannes_ hat Folgendes geschrieben:
Denn bisher war ja dann scheinbar der Pausenwert, der die Geschwingikeit festlegt, auf einen festen Wert fixiert?

Nach meinem sehr flüchtigen Blick auf den Code habe ich das so interpretiert, ja.

Zitat:
Genügt es dazu, wenn ich 'pause' in die Klammerwerte schreibe oder muss ich auch den möglichen Umfang mit dazuschreiben?

Die Pause wird ein Eingangswert wie a, n_steps und n_direct definiert. Du solltest ihn allerdings nicht "pause" nennen, da Du sonst die Funktion Pause überschreibst - das wird merkwürdige Fehlermeldungen geben...

Zitat:
Ich bin nämlich davon ausgegangen, dass in meiner obigen Schleife die Pause nur zur Funktionstrennung verantwortlich ist, weil das eine digital.write ja für vorwärts und das andere für rückwärts (oder cw und ccw) verantwortlich ist; erhöhe ich also den Pausenwert, würd der ganze Prozess in meinen Augen einfach nur länger dauern...?

Jetzt habe ich nochmal genau hingeschaut. Und es sieht so aus, als würde man auf ledPin3 dem Treiber die Richtung mitteilen und auf ledPin2 ein mach-jetzt-einen-Schritt-Signal schicken. Den Schritt macht der Treiber dann auf der steigenden Flanke von ledPin2. Die erste Pause ist dann dazu da, dass ledPin2 eine kleine Weile auf null ist, bevor er wieder auf 1 gesetzt wird. Wahlweise macht der Treiber den Schritt auch auf der fallenden Flanke - aber das ist eigentlich Wurst.

Ich hatte bei der Konstruktion was anderes im Sinn, das war aber Quatsch.

Die Drehgeschwindigkeit ist ja nichts anderes als die Zahl der Schritte je Sekunde. Die kannst Du durch den zweiten Aufruf von pause() in Deiner Schleife beeinflussen. Wenn die zweite Pause sehr lang ist, hat man viel Zeit zwischen zwei Schritten und die Drehzahl ist klein. Wenn die zweite Pause sehr klein ist, folgen die Schritte sehr schnell aufeinander und die Drehzahl ist groß.
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.