Code ändern bei gleicher funktionalität
-
Hallo Leute,
Ich brauche Hilfe:Ich habe diesen ursprünglichen funktionierenden Arduino Code:
Funktion von Code:
Die Potis bei dem ersten Arduino steuern die Servos bei den zweiten Arduino.
Der zweite Arduino empfängt Signale von den ersten Arduino via RS232,beim zweiten Arduino werden die Signale in zahlen konvertiert und einen bestimmten Digitalen Ausgang zugeordnet.
An den Ausgängen sind Servos angeschlossen.Erklärung:
Es kommen werte in den zweiten Arduino über Rs232 Schnittstelle rein wie:
1500a
2000b
Anhand der Buchstaben ordnet der Code die Zahl einen bestimmten Digitalen Ausgang zu. Die Zahl wird dann als PWM-Signal an die Servos raus gehauen.Ich möchte den Code ein wenig umändern.
Der ursprüngliche Code:
//zoomkat 11-22-12 simple delimited ',' string parse //from serial port input (via serial monitor) //and print result out serial port //multi servos added // Powering a servo from the arduino usually *DOES NOT WORK*. String readString; #include <Servo.h> Servo myservoa, myservob, myservoc, myservod; // create servo object to control a servo void setup() { Serial.begin(9600); //myservoa.writeMicroseconds(1500); //set initial servo position if desired myservoa.attach(6); //the pin for the servoa control myservob.attach(7); //the pin for the servob control myservoc.attach(8); //the pin for the servoc control myservod.attach(9); //the pin for the servod control Serial.println("multi-servo-delimit-test-dual-input-11-22-12"); // so I can keep track of what is loaded } void loop() { //expect single strings like 700a, or 1500c, or 2000d, //or like 30c, or 90a, or 180d, //or combined like 30c,180b,70a,120d, if (Serial.available()) { char c = Serial.read(); //gets one byte from serial buffer if (c == ',') { if (readString.length() >1) { Serial.println(readString); //prints string to serial port out int n = readString.toInt(); //convert readString into a number // auto select appropriate value, copied from someone elses code. if(n >= 500) { Serial.print("writing Microseconds: "); Serial.println(n); if(readString.indexOf('a') >0) myservoa.writeMicroseconds(n); if(readString.indexOf('b') >0) myservob.writeMicroseconds(n); if(readString.indexOf('c') >0) myservoc.writeMicroseconds(n); if(readString.indexOf('d') >0) myservod.writeMicroseconds(n); } else { Serial.print("writing Angle: "); Serial.println(n); if(readString.indexOf('a') >0) myservoa.write(n); if(readString.indexOf('b') >0) myservob.write(n); if(readString.indexOf('c') >0) myservoc.write(n); if(readString.indexOf('d') >0) myservod.write(n); } readString=""; //clears variable for new input } } else { readString += c; //makes the string readString } } }
Der geänderte Code:
//zoomkat 11-22-12 simple delimited ',' string parse //from serial port input (via serial monitor) //and print result out serial port //multi servos added // Powering a servo from the arduino usually *DOES NOT WORK*. String readString; #include <Servo.h> Servo myservoa, myservob, myservoc, myservod; // create servo object to control a servo void setup() { Serial.begin(9600); //myservoa.writeMicroseconds(1500); //set initial servo position if desired myservoa.attach(6); //the pin for the servoa control myservob.attach(7); //the pin for the servob control myservoc.attach(8); //the pin for the servoc control myservod.attach(9); //the pin for the servod control Serial.println("multi-servo-delimit-test-dual-input-11-22-12"); // so I can keep track of what is loaded } void loop() { //expect single strings like 700a, or 1500c, or 2000d, //or like 30c, or 90a, or 180d, //or combined like 30c,180b,70a,120d, if (Serial.available()) { char c = Serial.read(); //gets one byte from serial buffer if (c == ',') { if (readString.length() >1) { Serial.println(readString); //prints string to serial port out int n = readString.toInt(); //convert readString into a number // auto select appropriate value, copied from someone elses code. if(n >= 500) { Serial.print("writing Microseconds: "); Serial.println(n); if(readString.indexOf('a') >0) { n = map(n, 0, 1023, 0, 180); myservoa.write(n); } /* Ein Werte kommt in Arduino rein, zb.889a, dieser Wert soll dementsprechend zugeordnet werden, dann soll die Lineare Rechnung folgen: "(n, 0, 1023, 0, 180)", als letztes soll der Signal rausgehen : myservoa.write(n); Was mache ich falsch? */ if(readString.indexOf('b') >0) myservob.writeMicroseconds(n); { n = map(n, 0, 1023, 0, 180); myservoa.write(n); } if(readString.indexOf('c') >0) myservoc.writeMicroseconds(n); { n = map(n, 0, 1023, 0, 180); myservoa.write(n); } if(readString.indexOf('d') >0) myservod.writeMicroseconds(n); { n = map(n, 0, 1023, 0, 180); myservoa.write(n); } } readString=""; //clears variable for new input } } else { readString += c; //makes the string readString } } }
Für jede Hilfe bin ich dankbar
-
Ohne Arduino zu kennen, das hier ist merkwürdig, vermutlich sitzt die { zu weit unten.
if(readString.indexOf('b') >0) myservob.writeMicroseconds(n); { n = map(n, 0, 1023, 0, 180); myservoa.write(n); }
heisst: wenn indexOf('b')>0 dann führe writeµs aus. Der Block danach wird IMMER ausgeführt.
-
Was Du falsch machst, ist die Codeformatierung, und per Copy und paste progerammieren.
if(readString.indexOf('b') >0) myservob.writeMicroseconds(n); { n = map(n, 0, 1023, 0, 180); myservoa.write(n); } if(readString.indexOf('c') >0) myservoc.writeMicroseconds(n); { n = map(n, 0, 1023, 0, 180); myservoa.write(n); } if(readString.indexOf('d') >0) myservod.writeMicroseconds(n); { n = map(n, 0, 1023, 0, 180); myservoa.write(n); }
Das ist jawohl Quark.
Ansonsten: bist Du sicher das Du das Protokoll richtig verstanden hast?
Das Protokoll erwartet immer ein Komma hintendran und unterscheidet zusätzlich noch zwischen Werten >=500 und allen anderen.
Das ist alles recht halbgar.
Überleg, ob Du nicht ein wenig Grips investierst und das Protokoll verbesserst.
-
Hierbei zeigt der IDE von Arduino keine Fehler an:
(Die werte habe ich dementsprechend geändert, sodass Werte ab 1 bearbeitet werden können)if(readString.indexOf('b') >0) { n = map(n, 1, 1023, 1, 180); myservoa.write(n); }
oder
if(readString.indexOf('b') >0) n = map(n, 1, 1023, 1, 180),myservoa.write(n);
Mein Code funktioniert trotzdem nicht. (Der Ursprüngliche Code funktioniert nicht Optimal)
Kann sein, das dass beide dasselbe ist, nur unterschiedlich geschrieben // bin c-neuling
Jedenfalls bedanke ich mich eure Antworten.Wahrscheinlich werde ich einen "Auftragsarbeit" anfertigen, falls jemand lust hat, bei meinen "Projekt" zu helfen
so kann er Augen offen halten und bei Projekte nachschauen. Leckerlis gibt es als Belohnung.
-
if(readString.indexOf('b') >0) n = map(n, 1, 1023, 1, 180),myservoa.write(n);
Das ist gültiges C?