Arduino

  • VB.NET
  • .NET 4.5

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Thunderbolt.

    Hallo Gemeinde,

    leider habe ich ein Problem. Im Bereich Arduino bin ich noch neu.
    Ich versuche über verschiedene Ausgänge eines Arduinos PWM Signale auszugeben.
    Das ganze möchte ich mit einem kleinem Programm vom PC aus steuern.
    Soweit ganz gut. Habe hier auch eine kleine Anleitung gefunden.
    Ein Ausgang funktioniert aber nicht die anderen.
    Leider komme ich nicht weiter und benötige hilfe von den "Wissenden".
    Hier der Code vom Arduino:

    C-Quellcode

    1. int inByte;
    2. char inText1[300];
    3. char inText2[300];
    4. char inText3[300];
    5. char inText4[300];
    6. int outp1;
    7. int outp2;
    8. int outp3;
    9. int outp4;
    10. int index1;
    11. int index2;
    12. int index3;
    13. int index4;
    14. int PWM1 = D5;
    15. int PWM2 = D6;
    16. int PWM3 = D7;
    17. int PWM4 = D8;
    18. void setup() {
    19. Serial.begin(9600);
    20. pinMode(D5, OUTPUT);
    21. pinMode(D6, OUTPUT);
    22. pinMode(D7, OUTPUT);
    23. pinMode(D8, OUTPUT);
    24. int outp1 = 0;
    25. int outp2 = 0;
    26. int outp3 = 0;
    27. int outp4 = 0;
    28. }
    29. void loop(){
    30. if (Serial.available() > 0) {
    31. inByte = Serial.read();
    32. if (inByte == 13) // Wenn das Enter ankommt. PWM1 D5
    33. {
    34. // outp1 = 0;
    35. outp1= atoi(inText1);
    36. analogWrite(PWM1, outp1);
    37. index1 = 0;
    38. memset(&inText1[0], 0, sizeof(inText1));
    39. }
    40. else // Falls kein Enter kommt muss der Text gespeichert werden in dem inText Array
    41. {
    42. if (index1 < 300) { // Diese Überprüfung ist nötig, damit das Array nicht überfüllt wird sonst werden andere Variablen überschrieben.
    43. inText1[index1] = inByte;
    44. index1 += 1;
    45. }
    46. }
    47. if (inByte == 8) // Wenn das Back ankommt. PWM2 D6
    48. {
    49. // outp2 = 0;
    50. outp2= atoi(inText2);
    51. analogWrite(PWM2, outp2);
    52. index2 = 0;
    53. memset(&inText2[0], 0, sizeof(inText2));
    54. }
    55. else // Falls kein Enter kommt muss der Text gespeichert werden in dem inText Array
    56. {
    57. if (index2 < 300) { // Diese Überprüfung ist nötig, damit das Array nicht überfüllt wird sonst werden andere Variablen überschrieben.
    58. inText2[index1] = inByte;
    59. index2 += 1;
    60. }
    61. }
    62. if (inByte == 24) // Wenn das Cancel ankommt. PWM3 D7
    63. {
    64. outp3 = 0;
    65. outp3= atoi(inText3);
    66. analogWrite(PWM3, outp3);
    67. index3 = 0;
    68. memset(&inText3[0], 0, sizeof(inText3));
    69. }
    70. else // Falls kein Enter kommt muss der Text gespeichert werden in dem inText Array
    71. {
    72. if (index3 < 300) { // Diese Überprüfung ist nötig, damit das Array nicht überfüllt wird sonst werden andere Variablen überschrieben.
    73. inText3[index3] = inByte;
    74. index3 += 1;
    75. }
    76. }
    77. if (inByte == 10) // Wenn das lf linefeed ankommt. PWM4 D8
    78. {
    79. outp4 = 0;
    80. outp4= atoi(inText4);
    81. analogWrite(PWM4, outp4);
    82. index4 = 0;
    83. memset(&inText4[0], 0, sizeof(inText4));
    84. }
    85. else // Falls kein Enter kommt muss der Text gespeichert werden in dem inText Array
    86. {
    87. if (index4 < 300) { // Diese Überprüfung ist nötig, damit das Array nicht überfüllt wird sonst werden andere Variablen überschrieben.
    88. inText4[index4] = inByte;
    89. index4 += 1;
    90. }
    91. }
    92. }
    93. }


    hier der Code von VB2010:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim ser As New System.IO.Ports.SerialPort
    3. Dim Scro As Integer
    4. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    5. Scro = 0
    6. ser.WriteLine(Scro & vbCr)
    7. ser.Close()
    8. End Sub
    9. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    10. ser.BaudRate = 9600
    11. ser.PortName = "COM6"
    12. ser.Open()
    13. End Sub
    14. Private Sub HScrollBar1_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles HScrollBar1.Scroll
    15. Label1.Text = HScrollBar1.Value.ToString
    16. ser.WriteLine(HScrollBar1.Value & vbCr)
    17. End Sub
    18. Private Sub HScrollBar2_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles HScrollBar2.Scroll
    19. Label2.Text = HScrollBar2.Value.ToString
    20. ser.WriteLine(HScrollBar2.Value.ToString & vbBack)
    21. End Sub
    22. Private Sub HScrollBar3_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles HScrollBar3.Scroll
    23. Label3.Text = HScrollBar3.Value.ToString
    24. ser.WriteLine(HScrollBar3.Value & vbCancel)
    25. End Sub
    26. Private Sub HScrollBar4_Scroll(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles HScrollBar4.Scroll
    27. Label4.Text = HScrollBar4.Value.ToString
    28. ser.WriteLine(HScrollBar4.Value.ToString & vbLf)
    29. End Sub
    30. End Class


    Ich weiß nicht mehr weiter. Könnt Ihr mir bitte helfen? || Danke
    @s_ollis Was sagt das Handbuch, was der Arduino für Zeilenenden erwartet?
    Du hast da ein interessantes Gemisch aus VB-Steuerzeichen und dem standardmäßigen Environment.Newline.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Hallo RodFromGermany.
    Anhand das ich z.B. nach dem Wert eine "Enter" übertrage, sollte eigendlich der Arduino erkennen um welchen PWM Ausgang es sich handelt.
    Die Lösung scheint aber nicht die beste wenn ich mehere Ausgänge unabhängig bedienen möchte.
    Der Gedankenanstoß kam durch @ebrithil und dieser Anleitung:
    vb-paradise.de/index.php/Threa…itertes-Arduino-Tutorial/

    Ich fange auch neu an, brauche nur Infos wie ich mein vorhaben am besten verwirkliche.

    RodFromGermany schrieb:

    was der Arduino für Zeilenenden erwartet
    Gar keine, die Logik, Zeilen aus dem Bytestrom zu lesen, muss man selbst implementieren (oder eine Library verwenden, das ist hier aber nicht der Fall).

    s_ollis schrieb:

    Ein Ausgang funktioniert aber nicht die anderen
    Das liegt daran, dass du hier immer auf inText4 schreibst, in deinen PWM-Aktionen aber jeweils inText1 bis inText4 verwendest. Stattdessen wäre es sinnvoll, einen Textspeicher zu verwenden, den zu füllen und dann als Zahl zu lesen. Im VB-Code schickst du immer mit WriteLine. Das hängt immer \r\n (bestehend aus den Bytes 13 und 10) an den gesendeten String an. Da das bei dir aber spezielle Steuerzeichen sind und du keine Zeilen an sich liest, solltest du Write verwenden, weil sonst immer Kanal 1 und 4 mit leeren Strings gesetzt werden. Das memset kannst du dir übrigens sparen, wenn du vor dem atoi-Call das Byte nach dem letzten Zeichen (den Index speicherst du ja schon fleißig mit) auf 0 (Null) setzt.
    Mit freundlichen Grüßen,
    Thunderbolt