Arduino als Steuereinheit für Roboter

Moin!
Ich habe einen Roboter programmiert. Habe dazu nun eine Fernbedienung gebaut, welche aber nur 2 Taster besitzt.

Bisher folgender Ablauf:
Roboter wird über Schalter am Gehäuse vom Roboter eingeschaltet.
Taster A lässt Motor A laufen, Taster B Motor B, beide zusammen dementsprechend lassen beide Motoren laufen. Motor A - Roboter dreht sich, Motor B - Roboter dreht sich in die andere Richtung.
Gesteuer wird alles über PMW Signale via L293D Baustein.

Wie kann ich nun eine Rückwärtsfunktion ohne Erweiterung der Hardware programmieren?
ich habe an eine Tastenkombination o.Ä. gedacht, weiß aber nicht, wie ich das realisieren kann.

/*Motor links
*/

int enablePin10 = 11;
int inPin10 = 10;
int inPin20 = 9;
int switchPin10 = 7;
int potPin10 = 0;

/*Motor rechts
*/
int enablePin11 = 6;
int inPin11 = 5;
int inPin21 = 3;
int switchPin11 = 4;
int potPin11 = 1;

void setup()
/*Motor links
*/
{
pinMode(inPin10, OUTPUT);
pinMode(inPin20, OUTPUT);
pinMode(enablePin10, OUTPUT);
pinMode(switchPin10, INPUT_PULLUP);

/*Motor rechts
*/

pinMode(inPin11, OUTPUT);
pinMode(inPin21, OUTPUT);
pinMode(enablePin11, OUTPUT);
pinMode(switchPin11, INPUT_PULLUP);
}
void loop()
{
{
if (digitalRead(switchPin11)==LOW){
digitalWrite(inPin10, HIGH);
}
{
if (digitalRead(switchPin10)==LOW){
digitalWrite(inPin11, HIGH);
}
{
if (digitalRead(switchPin11)==HIGH){
digitalWrite(inPin10, LOW);
}
{
if (digitalRead(switchPin10)==HIGH){
digitalWrite(inPin11, LOW);
}
}
}
}
}
{
int speed = analogRead(potPin10) / 4;
boolean reverse = digitalRead(switchPin10);
setMotor(speed, reverse);
{
int speed = analogRead(potPin11) / 4;
boolean reverse = digitalRead(switchPin11);
setMotor(speed, reverse);
}
}
}
void setMotor(int speed, boolean reverse)
{
{
analogWrite(enablePin10, speed);

}
{
analogWrite(enablePin11, speed);

}
}

Wie kann ich nun eine Rückwärtsfunktion ohne Erweiterung der Hardware programmieren?

Das ist erstmal weder eine Frage der Motoren noch des Arduino, sondern der Logik.

Taster kann man kurz oder lang drücken ( evtl. auch "ganz kurz") , zur Not kann es einen Unterschied machen, ob man zusätzlich zu einem Taster einen zweiten drückt...

Ausserdem hast du noch zwei Potis in deinem Sketch, die kannst du evtl auch für Vorwärts/Rückwärts missbrauchen.

Du musst dir erstmal überlegen, was du genau willst. Dann können wir diskutieren, ob das sinnvoll ist, oder zur Not auch ( :wink: ), wie es zu realisieren ist

Übrigens: Zum auf der Stelle drehen musst du einen Motor vorwärts, den andern gleichzeitig rückwärts laufen lassen..

Und deine "Fern"-Steuerung ist ziemlich nah und kabelgebunden, stimmts ?

wie Michael schon sagt: erstmal musst Du überlegen, was genau Du haben willst. Vorschlag: mit einem kurzen Doppelklick auf eine Taste (ähnlich wie bei der Maus) schaltet man die Drehrichtung des Motors um. Bei einem einfachen kurzen (oder langen) Klick wird der Motor einfach in der vorher ausgewählten Richtung bewegt.

Bitte als erstes mal in die Code Tags deinen Code.
Andere Logik Beschaltung:
Taster A vorwärts
Taster B rückwärts
Taster A und dazu Taster B linksrum
Taster B und dazu Taser A rechtsrum

Gruß
DerDani

Taster A vorwärts
Taster B rückwärts
Taster A und dazu Taster B linksrum
Taster B und dazu Taster A rechtsrum

Im dritten Fall dreht der Roboter vorwärtsfahrend nach links ( gegen den Uhrzeigersinn ).
Im vierten Fall rückwärtsfahrend nach rechts (mit dem Uhrzeiger)
Braucht also in jedem Fall Platz auf der Steuerbordseite (das ist, unabhängig von der aktuellen Fahrtrichtung, nach "vorne" schauend links)

Egal, finde ich etwas beschränkt und nicht sehr intuitiv.

@mgcss:
Richtig: "Doppelklick" gibt es auch noch. Man sollte allerdings dann per LED die voreingestellte Richtung signalisieren.

Sind die Potis nur zum Trimmen, oder könnte man die nicht generell zum Steuern nehmen. ( Ganz ohne Taster ) ?

Du solltest weniger überflüssige geschweifte Klammern verwenden.

Du solltest deinen Variablen bessere Namen geben, dann kann man den Kode viel leichter lesen und sich viele Kommentare sparen.

Du solltest keinen RAM verschwenden und Konstanten als const definieren.

Wenn man nach den Regeln deinen eingangs geposteten Kode behandelt, könnte sich etwa das ergeben

const byte linksPWM = 11;
const byte linksDirA = 10;
const byte linksDirB = 9;
const byte linksTaste = 7;
const byte linksPoti = A0;

const byte rechtsPWM = 6;
const byte rechtsDirA = 5;
const byte rechtsDirB = 3;
const byte rechtsTaste = 4;
const byte rechtsPoti = A1;

void setup() {
  pinMode(linksDirA, OUTPUT);
  pinMode(linksDirB, OUTPUT);
  pinMode(linksPWM, OUTPUT);
  pinMode(linksTaste, INPUT_PULLUP);

  pinMode(rechtsDirA, OUTPUT);
  pinMode(rechtsDirB, OUTPUT);
  pinMode(rechtsPWM, OUTPUT);
  pinMode(rechtsTaste, INPUT_PULLUP);
}

void loop() {
  digitalWrite(linksDirA, !digitalRead(rechtsTaste));
  digitalWrite(rechtsDirA, !digitalRead(rechtsTaste));
  setMotor(analogRead(linksPoti) / 4, digitalRead(linksTaste));
  setMotor(analogRead(rechtsPoti) / 4, digitalRead(rechtsTaste));
}

void setMotor(int speed, boolean reverse) {
  analogWrite(linksPWM, speed);
  analogWrite(rechtsPWM, speed);
}

Da kann man jetzt leichter sehen, was deine 'Fernbedienung' wirklich macht...

Warum macht setMotor auf beiden Motoren rum?
Wenn das gewünscht ist, warum heisst die Funktion dann nicht setMotors?
Warum kümmert sich die Funktion nicht um den reverse Parameter?
Welche der Motoren sollte der betreffen?

Roboter ist ein fettes Wort für einen Panzer.
Oder was ist das mehr als eine Panzersteuerung?

Wenn das gewünscht ist, warum heisst die Funktion dann nicht setMotors?

Das kann nicht gewünscht sein, denn warum wird die Funktion zweimal mit verschiedenen Potis aufgerufen ?

Und dass LinksDirA und RechtsDirA immer gleich sind, RechtsDirB und LinksDirB aber nie gesetzt werden, sieht man mit den neuen Namen auch leicht, und gibt auf...