DC Motor ansteuern über Arduino und Visual Basic

Hallo,
ich bin dabeie eine Motoransteuerung zu entwerfen. Der Plan ist, dass ich mit VB eine Oberflächer erstelle, auf der ich die RIchtung und Geschwindigkeit des Motors einstellen kann.
Dh. ich schicke über VB Befehle an die serielle Schnittstelle und der Arduino wertet diese dann entsprechend aus aus lässt den Motor drehen.
So weit so gut!
Das Problem ist, dass ich nur ein mal am Anfang die Richtung festlegen kann, danach tut sich mit dem Richtungumkehr nichts mehr, währen der PWM-Wert jedoch weiterhin variiert werden kann.
Wo liegt das Problem?
Am Arduino-Sketch oder VB-SketcH?

Arduino:

#define MOTOR_IN1 9
#define MOTOR_IN2 10
enum ZUSTAND {links, rechts, aus};
ZUSTAND zustand;

uint16_t pwm = 0;

void setup() {
 Serial.begin(115200);
 pinMode(MOTOR_IN1, OUTPUT);
 pinMode(MOTOR_IN2, OUTPUT);
 zustand = aus;
}

void motor () {
 switch (zustand) {
   case links:
     pwm = Serial.parseInt ();
     analogWrite (MOTOR_IN2, pwm);
     digitalWrite (MOTOR_IN1, LOW);
     break;
   case rechts:
     pwm = Serial.parseInt ();
     analogWrite (MOTOR_IN1, pwm);
     digitalWrite (MOTOR_IN2, LOW);
     break;
   case aus:
     digitalWrite (MOTOR_IN2, LOW);
     digitalWrite (MOTOR_IN1, LOW);
     break;
 }
}

void gui () {
 int serialByte = Serial.read ();
 if (serialByte == 'r') {
   zustand = rechts;
 }
 if (serialByte == 'l') {
   zustand = links;
 }
 if (serialByte == 'a') {
   zustand = aus;
 }
}





void loop () {
 
 gui();
 motor ();
}




VB:

Public Class Form1
   Dim pwm As Integer
   Dim zustand As Char

   Private Sub RadioButton1_CheckedChanged(sender As Object, e As EventArgs) Handles Links.CheckedChanged
       zustand = "l"
   End Sub

   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       SerialPort1.PortName = "COM11"
       SerialPort1.BaudRate = "115200"
       SerialPort1.Open()
   End Sub

   Private Sub Rechts_CheckedChanged(sender As Object, e As EventArgs) Handles Rechts.CheckedChanged
       zustand = "r"
   End Sub

   Private Sub Aus_CheckedChanged(sender As Object, e As EventArgs) Handles Aus.CheckedChanged
       zustand = "a"
   End Sub

   Private Sub drehzahl_TextChanged(sender As Object, e As EventArgs) Handles drehzahl.TextChanged
       pwm = drehzahl.Text
   End Sub

   Private Sub send_Click(sender As Object, e As EventArgs) Handles send.Click
       SerialPort1.Write(zustand)
       SerialPort1.Write(pwm)

   End Sub
End Class

Danke!

y.PNG

Hallo,

warum testest Du das nicht zunächst mal mit dem Monitor der IDE. Da kannst Du auch auch Werte eingeben. Dann kannst Du dir mit Serial.print werte ausgeben lassen und damit dem Fehler einkreisen. Wenn dann alles so laüft wie du dir das vorstellt hängst Du das VB Ding dran.

Heinz

talha74:
Wo liegt das Problem?

Zunächst ist das Problem, dass Dein Code so kaum lesbar ist. Fasse ihn bitte in Code-Tags. Nach > 10 Postings solltest Du das wirklich draufhaben :wink:

Gruß

Gregor

gregorss:
Zunächst ist das Problem, dass Dein Code so kaum lesbar ist. Fasse ihn bitte in Code-Tags. Nach > 10 Postings solltest Du das wirklich draufhaben :wink:

Gruß

Gregor

Oh sorry. Aber dafür habe ich die Bilder angehängt.

Hallo,

Also die Bilder sind nicht besonders optimal, ich werd sicher keine OCR Software anwerfen um den halben Code irgendwie, irgendwo reinzubekommen. :wink:

Dieses "enum" verkompliziert imho das Ganze noch und das Du "l", "r" also Characters verwendest, macht es noch etwas komplexer sag ich mal, Du solltest Dir für den ersten Versuch einfach mal die empfangen Daten ausgeben. (Entweder einfach die LED(13) ein/aus schalten oder alles wieder zurückschicken, dann brauchst Du aber auch noch ein Feld in Deinem Win Tool. Hier könntest Du später irgendwelche Sensor Daten ausgeben lassen.

Schau mal:

pwm = Serial.parseInt ();
     analogWrite (MOTOR_IN2, pwm);
     digitalWrite (MOTOR_IN1, LOW);
     break;

Einen H-Treiber steuert man mit 3 Pins!!! Ich finde im ganzen Code kein digitalWrite(pin, HIGH); das wird so nicht funktionieren.
Da ich Deine Verkabelung nicht kenne, kann ich Dir nicht sagen was falsch bzw. nicht verbunden ist.
Welchen Motor Treiber verwendest Du?

Damit ein Motor läuft muss das ungefähr so ausschauen:

pwm = Serial.parseInt ();
     analogWrite (MOTOR_EN, pwm);
     digitalWrite (MOTOR_IN1, LOW); // Einen auf LOW
     digitalWrite (MOTOR_IN2, HIGH); // Den anderen auf HIGH
// Und wenn die pwm Zahl nicht unter ~50 ist, sollte er laufen.
// Zum umpolen:
     digitalWrite (MOTOR_IN1, HIGH);
     digitalWrite (MOTOR_IN2, LOW);
     break;

Das sollte für den Anfang hoffentlich Helfen.

Grüße,
Donny

talha74:
Oh sorry. Aber dafür habe ich die Bilder angehängt.

Meinst Du, dass wir die Bilder zum Testen abtippen? Vergiss es.

Gruß Tommy