Fahrtenregler?!

Hallo, ich möchte mir mit Arduino einen eigenen Fahrtenregler für Modellpanzer bauen.
Ich habe mir eine kleine Schaltung mit Motor, Potentiometer und co bereits gebaut, möchte jedoch mit dem Potentiometer Drehrichtung und Geschwindigkeit des Motors steuern. Ich gehe davon aus das man das Potentiometer um etwa 300° drehen kann, ich würde den IC gern so programmieren das wenn das Potentiometer zwischen 145° und 155° steht dass garnichts passiert. Wenn es jetzt z.B. bei 156° steht soll es bis 300° die Geschwindigkeit immer höher stellen und den Motor links drehen lassen,unter 145° genau andersrumm.
Mein Problem jedoch ist das ich nicht wirklich weis wie ich das verwirklichen soll, ein bischen was
getippt habe ich schon, der Motor dreht hier nur in eine Richtung.

int motor_A=5;
int motor_B=4;
int potPin = 0;
void setup()
{
}
void loop()
{
int value = analogRead(potPin);
int motor_Av = map(value,0,1023,0,255);
int motor_Bv = map(value,0,1023,255,0);
analogWrite(motor_A,motor_Av);
analogWrite(motor_B,motor_Bv);
}

//Edit: Ich benutze den Motortreiber: L293DNE

Schaltung.fzz (6.86 KB)

ich denke, du kannst hier mit If-Zweigen arbeiten.

Zuerst muß du die AD-Werte ausmessen, die du bei 145° bzw 155° kriegst

const int AD_145 = 450;  // nur geraten
const in AD_155 = 550;

Dann prüfst du ab in welchem Bereich du bist, und steuerst entsprechend den Motor an.

 int value = analogRead(potPin);       
  if (value > AD_155){    
      // PWM für Brücken ausgeben
  } else if ((value < AD_145){    
      // PWM für Brücken ausgeben
  } else {    
    analogWrite(motor_A,0);              
    analogWrite(motor_B,0);

Vielen Dank für den Tipp.
Ich habe mein "Programm" ein wenig umgetippt:
int motor_A=5;
int motor_B=4;
int potPin = 0;
void setup()
{
}
void loop()
{
const int AD_145 = 450; // nur geraten
const int AD_155 = 550;
int value = analogRead(potPin);
int motor_Av = map(value,0,1023,0,255);
int motor_Bv = map(value,0,1023,255,0);
if (value > AD_155)
{
analogWrite(motor_A,motor_Av);
analogWrite(motor_B,motor_Bv);
}
else if ((value < AD_145))
{
analogWrite(motor_A,motor_Bv);
analogWrite(motor_B,motor_Av);
}
else
{
analogWrite(motor_A,0);
analogWrite(motor_B,0);
}
}

Jetzt jedoch dreht er nur innerhalb von 145° und 155° und auch hier nur in die selbe Richtung.

@Knick, du weißt aber schon, was eine Panzerlenkung ist oder? :smiley:

Rechts drehen heißt Links mehr Power als Rechts. Links drehen Rechts mehr Power als Links.

Es gibt Potis, die "zurückschwingend". Heißt schwingen immer wieder in die Mittelstellung.

Alternativ könntest du auch 2 Playstation Potis benutzen. Vor und zurück für die Fahrtrichtung je Motor und Links und Rechts beim ersten für Kabine links rechts und beim anderen für Hoch runter.

Das ist mir klar, jedoch möchte ich es erst einmal mit einem einzigem Motor ausprobieren.
Später möchte ich dann mit einem Poti vorwärts oder rückwärts und mit einem anderen dann das Lenken übernehmen, oder habt ihr eine andere Idee? Das eine Poti dient ja der Richtung und der Geschwindigkeit, das andere ist sozusagen nur dazu da um die Gesammtgeschwindigkeit das Motors runter zu nehmen wenn ich in eine Kurve fahre, welches man doch auch später im Programm abfragen kann.Ich benutze die selben Potis wie sie im Fritzing Creator Kit vorhanden sind...

Potis aus dem Fritzing Creator Kit Kenne ich nicht. Finde die Idee wie du die Regelung machen willst eher nicht so prickelnd. Das ist ja gerade das interessante an der Panzerlenkung. Klar, kann man das evtl. auch mit einem Joystick lösen.

Erst mal eine prinzipielle Sache:

Code fügst du am besten mit den Code-Tags "#" ein.

Mit ist nicht ganz klar wie du den Motor steuerst.

Aber ich denke, du must den map Befehl innerhalb der einzelnen IF zweige anpassen.

z.B. so:

 int motor_Av = map(value,AD_155,1023,0,255);    
  int motor_Bv = map(value,AD_155,1023,255,0);

Stimmt den diene Hardware?
Also kannst du mit manuellen Befehlen den Motor in beide Richtungen drehen lassen?

Wenn ich den Motor ohne das Poti mit einem Beispielprogramm laufen lasse dann dreht er auch nicht in beide Richtungen:

/*
  Motor
  dreht einen Motor erst rechts, dann links herum
  
  Dieses Beispiel aus dem Fritzing Creator Kit: www.fritzing.org/creator-kit.
*/

int motor_A=5;
int motor_B=4;
int motor_Speed=3;

void setup(){
  pinMode(motor_A,OUTPUT);
  pinMode(motor_B,OUTPUT);
}

void loop(){
  digitalWrite(motor_A,HIGH); 
  digitalWrite(motor_B,LOW);
  for (int i=0; i<256; i+=5){
    analogWrite(motor_Speed,i); 
    delay(20);
  }
  for (int i=255; i>0; i-=5){
    analogWrite(motor_Speed,i); 
    delay(20);
  }

  digitalWrite(motor_A,LOW); 
  digitalWrite(motor_B,HIGH);
  for (int i=0; i<256; i+=5){
    analogWrite(motor_Speed,i);
    delay(20);
  }
  for (int i=255; i>0; i-=5){
    analogWrite(motor_Speed,i);
    delay(20);
  }
}

Wie sieht die Verkabelung dazu aus?

So sah sie vorher aus, hatte es genau so angeschlossen wie es im kleinen Lernbuch von Fritzing stand:

Nachdem ich dann 1,5 Stunden weiter gegoogelt habe sieht alles nun so aus, und der Motor dreht in beide Richtungen, jedoch will das mit dem Poti nicht mehr so wie es vorher war:

Wow! Danke euch für die Tipps, ich habe die Schaltungen beide auf der Mitte getroffen,das mit der Drehrichtung übers Poti funktioniert, ist zwar nur die ein und selbe Geschwindigkeit in beide Richtungen, jedoch wenn das Poti auf Mittelstellung ist passiert nichts, so wie es sollte. Das Programm sieht jetzt so aus:

int motor_a=5;
int motor_b=6;
int potpin = 0;

void setup()
{
  pinMode(motor_a,OUTPUT);
  pinMode(motor_b,OUTPUT);
  pinMode(potpin,INPUT);
}

void loop()
{
  const int AD_145 = 350;  // nur geraten
  const int AD_155 = 400;
  int value = analogRead(potpin);           
  int motor_Av = map(value,AD_155,1023,0,255);      
  if (value > AD_155)
  {    
  digitalWrite(motor_a,motor_Av); 
  digitalWrite(motor_b,LOW);
  } 
  else if ((value < AD_145))
  {    
  digitalWrite(motor_a,LOW); 
  digitalWrite(motor_b,motor_Av);
  } 
  else 
  {    
  analogWrite(motor_a,0);              
  analogWrite(motor_b,0);          
  }
}