UP und DW Button Wert

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von ing.mh.

    UP und DW Button Wert

    Mayday Mayday, Hallo ihr Lieben,

    ich bin neu in VB Welt und ich benötige Hilfe.

    ich arbeite an eine User Interface zum Steuern eines BLDC Motors. Mit zwei UP/Down Buttons möchte ich die Spannung und die Frequenz an steuern. U von 0 bis 30V und die f von 0 bis 60 Hz. Für die Steuerung in Arduin Beispiel von FOC Modul ist das so, für die Frequenz ist das Befehl Buchstabe T gefolgt mit der gewünschten Frequenz und das selbe mit der Spannung L gefolgt mit der gewünschten Spannung.

    Jetzt die Frage, wie realisiere ich das, sodass wenn ich den Wert anhand up & down ändere auch seriell an Arduino ankommt und genauso von Arduino verstanden wird. Als Anhang ein Bild.

    Vielen Dank und falls ich hier falsh bin bitte an die Admin zum Verschieben.
    Bilder
    • Bild_2022-04-17_212241748.png

      13,85 kB, 690×454, 95 mal angesehen
    @ing.mh Willkommen im Forum. :thumbup:
    Nicht mit Button sondern mit NumericUpDown-Controls.
    Dort gibst Du einen Wert vor, der dann meinetwegen in einer Button_Click an wen auch immer übertragen wird.
    Feddich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo ing.mh,

    such mal nach Serialport und Arduino, da gibt es schon einige Beispiele hier im Forum.

    Im Prinzip geht es ähnich wie auf dem Arduino, du öffnest die Verbindung (SerialPort) stellst die Baudrate etc. ein und kannst was senden.
    Für das Empfangen richtet man eine Evnethandler ein (DataReceivedHandler), also eine "Fuktion" die aufgerufen wird wenn Daten ankommen.

    Dabei muss man noch beachten, dass der EventHandler in einem anderen Thread läuft und die Daten nicht so einfach, direkt auf einer Form ausgegeben werden kann.
    Da benötigt es noch ein "Trick", Thema Invoke.

    Aber wie gesagt schau dir erst mal die Beispiele an.
    @ing.mh
    Erklär mal genauer wo du hängst, Was genau ist dein Problem?
    Ein präzise Problem Beschreibung ist die halbe Lösung. ;)
    Und poste mal einen Link zu dem Protokoll und den Einstellungen das VCP von dem "FOC Moduls".
    Vielen Dank für die Antwort,
    @Hifu, mein Problem ist ich möchte per nummericUpDw werte an Arduino senden, zB. ich wähle die Frequenz 40 Hz die muss Arduino empfangen und umsetzen. jetzt wenn ich Char sende eine "A" dann funktioniert das. aber wenn ich eine Zahl sende funktioniert das nicht.

    ich habe versuch das per einer LED zu testen, die LED bleibt einfach aus >> Arduino empfängt einfach nicht den Wert oder ich mache hier etwas falsch.

    FOC Bibliothek funktioniert an sich gut wenn ich die Befehle in dem Arduino seriellen Monitor, die Befehle werden dort wie folgendes eingegeben: T50 bedeutet die Frequenz 50 Hz und L12 bedeutet die Spannung 12 V.

    Die befehle möchte ich aber direkt von meiner Interface steuern, darum geht es.
    Die Sprache die ich benutze ist .VB
    FG
    Ing.mh
    Dann sende mal Zahl.ToString.
    Also:

    VB.NET-Quellcode

    1. Dim i as Integer = 40
    2. Sende(i.ToString)

    Deiner Antwort entnehme ich das dein SerialPort, VB seitig, funktioniert.
    Poste mal den Code den du zum senden verwendest.

    ing.mh schrieb:

    aber wenn ich eine Zahl sende funktioniert das nicht.
    Was erwartet die Gegenstelle?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke danke,

    VB.NET-Quellcode

    1. Private Sub V_SET_ValueChanged(sender As Object, e As EventArgs) Handles V_SET.ValueChanged
    2. Dim i As Integer = 40
    3. Write("L", i.ToString)
    4. End Sub
    5. Private Sub F_SET_ValueChanged(sender As Object, e As EventArgs) Handles F_SET.ValueChanged
    6. Dim i As Integer = 40
    7. Write("T", i.ToString)
    8. End Sub


    Aber wie kann Arduino unterscheiden, welcher Wert ist für die Spannung bestimmt und welcher ist für die Frequenz, ich muss zugeben, für mich als Anfänger ist es schwierig diese dinge zu verstehen. :(

    Code-Tags eingefügt. ~Thunderbolt

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Thunderbolt“ ()

    ing.mh schrieb:

    Aber wie kann Arduino unterscheiden
    Indem Du statt der 40 den Wert (.Value) des NumericUpDown-Controls verwendest.
    Was genau macht Write(...)?
    ====
    Über welche Programmiererfahrung verfügst Du?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ing.mh schrieb:

    Aber wie kann Arduino unterscheiden, welcher Wert ist für die Spannung bestimmt und welcher ist für die Frequenz, ich muss zugeben, für mich als Anfänger ist es schwierig diese dinge zu verstehen.

    Tja, poste eben mal das Protokoll.
    Vermute das "L bzw das "T" werden das machen, ist aber ohne die Protokollbeschreibung nur Kaffeesatz Leserei.
    BTW
    Wenn ich dich bitte den Code zu senden, dann sende den doch bitte auch.
    Mir ist nicht klar was "Write" macht.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Me.CenterToParent()
    4. BtnCon.Enabled = False
    5. BtnCon.BringToFront()
    6. BtnDiscon.Enabled = False
    7. BtnDiscon.SendToBack()
    8. CmbBaud.BringToFront()
    9. CmbBaud.SelectedItem = "9600"
    10. U.Enabled = True
    11. U.BringToFront()
    12. nU.Enabled = False
    13. nU.SendToBack()
    14. Dim aw As String
    15. aw = 300
    16. Chart1.Series("Potentiometer").Points.AddY(aw)
    17. Chart1.Series("Potentiometer").IsValueShownAsLabel = False
    18. Chart1.ChartAreas("ChartArea1").AxisX.Enabled = DataVisualization.Charting.AxisEnabled.False
    19. End Sub
    20. Private Sub BtnScanPort_Click(sender As Object, e As EventArgs) Handles BtnScanPort.Click
    21. CmbPort.Items.Clear()
    22. Dim myPort As Array
    23. Dim i As Integer
    24. myPort = IO.Ports.SerialPort.GetPortNames()
    25. CmbPort.Items.AddRange(myPort)
    26. i = CmbPort.Items.Count
    27. i = i - i
    28. Try
    29. CmbPort.SelectedIndex = i
    30. Catch ex As Exception
    31. Dim result As DialogResult
    32. result = MessageBox.Show("com port not detected", "Warning !!!", MessageBoxButtons.OK)
    33. CmbPort.Text = ""
    34. CmbPort.Items.Clear()
    35. Call Form1_Load(Me, e)
    36. End Try
    37. BtnCon.Enabled = True
    38. BtnCon.BringToFront()
    39. CmbPort.DroppedDown = True
    40. End Sub
    41. Private Sub BtnCon_Click(sender As Object, e As EventArgs) Handles BtnCon.Click
    42. BtnCon.Enabled = False
    43. BtnCon.SendToBack()
    44. SerialPort1.BaudRate = CmbBaud.SelectedItem
    45. SerialPort1.PortName = CmbPort.SelectedItem
    46. SerialPort1.Open()
    47. Timer1.Start()
    48. BtnDiscon.Enabled = True
    49. BtnDiscon.BringToFront()
    50. End Sub
    51. Private Sub BtnDiscon_Click(sender As Object, e As EventArgs) Handles BtnDiscon.Click
    52. BtnDiscon.Enabled = False
    53. BtnDiscon.SendToBack()
    54. Timer1.Stop()
    55. SerialPort1.Close()
    56. BtnCon.Enabled = True
    57. BtnCon.BringToFront()
    58. End Sub
    59. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    60. Try
    61. Dim i As Single = SerialPort1.ReadExisting
    62. LblPotentiometer.Text = "rpm :" & i.ToString
    63. U1.Text = "U1 :" & i.ToString
    64. U2.Text = "U2 :" & i.ToString
    65. Chart1.Series("Potentiometer").Points.AddY(i.ToString)
    66. If Chart1.Series(0).Points.Count = 20 Then
    67. Chart1.Series(0).Points.RemoveAt(0)
    68. End If
    69. Chart1.ChartAreas(0).AxisY.Maximum = 400
    70. Catch ex As Exception
    71. End Try
    72. End Sub
    73. Private Sub BtnStart_Click(sender As Object, e As EventArgs) Handles BtnStart.Click
    74. BtnStart.Enabled = False
    75. BtnStart.SendToBack()
    76. SerialPort1.Write("A")
    77. BtnStop.Enabled = True
    78. BtnStop.BringToFront()
    79. End Sub
    80. Private Sub BtnStop_Click(sender As Object, e As EventArgs) Handles BtnStop.Click
    81. BtnStop.Enabled = False
    82. BtnStop.SendToBack()
    83. SerialPort1.Write("a")
    84. BtnStart.Enabled = True
    85. BtnStart.BringToFront()
    86. End Sub
    87. Private Sub V_SET_ValueChanged(sender As Object, e As EventArgs) Handles V_SET.ValueChanged
    88. End Sub
    89. Private Sub F_SET_ValueChanged(sender As Object, e As EventArgs) Handles F_SET.ValueChanged
    90. End Sub
    91. Private Sub U_Click(sender As Object, e As EventArgs) Handles U.Click
    92. U.Enabled = False
    93. U.SendToBack()
    94. SerialPort1.Write("U")
    95. nU.Enabled = True
    96. nU.BringToFront()
    97. End Sub
    98. Private Sub nU_Click(sender As Object, e As EventArgs) Handles nU.Click
    99. nU.Enabled = False
    100. nU.SendToBack()
    101. SerialPort1.Write("u")
    102. U.Enabled = True
    103. U.BringToFront()
    104. End Sub
    105. Private Sub V_Click(sender As Object, e As EventArgs) Handles V.Click
    106. V.Enabled = False
    107. V.SendToBack()
    108. SerialPort1.Write("U")
    109. nV.Enabled = True
    110. nV.BringToFront()
    111. End Sub
    112. Private Sub nV_Click(sender As Object, e As EventArgs) Handles nV.Click
    113. nV.Enabled = False
    114. nV.SendToBack()
    115. SerialPort1.Write("u")
    116. V.Enabled = True
    117. V.BringToFront()
    118. End Sub
    119. Private Sub W_Click(sender As Object, e As EventArgs) Handles W.Click
    120. W.Enabled = False
    121. W.SendToBack()
    122. SerialPort1.Write("U")
    123. nW.Enabled = True
    124. nW.BringToFront()
    125. End Sub
    126. Private Sub nW_Click(sender As Object, e As EventArgs) Handles nW.Click
    127. nW.Enabled = False
    128. nW.SendToBack()
    129. SerialPort1.Write("u")
    130. W.Enabled = True
    131. W.BringToFront()
    132. End Sub
    133. Private Sub UVW_Click(sender As Object, e As EventArgs) Handles UVW.Click
    134. End Sub
    135. Private Sub nUVW_Click(sender As Object, e As EventArgs) Handles nUVW.Click
    136. End Sub
    137. End Class



    Das Problem betrift nur die beiden Sub

    VB.NET-Quellcode

    1. Private Sub V_SET_ValueChanged(sender As Object, e As EventArgs) Handles V_SET.ValueChanged
    2. End Sub
    3. Private Sub F_SET_ValueChanged(sender As Object, e As EventArgs) Handles F_SET.ValueChanged
    4. End Sub


    Arduino Code :
    Spoiler anzeigen

    C#-Quellcode

    1. // Open loop motor control example
    2. #include <SimpleFOC.h>
    3. // BLDC motor & driver instance
    4. // BLDCMotor motor = BLDCMotor(pole pair number);
    5. BLDCMotor motor = BLDCMotor(11);
    6. //BLDCDriver3PWM driver = BLDCDriver3PWM(pwmA, pwmB, pwmC, Enable(optional));
    7. BLDCDriver3PWM driver = BLDCDriver3PWM(9, 5, 6, 8);
    8. // Stepper motor & driver instance
    9. //StepperMotor motor = StepperMotor(50);
    10. //StepperDriver4PWM driver = StepperDriver4PWM(9, 5, 10, 6, 8);
    11. //target variable
    12. float target_velocity = 0;
    13. // instantiate the commander
    14. Commander command = Commander(Serial);
    15. void doTarget(char* cmd) { command.scalar(&target_velocity, cmd); }
    16. void doLimit(char* cmd) { command.scalar(&motor.voltage_limit, cmd); }
    17. void setup() {
    18. // driver config
    19. // power supply voltage [V]
    20. driver.voltage_power_supply = 24;
    21. // limit the maximal dc voltage the driver can set
    22. // as a protection measure for the low-resistance motors
    23. // this value is fixed on startup
    24. driver.voltage_limit = 6;
    25. driver.init();
    26. // link the motor and the driver
    27. motor.linkDriver(&driver);
    28. // limiting motor movements
    29. // limit the voltage to be set to the motor
    30. // start very low for high resistance motors
    31. // currnet = resistance*voltage, so try to be well under 1Amp
    32. motor.voltage_limit = 3; // [V]
    33. // open loop control config
    34. motor.controller = MotionControlType::velocity_openloop;
    35. // init motor hardware
    36. motor.init();
    37. // add target command T
    38. command.add('T', doTarget, "target velocity");
    39. command.add('L', doLimit, "voltage limit");
    40. Serial.begin(9600);
    41. Serial.println("Motor ready!");
    42. Serial.println("Set target velocity [rad/s]");
    43. _delay(1000);
    44. }
    45. void loop() {
    46. // open loop velocity movement
    47. // using motor.voltage_limit and motor.velocity_limit
    48. motor.move(target_velocity);
    49. // user communication
    50. command.run();
    51. delay(100);
    52. }



    CodeTags korrigiert
    aufgrund des Codeumfangs Spoiler hinzugefügt
    ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Hmm, schalte mal Option Strict On und finde, verstehe und bereinige die Fehler.
    @RodFromGermany
    Könntest du bitte mal den Link zu den VS Grundeinstellungen posten, habe den nicht parat.
    Meinst Du den hier? empfohlene VS-Einstellungen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @ing.mh

    in deinem Arduino-Code benutzt du das "Commander Object", das kenn ich zwar noch nicht, hab mir bei GitHub aber gerade ein paar Beispiele angeschaut.
    (Ich hoffe das ich das richtige erwischt habe, weiß nicht ob es noch mehr gibt.)

    Geht das, was du vor hast überhaupt mit dem Commander?
    Wenn ich es richtig verstehe, erkennt der Commander Code-Wörter und ruft dann eine definierte Funktion aus.
    Bei dir wären es die Code-Wörter "T" und "L", du möchtest aber auch noch ein Parameter also Frequenz und Spannung mit geben.
    Kann man das dann noch auslesen wenn die Code-Wörter erkannt wurden?

    In deinem C-Code für Arduino definierst du in den Funktionen, die vom Commander aufgerufen werden, übergebenen Paramete mit char* und Rückgabe Void.
    void doTarget(char* cmd)
    Auf GitHub in dem Beispiel erwartet die Funktion aber ein Commander-Objekt und Bool als Rückgabe
    bool goodbyeHandler(Commander &Cmdr)

    Edit:
    Handelt es sich um die Arduino SimpleFOClibrary mit der Doku bei "docs.simplefoc.com"?
    Dann sieht es so aus als ob der Commander etwas anders funktioniert.

    Läuft dein Arduino Code wenn du in mit dem Serial-Monitor testes, oder hängt es dort auch schon?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SoEinVBler“ ()

    Vielen Dank für tolle und rasche Hilfe,

    das Problem habe ich inzwischen so gelöst.

    VB.NET-Quellcode

    1. Private Sub NumUD_Freq_ValueChanged(sender As Object, e As EventArgs) Handles NumUD_Freq.ValueChanged
    2. Dim str2Send As String
    3. str2Send = "F" & NumUD_Freq.Value.ToString
    4. SendToDevice(str2Send)
    5. End Sub

    Das erste Problem ist gelöst, vielen Dank.

    das nächste Problem ist: wie kann einen Wert vom Arduino seriell zu meiner Interface gezielt senden, sodass diese Wunschwerte genau in der richtigen Stelle dargestellt werden sowie einige davon auch als Chart.

    Arduino code dazu:

    C-Quellcode

    1. ​void loop()
    2. {
    3. motor.move(target_velocity);
    4. command.run();
    5. delay(100);
    6. Phase_U=analogRead(Messwert_U);
    7. //Serial.print("");
    8. Serial.print(Phase_U);
    9. }


    Arduino-Code läuft einwandfrei, der Wert wird dementsprechend seriell gesendet, nur auf meine Interface wird es nicht richtig dargestellt, mehrere duplikate nacheinander und da ich auch andere Werte senden und darstellen möchte, weiß ich gerade nicht mehr wie es weiter geht.

    en schönen Sonntag

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ing.mh“ ()

    Hallo,

    ich weiß nicht was du genau senden möchtest, aber hier mal ein kleines Beispiel wie ich so was schon umgesetzt haben.

    Auf dem Aruduino läuft eine Rennbahn-Steuerung, die Informationen an den PC sendet, wie z.B. die Tankfüllung oder Rundenzeit.
    auf dem Arduion bau ich dann einen String zusammen, der mir die Kennung für die gesendete Information, das Auto und den Wert gibt.
    Am Beispiel Tankfüllung.

    C-Quellcode

    1. Serial.println(String("Tank_" + i+1 + ";" + Tank[i]));


    Tank_
    Kennung für Tanken
    i
    Kennung (index) vom Auto
    ;
    Trennzeichen
    Tank
    Tankfüllung vom entsprechendem Auto


    Auf dem PC empfange ich dann die Daten und "entschlussel" sie.

    VB.NET-Quellcode

    1. indata = sp.ReadLine() ' sp -> Serial Port
    2. x = indata.Split(";")
    3. ...
    4. Dim i As Integer = CInt(x(0).Substring(x(0).Length - 1, 1))


    In X(0) steht dann z.B. Tank_1 und in x(1) dann die Tankfüllung.
    Aus X(0) zieh ich von der letzten Stelle dann noch die Fahrzeugnummer.

    Das ist jetzt nur ein Auszug aus dem Code, anhand der Kennung mach ich dann mit Select Case eine Auswertung ob es um die Tankfüllung oder Rundenzeit etc. geht.
    In dem Case-Zweig kann ich dann den Rest auswerten.
    Eine Lösung ist nun offensichtlich, gibt aber mehere Wege zum Ziel, die einfachste ist wie bereits gezeigt, einen string bilden, die werte getrennt mit z.B. ; und mit zeilenende schreiben, auf VB seite, Zeilenweise einlesen, jede Zeile splitten, werte verarbeiten.