Hi
klappt leider auch nicht, bekomme wieder nur ein fiepen weil der Pmw Wert durch den Ascii Code um die 50 liegt (denke ich)
Trotzdem Danke für deinen Versuch
Gruß
Hi
klappt leider auch nicht, bekomme wieder nur ein fiepen weil der Pmw Wert durch den Ascii Code um die 50 liegt (denke ich)
Trotzdem Danke für deinen Versuch
Gruß
Geändert von Flexgate (05.08.2011 um 22:29 Uhr)
Also bei mir klappt es im Test mit einer LED einwandfrei und ich bekomme auch die Drehrichtung zurück.
Eingabeformat:
1) + oder - senden
2) Geschwindigkeit senden
wenn ich als Geschwindigkeit 200 angebe, leuchtet die LED deutlich.
Bevor du die Drehrichtung änderst, musst du immer ein Komma senden, damit der Motor angehalten wird. Dann kannst du wieder die Drehichtung und Geschwindigkeit festlegen.
Bei der Ansteuerung von Motoren verwendet man häufig Rampen zum kontrollierten Beschleunigen und Abbremsen der Motoren, um Stromspitzen zu vermeiden. Ich poste nochmal einen Code, der Rampen zum Beschleunigen und Abbremsen der Motoren verwendet.
Code:char eingabe = 's'; int geschwindigkeit = 0; void setup(){ Serial.begin(9600); pinMode(11, OUTPUT); pinMode(10, OUTPUT); pinMode(9, OUTPUT); } void loop(){ if (Serial.available()){ eingabe = Serial.read(); } if (eingabe == '+'){ // zuerst überprüfen, ob vorwärts oder rückwarts gefahren werden soll if(Serial.available()){ geschwindigkeit = Serial.read(); // nochmals auf eine Eingabe der Geschwindigkeit warten digitalWrite(10, LOW); // digitalWrite(9, HIGH); // for(int i = 0; i <= geschwindigkeit; i = i + 10){ analogWrite(11, i); // Nun den eingegebenen Wert in das Timer PWM-Register schreiben = Geschwindigkeit regeln delay(20); } Serial.println("LINKS"); } } if (eingabe == '-'){ // dasselbe für Rückwärtsfahrt if(Serial.available()){ geschwindigkeit = Serial.read(); digitalWrite(10, HIGH); // digitalWrite(9, LOW); // for(int i = 0; i <= geschwindigkeit; i = i + 10){ analogWrite(11, i); // Nun den eingegebenen Wert in das Timer PWM-Register schreiben = Geschwindigkeit regeln delay(20); } Serial.println("RECHTS"); } } if (eingabe == ','){ for(int i = geschwindigkeit; i >= 0; i = i - 10){ analogWrite(11, i); // Nun den eingegebenen Wert in das Timer PWM-Register schreiben = Geschwindigkeit regeln delay(20); } geschwindigkeit = 0; Serial.println("STOP"); eingabe = 's'; } }
Geändert von Torrentula (06.08.2011 um 08:54 Uhr)
MfG Torrentula
Gibt es denn bei C keinen Befehl mit den aus einem ASCII String eine integer Zahl gemacht werden kann?
Gruß RichardCode:$regfile = "m48def.dat" ' specify the used micro $crystal = 8000000 ' used crystal frequency $baud = 19200 ' use baud rate $hwstack = 32 ' default use 32 for the hardware stack $swstack = 10 ' default use 10 for the SW stack $framesize = 40 ' default use 40 for the frame space Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0 Dim A As Byte , S As String * 10 S = "123" A = Val(s) 'convert string Print A ' 123 End
Doch schon: atoi();Gibt es denn bei C keinen Befehl mit den aus einem ASCII String eine integer Zahl gemacht werden kann?
Aber im Falle des Arduino passiert das automatisch, wenn man die Konsoleneingabe in einen Integer einliest. Und wenn man die Konsoleneingabe in ein char einliest, dann wird diese als ASCII-Zeichen gespeichert. Wenn man die Eingabe in einen String einliest, dann wird diese al String gespeichert.Code:char string[20] = "123"; int Integer; Integer = atoi(string); Serial.println(Integer);
Deswegen ist es auch einfacher mit der Arduino IDE zu programmieren. Man muss sich nicht ständig um Datentyp-Konvertierungen gedanken machen, wenn man Daten einliest bzw. Daten ausgibt.
Die Arduino IDE nimmt einem ein ganzes Stück arbeit ab. Wenn sie dies nicht tun würde, müsste man sich in dem Code oben auch noch um die PWM-Erzeugung, die includes und und und kümmern.
MfG Torrentula
Dann verstehe ich das Problem nicht richtig, Der PWM Wert ist hier ja nicht z.b. int 128 sondern der ASCII wert 49 DEZ 1. Also nur die 1. Stelle von 128. Man muss also einen String "128" empfangen und dann in eine Zahl wandeln, dann sollte auch der richtige Wert im PWM Register landen?
Irgendwann muss ich mich doch noch einmal um C kümmern.Wenn bloß die Tastaturbelegung mit den ganzen () {} [] nicht wäre.
Gruß Richard
Geändert von Richard (06.08.2011 um 10:45 Uhr)
Hi
erst mal danke für eure Antworten.
Hab beide Codes von Torrentula kopiert und ausgeführt.
Beim ersten kommt nur ein Fiepen, beim 2ten passiert leider gar nix. Führe ich meinen zweiten Code aus können mit 200+ \ 180- \ 255+ die Motoren gesteuert werden. Also an der Schaltung liegt es nicht.
Ich kann mich leider erst Morgen damit weiter beschäftigen weil ich gleich auf Tour bin.
Gruß
Geändert von Flexgate (06.08.2011 um 11:17 Uhr)
Irgendwie ist die Konvertierung von ASCII zu integer komisch.... deswegen auch die Lösung mit separaten Eingaben... allerdings zickt mein Programm auch ein wenig rum, manchmal übernimmt es keine Werte
Zum Verzweifeln
Torrentula
MfG Torrentula
Hi
das ganze funktioniert auch ganz gut mit Firmata, hier downloaden:
http://firmata.org/wiki/Main_Page
in der Arduino IDE 0022 mit dem Uno folgenden Sketch öffnen und auf das Board hochladen: (mit dem Uno erscheinen nur mit diesem Sketch Buttons in Firmata)
File -> Examples -> Firmata -> StandardFirmata_2_2_forUNO_0_3
Danach die Firmata.exe als Admin ausführen und den richtigen Com Port auswählen.
Anschließend kann in der Software per Mausklick High \ Low \ PMW eingestellt werden.
siehe:
http://firmata.org/wiki/File:Firmata...screenshot.png
Gruß
Geändert von Flexgate (09.08.2011 um 17:55 Uhr)
Moin
ich müsste einen servo dazu bringen, das die bewegungsgeschwindichkeit mit einem poti einstellbar ist.kann mir da jemand helfen. Please
Lesezeichen