Forum: Mikrocontroller und Digitale Elektronik Arduino Programm Verzweigung


von Schnutzkurt (Gast)


Lesenswert?

Hallo Leute bin am verzweifeln ;)

Was ich versuche ist einen Motor mit einem Poti od mehreren Tastern zu 
steuern.
Als wenn das Programm läuft und ich den Poti verstelle, das Programm das 
merkt,den neuen Wert des Potis nimmt und zu dem dazupassenden Wert in 
der IF anweisung geht und jetzt diese Schleife abarbeitet bis der Poti 
wieder verdreht wird.
Mein Code merkt erst nach der nächsten Schleife das sich der Poti 
verändert hat.
Wie mache ich das bei Poti änderung das Programm reagiert und den neuen 
Wert in den Schleifen sucht?

1
#include "DualVNH5019MotorShield.h"
2
DualVNH5019MotorShield md;
3
//Freie pins digi:1,3,5,11,13 analog:2,3,4,5,6,7,8,9
4
//link zum Shield http://www.pololu.com/docs/0J49/2
5
6
int WertPoti = 0;
7
8
void setup()
9
{
10
md.init();
11
pinMode(WertPoti,INPUT);
12
Serial.begin(9600);
13
}
14
15
void loop()
16
{
17
int WertPoti = analogRead(A2);
18
Serial.println(WertPoti);
19
20
if (WertPoti >=10 && WertPoti <=150)
21
md.setM1Speed(100);
22
delay(5000);
23
24
if (WertPoti >=150 && WertPoti <=300)
25
md.setM1Speed(400);
26
delay(5000);
27
}
28
29
USW..

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Schnutzkurt schrieb:

> Mein Code merkt erst nach der nächsten Schleife das sich der Poti
> verändert hat.

Das sind keine weiteren Schleifen.
Aber was da sind, das sind jede Menge delays.
Wozu sollen die gut sein?
Dein Programm muss durch all diese Delays durch, bis es dann endlich 
irgendwann mit der Funktion loop() komplett durch ist und loop() erneute 
aufgerufen wird.

Aber: WOzu die ganzen delays? Die brauchst du doch gar nicht.
1
void loop()
2
{
3
  int WertPoti = analogRead(A2);
4
5
  Serial.println(WertPoti);
6
7
  if (WertPoti >=10 && WertPoti <=150)
8
    md.setM1Speed(100);
9
10
  else if (WertPoti <= 300)
11
    md.setM1Speed(400);
12
13
  else if (....
14
}

das stört doch keinen (hoffentlich), wenn dein Programm in kurzen 
Zeitabständen den M1Speed erneut auf 100 setzt. Oder doch?

: Bearbeitet durch User
von Schnutzkurt (Gast)


Lesenswert?

Hallo Karl Heinz,
Danke für deine Antwort!

Wenn ich aber in der Schleife zb.

 for (int i=0; i <= 400; i++){
      md.setM1Speed(i);
    delay(300);

gerade läuft und das dauert ein paar Sekunden - denn Poti verstelle 
möchte ich das er gleich zum neuen Wert Springt und diese Schleife 
abarbeitet und nicht fertig dimmt.

von Philip P. (nosuchnick)


Lesenswert?

Karl Heinz schrieb:
> Aber was da sind, das sind jede Menge delays.
> Wozu sollen die gut sein?

Nicht das ich diese Methodik gut heissen würde, aber ein Effekt von 
denen ist, dass die Serielle Schnittstelle nicht mit Daten vollgestopft 
wird. Ich könnte mir auch vorstellen, dass die von einem 
Entprellungsversuch übriggeblieben sind.

Und ich tippe mal, dass da Klammern fehlen, und eigentlich nur ein delay 
pro Zweig gedacht war:
1
void loop()
2
{
3
  int WertPoti = analogRead(A2);
4
  Serial.println(WertPoti);
5
6
  if (WertPoti >=10 && WertPoti <=150){
7
    md.setM1Speed(100);
8
    delay(5000);
9
  }
10
11
  if (WertPoti >=150 && WertPoti <=300){
12
    md.setM1Speed(400);
13
    delay(5000);
14
  }
15
}

Ich würde evtl. eine kleine Hysterese einbauen, falls der Poti zu stark 
rauscht.
1
void loop() {
2
  static unsigned long lastUpdate = millis();
3
  int WertPoti = analogRead(A2);
4
5
  if((lastUpdate + 1000) < millis()){
6
    Serial.println(WertPoti);
7
    lastUpdate = millis();
8
  }
9
10
  if (WertPoti >=10 && WertPoti <=145)
11
    md.setM1Speed(100);
12
13
  else if ((WertPoti >= 155) && (WertPoti <= 300)) 
14
    md.setM1Speed(400);
15
16
  else if (....
17
}

von Karl H. (kbuchegg)


Lesenswert?

Schnutzkurt schrieb:
> Hallo Karl Heinz,
> Danke für deine Antwort!
>
> Wenn ich aber in der Schleife zb.
>
>  for (int i=0; i <= 400; i++){
>       md.setM1Speed(i);
>     delay(300);
>
> gerade läuft und das dauert ein paar Sekunden - denn Poti verstelle
> möchte ich das er gleich zum neuen Wert Springt und diese Schleife
> abarbeitet und nicht fertig dimmt.

Tja. Da brauchst du aber eine ganz andere Systematik. Du willst dann 
genau diese Schleife in erster Linie gar nicht haben.

Das musst du dann ein wenig schlauer angehen und die for-Schleife erst 
mal prinzipiell dadurch ersetzen, dass du die loop() indirekt diese 
Schleife machen lässt.
1
void loop()
2
{
3
  if( currentSpeed <= 400 ) {
4
    md.setM1Speed(i);
5
    currentSpeed++;
6
    delay(300);
7
  }
8
}

das macht ja genau dasselbe, nur das es keine for-Schleife bietet.

WEiters musst du feststellen, ob jemand am Poti gedreht hat. Das 
erreichst du mit einem Wertevergleich mit einem früheren Wert
1
void loop()
2
{
3
  int WertPoti = analogRead(A2);
4
5
  if (WertPoti != alterWertPoti) {
6
    // das Poti ist verstellt worden
7
    alterWertPoti = WertPoti;
8
9
    if (WertPoti ....
10
    ...
11
  }
12
}

und jetzt musst du die beiden Dinge noch kombinieren.
Zum einen soll die MotorDrehzahl sich laufend stetig verändern (durch 
die 'for'-Schleife, zum anderen soll aber bei einer Wertänderung am Poti 
dieses Hochzählen sofort unterbrochen werden. Im einfachsten Fall läuft 
das auf einen 'Modus' hinaus. In welchem Modus ist die 
Geschwindigkeitskontrolle? Soll der Motor in einer Rampe schneller 
werden, oder soll er aufs Poti hören?
1
#define MODE_RAMPE 0
2
#define MODE_POTI  1
3
4
5
void loop()
6
{
7
  if (SpeedMode == MODE_RAMPE ) {
8
    if( currentSpeed <= 400 ) {
9
      md.setM1Speed(i);
10
      currentSpeed++;
11
      delay(300);
12
    }
13
  }
14
15
  // mittels einer Taste die Rampenfunktion starten
16
  if (Taste1 gedrückt)
17
    SpeedMode = MODE_RAMPE;
18
    currentSpeed = 0;
19
  }
20
21
  // wenn am Poti gedreht wurde, dann die Rampe sofort stoppen
22
  // und selber das Kommando über die Speed übernehmen
23
  int WertPoti = analogRead(A2);
24
25
  if (WertPoti != alterWertPoti) {
26
    // das Poti ist verstellt worden
27
    alterWertPoti = WertPoti;
28
    SpeedMode = MODE_POTI;    // damit die Rampenfunktion abgestellt wird
29
30
    if (WertPoti ....
31
    ...
32
  }
33
}

: Bearbeitet durch User
von Schnutzkurt (Gast)


Lesenswert?

Super DANKE DANKE

werde ich gleich testen.
das Forum hier ist echt spitze!!

im Arduino.de Forum diskutieren sie wie man ne Frage stellen soll oder 
ein Buch lesen da würde es irgendwo stehen usw usw.;(
aber keiner versucht einem zu helfen.
"Ich weiß wie es geht aber komm selber drauf" finde ich nicht die 
richtige Art in einem Forum.
als nochmals danke!!
Hoffe ihr brauch mal ein Kochrezept da kann ich euch weiter helfen :)

von Karl H. (kbuchegg)


Lesenswert?

bedenke aber auch, dass der Wert vom ADC nicht ganz stabil sein wird. 
:-)
Das ist völlig normal, dass der Wert um bis zu +- 2 schwankt, obwohl 
niemand am Poti dreht.

D.h. das hier
1
  if (WertPoti != alterWertPoti) {
mag ein klein wenig zu optimistisch sein. Die Werte können ganz leicht 
unterschiedlich sein, obwohl niemand sich am Poti zu schaffen macht.
Da wirst du dir noch was einfallen lassen müssen. Aber das soll ja auch 
dein Projekt sein :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.