Nabend zusammen,
so die Programmierung des Arduino ist nun auch fertig.
Die Funktionalität ist die Gleiche wie bei der zuvor beschriebenen SPS.
Nur das hier der Motor nicht mit Relais ein und ausgeschaltet wird,
sondern mittels Pulsweitenmodulation langsam beschleunigt und abgebremst wird.
Und dies mit einer programmierbaren Min und Max- Geschwindigkeit.
Hier der Sketch für die interessierten:
Code: Alles auswählen
//Ports definieren
#define EnableA 3 //Arduino Pin 3 auf Eingang PWM-Signal Motor 1 der H-Brücke
#define In1 4 //Arduino Pin 4 auf Eingang Nr.1 der H-Brücke
#define In2 5 //Arduino Pin 5 auf Eingang Nr.2 der H-Brücke
#define Pin_Wechsel 11 // Taster für Lagewechsel des Monitors
#define Pin_Senkrecht 12 //Endschalter Monitor steht senkrecht
#define Pin_Waagerecht 13 //Endschalter Monitor steht waagerecht
#define Speed_Max 255 // Gibt die maximale Motorgeschw. an. 255 = 100%
#define Speed_Min 50 // Gibt die minimale Motorgeschw. an. 0 = 100%
#define Schwenkzeit_max 4000 // Angabe der maximalen Schwenkzeit, bevor Nothalt
#define Debug // Bedingte Compilierung (Wenn nicht augeklammert => serielle Ausgabe zur Fehlersuche)
// Globale Variablen deklarieren
int Wechsel_Taster = digitalRead(Pin_Wechsel);
int Endschalter_Senkrecht = digitalRead(Pin_Senkrecht);
int Endschalter_Waagerecht = digitalRead(Pin_Waagerecht);
boolean SenkrechtSchwenken = 0; // Wird auf 1 gesetzt, wenn Monitor nach senkrecht schwenkt.
boolean WaagerechtSchwenken = 0; //Wird auf 1 gesetzt, wenn Monitor nach waagerecht schwenkt.
boolean FirstLoop = 1; // Flagvariable für die erste Programmschleife
unsigned long Zeit_akt = 0; // Aktuelle Schwenkzeit für Nothalt
unsigned long Startzeit = 0; // Startzeit für Nothalt in Millisekunden
unsigned long Taster_Timer_akt = 0; // Aktuelle Zeit wie lange Wechseltaster betätigt
unsigned long Taster_Timer_Start = 0; // Startzeit wann Wechseltaster betätigt
void setup() {
Serial.begin(38400);// Initialisierung der seriellen Kommunikation mit 38400bits/sek:
pinMode(Pin_Wechsel, INPUT);// Taster Lagewechsel an Pin_Wechsel als Eingang deklarieren
pinMode(Pin_Senkrecht, INPUT);// Endschalter senkrecht an Pin_Senkrecht als Eingang deklarieren
pinMode(Pin_Waagerecht, INPUT);// Endschalter waagerecht an Pin_Waagerecht als Eingang deklarieren
pinMode(EnableA, OUTPUT); //Arduino Pin EnableA als Ausgangspin deklarieren
pinMode(In1, OUTPUT); //Arduino Pin In1 als Ausgangspin deklarieren
pinMode(In2, OUTPUT); //Arduino Pin In2 als Ausgangspin deklarieren
}
void Motor_Start(int Richtung, int Geschw) { //Anweisungsblock Motor Start
switch (Richtung) {
case 1: // Richtung = 1 => Motor läuft links
digitalWrite(In1, LOW);
digitalWrite(In2, HIGH);
break;
case 2: // Richtung = 2 => Motor läuft rechts
digitalWrite(In1, HIGH);
digitalWrite(In2, LOW);
break;
}
analogWrite(EnableA, Geschw); // PWM-Signal (0-255) an EnableA Pin der H_Brücke senden
}
void Motor_Stop() { // Anweisungsblock Motor Stop und Rücksetzten der Flag-Variablen
digitalWrite(In1, LOW);
digitalWrite(In2, LOW);
analogWrite(EnableA, 0);
Zeit_akt = 0;
Startzeit = 0;
SenkrechtSchwenken = 0;
WaagerechtSchwenken = 0;
}
void Eingaege_abfragen() { // Zustünder der Eingünge abfragen
Wechsel_Taster = digitalRead(Pin_Wechsel);
Endschalter_Senkrecht = digitalRead(Pin_Senkrecht);
Endschalter_Waagerecht = digitalRead(Pin_Waagerecht);
}
void Serielle_Ausgabe() { // Anweisungsblock Datenausgabe über serielle Schnittstelle (Debug)
Serial.print("Wechsel Taster : ");
Serial.println(Wechsel_Taster);
Serial.print("Endschalter Senkrecht : ");
Serial.println(Endschalter_Senkrecht);
Serial.print("Endschalter Waagerecht : ");
Serial.println(Endschalter_Waagerecht);
Serial.print("SenkrechtSchwenken : ");
Serial.println(SenkrechtSchwenken);
Serial.print("WaagerechtSchwenken : ");
Serial.println(WaagerechtSchwenken);
Serial.println("------------");
delay (500);
}
void loop() { // Hauptprogrogrammschleife
Eingaege_abfragen(); // Zustände der Eingangspin's abfragen
// Wenn Wechseltaster grade erst gedrückt wird, Systemzeit holen
if ((Wechsel_Taster == 1) && (Taster_Timer_Start == 0)) Taster_Timer_Start = millis();
// Solange Wechseltaster gedrückt ist, aktuelle Timerzeit berechnen
if ((Wechsel_Taster == 1) && (Taster_Timer_Start > 0)) Taster_Timer_akt = millis() - Taster_Timer_Start;
if (Wechsel_Taster == 0) { // Wenn Wechseltaster nicht gedrückt ist
Taster_Timer_Start = 0; //Rücksetzten der Startzeit des Timers Tastenanschlagzeit
Taster_Timer_akt = 0; //Rücksetzten des Timers Tastenanschlagzeit
}
#ifdef Debug
Serial.println(Taster_Timer_akt); // Datenausgabe der aktuellen Tastendrückzeit wenn Debug
#endif
if (Taster_Timer_akt >= 3000){ //Wenn Taster länger als 3 Sekunden gedrückt
FirstLoop = 1; // FirstLoop auf 1 setzten und schwenken nach waagerecht erzwingen
Taster_Timer_Start = 0; //Rücksetzten der Startzeit des Timers Tastenanschlagzeit
Taster_Timer_akt = 0; //Rücksetzten des Timers Tastenanschlagzeit
}
//Anweisungsblock Monitor begint nach waagerecht zu schwenken.
if ((((Wechsel_Taster == 1) && (Endschalter_Senkrecht == 1)) && !((SenkrechtSchwenken == 1) || (WaagerechtSchwenken == 1))) || FirstLoop == 1) {
WaagerechtSchwenken = 1; // Setzen der Flagvariablen
Startzeit = millis(); // Startzeit für Nothalt holen
#ifdef Debug
Serial.println("Waagerecht schwenken begint"); // Datenausgabe wenn Debug
#endif
for (int x = Speed_Min; x < Speed_Max; x = x + 1) { // Motor von Speed_Min auf Speed_Max beschleunigen
Motor_Start(1, x);
delay (2);
}
}
//Anweisungsblock Monitor endet nach waagerecht zu schwenken.
if ((WaagerechtSchwenken == 1) && (Endschalter_Waagerecht == 1)) {
for (int x = Speed_Max; x > Speed_Min; x = x - 1) { // Motor von Speed_Max auf Speed_Min abbremsen
Motor_Start(1, x); // Motor entsprechend starten
delay (2);
}
Motor_Stop(); // Motor stoppen und Flagvriablen rücksetzten
#ifdef Debug
Serial.println("Waagerecht schwenken endet"); // Datenausgabe wenn Debug
#endif
}
//Anweisungsblock Monitor begint nach senkrecht zu schwenken.
if (((Wechsel_Taster == 1) && (Endschalter_Waagerecht == 1)) && !((SenkrechtSchwenken == 1) || (WaagerechtSchwenken == 1))) {
SenkrechtSchwenken = 1; // Setzen der Flagvariablen
Startzeit = millis(); //Startzeit für Nothalt holen
#ifdef Debug
Serial.println("Senkrecht schwenken begint");// Datenausgabe wenn Debug
#endif
for (int x = Speed_Min; x < Speed_Max; x = x + 1) { // Motor von Speed_Min auf Speed_Max beschleunigen
Motor_Start(2, x);
delay (2);
}
}
//Anweisungsblock Monitor endet nach senkrecht zu schwenken.
if ((SenkrechtSchwenken == 1) && (Endschalter_Senkrecht == 1)) {
for (int x = Speed_Max; x > Speed_Min; x = x - 1) { // Motor von Speed_Max auf Speed_Min abbremsen
Motor_Start(2, x); // Motor entsprechend starten
delay (2);
}
Motor_Stop(); // Motor stoppen und Flagvriablen rücksetzten
#ifdef Debug
Serial.println("Senkrecht schwenken endet"); // Datenausgabe wenn Debug
#endif
}
if ((SenkrechtSchwenken == 1) || (WaagerechtSchwenken == 1)) {
Zeit_akt = millis() - Startzeit; // Solange Schwenken aktiv ist den Timer aktualisieren
if (Zeit_akt >= Schwenkzeit_max) { // Nothalt wenn Schwnkzeit_max erreicht ist
Motor_Stop(); // Motor stoppen und Flagvriablen rücksetzten
#ifdef Debug
Serial.println("**************Nothalt****************"); // Datenausgabe wenn Debug
#endif
}
}
#ifdef Debug
Serial.println(Zeit_akt); // Datenausgabe wenn Debug
Serielle_Ausgabe();
#endif
FirstLoop = 0; // Flagvariable rücksetzten
}
Video reiche ich noch nach.
LG Dirk