Forum: Mikrocontroller und Digitale Elektronik Arduino Steuerung für drei Achsige Halterung


von Ron B. (simatic)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
zuerst einmal zu mir. Ich heiße Ron, bin 19 Jahre alt und lerne im 3. 
Lehrjahr Mechatroniker (Industrie). Im Hobby bereich habe ich mir vor 
kurzem einen Arduino Uno zugelegt, da mich das Thema Mikrocontroller mit 
dem elektrischen drumherum ziemlich interessiert. Für jemanden der sonst 
Automatisierungssysteme wie die S7 gewohnt ist, ist der µC doch eine 
große Umstellung. Nun habe ich mir als Projekt die Low Budget 
Automatisierung einer von mir gebauten Monitorhalterung vorgenommen 
(Nein ich bin kein Nerd, hier ist der Weg das Ziel :) ).
Die drei Achsen sind über 12VDC Motoren rotatorisch verfahrbar. Jede 
Achse hat zwei Endlagen, die über digitale Hall-Sensoren abgefragt 
werden. Die Motoransteuerung ist über jeweils 2 Relais realisiert 
(Relais 1=Ein/Aus, Relais 2= Rechts/Links). Zur Bedienung werden 3 Potis 
verwendet. Für jede Achse eins, sollte aber aus dem Sketch hervorgehen. 
Bei der Grundfahrt (Poti1=1000+, Poti2= Stopp, Poti3= Stopp) sollen alle 
Achsen in die hintere Endlage fahren.

Die Verdrahtung der Sensoren und Aktoren mit dem µC sind kein Problem 
für mich. Ich scheitere nur im Moment an dem Arduino Programm. Wenn ich 
den ganzen Apparat starte ziehen alle Relais an (Motoren sind 
abgeklemmt, sonst Crash). Potistellung ist egal. Ich erwarte hier keinen 
überarbeiteten Sketch, würde mich über das Aufmerksam machen auf 
Logik/Programmierfehler freuen. Ich bin absoluter Neuling auf dem Gebiet 
der µC Programmierung. Ich hoffe ihr habt Verständnis dafür. Im Anhang 
findet ihr den Sketch. Die 3,5s delay am Ende sind für das bessere 
Beobachten der Variablen im seriellen Monitor gedacht.

Vielen Dank schonmal!

Greets
Ron


1
const int K1_A_0 = 2;         //Wand          0=aus,          1=ein                                                          DO
2
const int K2_B_0 = 3;         //Scharnier     0=aus,          1=ein                                                          DO
3
const int K3_C_0 = 4;         //Monitor       0=aus,          1=ein                                                          DO
4
const int K4_A_1 = 5;         //Wand          0=rechts,       1=links                                                        DO
5
const int K5_B_1 = 6;         //Scharnier     0=rechts,       1=links                                                        DO
6
const int K6_C_1 = 7;         //Monitor       0=rechts,       1=links                                                        DO
7
const int Achse_A_0 = 8;      //Wand                          1=eingefahren                                                  DI
8
const int Achse_A_1 = 9;      //Wand                          1=ausgefahren                                                  DI
9
const int Achse_B_0 = 10;     //Scharnier                     1=eingefahren                                                  DI
10
const int Achse_B_1 = 11;     //Scharnier                     1=ausgefahren                                                  DI
11
const int Achse_C_0 = 12;     //Monitor                       1=eingefahren                                                  DI
12
const int Achse_C_1 = 13;     //Monitor                       1=ausgefahren                                                  DI
13
const int S1 = A0;            //Poti Wand           0-250=rechts, 251-750=Stopp, 751-1000=links, 1001-1024= Grundstellung    AI
14
const int S2 = A1;            //Poti Scharnier      0-250=rechts, 251-750=Stopp, 751-1000=links                              AI
15
const int S3 = A2;            //Poti Monitor        0-250=rechts, 251-750=Stopp, 751-1000=links                              AI
16
17
int _S1_Value = 0;            //Potiwert Wand
18
int _S2_Value = 0;            //Potiwert Scharnier
19
int _S3_Value = 0;            //Potiwert Monitor
20
21
int _Achse_A_0_Value = 0;    //Wand eingefahren
22
int _Achse_A_1_Value = 0;    //Wand ausgefahren
23
int _Achse_B_0_Value = 0;    //Scharnier eingefahren
24
int _Achse_B_1_Value = 0;    //Scharnier ausgefahren
25
int _Achse_C_0_Value = 0;    //Monitor eingefahren
26
int _Achse_C_1_Value = 0;    //Monitor ausgefahren
27
28
void setup()
29
{
30
  Serial.begin(9600);
31
32
  pinMode (K1_A_0, OUTPUT);
33
  pinMode (K2_B_0, OUTPUT);
34
  pinMode (K3_C_0, OUTPUT);
35
  pinMode (K4_A_1, OUTPUT);
36
  pinMode (K5_B_1, OUTPUT);
37
  pinMode (K6_C_1, OUTPUT);
38
  pinMode (Achse_A_0, INPUT);
39
  pinMode (Achse_A_1, INPUT);
40
  pinMode (Achse_B_0, INPUT);
41
  pinMode (Achse_B_1, INPUT);
42
  pinMode (Achse_C_0, INPUT);
43
  pinMode (Achse_C_1, INPUT);
44
}
45
46
void loop()
47
{
48
49
50
  {
51
    
52
    Serial.print("Achse_A_0     "); 
53
    Serial.println(digitalRead(Achse_A_0));      
54
    Serial.print("Achse_A_1     ");
55
    Serial.println(digitalRead(Achse_A_1));    
56
    Serial.print("Achse_B_0     ");
57
    Serial.println(digitalRead(Achse_B_0)); 
58
    Serial.print("Achse_B_1     ");
59
    Serial.println(digitalRead(Achse_B_1));
60
    Serial.print("Achse_C_0     ");
61
    Serial.println(digitalRead(Achse_C_0));  
62
    Serial.print("Achse_C_1     ");
63
    Serial.println(digitalRead(Achse_C_1));   
64
    Serial.print("Poti 1     ");
65
    Serial.println(analogRead(_S1_Value));   
66
    Serial.print("Poti 2     ");
67
    Serial.println(analogRead(_S2_Value));  
68
    Serial.print("Poti 3     ");
69
    Serial.println(analogRead(_S3_Value));   
70
     Serial.println("  ");
71
    
72
73
  }
74
75
76
  {
77
78
    _Achse_A_0_Value = digitalRead(Achse_A_0);
79
    _Achse_A_1_Value = digitalRead(Achse_A_1);
80
    _Achse_B_0_Value = digitalRead(Achse_B_0);
81
    _Achse_B_1_Value = digitalRead(Achse_B_1);
82
    _Achse_C_0_Value = digitalRead(Achse_C_0);
83
    _Achse_C_1_Value = digitalRead(Achse_C_1);
84
    _S1_Value = analogRead(S1);
85
    _S2_Value = analogRead(S2);
86
    _S3_Value = analogRead(S3);
87
  }
88
89
  // Achse Wand
90
91
92
93
  if ((_S1_Value == 0 < 250) && (_Achse_A_1_Value == 0))                         //Achse Wand ausfahren (links)
94
  {
95
    digitalWrite(K1_A_0, HIGH);
96
    digitalWrite(K4_A_1, HIGH);
97
  }
98
99
100
  if (((_S1_Value == 750 < 1000) && (_Achse_A_0_Value == 0)) || ((_S1_Value > 1001) && (_Achse_A_0_Value == 0)))                     //Achse Wand einfahren (rechts)
101
  {
102
    digitalWrite(K1_A_0, HIGH);
103
    digitalWrite(K4_A_1, LOW);
104
  }
105
106
  if ((_S1_Value == 251 < 749) && (_S1_Value < 1001))                                                                       //Achse Wand Stopp
107
  {
108
    digitalWrite(K1_A_0, LOW);
109
    digitalWrite(K4_A_1, LOW);
110
  }
111
112
113
  //Achse Scharnier
114
115
116
117
  if ((_S2_Value == 0 < 250) && (_Achse_B_1_Value == 0))                                                                   //Achse Scharnier ausfahren (auf)
118
  {
119
    digitalWrite(K2_B_0, HIGH);
120
    digitalWrite(K5_B_1, HIGH);
121
  }
122
123
124
  if (((_S2_Value == 750 < 1025) && (_Achse_B_0_Value == 0)) || ((_S1_Value > 1001) && (_Achse_B_0_Value == 0)))            //Achse Scharnier einfahren (zu)
125
  {
126
    digitalWrite(K2_B_0, HIGH);
127
    digitalWrite(K5_B_1, LOW);
128
  }
129
130
  if ((_S2_Value == 251 < 749) && (_S1_Value < 1001))                                                                      //Achse Scharnier Stopp
131
  {
132
    digitalWrite(K2_B_0, LOW);
133
    digitalWrite(K5_B_1, LOW);
134
  }
135
136
137
  //Achse Monitor
138
139
140
  if ((_S3_Value == 0 < 250) && (_Achse_C_1_Value == 0))                                                                  //Achse Monitor ausfahren
141
  {
142
    digitalWrite(K3_C_0, HIGH);
143
    digitalWrite(K6_C_1, HIGH);
144
  }
145
146
147
  if (((_S3_Value == 750 < 1025) && (_Achse_C_0_Value == 0)) || ((_S1_Value > 1001) && (_Achse_C_0_Value == 0)))          //Achse Monitor einfahren
148
  {
149
    digitalWrite(K3_C_0, HIGH);
150
    digitalWrite(K6_C_1, LOW);
151
  }
152
153
  if ((_S3_Value == 251 < 749) && (_S1_Value < 1001))                                                                      //Achse Monitor Stopp
154
  {
155
    digitalWrite(K3_C_0, LOW);
156
    digitalWrite(K6_C_1, LOW);
157
  }
158
159
160
delay (3500);
161
  
162
163
}

von Alexander S. (alex998)


Lesenswert?

Ron B. schrieb:


> const int K1_A_0 = 2;

->  #define K1_A_0 2

Dafür solltest du Makros nutzen.

Ansonsten: Schaltplan wär nicht verkehrt.

von PittyJ (Gast)


Lesenswert?

Warum Macros?
Ich verwende const ints auch sehr gerne.
Die machen das gleiche und der Compiler kann sauber damit arbeiten. 
Keine Präprozessor-Ersetzung mit irgendwelchen Nebenwirkungen.

von Alexander S. (alex998)


Lesenswert?

@PittyJ: Ja du hast Recht; beim Arduino-C++ hat const Vorteile 
(Casting), war von C ausgegangen.

von Peter (Gast)


Lesenswert?

Hast du vll. eine fertige Relaisplatine gekauft. Oft schalten die bei 
0V. Kannst ja mal probieren in dem du beim Einschalten alle Ausgänge 
setzt... Dann sollten alle Relais aus sein.

von Rasputin (Gast)


Lesenswert?

hab nur kurz drüber geschaut, aber sowas:
1
(_S1_Value == 750 < 1000)

funktioniert nicht. Vermutlich meintest du sowas wie:
1
(_S1_Value > 750 && _S1_Value <= 1000)

von Ron B. (simatic)


Lesenswert?

Dann bleibe ich erstmal bei den const_int's.

Ich bin leider kein Experte in E-CAD, im Moment fuchse ich mich in Eagle 
rein. Bis da etwas ordentliches rauskommt dauert es aber noch. Eine 5V 
Relais Karte verwende ich für die Relais, die den Motor Ein/Aus 
schalten. Die Relais für die Pol Wendung werden über einen C547B 
Transistor angesteuert.
Die elektrische Schaltung und ob die Ausgänge die Relais schalten habe 
ich getestet.



Rasputin schrieb:
> hab nur kurz drüber geschaut, aber sowas:
>
>
1
(_S1_Value == 750 < 1000)
>
> funktioniert nicht. Vermutlich meintest du sowas wie:
>
>
1
(_S1_Value > 750 && _S1_Value <= 1000)

Danke für den Tipp, Rasputin. Funktion soll sein, dass wenn Poti 1 einen 
Wert zwischen 750 und 1000  hat, Relais K1 anzieht und K4 nicht. Ist 
dies dann eine funktionierende Bedingung?
1
(((_S1_Value > 750 && _S1_Value <= 1000 ) && (_Achse_A_0_Value == 0)) || ((_S1_Value > 1001) && (_Achse_A_0_Value == 0)))

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