Forum: Mikrocontroller und Digitale Elektronik ATmega328 2 Taster 2 Servos schalten


von Markus R. (markus_r131)


Lesenswert?

Hallo liebe gleichgesinnte ;)

kurzes Vorwort:

ich habe mir mal Gedanken gemacht wie ich bei meinem Futterboot anstelle 
des eingebauten Hoppers (der ja immer wieder fest rostet) eine 
alternative Lösung suchen könnte. Ich möchte zwei Servo´s in das Gehäuse 
einbauen und mit einem Ausleger die Montage abwerfen. Die zwei 
Steuerleitungen vom Empänger liegen über Reed-Kontakte an den zwei 
Eingängen des ATmega und wedern seperat angesteuert. Ich habe nur ein 
Problem mit meinem Sketch das die Servos immer gleichzeitg Schalten (ich 
verzweifel bald) ich muss dem Mega irgend wie sagen das er die Ein und 
Ausgänge getrennt voneinander schalten und ausgewerten werden muss. 
Leider habe ich nicht all zuviel Ahnung vom Programieren. Wie könnte ich 
das Prblem lösen?? MFG
1
#include <Servo.h> // zugriff auf Servo Bibliothek
2
const int BUTTON1 = 2; // Pushbutton Pin auf dem Board (2)
3
const int BUTTON2 = 4; // Pushbutton Pin auf dem Board (4)
4
int val = 0; // speichert den Zustand des Tasters
5
int old_val = 0; // speichert den vorherigen wert von val
6
int state = 0; // 0 = Servo Position eins 1 = Servo Position zwei
7
Servo servo1; // deklariert den Namen des ersten Servos
8
Servo servo2;
9
void setup() {
10
  pinMode(BUTTON1, INPUT_PULLUP); // Gibt an dass Buttom ein Input ist
11
  pinMode(BUTTON2, INPUT_PULLUP); // Gibt an dass Buttom ein Input ist
12
  servo1.attach(9); // gibt an auf welchem Pin der Servo mit dem steuerkabel anliegt
13
  servo1.write(0); // gibt die Grundstellung des Servo beim start an
14
  servo2.attach(10); // gibt an auf welchem Pin der Servo mit dem steuerkabel anliegt
15
  servo2.write(0); // gibt die Grundstellung des Servo beim start an
16
}
17
18
void loop()
19
{  val = digitalRead(BUTTON1); // liest den Input aus und cheked ob er gedrückt ist.
20
   if ((val == LOW) && (old_val == HIGH)) { 
21
     state = 1 - state;
22
     delay(1000);
23
   }
24
    val = digitalRead(BUTTON2); // liest den Input aus und cheked ob er gedrückt ist.
25
   if ((val == LOW) && (old_val == HIGH)) {  
26
     state = 1 - state;
27
     delay(1000);
28
   }
29
   old_val = val; // aktueller val wird zu val alt
30
31
  if (state == 1) {
32
    servo1.write(150); // Stelle servo auf 180 grad
33
  } 
34
  else {
35
    servo1.write(0); // stelle servo auf startposition
36
  }  
37
   if (state == 1) {
38
    servo2.write(150); // Stelle servo auf 180 grad
39
  }  
40
  else {
41
    servo2.write(0); // stelle servo auf startposition
42
  }
43
44
}

: Verschoben durch User
von Udo S. (urschmitt)


Lesenswert?

Markus R. schrieb:
> Futterboot

Wie stellt man sich ein Futter-Boot vor?

von Helmut -. (dc3yc)


Lesenswert?

Ist doch klar: ein Kahn, auf dem es Futter gibt. Z.B. MeinSchiff2 oder 
AIDA oder MSC....

von Markus R. (markus_r131)


Angehängte Dateien:

Lesenswert?

in etwa so :) oben 4kg Futter rein die Angelschnüre kommen an den Hopper 
und dann wird alles drausen abgeworfen.

: Bearbeitet durch User
von Markus R. (markus_r131)


Lesenswert?

weis den keiner weiter??

ich müsste doch noch eine Abfrage der Taster einbringen oder?

von oldeurope O. (Gast)


Lesenswert?

Markus R. schrieb:
1
 #include <Servo.h> // zugriff auf Servo Bibliothek
2
 const int BUTTON1 = 2; // Pushbutton Pin auf dem Board (2)
3
 const int BUTTON2 = 4; // Pushbutton Pin auf dem Board (4)
4
 int val = 0; // speichert den Zustand des Tasters
5
 int old_val = 0; // speichert den vorherigen wert von val
6
 int statea = 0; // 0 = Servo Position eins 1 = Servo Position zwei
7
 int stateb = 0;
8
 Servo servo1; // deklariert den Namen des ersten Servos
9
 Servo servo2;
10
 void setup() {
11
   pinMode(BUTTON1, INPUT_PULLUP); // Gibt an dass Buttom ein Input ist
12
   pinMode(BUTTON2, INPUT_PULLUP); // Gibt an dass Buttom ein Input ist
13
   servo1.attach(9); // gibt an auf welchem Pin der Servo mit dem 
14
 steuerkabel anliegt
15
   servo1.write(0); // gibt die Grundstellung des Servo beim start an
16
   servo2.attach(10); // gibt an auf welchem Pin der Servo mit dem 
17
 steuerkabel anliegt
18
   servo2.write(0); // gibt die Grundstellung des Servo beim start an
19
 }
20
 
21
 void loop()
22
 {  val = digitalRead(BUTTON1); // liest den Input aus und cheked ob er 
23
 gedrückt ist.
24
    if ((val == LOW) && (old_val == HIGH)) {
25
      statea = 1 - statea;
26
      delay(1000);
27
    }
28
     val = digitalRead(BUTTON2); // liest den Input aus und cheked ob er 
29
 gedrückt ist.
30
    if ((val == LOW) && (old_val == HIGH)) {
31
      stateb = 1 - stateb;
32
      delay(1000);
33
    }
34
    old_val = val; // aktueller val wird zu val alt
35
 
36
   if (statea == 1) {
37
     servo1.write(150); // Stelle servo auf 180 grad
38
   }
39
   else {
40
     servo1.write(0); // stelle servo auf startposition
41
   }
42
    if (stateb == 1) {
43
     servo2.write(150); // Stelle servo auf 180 grad
44
   }
45
   else {
46
     servo2.write(0); // stelle servo auf startposition
47
   }
48
 
49
 }

Möglicherweise so?

LG
old.

von Markus R. (markus_r131)


Lesenswert?

Das ist ja mein gebastelter Quelltext 1:1  und der funktioniert nicht. 
Taster 1 betätigt auch servo 1 und 2 sowie Taster 2 den 1. Und 2. Servo 
immer zusammen  schaltet. Ich möchte jedoch den Taster 1 drücken und den 
servo 1 schalten bzw Taster 2 drücken und den zweiten servo schalten.

: Bearbeitet durch User
von Daniel (Gast)


Lesenswert?

Schaue dir den Quelltext von oldeurope nochmal genau an. Er ist nicht 
mit deinem identisch. Dort gibt es die Variablen statea und stateb, bei 
dir gibt es nur state.

von Markus R. (markus_r131)


Lesenswert?

ok vielen Dank jetzt habe ich nur das Problem das Servo1 beim 
gedrückthalten hin und her schaltet. bei Servo 2 nicht ???

von ooohh man (Gast)


Lesenswert?

Markus R. schrieb:
> ok vielen Dank jetzt habe ich nur das Problem

Vielleicht mal selbständig weiterdenken?

von Daniel (Gast)


Lesenswert?

Du speicherst in old_val nur den Zustand von BUTTON2. Du benötigst noch 
eine weitere Variable zur Speicherung des Zustands von BUTTON1.

von Markus R. (markus_r131)


Lesenswert?

So, vielen Dank an alle die mir bei der Lösung des Problems geholfen 
haben. An / bei der fertige Sketch. Läuft stand alone auf einem 
ATmega328P.






1
//Stellt mittels zwei Taster (Taster 1 und Taster 2) jeweils einen Servo (Servo1 oder Servo 2) an.
2
//Somit können zwei Servos unabhängig voneinander geschaltet werden. Parogramm läuft auf ATmega328 //(stand alone).
3
// Markus Radtke 14.03.2019 servo_328.ino
4
5
6
7
#include <Servo.h> // zugriff auf Servo Bibliothek
8
 const int BUTTON1 = 2; // Pushbutton Pin auf dem Board (2)
9
 const int BUTTON2 = 4; // Pushbutton Pin auf dem Board (4)
10
 int vala = 0; // speichert den Zustand des Tasters 1
11
 int old_vala = 0; // speichert den vorherigen wert von vala taster 1
12
 int valb = 0; // speichert den Zustand des Tasters 2
13
 int old_valb = 0; // speichert den vorherigen wert von valb von taster 2
14
 int statea = 0; // 0 = Servo Position eins 1 = Servo Position zwei
15
 int stateb = 0; // 0 = Servo Position eins 1 = Servo Position zwei
16
 Servo servo1; // deklariert den Namen des ersten Servos
17
 Servo servo2; // deklariert den Namen des zweiten Servos
18
 void setup() {
19
   pinMode(BUTTON1, INPUT_PULLUP); // Gibt an dass Buttom ein Input ist
20
   pinMode(BUTTON2, INPUT_PULLUP); // Gibt an dass Buttom ein Input ist
21
   servo1.attach(9); // gibt an auf welchem Pin der Servo mit dem steuerkabel anliegt
22
   servo1.write(0); // gibt die Grundstellung des Servo beim start an
23
   servo2.attach(10); // gibt an auf welchem Pin der Servo mit dem steuerkabel anliegt
24
   servo2.write(0); // gibt die Grundstellung des Servo beim start an
25
 }
26
 
27
 void loop()
28
 {  vala = digitalRead(BUTTON1); // liest den Input aus und cheked ob er  gedrückt ist.
29
    if ((vala == LOW) && (old_vala == HIGH)) {
30
      statea = 1 - statea;
31
      delay(50);
32
    }
33
    valb = digitalRead(BUTTON2); // liest den Input aus und cheked ob er  gedrückt ist.
34
    if ((valb == LOW) && (old_valb == HIGH)) {
35
      stateb = 1 - stateb;
36
      delay(50);
37
    }
38
    old_vala = vala; // aktueller val wird zu val alt
39
 
40
   if (statea == 1) {
41
     servo1.write(150); // Stelle servo auf 150 grad
42
   }
43
   else {
44
     servo1.write(30); // stelle servo auf startposition
45
   }
46
    old_valb = valb; // aktueller val wird zu val alt
47
    
48
    if (stateb == 1) {
49
     servo2.write(150); // Stelle servo auf 150 grad
50
   }
51
   else {
52
     servo2.write(30); // stelle servo auf startposition
53
   }
54
 
55
 }

: Bearbeitet durch User
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.