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
intrelais1pin=2;
5
intrelais2pin=3;
6
intrelais3pin=4;
7
intrelais4pin=5;
8
9
ezButtonbutton1(A0);
10
ezButtonbutton2(A1);
11
12
ezButtonlimitsw1(8);
13
ezButtonlimitsw2(9);
14
ezButtonlimitsw3(10);
15
ezButtonlimitsw4(11);
16
ezButtonlimitsw5(12);
17
18
Servomyservo1;
19
Servomyservo2;
20
21
voidsetup(){
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
voidloop(){
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
}elseif(limitsw2.isPressed()){
58
motor1_S();
59
motor2_R();
60
}elseif(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
}elseif(limitsw5.isPressed()){
76
motor2_V();
77
78
}elseif(limitsw4.isPressed()){
79
motor2_S();
80
motor1_R();
81
}elseif(limitsw1.isPressed()){
82
motor1_S();
83
}
84
}
85
86
//-------------------------------- MOTOR 1 mit Zahnrad --------------------------------------
87
voidmotor1_V(){
88
digitalWrite(relais1pin,LOW);
89
digitalWrite(relais2pin,HIGH);
90
}
91
92
voidmotor1_R(){
93
digitalWrite(relais1pin,HIGH);
94
digitalWrite(relais2pin,LOW);
95
}
96
97
voidmotor1_S(){
98
digitalWrite(relais1pin,HIGH);
99
digitalWrite(relais2pin,HIGH);
100
}
101
//-------------------------------- MOTOR 2 Linear --------------------------------------
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.
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.
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.
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
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.
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.
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
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.
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... ;-)
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 ;-)
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
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
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.
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.
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
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.
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.
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.
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.
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
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.
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.
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
intrelais1pin=2;
5
intrelais2pin=3;
6
intrelais3pin=4;
7
intrelais4pin=5;
8
9
ezButtonBtnOpen(A0);
10
ezButtonBtnClose(A1);
11
12
ezButtonlimitsw1(8);
13
ezButtonlimitsw2(9);
14
ezButtonlimitsw3(10);
15
ezButtonlimitsw4(11);
16
ezButtonlimitsw5(12);
17
18
Servomyservo1;
19
Servomyservo2;
20
21
voidsetup(){
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
voidloop(){
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
}elseif(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
}elseif(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
}elseif(limitsw5.isPressed()){
90
Serial.println(F("LIMIT5"));
91
motor2_V();
92
Serial.println(F("Linearmotor Aktiv 0°"));
93
94
}elseif(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
}elseif(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 ----------------
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
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.
@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!
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.
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.
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.
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.
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.
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.
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
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.
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
intMotor_raus=2;// + MOTOR 1 mit Zahnrad
2
intMotor_rein=3;// - MOTOR 1 mit Zahnrad
3
intMotor_hoch=4;// + MOTOR 2 Actuator
4
intMotor_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.