Code:
/* Dieses Programm steuert den Bagger auch mit einem IR-Empfänger.
* ********************Die Steppersoftware ist selber gemacht.*******************************
***** es sind die Bagger - Programme
***** STOP und
***** Justierung
***** Motor 2 fahren >>>> mit Schaufelbewegung
***** Motor 3 fahren >>>> mit Schaufelbewegung
***** xy- fahren >>>> mit Schaufelbewegung *** und Vorgabe der xy-Koordinaten vom Seriellen Monitor
***** LKW-beladen >>>> Arm senken, schaufeln, fahren und drehen, Arm senken und Schaufel beladen
>> Arm heben, Kurve rückwärts fahren, Kurve vorwärts fahren, Arn vor, Schaufel leeren
***** Steuerung des Baggers über den IR-Empfänger
***** Steuerung des Baggers über den BT-Empfänger
***** Steuerung der Betriebsarten über den BT-Empfänger und nicht über das Mäuseklavier
***** (funktionsfähig)
>>>>>>>>>>>>>>>>>>>>> Die Motorspannungen sind : Vm 11,4 V; VMot 11,9 V <<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>> Vcc = 5 V <<<<<<<<<<<<<<<<<<<<<<<<
* *********** um die PullUp-Widerstände zu nutzen, LOW = Aktivierung der Funktion *****************
- Nr.1 (PIN 2) Stillstand
- Nr.2 (PIN 3) Justierung
- Nr.3 (PIN 4) eine Bewegung von M2 mit folgender Schaufelbewegung
- Nr.4 (PIN 5) eine Bewegung von M3 mit folgender Schaufelbewegung
- Nr.5 (PIN 6) eine Koordinate anfahren
- Nr.6 (PIN 7) einen "LKW" beladen
- Nr.7 (PIN 8) IR-Steuerung
- Nr.8 (PIN 9) Bluetooth-Steuerung
SUCH-ZIELE: #include float HP_X1 void setup void loop()
*/
#define Pot2(x) (x*x) // das ist eine selbst gemachte Funktion, die die in Klammern stehende Zahl mit sich selbst multipliziert.
// das habe ich so gewählt, weil eine Multiplikation zweier float-Zahlen schneller sein soll, als da mit der
// Funktion pow() geschehen soll!
// >>>>>>>>>>>>>>>>>> für IR Empfänger >>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#include "IRremote.h" //Library für die IR-Steuerung; aus dem Internet
int receiver = 14; // Signal Pin of IR receiver to Arduino Digital Pin 14
/*-----( Declare objects )-----*/
IRrecv irrecv(receiver); // create instance of 'irrecv'
decode_results results; // create instance of 'decode_results'
int IR_Nr_fuer_Mx;
int Zykluszaehler = 0; // ein Zähler zur Vermeidung eines delay-Befehls
// >>>>>>>>>>>>>>>>>> für IR Empfänger bis hier >>>>>>>>>>>>>>>>>>>>>>>>>>>>>
String BT_Info = "";
String BT_Laenge;
int BT_Lae_int;
int PIN_Akku_Spg = 0;
double Akku_Spg;
String Akku_String;
//char* Akku_String[20]; // das klappt auch nicht
unsigned long deltamic; // für Test der Zykluszeit
unsigned long microsaltTest;
unsigned long LZ_SpeicherBT_send = millis(); // Speicher für die Bluetooth-Lebenszeichenwachung-Sendesignal
unsigned long LZ_SpeicherBT_empf = millis();; // Speicher für die Bluetooth-Lebenszeichenwachung-Empfangssignal
unsigned long LZ_SpeicherUNO = millis();; // Speicher für die UNO-Zeitüberwachung
unsigned long Akku_send = millis();
boolean MK1_1; // Variable für die Eingänge des Mäusklaviers 1; schalten gegen GND
boolean MK1_2; // sie sind aktiv bei LOW
boolean MK1_3;
boolean MK1_4;
boolean MK1_5;
boolean MK1_6;
boolean MK1_7;
boolean MK1_8;
boolean MK1_1alt; // für die Prellunterrdrückung des Kontakts
boolean MK1_2alt; // sie sind aktiv bei LOW
boolean MK1_3alt;
boolean MK1_4alt;
boolean MK1_5alt;
boolean MK1_6alt;
boolean MK1_7alt;
boolean MK1_8alt;
boolean JustM3var = LOW; // wird erst HIGH, wenn JustPin wieder HIGH ist; Funktion Fangschaltung
boolean M1solldrehen = true; // für UP Justierung
boolean M2solldrehen = true; // für UP Justierung
boolean M3solldrehen = false; // für UP Justierung
int Just_Taster = 53; // mit digital Eingang 53 wird beim Justieren die jeweilige Motorbewegung gestoppt
int LKW_Zyklus = 1; // steuert über switch den LKW-Ladevorgang
//++++++++++++++++++ für weitere UPs
float HP_X1 = 360.0; // hier werden für den "Handbetrieb die XY_Koordinaten vorgegeben
float HP_Y1 = -35.0;
float HP_X1neu; // hier werden vom Monitor die neuen Werte aufgenommen
float HP_Y1neu;
// Ecke oben rechts: x = 352; y = 182
// Ecke oben links: x = 216; y = 47
// Ecke unten links: x = 205; y = -83
// Ecke unten rechts: x = 392; y = -50
// links, y = 0: x = 221; y = 0
// rechts, y = 0: x = 394; y = 0
// tiefster Punkt unten: x = 268; y = -94
// >>>> ohne dass die Schaufel den Boden berührt y > -62
boolean xy_fertig = false;
boolean xy_Start = true;
boolean M1_fertig = false;
boolean M1_Start = true;
int Zyklus_M1 = 1; // steuert das Zyklische Fahren
float lzahn1_ist = 0.0; // Ausfahrlänge von Zahnstange 1 nach Justierung 1
float lzahn1; // Ausfahrlänge von Zahnstange 1 nach Justierung 1
unsigned long Schrittz_M1; // wird für Fernsteuerung benötigt
int M1xy_dir;
boolean M2_fertig = false;
boolean M2_Start = true;
int Zyklus_M2 = 1;
float lzahn2_ist = 98.0; // Ausfahrlänge von Zahnstange 2 nach Justierung 98
float lzahn2_soll; // neue Ausfahrlänge von Zahnstange 2
float Schrittz_M2; // wird für Fernsteuerung benötigt
int M2xy_dir;
boolean M3_fertig = false;
boolean M3_Start = true;
int Zyklus_M3 = 1;
float lzahn3_ist = 68.0; // Ausfahrlänge von Zahnstange 3 nach Justierung 68
float lzahn3_soll; // neue Ausfahrlänge von Zahnstange 3
float Schrittz_M3; // wird für Fernsteuerung benötigt
int M3xy_dir;
boolean M4_fertig = false;
boolean M4_Start = true;
boolean M5_fertig = false;
boolean M5_Start = true;
boolean M6_fertig = false;
boolean M6_Start = true;
int Zyklus_M6 = 1;
//++++++++++++++++++++++++++++++++++
//************************************************************************************************************************
void setup() { //******************************************************************************************************
Serial.begin (250000); // diese Buadrate muss auch in der Konsole (Serieller Monitor) eingestellt sein
while (!Serial);
Serial.println("IR Receiver Button Decode");
irrecv.enableIRIn(); // Start des IR-Empfängers
Serial1.begin(9600); // Öffnen der Seriellen Schnittstelle Nr 1 im Arduino MEGA zum Uno im Fahrwerk
while (!Serial1);
Serial2.begin(9600); // Öffnen der Seriellen Schnittstelle Nr 2 im Arduino MEGA zum BT-Modul HC-06
while (!Serial2);
pinMode (Just_Taster, INPUT); // wird nur im UP Justierung benötigt
digitalWrite(Just_Taster, HIGH); //schaltet den PullUp-Widerstand ein
pinMode (2, INPUT); // Pins als Eingänge deklarieren
pinMode (3, INPUT);
pinMode (4, INPUT);
pinMode (5, INPUT);
pinMode (6, INPUT);
pinMode (7, INPUT);
pinMode (8, INPUT);
pinMode (9, INPUT);
pinMode (52, OUTPUT);
digitalWrite (52, LOW);
pinMode (13, OUTPUT);
digitalWrite (2, HIGH); // schaltet die 20 kOhm PullUp-widerstände ein
digitalWrite (3, HIGH);
digitalWrite (4, HIGH);
digitalWrite (5, HIGH);
digitalWrite (6, HIGH);
digitalWrite (7, HIGH);
digitalWrite (8, HIGH);
digitalWrite (9, HIGH);
MK1_1alt = digitalRead(2); // erforderlich gegen Schalterprellen
MK1_2alt = digitalRead(3);
MK1_3alt = digitalRead(4);
MK1_4alt = digitalRead(5);
MK1_5alt = digitalRead(6);
MK1_6alt = digitalRead(7);
MK1_7alt = digitalRead(8);
MK1_8alt = digitalRead(9);
pinMode (41, OUTPUT); // M1
pinMode (43, OUTPUT);
pinMode (45, OUTPUT);
pinMode (47, OUTPUT);
pinMode (22, OUTPUT); // M2
pinMode (24, OUTPUT);
pinMode (26, OUTPUT);
pinMode (28, OUTPUT);
pinMode (32, OUTPUT); // M3
pinMode (34, OUTPUT);
pinMode (36, OUTPUT);
pinMode (38, OUTPUT);
pinMode (42, OUTPUT); // M4
pinMode (44, OUTPUT);
pinMode (46, OUTPUT);
pinMode (48, OUTPUT);
pinMode (31, OUTPUT); // M5
pinMode (33, OUTPUT);
pinMode (35, OUTPUT);
pinMode (37, OUTPUT);
}
//**********************************************************************************************************************
void loop() { //******************************************************************************************************
if ((millis() - LZ_SpeicherUNO) > 500) { // Lebenszeichen an UNO-SChnittstelle
LZ_SpeicherUNO = millis();
Serial1.println("prima"); // an UNO; +++ println +++ ist wichtig, nicht print
} // ************* ENDE if ((millis() - LZ_SpeicherUNO) > 500)
// Teständerung
if ( digitalRead(2) == HIGH && digitalRead(9) == HIGH ) { // diese Schalterstellung heißt BA-Wahl über App
// >>>>>>>>>>>>>>>>>>>>>>>>>>> bei TEST ohne Mäuseklavier muss hier jeweils HIGH stehen <<<<<<<<<<<<<<<<<<<<<<<<<<
// das sind der Stop- ** und ** der BT-Schalter
// die Eingänge werden hier direkt verwendet, weil bei der BA-Wahl über App MK1_x nicht mehr die realen Stellungen der Schalter enthält
if ((millis() - Akku_send) > 10000) { // Akkuspannung an Tablet senden
Akku_Spg = analogRead(PIN_Akku_Spg); // Messwert einlesen
Akku_Spg = Akku_Spg / 1023.0 * 21.51; // ergibt sich aus den engesetzten Widerständen
Serial.print("Akkuspannung = " );
Serial.println(dtostrf(Akku_Spg, 5, 2, Akku_String));
Serial.print(Akku_Spg); //
Serial2.print("18"); // ist hier zZ nur ein Versuch
Akku_send = millis();
} // ************* ENDE if ((millis() - Akku_send) > 10000)
if (((millis() - LZ_SpeicherBT_empf) > 2500)) { // && (IR_Nr_fuer_Mx != 0)
Serial.println(" ");
Serial.println("Zeitueberschreitung BT-Verbindung");
IR_Nr_fuer_Mx = 20; // alle Motoren aus
Fernsteuerung (); // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
LZ_SpeicherBT_empf = millis(); // damit bei BT-Fehler nicht ständig gesendet wird
} // ************* ENDE if((millis() - LZ_SpeicherBT_empf) > 2500)
BT_Auswertung(); // in dem UP werden die diversen Signale von BT ausgewertet
if ((millis() - LZ_SpeicherBT_send) > 1800) { // Lebenszeichen an BT, wenn BA BT scharf
// LZ_SpeicherBT_send = millis();
Serial2.print("18.23"); // an BT
} // ************* ENDE if ((millis() - LZ_SpeicherBT_send) > 1800)
} // ************* ENDE if (digitalRead(2) == LOW && dig........
else { // dieser Block ist in der BA-Wahl von der App nicht mehr wirksam
MK1_1 = digitalRead(2); //digitalRead(2); // STOP > die Variablen MK.. erhalten die Zustände der Eingänge
MK1_2 = digitalRead(3); //digitalRead(3); // Justieren; sie sind aktiv bei LOW
MK1_3 = digitalRead(4); //digitalRead(4); // M1 und M2 fahren
MK1_4 = digitalRead(5); //digitalRead(5); // M1 und M3 fahren
MK1_5 = digitalRead(6); //digitalRead(6); // xy anfahren float HP_X1
MK1_6 = digitalRead(7); //digitalRead(7); // LKW beladen
MK1_7 = digitalRead(8); //digitalRead(8);
MK1_8 = digitalRead(9); //digitalRead(9);
if (MK1_1 != MK1_1alt || MK1_2 != MK1_2alt || MK1_3 != MK1_3alt || MK1_4 != MK1_4alt || MK1_5 != MK1_5alt || MK1_6 != MK1_6alt || MK1_7 != MK1_7alt || MK1_8 != MK1_8alt) {
MK1_1alt = MK1_1;
MK1_2alt = MK1_2;
MK1_3alt = MK1_3;
MK1_4alt = MK1_4;
MK1_5alt = MK1_5;
MK1_6alt = MK1_6;
MK1_7alt = MK1_7;
MK1_8alt = MK1_8;
} // ENDE if(MK1_1 != MK1_1alt............................
} // ENDE else
if (digitalRead(Just_Taster) == LOW && (MK1_2 == HIGH || (digitalRead(2) == LOW && digitalRead(9) == LOW)) ) { // TESTMÖGLICHKEIT bei Problemen
// soll nur reagieren, wenn nicht justiert wird, da der Taster dann eine ander Funktion hat.
// oder wenn BAs von der App eingestellt werden
delay(300); // unterdrückt Tasterprellen
Serial.print ("");
Serial.print ("");
Serial.print ("");
Serial.print ("HP_X1 = ");
Serial.print (HP_X1);
Serial.print (", HP_Y1 = ");
Serial.println (HP_Y1); Serial.println ("");
Serial.print ("lzahn1_ist = steht bei = ");
Serial.println (lzahn1_ist);
Serial.print ("lzahn1 = Ziel war = ");
Serial.println (lzahn1); Serial.println ("");
Serial.print ("lzahn2_ist = steht bei = ");
Serial.println (lzahn2_ist);
Serial.print ("lzahn2_soll = Ziel war = ");
Serial.println (lzahn2_soll); Serial.println ("");
Serial.print ("lzahn3_ist = steht bei = ");
Serial.println (lzahn3_ist);
Serial.print ("lzahn3_soll = Ziel war = ");
Serial.println (lzahn3_soll); Serial.println ("");
Serial.print ("M1_fertig = ");
Serial.println (M1_fertig);
Serial.print ("M1_Start = ");
Serial.println (M1_Start);
Serial.print ("Zyklus_M1 = ");
Serial.println (Zyklus_M1);
Serial.println ("");
Serial.print ("M2_fertig = ");
Serial.println (M2_fertig);
Serial.print ("M2_Start = ");
Serial.println (M2_Start);
Serial.print ("Zyklus_M2 = ");
Serial.println (Zyklus_M2);
Serial.println ("");
Serial.print ("M3_fertig = ");
Serial.println (M3_fertig);
Serial.print ("M3_Start = ");
Serial.println (M3_Start);
Serial.print ("Zyklus_M3 = ");
Serial.println (Zyklus_M3);
Serial.println ("");
Serial.print ("M4_fertig = ");
Serial.println (M4_fertig);
Serial.print ("M4_Start = ");
Serial.println (M4_Start);
Serial.println ("");
Serial.print ("M5_fertig = ");
Serial.println (M5_fertig);
Serial.print ("M5_Start = ");
Serial.println (M5_Start);
Serial.println ("");
Serial.print ("M6_fertig = ");
Serial.println (M6_fertig);
Serial.print ("M6_Start = ");
Serial.println (M6_Start);
Serial.print ("Zyklus_M6 = ");
Serial.println (Zyklus_M6);
Serial.println ("");
Serial.print ("xy_Start = ");
Serial.println (xy_Start);
Serial.println ("");
Serial.println ("");
}
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if (MK1_1 == LOW && MK1_8 == HIGH) { // STOP
Ruecksetzen ();
if ( digitalRead(2) == LOW && digitalRead(9) == LOW ) { // diese Schalterstellung heißt BA-Wahl über App
MK1_1 == HIGH;
MK1_8 == LOW;
}
}
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
else if (MK1_2 == LOW && MK1_1 == HIGH) { // Justierung
Justierung(); // Programm 2: Justierung
}
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
else if (MK1_3 == LOW && MK1_1 == HIGH ) { // M2 bewegen
M2_fahren(); // Programm 3: M2_fahren ; von der letzten Position auf maximal ausgefahren
M1_fahren(); // Programm 3: M1_fahren ; von der letzten Position auf maximal ausgefahren
}
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
else if (MK1_4 == LOW && MK1_1 == HIGH ) { // M3 bewegen
M3_fahren(); // Programm 4: M3_fahren ; von der letzten Position auf maximal ausgefahren
M1_fahren(); // Programm 4: M1_fahren ; von der letzten Position auf maximal ausgefahren
}
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
else if (MK1_5 == LOW && MK1_1 == HIGH) { // x/y - Koordinate anfahren
// ************** neuen xy - Wert vom SerialMonitor empfangen **************
if (Serial.available() ) { // es müssen 2 durch Kommata getrennte Werte eingegeben werden
HP_X1neu = Serial.parseInt(); //der Befehl,und damit eine Wartezeit, wird nur ausgeführt, wenn ein Wert im Puffer ist
HP_Y1neu = Serial.parseInt();
} // *************** ENDE if (Serial.available() ) **********************
if ( HP_X1neu > 0) {
Serial.print("HP_X1neu = ");
Serial.println(HP_X1neu);
Serial.print("HP_Y1neu = ");
Serial.println(HP_Y1neu);
Ruecksetzen ();
HP_X1 = HP_X1neu;
HP_Y1 = HP_Y1neu;
HP_X1neu = 0;
} // *************** ENDE if ( HP_X1neu > 0) **********************
xy_fahren(12, 12); // Programm 5: eine x/y -Koordinate anfahren; Parameter sind die Geschwindigkeiten für M2 und M3
if (M2_fertig == true) { // hier wird der Zielwert übernommen
lzahn2_ist = lzahn2_soll;
}
if (M3_fertig == true) { // hier wird der Zielwert übernommen
lzahn3_ist = lzahn3_soll;
}
if (M2_fertig == true && M3_fertig == true) {
M1_fahren();
} // *********** ENDE (M2_fertig == true && M3_fertig == true) ***********
} // *********** ENDE (MK1_5 == LOW && MK1_1 == HIGH)
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
else if (MK1_6 == LOW && MK1_1 == HIGH) { // LKW beladen
LKW_beladen ();
} // ************* ENDE else if (MK1_6 == LOW && MK1_1 == HIGH)
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
else if (MK1_7 == LOW && MK1_1 == HIGH) { // Steuerung über den IR-Empfänger
if (++Zykluszaehler > 5000) { // soll mehrfach senden einer Tastenbetätigung verhindern = delay aber ohne Programm Stop
// diese if-Schleife wird nur ; das ist die Anzahl der Zyklen mit einer Zykluszeit von ca. 0,1 ms
Zykluszaehler = 0;
if (irrecv.decode(&results)) // Wurde ein IR-Signal empfangen?
{
Serial.print("results.value = ");
Serial.println(results.value);
IR_Empfangen(); // zum Unterprogramm, das dieses Signal auswertet
irrecv.resume(); // empfange den nächsten Wert
} // ************* ENDE if (irrecv.decode(&results))
}
Fernsteuerung(); // UP Fernsteuerung aufrufen
} // ************* ENDE else if (MK1_7 == LOW && MK1_1 == HIGH)
// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
else if (MK1_8 == LOW && MK1_1 == HIGH) { // Steuerung über das Bluetoothmodul
} // ************* ENDE else if (MK1_8 == LOW && MK1_1 == HIGH)
} //************* ENDE loop
Lesezeichen