// Winnis Arduino Pro-Minni für VW Delivery Plataforma, Plateausteuerung
// © by Winfried Schmickler 2018
// Dieses Programm ist lizenziert unter einer
// Creative Commons Namensnennung-Nicht kommerziell 4.0 International Lizenz.
// Die gewerbliche Nutzung ist nicht gestattet.
// Dieser Textteil darf nicht entfernt werden und bei Weitergabe des Programms ist die Quelle zu nennen.
//-----------------------------------------------------------------
// Die beiden Motoren werden über einer H-Brücke Pololu DRV8835 betrieben
// H-Brück Motorkanal Kanal A = Verschiebeantrieb Getriebemotor N20
// H-Brück Motorkanal Kanal B = Hubzylinder (e-Motor in 7 mm Zylinderatrappe)
//-----------------------------------------------------------------
// Beginn Deklaration für Motor-H-Brücke
// int aPhase = 7; //Pin APHASE des Motortreibers an digital Pin 7 vom Arduino
// int aEnable = 8; //Pin AENABLE des Motortreibers an digital Pin 8 vom Arduino
// int bPhase = 9; //Pin BPHASE des Motortreibers an digital Pin 9 vom Arduino
// int bEnable = 10; //Pin BENABLE des Motortreibers an digital Pin 10 vom Arduino
// Ende Deklaration für Motor-H-Brücke
//-------------------------------------------------------------------------
// Beginn Deklaration Pinzuweisungen
int pw = 1; // Steuerknüppel-Poti waagerecht
int pb = 2; // Steuerknüppel-Poti senkrecht
int psch = 3; // Plateau-Steuerknüppel-Poti Signal vom Empfänger
int pwswitch = 4; // Plateau waagerecht switch
int plvo = 5; // Plateau vorne switch
int plhi = 6; // Plateau hinten switch
int aPhase = 7; // Pin APHASE des Motortreibers an digital Pin 7 vom Arduino
int aEnable = 8; // Pin AENABLE des Motortreibers an digital Pin 8 vom Arduino
int bPhase = 9; // Pin BPHASE des Motortreibers an digital Pin 9 vom Arduino
int bEnable = 10; // Pin BENABLE des Motortreibers an digital Pin 10 vom Arduinov
int rk = 11; // Rundumkennleuchte Ausgang
int zukoswitch = 12; // Zugkolben-Schalter Eingang
int ar = 13; // Arbeitsscheinwerfer Ausgang
//---------------------------------------------------------------------------------------
// Wertzuweisungen
byte vb = 75;
byte vw = 75;
byte dvpsch = 75;
byte rkon = 0;
byte aron = 0;
byte wbon = 0;
int FlagAbladen = 0;
int FlagHeben = 0;
int FlagPlattform = 0;
int rpwswitch = 0; // Plattform Unten switsch Startwert = LOW
//int zukoswitch = 0;
int rzukoswitch = 0;
int rplvo = 0; // read Plattform vorne
int rplhi = 0; // read plattform hinten
unsigned long db;
unsigned long dw;
unsigned long dpsch;
// Ende Deklaration
//------------------------------------------------------------------------------//
// //
// SETUP //
//==============================================================================//
void setup()
{
pinMode(pb, INPUT);
pinMode(pw, INPUT);
pinMode(psch, INPUT);
pinMode(pwswitch, INPUT);
pinMode(plvo, INPUT);
pinMode(plhi, INPUT);
pinMode(aPhase, OUTPUT);
pinMode(aEnable, OUTPUT);
pinMode(bPhase, OUTPUT);
pinMode(bEnable, OUTPUT);
pinMode(rk, OUTPUT);
pinMode(zukoswitch, INPUT);
pinMode(ar, OUTPUT);
// Beginn Startkontrolle Position der Plattform
rplvo = digitalRead(plvo); // rplvo = read Plattform vorne Schalter, Lese Schalterstellung
if (rplvo == HIGH) // Wenn der Schalter offen ist.....
{
grundstellung(); // gehe zu Unterroutine "grundstellung()" darin zu Unterroutine "aufladen()"
}
} // danach wird die Programmschleife ausgeführt.
//
//
//================================================================================
void loop() // Beginn Programmroutine-Schleife
{
dpsch = pulseIn(psch, HIGH, 20000); // Daten-Poti-Steuerknüpplel = pulseIn
dvpsch = map(dpsch, 944, 2039, 0, 150); // ursprünglischer Wert: vb = map(db, 1090, 1929, 0, 150);
delay(100); // 100 ms warten
if (dvpsch > 150) // wenn Daten-vom-Poti-Steuerknüpel größer als 150 nach vorne geneigt
{
rundumlicht(); // gehe zu Unterroutine Rundumlicht()
}
if (dvpsch < 30 && FlagPlattform == 2) // wenn Hebel in Mittelstellung und die Plattform in Abladestellung ist
{
aufladen(); // gehe zu Unterroutine aufladen()
}
if (dvpsch < 30 || FlagAbladen == 1)
{
if (rkon == 0)
{
rundumlicht();
}
if (aron == 0)
{
arbeitslicht();
}
abladen();
}
}
// Programmschleife Ende
//
//========================================================================
void grundstellung() // Sicherstellung, das beim Einschalten das Plateau in Ruhelage fährt
{
digitalWrite(aEnable, LOW); // Kanal A deaktivieren (Verschiebemotor ausschalten)Sicherheitsmaßnahme
digitalWrite(bEnable, LOW); // Kanal B deaktivieren (Hubzylinder ausschalten)
digitalWrite(bPhase, LOW); // Richtung B Hub-Spindel hereinfahren, Rechtslauf einstellen
digitalWrite(bEnable, HIGH); // Kanal B aktivieren (Hubzylinder einschalten)
FlagHeben = 3; // Hub-Zylinder fährt ein
do
{
rpwswitch = digitalRead(pwswitch); // Schleife read Plattform waagerecht Schalter (Schalterstellung auslesen)
}
while (rpwswitch == HIGH); // bis das Ergebnis == HIGH (offen) ist...dann
digitalWrite(bEnable, LOW); // Kanal B deaktivieren (Hubzylinder ausschalten)
digitalWrite(aEnable, LOW); // Kanal A deaktivieren (Verschiebemotor ausschalten)
digitalWrite(aPhase, LOW); // Richtung B Verschiebe-Spindel hereinfahren, Rechtslauf einstellen
digitalWrite(aEnable, HIGH); // Kanal A aktivieren (Verschiebemotor einschalten)
FlagAbladen = 3; // Plattform wird nach vorne verschoben
do
{
rplvo = digitalRead(plvo); // Schleife read Plattformschalter vorne. Endschalterstellung auslesen
}
while (rplvo == HIGH); // bis das Ergebnis == HIGH (offen) ist...dann
digitalWrite(aEnable, LOW); // Kanal A deaktivieren (Verschiebemotor ausschalten)
FlagAbladen = 0; // Flags zurücksetzen
FlagHeben = 0;
FlagPlattform = 0;
} // Return zu void loop()
// Programmroutine Ende
//========================================================================================================
void aufladen()
// Kanal A = Verschiebeantrieb
// Kanal B = Hubzylinder
// pwswitch = plattform-waagerecht-switch
// plvo = plattform-vorne-switch
// plhi = plattform-hinten-switch
// zukoswitch = zug-kolben- switch
// rzukoswitch = read-zug-kolben-switch
// FlagPlattform = 2 wird in Routine "abladen()" oder "grundstellung()" auf 2 eingestellt, wenn
// das Plateau in Ladeposition steht.
{
rzukoswitch = digitalRead(zukoswitch);
if (rzukoswitch == HIGH && FlagPlattform == 2) // wenn Endschalter Plattform oben betätigt ist, und ....
// das Plateau ist in Ladeposition
{
digitalWrite(aEnable, LOW); // Kanal A deaktivieren (Verschiebemotor ausschalten)
digitalWrite(aPhase, LOW); // Richtung B Verschiebe-Spindel hereinfahren, Rechtslauf einstellen
digitalWrite(aEnable, HIGH); // Kanal A aktivieren (Verschiebemotor einschalten)
FlagAbladen = 2; // Aufladevorgang läuft Plattform wird nach vorne verschoben
FlagPlattform = 3; // die Plattform befindet sich irgendwo zwischen vorne und hinten
delay (5000); // 5 sec warten bis Plattform ein Stück vorgefahren ist
digitalWrite(aEnable, LOW); // Kanal A deaktivieren (Verschiebemotor ausschalten)
// Die Plattform wird ca. in der Mitte, auf dem Weg nach vorne, angehalten
digitalWrite(bEnable, LOW); // Kanal B deaktivieren (Hubzylinder ausschalten)
digitalWrite(bPhase, LOW); // Richtung B Hub-Spindel hereinfahren, Rechtslauf einstellen
digitalWrite(bEnable, HIGH); // Kanal B aktivieren (Hubzylinder einschalten)
FlagHeben = 3; // Hub-Zylinder fährt ein
do
{
rpwswitch = digitalRead(pwswitch); // read Plattform waagerecht Schalter (Schalterstellung auslesen)
}
while (rpwswitch == HIGH); // falls das Ergebnis == HIGH (offen) ist...
digitalWrite(bEnable, LOW); // Kanal B deaktivieren (Hubzylinder ausschalten)
digitalWrite(aEnable, LOW); // Kanal A deaktivieren (Verschiebemotor ausschalten)
digitalWrite(aPhase, LOW); // Richtung B Verschiebe-Spindel hereinfahren, Rechtslauf einstellen
digitalWrite(aEnable, HIGH); // Kanal A aktivieren (Verschiebemotor wieder einschalten)
FlagAbladen = 3; // Aufladevorgang läuft Plattform wird nach vorne verschoben
do
{
rplvo = digitalRead(plvo); // read Plattformschalter vorne. Endschalterstellung auslesen
}
while (rplvo == HIGH); // falls das Ergebnis == HIGH (offen) ist...
digitalWrite(aEnable, LOW); // Kanal A deaktivieren (Verschiebemotor ausschalten)
arbeitslicht(); // gehe zu Unterroutine "arbeitslicht" Arbeitslicht ausschalten wenn es noch an ist
}
dpsch = pulseIn(psch, HIGH, 20000);
dvpsch = map(dpsch, 944, 2039, 0, 150);
//if (dvpsch > 30)
//{
FlagAbladen = 0; // Flags zurücksetzen
FlagHeben = 0;
FlagPlattform = 0;
// }
} // Return
// Programmroutine Ende
//=================================================================================================
void abladen()
// Kanal A = Verschiebeantrieb
// Kanal B = Hubzylinder
// pwswitch = plattform-waagerecht-switch
// plvo = plattform-vorne-switch
// plhi = plattform-hinten-switch
{
rplvo = digitalRead(plvo);
if (rplvo == LOW && FlagAbladen == 0) // Endschalter vorne ist betätigt, Plateau bewegt sich nicht
{
rpwswitch = digitalRead(pwswitch);
if (rpwswitch == LOW) // Plateau ist unten
{
//Serial.print("Testpunkt go");
digitalWrite(aEnable, LOW); // Kanal A deaktivieren
digitalWrite(aPhase, HIGH); // Richtung A Spindel herausfahren linkslauf
digitalWrite(aEnable, HIGH); // Kanal A aktivieren
// FlagAbladen = 1; //Abladevorgang läuft Plattform wird nach hinten verschoben
do
{
rplhi = digitalRead(plhi);
}
while (rplhi == HIGH); // verlässt Schleife wenn Bedingung nicht Wahr (False)
digitalWrite(aEnable, LOW); // Kanal A deaktivieren
digitalWrite(bEnable, LOW); // Kanal B deaktivieren
digitalWrite(bPhase, HIGH); // Richtung A Spindel herausfahren linkslauf
digitalWrite(bEnable, HIGH); // Kanal B aktivieren
do
{
//Serial.println("warten");
rzukoswitch = digitalRead(zukoswitch);
}
while (rzukoswitch == LOW); // Zugkolbenschalter hat nach LOW geschaltet
digitalWrite(bEnable, LOW); // Kanal B deaktivieren
FlagPlattform = 2; // Plateau steht in Ladeposition
FlagAbladen = 2; // Verhindert weiteren Lauf in die Funktion abladen
FlagHeben = 2; // Hubzylinder ist voll ausgefahren
}
}
} // Return
// Programmroutine Ende
//==============================================================================================
void arbeitslicht()
{
if (aron == 0)
{
digitalWrite(ar, HIGH);
aron = 1;
delay(2000);
}
else
{
digitalWrite(ar, LOW);
aron = 0;
//delay(1200);
}
} // Return
// Programmroutine Ende
//==============================================================================================
void rundumlicht()
{
if (rkon == 0)
{
digitalWrite(rk, HIGH);
rkon = 1;
delay(2000); // zwei Sekunden warten bevor die Plattform nach hinten fährt
}
else
{
digitalWrite(rk, LOW);
rkon = 0;
delay(1200);
}
} // Return
// Programmroutine Ende
//=============================================================================================