Forum: Mikrocontroller und Digitale Elektronik TV-Unterbettlift


von Andrea I. (andele)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
habe einen TV-Unterbettlift zusammen gebastelt, zweifle etwas an der 
elektonik bzw. an den sketch.
Es sind 2X Buttons, 5X limit-switch, 1X DC-Motor(12V), 1X 
Linearmotor(12V), 2x MG90S(Servo), 1X 4-Channel Relaiboard, 1X Arduino 
Uno(R3).
Benutze die Bibliothek "ezButton".
Wenn mann aufs Button(A0) drückt fährt das DC-Motor die einheit raus, 
dann wird der Limit2 ausgelöst, die einheit wird geschwenkt durch den 
LinearMotor(90°), der Limit3 wird ausgelöst, Servo1 wird aktiviert TV 
wird auf Endposition gebracht.
Wenn ich es aber schliesen möchte mache ich das mit Button(A1),Servo2 
wird aktiviert, einheit fährt auf Ausganstellung, Limit5 wird ausgelöst, 
Linearmotor(0°) schwänkt die einheit, Limit4 wird ausgelöst, DC-Motor 
fährt zurück, Limit1 wird ausgelöst.
Mein erstes Problem ist wenn Limit5 ausgelöst wird passiert nichts, muss 
das Arduino reseten damit das Relaiboard das Linearmotor aktiviert, 
manchmal klappt das und manchmal halt nich weiss nicht warum.
Zweites Problem ist, habe mich mal vertan mit den Button(A0), obwohl der 
Limit2 ausgelöst wurde ist der DC-Motor weiter gefahren, eigentlich 
hätte er garnicht fahren sollen da die position erreicht wurde bzw. 
Limit2 ausgelöst.
Schaltplan im Anhang, falls was benötigt wird bitte bescheid geben.
1
#include <ezButton.h>
2
#include <Servo.h>
3
4
int relais1pin = 2;
5
int relais2pin = 3;
6
int relais3pin = 4;
7
int relais4pin = 5;
8
9
ezButton button1(A0);  
10
ezButton button2(A1);
11
12
ezButton limitsw1 (8);
13
ezButton limitsw2 (9);
14
ezButton limitsw3 (10);
15
ezButton limitsw4 (11);
16
ezButton limitsw5 (12); 
17
 
18
Servo myservo1;
19
Servo myservo2;
20
21
void setup() {
22
23
  pinMode(relais1pin,OUTPUT);
24
  pinMode(relais2pin,OUTPUT);
25
  pinMode(relais3pin,OUTPUT);
26
  pinMode(relais4pin,OUTPUT);
27
28
  button1.setDebounceTime(50); 
29
  button2.setDebounceTime(50); 
30
31
  myservo1.attach(6);
32
  myservo2.attach(7);
33
  myservo1.write(100);
34
  myservo2.write(80);
35
  
36
  digitalWrite(relais1pin,HIGH);
37
  digitalWrite(relais2pin,HIGH);
38
  digitalWrite(relais3pin,HIGH);
39
  digitalWrite(relais4pin,HIGH);
40
41
}
42
43
void loop() {
44
  
45
  button1.loop(); 
46
  button2.loop();
47
  
48
  limitsw1.loop();
49
  limitsw2.loop();
50
  limitsw3.loop();
51
  limitsw4.loop();
52
  limitsw5.loop();
53
54
 
55
 if(button1.isPressed()){
56
    motor1_V();
57
   } else if (limitsw2.isPressed()) {
58
    motor1_S();
59
    motor2_R();
60
   }else if (limitsw3.isPressed()) {
61
    motor2_S();
62
    myservo1.write(70);
63
      delay(1000);
64
    myservo1.write(100);
65
      delay(1000);  
66
   }
67
68
69
 
70
if(button2.isPressed()){
71
    myservo2.write(120);
72
    delay(1000); 
73
    myservo2.write(80);
74
    delay(1000);   
75
   } else if (limitsw5.isPressed()) {
76
    motor2_V();
77
78
   }else if (limitsw4.isPressed()) {
79
    motor2_S(); 
80
    motor1_R(); 
81
   }else if (limitsw1.isPressed()) {
82
    motor1_S();  
83
 }
84
}
85
 
86
//-------------------------------- MOTOR 1 mit Zahnrad --------------------------------------
87
void motor1_V(){
88
  digitalWrite(relais1pin,LOW);
89
  digitalWrite(relais2pin,HIGH);
90
}
91
92
void motor1_R(){
93
  digitalWrite(relais1pin,HIGH);
94
  digitalWrite(relais2pin,LOW);
95
}
96
97
void motor1_S(){
98
  digitalWrite(relais1pin,HIGH);
99
  digitalWrite(relais2pin,HIGH);
100
}
101
//-------------------------------- MOTOR 2 Linear --------------------------------------
102
void motor2_V(){
103
  digitalWrite(relais3pin,LOW);
104
  digitalWrite(relais4pin,HIGH);
105
}
106
107
void motor2_R(){
108
  digitalWrite(relais3pin,HIGH);
109
  digitalWrite(relais4pin,LOW);
110
}
111
112
void motor2_S(){
113
  digitalWrite(relais3pin,HIGH);
114
  digitalWrite(relais4pin,HIGH);
115
}

: Bearbeitet durch User
von PittyJ (Gast)


Lesenswert?

Sorry, ich blicke bei dem Programm nicht durch, was wo und wann gemacht 
werden soll.

Aber du wahrscheinlich auch nicht ... ich habe den verdacht, dass du 
nicht programmieren kannst, und der Code bislang nur Copy@Paste von 
irgendwo her ist.

Vielleicht sollte man einfach mal das gute alte printf() Debugging 
machen. Also an allen Stellen Stati und Werte ausgeben. Und sich dann 
einfach anschauen, wie sich die Werte verhalten, wenn man Tasten drückt, 
und sich was verändert.
Also Ist und Soll vergleichen. Dann kann man erkennen, was nicht ist, 
wie es soll und das Programm modifizieren.

Ach ja: Kommentare machen das Programm nicht langsamer, weil der 
Compiler sie ja entfernt, und die CPU später nicht davon gestört wird.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Du solltest unbedingt, auch um selber durchzublicken, den Buttons und 
Relais sinnvolle Namen geben. Du weisst ja selber morgen nicht mehr, was 
'relais3pin' macht in der Konstruktion.
Also lieber 'HebemotorHoch', SchwenkmotorAussen', 'HebelimitOben' usw. 
benutzen. Das ist ein simpes 'Find & Replace' und dann wird dir die 
Logik selber klarer.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Andrea I. schrieb:
> 1X Linearmotor(12V)

So, wie dein Motor auf dem "Schaltplan" aussieht, ist das bestimmt kein 
Linearmotor.
https://de.wikipedia.org/wiki/Linearmotor

von Thomas W. (goaty)


Lesenswert?

Eine Zustandsmaschine mit sauber benannten States und events wäre 
wesentlich übersichtlicher.

Ich hatte hier mal was grob skizziert: 
Beitrag "Re: STM32: LED 3 x blinken lassen ohne blocking Code zu verwenden"

: Bearbeitet durch User
von Andrea I. (andele)


Lesenswert?

PittyJ schrieb:
> Sorry, ich blicke bei dem Programm nicht durch, was wo und wann gemacht
> werden soll.
>
> Aber du wahrscheinlich auch nicht ... ich habe den verdacht, dass du
> nicht programmieren kannst, und der Code bislang nur Copy@Paste von
> irgendwo her ist.
>
> Vielleicht sollte man einfach mal das gute alte printf() Debugging
> machen. Also an allen Stellen Stati und Werte ausgeben. Und sich dann
> einfach anschauen, wie sich die Werte verhalten, wenn man Tasten drückt,
> und sich was verändert.
> Also Ist und Soll vergleichen. Dann kann man erkennen, was nicht ist,
> wie es soll und das Programm modifizieren.
>
> Ach ja: Kommentare machen das Programm nicht langsamer, weil der
> Compiler sie ja entfernt, und die CPU später nicht davon gestört wird.

Guten Morgen,
nein ,leider muss ich dich enttäuschen, es ist kein Copy@Paste. Schade 
das du schon urteilst ob ich durchblick oder nicht.
ich vermute das du dir das nicht richtig durchgelesen hast.
printf() hatte ich überall drin nach jeden auslöser, hätte ich auch 
auskommentieren können.
Nochmal, der Ralisboard beim zurück fahren antowrtet nicht.
Zweites Problem ist, habe mich mal vertan mit den Button(A0), obwohl der
Limit2 ausgelöst wurde ist der DC-Motor weiter gefahren, eigentlich
hätte er garnicht fahren sollen da die position erreicht wurde bzw.
Limit2 ausgelöst.

von Andrea I. (andele)


Lesenswert?

Matthias S. schrieb:
> Du solltest unbedingt, auch um selber durchzublicken, den Buttons und
> Relais sinnvolle Namen geben. Du weisst ja selber morgen nicht mehr, was
> 'relais3pin' macht in der Konstruktion.
> Also lieber 'HebemotorHoch', SchwenkmotorAussen', 'HebelimitOben' usw.
> benutzen. Das ist ein simpes 'Find & Replace' und dann wird dir die
> Logik selber klarer.

Guten Morgen,
ein Schaltplan ist im Anhang vorhanden

von Andrea I. (andele)


Lesenswert?

Wolfgang schrieb:
> Andrea I. schrieb:
>> 1X Linearmotor(12V)
>
> So, wie dein Motor auf dem "Schaltplan" aussieht, ist das bestimmt kein
> Linearmotor.
> https://de.wikipedia.org/wiki/Linearmotor

Bezeichnung beim einkauf ist ein LinearMotor(Linear Actuator)

von der nixwois (Gast)


Lesenswert?

Andrea I. schrieb:
> printf() hatte ich überall drin

Wo denn???

von Andrea I. (andele)


Lesenswert?

Hab es jetz mit kommentare hinterlegt.
1
 if(button1.isPressed()){   // Button1 wird gedrückt
2
3
    motor1_V();             // DC-Motor fährt nach vorne
4
5
   } else if (limitsw2.isPressed()) { // Limit2 wird ausgelöst
6
7
    motor1_S();             // DC-Motor Stoppt
8
9
    motor2_R();            // LinearMotor wird aktiviert und scwänkt die einheit auf 90°
10
11
   }else if (limitsw3.isPressed()) { //Limit3 wird ausgelöst
12
13
    motor2_S();  // Linearmotor stoppt
14
15
    myservo1.write(70);  // servo1 drückt auf
16
17
      delay(1000);
18
19
    myservo1.write(100); // servo1 auf ausgangstellung
20
21
      delay(1000);  
22
23
   }
24
25
 
26
27
if(button2.isPressed()){ // Button1 wird gedrückt
28
29
    myservo2.write(120);   // servo2 drückt zu
30
31
    delay(1000); 
32
33
    myservo2.write(80); // servo2 ausgangstellung
34
35
    delay(1000);   
36
37
   } else if (limitsw5.isPressed()) { // limit5 wird ausgelöst
38
39
    motor2_V();  // Linearmotor schwängt au 0°
40
41
   }else if (limitsw4.isPressed()) { // Limit4 wird ausgelöst
42
43
    motor2_S(); // Linearmotor stoppt
44
45
    motor1_R(); // DC-Motor fährt zurück
46
47
   }else if (limitsw1.isPressed()) { // Limit1 wird ausgelöst
48
49
    motor1_S();  // DC-Motor Stoppt
50
51
 }

von Michael M. (michaelm)


Lesenswert?

PittyJ schrieb:
> ....ich habe den verdacht,....
Ich habe noch viel mehr Verdachtsmomente... ^^

@ Andrea:
Was verstehst du unter "TV"? Teilungs-Verteigerung? 
Tilgungs-Vereinbarung? Technische Vorschrift?
Und diese ganze Bastelei soll unter einem Bett stattfinden??? Mit 
welchem Zweck/Ziel? Ich kann mir so eine Mimik nicht unter meinem Bett 
vorstellen.

Was hältst du von klar strukturieren Sätzen, verständlicher Wortwahl, 
Satzzeichen, Groß-/Kleinschreibung (siehe "wichtige Regeln":Groß- und 
Kleinschreibung verwenden und weiter: Längeren Sourcecode nicht im Text 
einfügen, sondern als Dateianhang) sowie Korrekturlesen vor dem 
Absenden?

Blickst du selbst überhaupt noch deine "geniale" Erfindung (wofür sie 
auch immer gut sein mag) durch?

Andrea I. schrieb:
> ...ein Schaltplan ist im Anhang vorhanden...
Das ist ein ziemlich wirrer Funktionsmodul-Verdrahtungsplan, jedoch 
kein Schaltplan.

Andrea I. schrieb:
>> So, wie dein Motor auf dem "Schaltplan" aussieht, ist das bestimmt kein
>> Linearmotor.
>> https://de.wikipedia.org/wiki/Linearmotor
>
> Bezeichnung beim einkauf ist ein LinearMotor(Linear Actuator)

Wikipedia ist eben nicht alles... ;-) Das Ding führt eine lineare 
Bewegung aus, aber es ist kein Linear-Motor.

: Bearbeitet durch User
von Uwe G. (scd)


Lesenswert?

Andrea I. schrieb:
1
   button1.loop();
2
   button2.loop();
3
 
4
   limitsw1.loop();
5
   limitsw2.loop();
6
   limitsw3.loop();
7
   limitsw4.loop();
8
   limitsw5.loop();
Zeig mal bitte noch die benutzte Bibliothek, es sieht ganz danach aus, 
als ob Du hier blockierenden Code drin hättest.

von Uwe G. (scd)


Lesenswert?

Michael M. schrieb:
> Was verstehst du unter "TV"? Teilungs-Verteigerung?
> Tilgungs-Vereinbarung? Technische Vorschrift?
> Und diese ganze Bastelei soll unter einem Bett stattfinden??? Mit
> welchem Zweck/Ziel? Ich kann mir so eine Mimik nicht unter meinem Bett
> vorstellen.

Warum muss man sich absichtlich so dumm stellen? Fotos anschauen hilft. 
Es handelt sich um einen TV aka Televisionsgerät oder Fernseher, der 
hier verfahren werden soll.

Michael M. schrieb:
> Das ist ein ziemlich wirrer Funktionsmodul-Verdrahtungsplan, jedoch
> kein Schaltplan.

Ist auch nicht nötig, weil das ganze noch recht übersichtlich ist.

von Andrea I. (andele)


Lesenswert?

Michael M. schrieb:
> PittyJ schrieb:
>> ....ich habe den verdacht,....
> Ich habe noch viel mehr Verdachtsmomente... ^^
>
> @ Andrea:
> Was verstehst du unter "TV"? Teilungs-Verteigerung?
> Tilgungs-Vereinbarung? Technische Vorschrift?
> Und diese ganze Bastelei soll unter einem Bett stattfinden??? Mit
> welchem Zweck/Ziel? Ich kann mir so eine Mimik nicht unter meinem Bett
> vorstellen.
>
> Was hältst du von klar strukturieren Sätzen, verständlicher Wortwahl,
> Satzzeichen, Groß-/Kleinschreibung (siehe "wichtige Regeln":Groß- und
> Kleinschreibung verwenden und weiter: Längeren Sourcecode nicht im Text
> einfügen, sondern als Dateianhang) sowie Korrekturlesen vor dem
> Absenden?
>
> Blickst du selbst überhaupt noch deine "geniale" Erfindung (wofür sie
> auch immer gut sein mag) durch?
>
> Andrea I. schrieb:
>> ...ein Schaltplan ist im Anhang vorhanden...
> Das ist ein ziemlich wirrer Funktionsmodul-Verdrahtungsplan, jedoch
> kein Schaltplan.
>
> Andrea I. schrieb:
>>> So, wie dein Motor auf dem "Schaltplan" aussieht, ist das bestimmt kein
>>> Linearmotor.
>>> https://de.wikipedia.org/wiki/Linearmotor
>>
>> Bezeichnung beim einkauf ist ein LinearMotor(Linear Actuator)
>
> Wikipedia ist eben nicht alles... ;-) Das Ding führt eine lineare
> Bewegung aus, aber es ist kein Linear-Motor.

Wow, hätte ich echt nicht gedacht, sorry wenn ich das euch/dir zu 
kompliziert mache. Ich versuche es nochmal.
TeleVision-Unterbettlift, Fernseher-Lift, und ja das ist eine skizzierte 
verdratungsplan.

ich habe es hier gekauft und mit dieser bezeichnung
https://www.ebay.de/itm/750-1000-1500-6000N-Linear-Actuator-12V-Linearantrieb-Elektrischer-Linearmotor-/233520151735

von MaWin (Gast)


Lesenswert?

Andrea I. schrieb:
> Mein erstes Problem ist wenn Limit5 ausgelöst wird passiert nichts, muss
> das Arduino reseten damit das Relaiboard das Linearmotor aktiviert,
> manchmal klappt das und manchmal halt nich weiss nicht warum.
> Zweites Problem ist, habe mich mal vertan mit den Button(A0), obwohl der
> Limit2 ausgelöst wurde ist der DC-Motor weiter gefahren, eigentlich
> hätte er garnicht fahren sollen da die position erreicht wurde bzw.
> Limit2 ausgelöst

Die Probleme kommen durch die naive Art, wie der Code geschrieben ist

Man ist immer in der Lage, auf Limit-Switches zu reagieren, deren 
Abfrage steht nie in einem else und fragt nie nach pressed(event) 
sondern immer nach state, und man baut immer time-outs ein damit auch 
bei ausbleibendem Limit der Motor nicht ewig weiter läuft. Man baut auch 
keine delay in die loop (und reagiert währenddessen auf GAR NICHTS) 
sondern loopt immer rum guckt auf millis( um zu entscheiden wann genug 
Zeit vergangen ist.

Stichwort state (machine) ist schon gut.

von Christian B. (cb1969)


Lesenswert?

Wenn das Ding am Endschalter ansteht und Du drückst Taste 1 fährt es 
natürlich weiter.
1
if(button1.isPressed()){
2
    motor1_V();
3
 }

wird ausgeführt. Egal was in den else Zweigen nachher kommt.
Das mußt Du logisch verknüpfen.

if TasteGedrückt and !Endschalter betätigt then MotorV

von Michael M. (michaelm)


Lesenswert?

Uwe G. schrieb:
> Es handelt sich um einen TV aka Televisionsgerät oder Fernseher, der
> hier verfahren werden soll.

Warum schreibt er dann nicht "Fernsehgerät"? Es könnte ja auch eine 
"privat" erfundene Abkürzung des Fragestellers sein?
Kommunikation ist eben auch eine Kunst... ;-)

von Andrea I. (andele)


Lesenswert?

Uwe G. schrieb:
> Andrea I. schrieb:
>
1
>    button1.loop();
2
>    button2.loop();
3
> 
4
>    limitsw1.loop();
5
>    limitsw2.loop();
6
>    limitsw3.loop();
7
>    limitsw4.loop();
8
>    limitsw5.loop();
9
>
> Zeig mal bitte noch die benutzte Bibliothek, es sieht ganz danach aus,
> als ob Du hier blockierenden Code drin hättest.

Die Bibliothek habe ich von hier
https://www.arduinolibraries.info/libraries/ez-button

von Andrea I. (andele)


Lesenswert?

Michael M. schrieb:
> Uwe G. schrieb:
>> Es handelt sich um einen TV aka Televisionsgerät oder Fernseher, der
>> hier verfahren werden soll.
>
> Warum schreibt er dann nicht "Fernsehgerät"? Es könnte ja auch eine
> "privat" erfundene Abkürzung des Fragestellers sein?
> Kommunikation ist eben auch eine Kunst... ;-)

jetzt weisst du es ;-)

von Andrea I. (andele)


Lesenswert?

Christian B. schrieb:
> Wenn das Ding am Endschalter ansteht und Du drückst Taste 1 fährt es
> natürlich weiter.
>
>
1
> if(button1.isPressed()){
2
>     motor1_V();
3
>  }
4
>
>
> wird ausgeführt. Egal was in den else Zweigen nachher kommt.
> Das mußt Du logisch verknüpfen.
>
> if TasteGedrückt and !Endschalter betätigt then MotorV


Bin mir nicht sicher ob du das so gemeint hast
1
 if(button1.isPressed() && limitsw2.isPressed()){
2
    motor1_V();

von Uwe G. (scd)


Lesenswert?

Andrea I. schrieb:
> Die Bibliothek habe ich von hier
> https://www.arduinolibraries.info/libraries/ez-button

Die ist nonblocking, das Programm bleibt also nicht bei der 
Tastenabfrage stehen.

Ich habe mir nochmals angeguckt, was Du willst und was Dein Programm 
macht. Die Jungs haben recht, speziell MaWin hat das klar ausgedrückt. 
Du brauchst eine state-machine für Deine Anwendung.

Für Arduino:
https://www.arduino.cc/reference/en/libraries/statemachine/
(Ich habe mir den Inhalt des Links nicht angeguckt)

von Wolfgang (Gast)


Lesenswert?

Andrea I. schrieb:
> Bezeichnung beim einkauf ist ein LinearMotor(Linear Actuator)

Dann ist das wohl eine Fehlübersetzung.
Man muss aber nicht jeden Fehler übernehmen.
Linear Actuator (de: Linearantrieb) trifft die Sache

von Schlaumaier (Gast)


Lesenswert?

Ist doch ganz einfach.

Du legst ein Endschalter auf einen PIN.
Während der Motor läuft fragt du diesen PIN laufen ab.
Sobald der PIN seinen Zustand wechselt, stop der Motor

So in etwa.

Pin.3 = low  // Endschalter
pin.1 = low  // Not-HALT

 do while pin.3 = low  or Pin.1 = high
  delay 100
 loop

  ' hier Motor stop Befehl.


Das ganze baust du in JEDE Motor Bewegung ein.

Fertig ist es.  Musst halt nur den passenden PIN (hier 3) an den 
jeweiligen Endschalter anpassen.  Wenn es eng wird, benutze ein PFC8574 
am i2c Port.

Ist nur die Abfrage etwas anders. Muss dann den passenden PIN des Chips 
abfragen anstatt direkt.

von Schlaumaier (Gast)


Lesenswert?

Schlaumaier schrieb:
> do while pin.3 = low  or Pin.1 = high
>   delay 100
>  loop

Sorry Prg-Fehler

Pin.3 = low  // Endschalter
pin.1 = low  // Not-HALT

 do while pin.3 = low  and Pin.1 = low
  delay 100
 loop

  ' hier Motor stop Befehl.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Andrea I. schrieb:
>> Also lieber 'HebemotorHoch', SchwenkmotorAussen', 'HebelimitOben' usw.
>> benutzen. Das ist ein simpes 'Find & Replace' und dann wird dir die
>> Logik selber klarer.
>
> Guten Morgen,
> ein Schaltplan ist im Anhang vorhanden

Moin. Jaja, aber wenn man immer mit dem Schaltplan vor der Nase dein 
Programm verfolgen muss, dann hat man schnell keine Lust mehr. Deswegen 
ja der Vorschlag, den Relaisausgängen und den Knöpfchen/Schaltern im 
Programm sinnvolle Namen zu verpassen. Dann ist es auch für dich in 3 
Jahren noch nachvollziehbar, was da abgeht.
In meinen Projekten mache ich deswegen eine ausführliche Einleitung, 
worum es geht, und wo welche Anschlüsse an welche Ports gehen. Die Ports 
heissen dann so wie das, was sie steuern oder empfangen.
Ich gebe zu, das das bei einem oder zwei Projekten evtl. übertrieben 
ist, aber bei mir haben sich mittlerweile Dutzende angesammelt. Da bin 
ich froh, das sowas im Programm steht.

von Andrea I. (andele)


Lesenswert?

Matthias S. schrieb:

> Moin. Jaja, aber wenn man immer mit dem Schaltplan vor der Nase dein
> Programm verfolgen muss, dann hat man schnell keine Lust mehr. Deswegen
> ja der Vorschlag, den Relaisausgängen und den Knöpfchen/Schaltern im
> Programm sinnvolle Namen zu verpassen. Dann ist es auch für dich in 3
> Jahren noch nachvollziehbar, was da abgeht.
> In meinen Projekten mache ich deswegen eine ausführliche Einleitung,
> worum es geht, und wo welche Anschlüsse an welche Ports gehen. Die Ports
> heissen dann so wie das, was sie steuern oder empfangen.
> Ich gebe zu, das das bei einem oder zwei Projekten evtl. übertrieben
> ist, aber bei mir haben sich mittlerweile Dutzende angesammelt. Da bin
> ich froh, das sowas im Programm steht.

Da hast du recht, werde in Zukunft drauf achten. Danke

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Andrea I. schrieb:
> Hab es jetz mit kommentare hinterlegt.
1
if(button1.isPressed()){   // Button1 wird gedrückt

Da steht jetzt im Code: "Wenn button1 ist gedrückt".
Und im Kommentar nochmal "Button1 wird gedrückt".

Das ist Quatsch. Du solltest im Kommentar nicht genau das schreiben, was 
bereits im Code steht. Hier muss kein Kommentar hin.

Im Kommentar beschreibst Du, was Du dir gedacht hast - warum es 
passiert. Und warum der Motor bei gedrückter Taste immer weiter fahren 
und nicht auf einen Endschalter reagieren soll. Auf Endschalter wird nur 
reagiert, wenn die Taste nicht mehr gedrückt (Else) wird.

Ein guter Code mit sprechenden Variablen (ein langer Variablenname 
benötigt auf dem Zielsystem nicht mehr Speicher als eine mit einem 
Buchstaben. Lediglich der Quellcode wird länger) braucht kein Kommentar.
1
if (starttaste.isPressed) { warnlampe_rot = EIN; }
sagt bereits alles, was gesagt werden muss.

von Cyblord -. (cyblord)


Lesenswert?

Wieder ein schönes Beispiel dass Arduino das logische strukturierte 
Denken nicht ersetzen kann. Man könnte fast die neckische These 
aufstellen: Wer mit Arduino gut entwickeln kann, kann das auch ohne. Das 
Gegenteil gilt hier ebenfalls.

von Schlaumaier (Gast)


Lesenswert?

Und fange an mit.

// Pin 1 = Schalter notaus
// Pin 3 = Motor 1 Steuerleitung

etc.

Und das ganze bevor du auch nur eine einzige Zeile Code geschrieben 
hast.

Warum. Damit du eine Anleitung hast, was du an welchen Pin löten musst. 
Und besonders dann wenn du (ok in den Fall eher nicht) die Schaltung 
noch einmal bauen willst. Oder was viel eher passieren kann, du die 
Schaltung erweiterst. Hier z.b. durch eine Infrarot-/Funk/Wlan.Handy/ 
Steuerung ... ;)

Selbst eine Einbindung über Alexa/Google ist problemlos möglich, wenn 
eine Zentrale vorhanden ist.

von Cyblord -. (cyblord)


Lesenswert?

Schlaumaier schrieb:
> Und fange an mit.
>
> // Pin 1 = Schalter notaus
> // Pin 3 = Motor 1 Steuerleitung
>
> etc.

So fängt man NICHT an. Man benutzt sprechende Variablen und Funktionen. 
Man kapselt bestimmte FUNKTIONALITÄTEN in diesen Funktionen und nicht 
Pin an und Pin aus.

: Bearbeitet durch User
von Andrea I. (andele)


Lesenswert?

Danke an die jenigen die helfen wollen, deswegen hab ich diesen Thread 
auch gestartet um geholfen zu werden.
Für die die einfach sinnloses ab lassen wollen ist absolut nicht nötig, 
geniesst das schöne Wetter. Danke.
 Mein sketch habe ich Schritt für Schritt erabeitet, ja es fehlt jede 
menge Erfahrung und würde gerne eure Erfahrung(optimierung) in anspruch 
nehmen.
Bin an einen Punkt(fehler) angekommen an dem ich mit meinen wissen nicht 
weiter komme, hoffe auf erklärungen wie man es am besten machen kann.
Würde mich sehr freuen. Ihr seid ein grosses Vorbild für mich und habe 
grossen Respekt, letztendlich kann ich nur von euch lernen.
Gruss

von Schlaumaier (Gast)


Lesenswert?

Cyblord -. schrieb:
> So fängt man NICHT an. Man benutzt sprechende Variablen und Funktionen.
> Man kapselt bestimmte FUNKTIONALITÄTEN in diesen Funktionen und nicht
> Pin an und Pin aus.

Lesen bildet ungemein.

Da steht irgends in meiner "Anleitung" Pin an aus.

Das beschreibt nur die Leitungen und wo sie angeschlossen sind. Im Code 
darunter weiße ich die Namen der Leitungen dann den passenden Pins zu.

Das sieht dann so aus.

Public Serial1 As Serial
Private motor_steuerung as d3pins // Arduino Pin D3
Private not_aus as d1pin // // Arduino Pin D3

Da ich aber nicht alle Pins direkt an den Arduino anschließe kann es 
durchaus sein das ich im Kommentar oben schreibe

// Anschluss 1 Display
// Anschluss 1 = blau = SCL   Adresse ####
// Anschluss 1 = rot = +
// Anschluss 1 = schwarz = -
// Anschluss 1 = grün = SDA

Dann weiss ich schlaues Kerlchen das Anschluss 1 der Display-port ist 
und welche Farben ich was zugewiesen habe. Der Port selbst ist ein dann 
nix anderes auf der Platine wie ein Stück Plastik wo der PSK-Stecker 
rein muss. Und da ich selbst gefertigte PSK-Kabel habe ist alles perfekt 
richtig.

Einfach gesagt. Ich kann i.d.R. nur anhand der Anmerkungen im Codes die 
Schaltung nachbauen.

von Wolfgang (Gast)


Lesenswert?

Andrea I. schrieb:
> Wenn mann aufs Button(A0) drückt fährt das DC-Motor die einheit raus,
> ...
> ezButton button1(A0);

Warum nennst du einen Knopf der das Ausfahren von irgendetwas bewirkt 
"Button1" und nicht z.B. "ButtonAusfahren" oder "BtnOpen".
Das würde den Quellcode deutlich lesbarer machen, ohne dass man 
irgendwelche zusätlichen Kommentare braucht.

von Andrea I. (andele)


Lesenswert?

Wolfgang schrieb:
> Andrea I. schrieb:
>> Wenn mann aufs Button(A0) drückt fährt das DC-Motor die einheit raus,
>> ...
>> ezButton button1(A0);
>
> Warum nennst du einen Knopf der das Ausfahren von irgendetwas bewirkt
> "Button1" und nicht z.B. "ButtonAusfahren" oder "BtnOpen".
> Das würde den Quellcode deutlich lesbarer machen, ohne dass man
> irgendwelche zusätlichen Kommentare braucht.

Ganz einfach, zu den Zeitpunkt war es für mich in Ordnung. Da ich 
festgestellt habe das einige ein Problem damit haben wegen 2 buttons die 
erwähnt werden aber nicht so wie gewünscht dargestellt ist, werde ich in 
Zukunft drauf achten.
Hoffe das hilft.
1
#include <ezButton.h>
2
#include <Servo.h>
3
4
int relais1pin = 2;
5
int relais2pin = 3;
6
int relais3pin = 4;
7
int relais4pin = 5;
8
9
ezButton BtnOpen(A0);  
10
ezButton BtnClose(A1);
11
12
ezButton limitsw1 (8);
13
ezButton limitsw2 (9);
14
ezButton limitsw3 (10);
15
ezButton limitsw4 (11);
16
ezButton limitsw5 (12); 
17
 
18
Servo myservo1;
19
Servo myservo2;
20
21
void setup() {
22
Serial.begin(115200);
23
  Serial.println(F("TEST"));
24
  
25
  pinMode(relais1pin,OUTPUT);
26
  pinMode(relais2pin,OUTPUT);
27
  pinMode(relais3pin,OUTPUT);
28
  pinMode(relais4pin,OUTPUT);
29
30
  BtnOpen.setDebounceTime(50); 
31
  BtnClose.setDebounceTime(50); 
32
33
  myservo1.attach(6);
34
  myservo2.attach(7);
35
  myservo1.write(100);
36
  myservo2.write(80);
37
  
38
  digitalWrite(relais1pin,HIGH);
39
  digitalWrite(relais2pin,HIGH);
40
  digitalWrite(relais3pin,HIGH);
41
  digitalWrite(relais4pin,HIGH);
42
43
}
44
45
void loop() {
46
  
47
  BtnOpen.loop(); 
48
  BtnClose.loop();
49
  
50
  limitsw1.loop();
51
  limitsw2.loop();
52
  limitsw3.loop();
53
  limitsw4.loop();
54
  limitsw5.loop();
55
56
 
57
 if(BtnOpen.isPressed()){
58
    Serial.println(F("BtnOpen"));
59
    motor1_V();
60
    Serial.println(F("DC-Motor Zahnrad Vor"));
61
   } else if (limitsw2.isPressed()) {
62
  Serial.println(F("LIMIT2"));    
63
    motor1_S();
64
    Serial.println(F("DC-Motor Zahnrad Stop"));
65
  motor2_R();
66
  Serial.println(F("Linearmotor Aktiv 90°"));
67
   }else if (limitsw3.isPressed()) {
68
  Serial.println(F("LIMIT3"));
69
    motor2_S();
70
  Serial.println(F("Linearmotor stopp"));
71
    myservo1.write(70);
72
  Serial.println(F("Servo1 aktiv"));
73
    delay(1000);
74
    myservo1.write(100);
75
  Serial.println(F("Servo1 ausganstellung"));
76
    delay(1000);  
77
   }
78
79
80
 
81
if(BtnClose.isPressed()){
82
  Serial.println(F("BtnClose"));
83
    myservo2.write(120);
84
  Serial.println(F("Servo2 aktiv"));
85
    delay(1000); 
86
    myservo2.write(80);
87
  Serial.println(F("Servo2 ausganstellung"));
88
    delay(1000);   
89
   } else if (limitsw5.isPressed()) {
90
  Serial.println(F("LIMIT5"));
91
    motor2_V();
92
  Serial.println(F("Linearmotor Aktiv 0°"));
93
94
   }else if (limitsw4.isPressed()) {
95
  Serial.println(F("LIMIT4"));
96
    motor2_S(); 
97
  Serial.println(F("Linearmotor Stopp°"));
98
    motor1_R(); 
99
  Serial.println(F("DC-Motor Zahnrad Zurück"));
100
   }else if (limitsw1.isPressed()) {
101
  Serial.println(F("LIMIT1"));
102
    motor1_S();  
103
  Serial.println(F("DC-Motor Zahnrad Stopp"));
104
 }
105
}
106
 
107
//---------DC-MOTOR 1 mit Zahnrad ----------------
108
void motor1_V(){
109
  digitalWrite(relais1pin,LOW);
110
  digitalWrite(relais2pin,HIGH);
111
}
112
113
void motor1_R(){
114
  digitalWrite(relais1pin,HIGH);
115
  digitalWrite(relais2pin,LOW);
116
}
117
118
void motor1_S(){
119
  digitalWrite(relais1pin,HIGH);
120
  digitalWrite(relais2pin,HIGH);
121
}
122
//------ MOTOR 2 Linear Actuator--------------
123
void motor2_V(){
124
  digitalWrite(relais3pin,LOW);
125
  digitalWrite(relais4pin,HIGH);
126
}
127
128
void motor2_R(){
129
  digitalWrite(relais3pin,HIGH);
130
  digitalWrite(relais4pin,LOW);
131
}
132
133
void motor2_S(){
134
  digitalWrite(relais3pin,HIGH);
135
  digitalWrite(relais4pin,HIGH);
136
}

von Otto (Gast)


Lesenswert?

Hallo,

meinen Respekt vor dem professionellen mechanischen Aufbau.
Folgende Anmerkungen, worüber du dir aber unbedingt Gedanken machen 
solltest:

1. Inbetriebnahme:

Die Bewegung sollte nur so lange erfolgen, wie der jeweilige Taster 
betätigt wird, bis alle Abläufe 100% sicher funktionieren.

2. Sicherheit:

Was passiert, wenn ein Endschalter überfahren wird (beispielsweise weil 
seine Betätigungs-Fahne verbogen oder die Befestigungsschrauben sich 
gelockert haben? Wahrscheinlich blockiert der Motor und ein oder mehrere 
Teile der Konstruktion (Motor, Netzteil) wird so heiß, dass das Holz zu 
brennen beginnt. Diese Gefahr musst du unbedingt ausschliessen - 
beispielsweise durch Beschränkung der maximalen Laufzeit jedes Motors 
(Timeout - bereits oben geschrieben) und durch Temperaturüberwachung der 
Einheiten mit Abschaltung der Versorgungspannung im Fehlerfall.

3. Einrichtbetrieb:

Was passiert, wenn die Konstruktion mitten im Betrieb stehen bleibt 
(Beispielsweise durch Stromausfall)? Wie fährst du die einzelnen 
EInheiten wieder in die Grundposition? Dafür benötigst du zumindest eine 
zusätzliche Bedienungsmöglichkeit.

Aus meiner Sicht ist der Dauerbetrieb in der von dir vorgesehenen Art 
und Weise unverantwortlich. Die Stromversorgung der gesamten Einheit 
(oder zumindest der Motoren) sollte nur für die Normaldauer des 
Ausfahrens oder Einfahrens eingeschaltet sein - was man allerdings auch 
durch eine relativ einfache Schaltung gewährleisten könnte.

Viele Grüße

Otto

von Andrea I. (andele)


Lesenswert?

Hi Otto, Vielen Dank, da bin ich absolut bei dir.
Das Ding kommt erst zum Einsatz wenn es 100% funktioniert. Am 
bedienmodul wo meine Ein und Ausfahr Knöpfe sind ist auch ein ein/aus 
Schalter für das System,  Problematik ist die Abfrage der Endschalter, 
hoffe auch durch Beihilfe das ich das hinbekomme.Ist ein schönes Projekt 
aber umfangreich an Sicherheit da haste absolut recht.

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

@Andrea:

was hindert dich dran, bereits jetzt deine Variablen "geschickt" 
umzubenennen?  Mit Texteditor-Ersetzung ist das ja in weniger als einer 
Minute erledigt.

Deine Software ist ja noch nocht fertig, und je einfacher die sich lesen 
lässt, desto besser wird der Algorithmus ja auch für dich verständlich.

PS: google nach TV-Unterbettlift zeigt interessante Konstruktionen, viel 
Erfolg mit dem Projekt!

: Bearbeitet durch User
von Schlaumaier (Gast)


Lesenswert?

Andrea I. schrieb:
> Problematik ist die Abfrage der Endschalter,
> hoffe auch durch Beihilfe das ich das hinbekomme.

Ist sie nicht.

Wie oben schon geschrieben ist deine Motorsteuerung m.M.n. nicht i.o.

Du solltest IMMER wenn sie der Motor bewegt alle 100 MS oder so den 
Endschalter abfragen der für den Weg zuständig ist.

Was die Nullstellung angeht.
Einfach auf beiden Richtungen ein Endschalter einbauen.

Wie schon erwähnt :

sub Motor_laufen
  while Endschalter = aus and not_schalter = aus
    delay 100
  loop

  // hier Befehl Motor Stop

end sub

Sobald da einer der Schalter : normaler Endschalter o. NOT-Schalter am 
Bedienpult ausgelöst wird, bleibt der Motor nach 100 ms stehen.

Als Endschalter würde ich ein Drahtbügeltaster einsetzen. Den kann man 
sich schön zurecht biegen.

von Cyblord -. (cyblord)


Lesenswert?

Schlaumaier schrieb:
> Da ich aber nicht alle Pins direkt an den Arduino anschließe kann es
> durchaus sein das ich im Kommentar oben schreibe
>
> // Anschluss 1 Display
> // Anschluss 1 = blau = SCL   Adresse ####
> // Anschluss 1 = rot = +
> // Anschluss 1 = schwarz = -
> // Anschluss 1 = grün = SDA
>
> Dann weiss ich schlaues Kerlchen das Anschluss 1 der Display-port ist
> und welche Farben ich was zugewiesen habe.

Sowas ist schlecht, weil es schnell passieren kann das Kommentar und 
Realität nicht mehr passen.
Man kann die Pinbelegung viel besser über den Code selbst dokumentieren. 
Ohne eine zusätzliche redundante Doku zu erzeugen die man dann auch noch 
ständig pflegen muss.
Wenn dann wird so etwas in einem Schaltplan dokumentiert.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Man kann auch Notaus-Endschalter einbauen, die knapp hinter den von der 
Software abgefragten hängen und beim Betätigen die ganze Maschine 
stromlos machen. Und zwar so lange, bis man den Strom abgestellt und die 
Blockade mechanisch gelöscht hat.

von Andrea I. (andele)


Lesenswert?

Christian H. schrieb:
> Man kann auch Notaus-Endschalter einbauen, die knapp hinter den von der
> Software abgefragten hängen und beim Betätigen die ganze Maschine
> stromlos machen. Und zwar so lange, bis man den Strom abgestellt und die
> Blockade mechanisch gelöscht hat.

Ist auch eine Option, Danke für den Tip.

von ... (Gast)


Lesenswert?

Andrea I. schrieb:
> Mein erstes Problem ist wenn Limit5 ausgelöst wird passiert nichts, muss
> das Arduino reseten damit das Relaiboard das Linearmotor aktiviert,
> manchmal klappt das und manchmal halt nich weiss nicht warum.

Aus deiner Verdrahtungsskizze geht nicht hervor woher die 
Betriebsspannungen für die verschiedenen Module kommen. Es ist keine 
gute Idee den µC und die Modellbauservos/Relais ohne weitere Maßnahmen 
(Polyfuse, Entkopplungdiode, Bufferkondensator) aus einer gemeinsamen 
Quelle zu betreiben. Der 5V LDO auf dem Arduino kann deine Servos im 
Blockierzustand nicht versorgen; bei einem Servodefekt erst recht nicht. 
Die Relaiskarte könnte funktionieren, wenn sie ordentlich designed ist.
Das könnte die Ursache für unplausibles Verhalten sein, muss es aber 
nicht.

von Schlaumaier (Gast)


Lesenswert?

Vielleicht hast du auch nur den falschen Stromeingang beim Arduino 
genommen.
Ich weiß bis heute noch nicht wieso mir das neulich passiert ist.

von Ralf X. (ralf0815)


Lesenswert?

Andrea I. schrieb:
> habe einen TV-Unterbettlift zusammen gebastelt, zweifle etwas an der
> elektonik bzw. an den sketch.
> Es sind 2X Buttons, 5X limit-switch, 1X DC-Motor(12V), 1X
> Linearmotor(12V), 2x MG90S(Servo), 1X 4-Channel Relaiboard, 1X Arduino
> Uno(R3).
> Benutze die Bibliothek "ezButton".
> Wenn mann aufs Button(A0) drückt fährt das DC-Motor die einheit raus,
> dann wird der Limit2 ausgelöst, die einheit wird geschwenkt durch den
> LinearMotor(90°), der Limit3 wird ausgelöst, Servo1 wird aktiviert TV
> wird auf Endposition gebracht.
> Wenn ich es aber schliesen möchte mache ich das mit Button(A1),*Servo2*
> wird aktiviert, einheit fährt auf Ausganstellung, Limit5 wird ausgelöst,
> Linearmotor(0°) schwänkt die einheit, Limit4 wird ausgelöst, DC-Motor
> fährt zurück, Limit1 wird ausgelöst.

Schon hier scheint mir einiges zum Verständnis und eine gewisse 
Übersichlichkeit zu fehlen.
jeweils den gesamten Aus- und Einfahrvorgang sollte man übersichtlich 
tabellarisch darstellen und in Text und Code die gleichen Begriffe 
verwenden.
- limitsw2
- Limit2
macht das Verständnis schon unübersichlicher als notwendig.

Du hast auch Limit1 im Eingangstext nicht erwähnt.
Wieso arbeitet lt. Text beim Ausfahren Servo1, beim Einfahren aber 
Servo2?
Warum nicht ein Bild der gesamten Konstruktion?

Natürlich kann man sich mit technischen Verständnis und lesen des Code 
einiges Vorstellen, aber es macht weniger Spass, dafür aber mehr Mühe.

Kritik an den Benennungen/Erklärungen im Code haben ja schon andere 
geübt.
Oder am fehlenden Schaltplan mit der tatsächlichen "Verdrahtung".
ICH stelle mir vor, dass der Arduino keine Servos mit 5V/GND 
versorgen(!) möchte, die einen "TV" bewegen sollen.

Zu der hier mehrfach angesprochenen Sicherheit:
Man kann es übertreiben, aber auch untertreiben.
ICH würde wahrscheinlich für JEDEN Antrieb eine zweiseitige 
Endabschaltung vorsehen, also bei Deiner Beschreibung wohl 8 
Endschalter.
Eine Lösung, einzelne Endschalter hier(!) quasi verzögert doppelt 
auszuführen, taugt in meinen Augen nicht, ist aber von der gesamten 
Konstruktion abhängig.
Sinnvoll erscheint mir hier(!), die Stromaufnahme der Antriebe zu 
überwachen, z.B. über ADS1115 und geeignete Shunts und im Code zu 
integrieren.
Und einen Stop im Bedienpanel vorzusehen, egal warum das mal angebracht 
ist.

von Andrea I. (andele)



Lesenswert?

Hallo zusammen, hab mir mal die Zeit genommen mal das ganze Bildlich 
darzustellen. Die zwei servo's sind dafür da um auf das Bedienpult die 
Vorprogrammierte höhe zu aktivieren.
Sketch habe ich nochmal Überarbeitet
1
#include <ezButton.h>
2
#include <Servo.h>
3
4
int relais1pin = 2;    //  + MOTOR 1 mit Zahnrad
5
int relais2pin = 3;    //  - MOTOR 1 mit Zahnrad
6
int relais3pin = 4;    //  + MOTOR 2 Actuator
7
int relais4pin = 5;    //  - MOTOR 2 Actuator
8
9
ezButton Button_Ausfahren(A0);  
10
ezButton Button_Einfahren(A1);
11
12
ezButton Endschalter_Hinten_DC_Motor (8); // Endschalter 1
13
ezButton Endschalter_Vorne_DC_Motor (9);  // Endschalter 2
14
ezButton Endschalter_90_Actuator (10);    // Endschalter 3
15
ezButton Endschalter_0_Actuator (11);     // Endschalter 4 
16
ezButton Endschalter_Lift (12);           // Endschalter 5
17
 
18
Servo myservo1;                          // Stativ raus fahren
19
Servo myservo2;                          // Stativ rein fahren
20
21
void setup() {
22
  Serial.begin(115200);
23
  Serial.println(F("TEST"));
24
  
25
  pinMode(relais1pin,OUTPUT);
26
  pinMode(relais2pin,OUTPUT);
27
  pinMode(relais3pin,OUTPUT);
28
  pinMode(relais4pin,OUTPUT);
29
30
  Button_Ausfahren.setDebounceTime(50); 
31
  Button_Einfahren.setDebounceTime(50); 
32
33
  myservo1.attach(6);
34
  myservo2.attach(7);
35
  myservo1.write(100);  
36
  myservo2.write(80);
37
  
38
  digitalWrite(relais1pin,HIGH);
39
  digitalWrite(relais2pin,HIGH);
40
  digitalWrite(relais3pin,HIGH);
41
  digitalWrite(relais4pin,HIGH);
42
43
}
44
45
void loop() {
46
  
47
  Button_Ausfahren.loop(); 
48
  Button_Einfahren.loop();
49
  
50
  Endschalter_Hinten_DC_Motor.loop();  // Endschalter 1
51
  Endschalter_Vorne_DC_Motor.loop();  // Endschalter 2
52
  Endschalter_90_Actuator.loop();    // Endschalter 3
53
  Endschalter_0_Actuator.loop();    // Endschalter 4
54
  Endschalter_Lift.loop();        // Endschalter 5
55
56
 
57
 if(Button_Ausfahren.isPressed()){
58
  Serial.println(F("Button_Ausfahren"));
59
    motor1_vor();
60
    Serial.println(F("DC-Motor Zahnrad Vor"));
61
   } else if (Endschalter_Vorne_DC_Motor.isPressed()) {
62
  Serial.println(F("Endschalter_2"));    
63
    motor1_stop();
64
    Serial.println(F("DC-Motor Zahnrad Stop"));
65
  motor2_zuruck();
66
  Serial.println(F("Actuator Aktiv 90°"));
67
   }else if (Endschalter_90_Actuator.isPressed()) {
68
  Serial.println(F("Endschalter_3"));
69
    motor2_stop();
70
  Serial.println(F("Actuator stopp"));
71
    myservo1.write(70);
72
  Serial.println(F("Servo1 aktiv"));  // Stativ fährt raus
73
    delay(1000);
74
    myservo1.write(100);
75
  Serial.println(F("Servo1 ausganstellung"));
76
    delay(1000);  
77
   }
78
79
80
 
81
if(Button_Einfahren.isPressed()){
82
  Serial.println(F("Button_Einfahren"));
83
    myservo2.write(120);
84
  Serial.println(F("Servo2 aktiv"));  // Stativ fährt rein
85
    delay(1000); 
86
    myservo2.write(80);
87
  Serial.println(F("Servo2 ausganstellung"));
88
    delay(1000);   
89
   } else if (Endschalter_Lift.isPressed()) {
90
  Serial.println(F("Endschalter_5"));
91
    motor2_vor();
92
  Serial.println(F("Actuator Aktiv 0°"));
93
94
   }else if (Endschalter_0_Actuator.isPressed()) {
95
  Serial.println(F("Endschalter_4"));
96
    motor2_stop(); 
97
  Serial.println(F("Actuator Stopp 0°"));
98
    motor1_zuruck(); 
99
  Serial.println(F("DC-Motor Zahnrad Zurück"));
100
   }else if (Endschalter_Hinten_DC_Motor.isPressed()) {
101
  Serial.println(F("Endschalter_1"));
102
    motor1_stop();  
103
  Serial.println(F("DC-Motor Zahnrad Stopp"));
104
 }
105
}
106
 
107
//------------------------ MOTOR 1 mit Zahnrad --------------------------------------
108
void motor1_vor(){
109
  digitalWrite(relais1pin,LOW);
110
  digitalWrite(relais2pin,HIGH);
111
}
112
113
void motor1_zuruck(){
114
  digitalWrite(relais1pin,HIGH);
115
  digitalWrite(relais2pin,LOW);
116
}
117
118
void motor1_stop(){
119
  digitalWrite(relais1pin,HIGH);
120
  digitalWrite(relais2pin,HIGH);
121
}
122
//----------------------- MOTOR 2 Linear Actuator --------------------------------------
123
void motor2_vor(){
124
  digitalWrite(relais3pin,LOW);
125
  digitalWrite(relais4pin,HIGH);
126
}
127
128
void motor2_zuruck(){
129
  digitalWrite(relais3pin,HIGH);
130
  digitalWrite(relais4pin,LOW);
131
}
132
133
void motor2_stop(){
134
  digitalWrite(relais3pin,HIGH);
135
  digitalWrite(relais4pin,HIGH);
136
}

von Cyblord -. (cyblord)


Lesenswert?

Mach eine State Machine!!!!!

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Du drückst mit den Servos auf eine Fernbedienung? Oder was ist das 
schwarze Kästchen mit den weißen "Tasten"?

von Andrea I. (andele)


Lesenswert?

Christian H. schrieb:
> Du drückst mit den Servos auf eine Fernbedienung? Oder was ist das
> schwarze Kästchen mit den weißen "Tasten"?

Bedieneinheit Kabelgebunden, bis zu 4 positionen einstellbar, Servo1 
drückt auf Taste 1, Stativ fährt hoch, Servo 2 drückt auf Taste 2, 
Stativ fährt runter.

: Bearbeitet durch User
von Rainer S. (enevile) Benutzerseite


Lesenswert?

Was die anderen sagen wollten habe ich mal ergänzt.
Wenn ich es richtig interpretiert habe.

So kann man direkt verstehen was die Variable nachher tun soll.
1
int Motor_raus= 2;    //  + MOTOR 1 mit Zahnrad
2
int Motor_rein= 3;    //  - MOTOR 1 mit Zahnrad
3
int Motor_hoch = 4;    //  + MOTOR 2 Actuator
4
int Motor_runter = 5;    //  - MOTOR 2 Actuator
5
6
//entsprechend anpassen STRG + F "relais1pin" alle ersetzen durch "Motor_raus"



Für die Zustände
Gehe davon aus das dein Relais-Board Low-Aktiv ist, weil beim Stop alle 
Pins High gesetzt werden.
1
switch (Zustand){
2
case Motor_raus:
3
  digitalWrite(relais1pin,LOW); 
4
  digitalWrite(relais2pin,HIGH);
5
break;
6
7
case Motor_rein:
8
  digitalWrite(relais1pin,HIGH);
9
  digitalWrite(relais2pin,LOW);
10
break;
11
//usw. für die anderen Zustände
12
13
}



Andrea I. schrieb:
> Die Bibliothek habe ich von hier
> https://www.arduinolibraries.info/libraries/ez-button

Die kenne ich nicht da kann ich nicht weiter helfen. Würde sowas selber 
programmieren.

: 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.