Autor Beitrag
Doofit
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Sa 29.08.15 19:00 
Hallo,
ich habe jetzt schon mehrer Wochen damit verbracht deutsche und englische Seiten zu durchsuchen, was die Steuerung von Schrittmotoren über CSharp angeht. Ich hab auch schon eine ganz Menge gefunden,aber erstmal zum Anfang. Ich habe mir eine 5-Achs-Steuerkarte ( www.savebase.com/inf...s_breakout_board.pdf ), sowie 3 Nema-17-Motoren besorgt (1,7A , 1,8°, 200 Schritte für eine ganze Umdrehung bei Vollschrittbetrieb), da ich fürs erste nur mal die X-, Y- und Z-Achse verwenden möchte. Die Steuerkarte ist über den OnBoard-LPT mit dem PC verbunden. Nachdem ich die inpout32.dll importiert habe, bin ich nun durch Google so weit, dass ich es im Wechsel mit "ControlPort.Output(0x378, Binärwert);" und "System.Threading.Thread.Sleep(Zeit);" schaffe ein Signal an die Achsen zu senden, was man an der LED für die jeweilige Achse erkennt. Wenn ich die Anleitung der Steuerkarte richtig lese muss ich erst durch einen Pin die Drehrichtung angeben und daraufhin dann einen anderen Pin immer ein- und ausschalten. Dies wurde mir auch auf gutefrage.net von einem Programmierer so bestätigt. Hier mal ein Codeausschnitt mit dem ich versuche die Z-Achse zu steuern:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
PortAccess.Output(0x37801000000);  //Drehrichtung angeben
System.Threading.Thread.Sleep(x);     //Zeit x warten
PortAccess.Output(0x37801100000);  //Impuls, Bit ein
System.Threading.Thread.Sleep(x);     //Zeit x warten
PortAccess.Output(0x37800000000);  //Bit aus
System.Threading.Thread.Sleep(x);     //Zeit x warten
PortAccess.Output(0x37801100000);  //Impuls Bit ein
System.Threading.Thread.Sleep(x);     //Zeit x warten
PortAccess.Output(0x37800000000);  //Bit aus


Das kann man natürlich am Ende alles in eine Schleife legen, doch zum Testen wollte ich es erst einmal so probieren. Der Code wiederholt sich so eine ganze Weile und startet sobald ein Button geklickt wird. Soweit so gut,klicke ich den Button, blinkt die LED für Z und man hört auch dass da irgendwas schaltet (Relais). Trotzdem bewegt sich der Motor nicht, aber ich bin mir sicher dass er richtig angeschlossen ist. Manchmal merkt man auch, dass er einen kleinen Ruck macht, aber nur minimal und das macht er auch nicht immer....bin langsam echt am verzweifeln, vielleicht hat hier jemand ein paar Tipps für mich, da ich keine Fehlermeldungen bekomme und demnach das Prinzip ja stimmen müsste...

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
Moderiert von user profile iconChristian S.: Topic aus Basistechnologien verschoben am Sa 29.08.2015 um 20:26
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 30.08.15 09:19 
Hallo und :welcome:

du gibst den 2. Parameter falsch an. Du möchtest einen Binärwert, aber sendest jeweils einen dezimalen Wert.
In C# (bis Version 5) gibt es keine direkte Darstellung eines Binärwerts ("Binärliteral"), erst ab C# 6 (VS 2015), s. z.B. C# binary literals.
Also entweder
ausblenden C#-Quelltext
1:
Convert.ToInt32("01100000"2); // Bit ein					

oder direkt in Hexadezimaldarstellung
ausblenden C#-Quelltext
1:
0x60					

Oder ab C# 6:
ausblenden C#-Quelltext
1:
0b01100000					

Für diesen Beitrag haben gedankt: Doofit
Doofit Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 31.08.15 16:22 
Hallo,

danke erstmal, wusste nicht dass das erst ab VS 2015 funktioniert. :roll:
Muss auch zugeben dass ich nicht so vertraut mit C# bin, eher hobbymäßig. :D
Also jetzt bekommt der Motor immer ein Signal, was schonmal ein großer Unterschied zu vorher ist. Trotzdem bewegt er sich nicht, man spürt lediglich kleine "Zucker". Der Code sieht nun folgendermaßen aus:


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
PortAccess.Output(0x3780x40);       //Drehrichtung angeben
System.Threading.Thread.Sleep(x);     //Zeit x warten
PortAccess.Output(0x3780x60);       //Impuls, Bit ein
System.Threading.Thread.Sleep(x);     //Zeit x warten
PortAccess.Output(0x3780x0);        //Bit aus
System.Threading.Thread.Sleep(x);     //Zeit x warten
PortAccess.Output(0x3780x60);       //Impuls Bit ein
System.Threading.Thread.Sleep(x);     //Zeit x warten
PortAccess.Output(0x3780x0);        //Bit aus


Für x habe ich momentan den Wert x = 40, aber ich denke nicht dass das mit meinem Problem zusammenhängt oder?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 31.08.15 16:55 
Hallo,

der Kommentar "Impuls", kommt der aus der Doku oder von dir?
Evtl. mußt du dann in einer Schleife den Motor dauerhaft bewegen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
for (int i=0; i<100; i++)
{
    PortAccess.Output(0x3780x60);       //Impuls, Bit ein
    System.Threading.Thread.Sleep(x);     //Zeit x warten
}


PS: Crossposts bitte immer angeben: myCSharp.de - Schrittmotor ansteuern, Motor bewegt sich nicht?
Doofit Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 31.08.15 19:42 
Habe ich versucht, leider mit dem selben Ergebnis wie zuvor....Zuckt regelmäßig, bewegt sich aber kein Stück :/

Crosspost: www.mycsharp.de/wbb2....php?threadid=115413
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 31.08.15 19:52 
Gibt es die Doku auch online, damit ich da mal reinschauen kann?
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Mo 31.08.15 19:54 
Wenn ich das Diagramm richtig lese, dann musst du das Direction-Bit halten, während du die Pulse sendest.

Falls dein Direction-Bit also tatsächlich 0x40 ist, dann probier mal sowas in einer Schleife:
ausblenden C#-Quelltext
1:
2:
3:
4:
PortAccess.Output(0x3780x40);       //Drehrichtung +, Bit 0
System.Threading.Thread.Sleep(x);     //Zeit x warten
PortAccess.Output(0x3780x60);       //Drehrichtung +, Bit 1
System.Threading.Thread.Sleep(x);     //Zeit x warten


Damit würde sich auch das derzeitige Verhalten erklären: Du toggelst das Drehrichtungs-Bit jedesmal, was den Motor dann netto nicht bewegt. Ist aber nur so eine Vermutung...
Doofit Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mo 31.08.15 22:49 
@ TH69: Die Doku ist in der Fragestellung verlinkt.

@ jfheins: Hab ich auch getestet...klappt nicht...irgendjemand muss doch eine Lösung dafür haben :cry:


Hier mal der Code:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace Schrittmotor_Versuch_2
{
    public partial class Form1 : Form
    {
        int x = 100;
        public Form1()
        {
            InitializeComponent();
        }

        private void btnZ_Click_1(object sender, EventArgs e)
        {
            lblAnzeige.Text = "Z-Achse";
            System.Threading.Thread.Sleep(x);
            PortAccess.Output(0x3780x20);
            for (int i = 0; i < 100; i++)
            {

                System.Threading.Thread.Sleep(x);
                PortAccess.Output(0x3780x40);
                System.Threading.Thread.Sleep(x);
                PortAccess.Output(0x3780x60);
                System.Threading.Thread.Sleep(x);
            }
        }

        private void btnAus_Click(object sender, EventArgs e)
        {
            PortAccess.Output(0x3780);
            PortAccess.Output(0x37A0);
            lblAnzeige.Text = "Aus";
        }
    }
}

public class PortAccess
{
    [DllImport("inpout32.dll", EntryPoint = "Out32")]
    public static extern void Output(int adress, int value);
}


class CParallelPort
{
    // inpout32.dll muss im /bin/debug-Ordner vorhanden sein!
    // Dieser Code funktioniert nur mit Windows XP
    // Für Windows 7 wird eine 64-Bit-DLL inpoutx64.dll benötigt!
    [DllImport("inpout32.dll", EntryPoint = "Out32")]
    public static extern void Output(int adress, int value);
    [DllImport("inpout32.dll", EntryPoint = "Inp32")]
    public static extern int Input(int adress);
}
Doofit Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Mi 02.09.15 01:35 
Mir ist noch etwas aufgefallen. Wenn ich den Motor ansteuern will - egal mit welcher Methode - liegt nur auf Pin 7, Pin 8 und GND Spannung an, auf Pin 1 jedoch nicht (Benennung nach Doku = www.savebase.com/inf...s_breakout_board.pdf ). Das heißt, wenn ich GND und Pin 7 oder Pin 8 mit den zwei Kabeln einer Spule des Motors verbinde, macht er einen Step (wenn das Programm währenddessen läuft). Verbinde ich aber - egal ob Pin 7, Pin 8 oder GND - mit Pin 1, passiert gar nichts mehr. Hat das was zu bedeuten? Muss ich irgendwie Spannung an Pin 1 bringen?

LG und danke für all die Antworten bisher
icho2099
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 101
Erhaltene Danke: 12

WIN XP, WIN 7, WIN 10
Delphi 6 Prof, Delphi 2005, FPC
BeitragVerfasst: Mi 02.09.15 09:32 
Hallo,
Pin1 auf dem LPT ist /Strobe, wird also investiert ausgegeben.
Ausserdem wirst du wohl noch Stepperdriver wie M335 brauchen.
Das Breakout board alleine dröselt nur die Signale auf.
Doofit Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Fr 04.09.15 01:38 
Hi,
so, ich bin jetzt umgestiegen auf eine USB Steuerkarte mit Stepperdrivern inklusive der Motoren. Mit dem mitgelieferten Testprogramm kann man die Motoren auch wunderbar bewegen. Das möchte ich allerdings natürlich durch mein eigenes Programm machen. Hat jemand Beispiele, Links, etc. zu der Ansteuerung vom USB-Port über C#? Hab auch schon Google gefragt, aber zur Ansteuerung via USB gibt es gar nicht so viel wie zum LPT-Port, ist ja klar, der LPT existiert schon etwas länger :D

Danke :)
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Fr 04.09.15 18:27 
USB ist nu mal grundlegend anders. Und zwar seriell und nicht mehr parallel. Es gibt Geräteklassen. Du müsstest jetzt mal herausfinden, als welches Gerät sich das Board anmeldet. Die Chancen stehen gut, dass es einen (virtuellen) COM-Port bereitstellt.
Wenn das so ist, brauchst du noch Infos über das Kommunikationsprotokoll. Da war doch bestimmt ne Anleitung dabei?
Doofit Threadstarter
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Fr 04.09.15 23:44 
Hi,
Also es handelt sich um einen Arduino Uno mit einem Shield für die 3 Schrittmotoren. Als Anleitung war www.conucon.de/user_download/tutorial.pdf angegeben, darin wird allerdings nur das mitgelieferte Testprogramm erklärt. Über den Arduino selbst findet man einiges, was schonmal gute Voraussetzungen für mein Vorhaben ist. Es gibt auch eine eigen Programmiersprache dafür, ich möchte dennoch in Microsoft Visual C# programmieren. Das Gerät wird im Gerätemanager unter Anschlüsse bei COM3 aufgeführt. Sagt euch das was? Ich hab von USB null Plan.

Danke :)
icho2099
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 101
Erhaltene Danke: 12

WIN XP, WIN 7, WIN 10
Delphi 6 Prof, Delphi 2005, FPC
BeitragVerfasst: Sa 05.09.15 12:04 
Deine Wahl ist ja nicht schlecht aber so wie ich dich verstanden habe, möchtest du die Stepper selber und direkt steuern. Also jeden einzelnen Schritt jedes Motors selber bestimmen?
Dazu ist zu sagen, dass es sich dann um eine Echtzeit Anwendung handelt, die du da umsetzen möchtest. Das ist nicht trivial und mit Windows schon mal gar nicht.
Du musst die Dynamik aller Achsen kontrollieren, Beschleunigung- und Verzögerungsrampen festlegen, etc.
Und das alles in Echtzeit.
Weil das nahezu unmöglich ist sind die angebotenen Steuerungen mit eigenen Controllern ausgestattet, die Echtzeitbetrieb erlauben, aber eben keine direkte Steuerung der Stepper.
Deine Anwendung spricht also mit einer zweiten Anwendung, sendet dieser Bewegungsanweisungen für die Achsen und Start/Stop Befehle.
Um zb einen diagonale x/y Weg für den Fräser fest zu legen, sind zwei Vektoren mit identischen Rampen nötig und der Startbefehl. Käme es bei dem Abfahren der Profile bei einem Stepper zu Verzögerungen, weicht der gefahrene Weg vom Soll ab, das Werkstücke wird unbrauchbar.
Das Arduino board implementiert rudimentäre Funktionen zur Achsensteuerung, die Befehle sind erläutert und werden seriell übertragen.
Die Umsetzung via USB ist dabei unwichtig. Deine Anwendung muss Steuerbefehle seriell über die COM Schnittstelle ausgeben. Hilfe dazu findest du hier reichlich im Forum.

Für diesen Beitrag haben gedankt: Doofit