#include //für SD Karte [libary]. #define SD_Karte_Pin 10 //Pin für die SD Karte #include //um .wav Dateien abzuspielen von der SD Karte über den Lautsprecher [libary]. #include // configs für TMRpc [libary]. #include #include //für Bluetooth-Kommunikation mit dem Arduino über SPI [libary von Arduino, also automatisch vorinstalliert]. TMRpcm lautsprecher; #include // für Servo-Motor [libary]. #include // um Serial zu emulieren auf anderen Pins (normalerweise sind Pin 0,1 für USB-Connection mit dem PC, deswegen setzen wir das HC-05-Modul auf Pin 5,6 sonst kommmt es immer zu Problemen und ebenfalls kann man dadurch 2 Serials gleichzeitig laufen lassen) [libary von Arduino, also automatisch vorinstalliert]. Servo kopf; // hier werden Servo-Motoren Variablen gegeben Servo l_hand; // Servo r_hand; // SoftwareSerial BT(5, 6); // RX, TX sind auf 5,6 gesetzt, dadurch haben wir die klassische Datenübertragung auf Pin 0, 1 und nun eine weitere in Pin 5, 6 für das HC-05-Modul. Somit könnte man einmal sich über USB mit dem PC verbinden und gleichzeitig mit Bluetooth. Aber wir setzten HC-05 auf 5, 6 um Probleme zu vermeiden (wird auch IMMER empfohlen HC-05 auf andere Pins zu setzten). byte val = ""; //hier speichern wir die Buchstaben, die ausgelesen werden in Bytes (Zahlen von 0-255), also z.B. wäre der Buchstabe "h" Zahl also die Zahl 104. So wird es aber nur für den Arduino sichtbar sein. Wenn wir diese gespeicherten Value in den Serial-Monitor printen, sehen wir im Seriellen Monitor halt "h". void setup() { Serial.begin(9600); // Serial Monitor starten für USB. BT.begin(9600); // Serial Monitor starten für Bluetooth also auf Pins 5, 6 RX, TX. delay(1000); lautsprecher.speakerPin = 9; //Setzten Lautsprecher auf Pin 9 // pinMode(8, OUTPUT); Dieser Pin soll für eine Lampe sein, die noch nicht implementiert ist. // digitalWrite(8, HIGH); kopf.attach(3); //Servo-Kopf auf Pin 2 l_hand.attach(7); //Servo l_hand auf Pin 7. r_hand.attach(4); //Servo r_hand auf Pin 4. if (!SD.begin(SD_Karte_Pin)) { Serial.println("SDFehler beim Start"); //Durch diesen if-Befehl überprüfen wir, ob die SD-Karte erreichbar ist. Also wenn SD.beginn nicht erreichbar ist, "returned" er zum Setup und printed "SD fehler beim Start". Also dass heißt, alles, was nach dem if-Befehl in Void-setup ist, würde jetzt übersprungen werden, weil die gesamte function "returned" wird (return kann man auch verwenden um Variablen zu "returnen", aber nicht hier der Fall). //Aber Loop findet trotzdem statt und wird nicht "returned". return; } } //function standby. void standby() { kopf.write(90); //Kopf drehen 90 Grad. int r_position = 30; // Variable r_positon wird auf 30° gesetzt. int l_position = map(r_position, 0, 180, 180, 0); //Variable l_position wird spiegelverkehrt gesetzt und ebenfalls auf 30 Grad gesetzt durch die Variable von r_position. l_hand.write(l_position); //der Servo-Motor l_hand wird spiegelverkehrt zu r_position gesetzt. r_hand.write(r_position); //r_hand Servo wird auf die Variable r_position gesetzt. } //Funktion hi void hi() { Serial.println("nn"); kopf.write(90); //Kopf wird auf 90° gesetzt. for (int i = 30; i <= 170; i++) { //for-Schleife i von 30 bis auf 170 in Einserschritten. Das heißt, in der Schleife wird alle 5 Millisekunden der Servo-Motor von 30 auf 170 gesetzt. r_hand.write(i);//der Stand von i wird auf den Servo-Motor übertragen. delay(5); } for (int i = 170; i >= 100; i--) {//hier das Gleiche wie im Kommentar darüber, aber hier wird es von 170 auf 100 gesetzt. r_hand.write(i); delay(5); } for (int i = 100; i <= 170; i++) {//hier das Gleiche wie im Kommentar darüber, aber hier wird es von 100 auf 170 gesetzt. r_hand.write(i); delay(5); } for (int i = 170; i >= 30; i--) {//hier das Gleiche wie im Kommentar darüber, aber hier wird es von 170 auf den Uhrsprungswert (30) gesetzt. r_hand.write(i);//der Stand von i wird auf den Servo-Motor gesetzt. delay(5); } standby(); //Funktion ""standby" wird ausgeführt, um die Servos wieder in ihre Uhrsprungsform zu bringen. } //Funktion haende_hoch void haende_hoch() { for (int i = 30; i <= 170; i++) {//for-Schleife i von 30 bis auf 170 in Einserschritten. Das heißt, in der Schleife wird alle 5 Millisekunden der Servo-Motor von 30 auf 170 gesetzt. int r_position = i;//i ist r_position Variable. int l_position = map(r_position, 0, 180, 180, 0);//l_position ist r_position, aber spiegelverkehrt. l_hand.write(l_position);//der Stand von i wird auf den Servo-Motor l_hand gesetzt, aber spiegelverkehrt wie r_position. r_hand.write(r_position);//der Stand von i wird auf den Servo-Motor r_hand gesetzt. delay(5); } delay(600); for (int i = 170; i >= 30; i--) {//for-Schleife i von 170 bis auf 30 in Einserschritten. Das heißt, in der Schleife wird alle 5 Millisekunden der Servo-Motor von 170 auf 30 gesetzt. int r_position = i;//i ist r_position Variable. int l_position = map(r_position, 0, 180, 180, 0);//l_position ist r_position, aber spiegelverkehrt. l_hand.write(l_position);//der Stand von i wird auf den Servo-Motor l_hand gesetzt, aber spiegelverkehrt wie r_position. r_hand.write(r_position);//der Stand von i wird auf den Servo-Motor r_hand gesetzt. delay(5); } } //Funktion weigh_lift ist nicht im gebrauch zurzeit void gewicht_heben() { for (int i = 30; i <= 170; i++) {//for-Schleife i von 30 bis auf 170 in Einserschritten. Das heißt, in der Schleife wird alle 5 Millisekunden der Servo-Motor von 170 auf 30 in Einserschritten. int r_position = i;//i ist r_position Variable. int l_position = map(r_position, 0, 180, 180, 0);//l_position ist r_position, aber spiegelverkehrt. l_hand.write(l_position);//der Stand von i auf den wird der Servo-Motor l_hand gesetzt, aber spiegelverkehrt wie r_position. r_hand.write(r_position);//der Stand von i auf den wird der Servo-Motor r_hand gesetzt. delay(5); } for (int count = 0; count <= 4; count++) {//diese for-Schleife wird 4-mal wiederholt. Halt solange bis "count" 4 erreicht hat. for (int i = 170; i >= 60; i--) {//for-Schleife i von 170 bis auf 60 in Einserschritten. Das heißt, in der Schleife wird alle 5 Millisekunden der Servo-Motor von 170 auf 60 in Einserschritten. int r_position = i;//i ist r_position Variable. int l_position = map(r_position, 0, 180, 180, 0);//l_position ist r_position, aber spiegelverkehrt. l_hand.write(l_position);//der Stand von i wird auf den Servo Motor l_hand gesetzt, aber spiegelverkehrt wie r_position. r_hand.write(r_position);//der Stand von i wird auf den Servo Motor r_hand gesetzt. delay(5); } for (int i = 60; i <= 170; i++) {//for-Schleife i von 60 bis auf 170 in Einserschritten. Das heißt, in der Schleife wird alle 5 Millisekunden der Servo-Motor von 60 auf 170 in Einserschritten. int r_position = i;//i ist r_position Variable. int l_position = map(r_position, 0, 180, 180, 0);//l_position ist r_position, aber spiegelverkehrt. l_hand.write(l_position);//der Stand von i wird auf den Servo Motor l_hand gesetzt, aber spiegelverkehrt wie r_position. r_hand.write(r_position);//der Stand von i wird auf den Servo Motor r_hand gesetzt. delay(5); } } for (int i = 170; i >= 30; i--) {//for-Schleife i von 170 bis auf 30 in Einserschritten. Das heißt, in der Schleife wird alle 5 Millisekunden der Servo-Motor von 170 auf 30 gesetzt in Einserschritten. int r_position = i;//i ist r_position Variable. int l_position = map(r_position, 0, 180, 180, 0);//l_position ist r_position, aber spiegelverkehrt. l_hand.write(l_position);//der Stand von i wird auf den Servo Motor l_hand gesetzt, aber spiegelverkehrt wie r_position. r_hand.write(r_position);//der Stand von i wird auf den Servo Motor r_hand gesetzt. delay(5); } } //Funktion excited ist noch leer und es wird einfach alles übersprungen, was in dieser Funktion nach return sein würde und man kann auch Variablen zurrückwerfen, also z.B i = 180 return i dadurch kann man Funktionen etwas ausrechnen lassen und die Funktion wieder in die Haupt-Schleife zurrückwerfen. void excited() { return;//Funktion wird zurrückgeworfen. } //Funtion links_schauen. void links_schauen() { kopf.write(180);//Servo Kopf auf 180 setzen. } //Funtion confused nicht im gebrauch void confused() { for (int count = 0; count <= 1; count++) {//diese for Schleife wird 1 mal wiederholt. Halt solange bis "count" 4 erreicht hat. kopf.write(30);//Servo-Kopf auf 30 setzen. r_hand.write(170);//Servo r_hand auf 170 setzen. delay(700); r_hand.write(30);//Servo r_hand auf 30 setzen. kopf.write(120);//Servo r_hand auf 120 setzen. l_hand.write(30);//Servo r_hand auf 30 setzen. delay(700); l_hand.write(160);//Servo r_hand auf 160 setzen. } standby();//Funktion "standby" wird hier aufgeführt, um die Servos in ihre Uhrsprungsform zu bringen. } //Funktion doppel_punch void doppel_punch() { for (int i = 30; i >= 0; i--) {//for-Schleife i von 30 bis auf 0 in Einserschritten. Das heißt, in der Schleife wird alle 5 Millisekunden der Servo-Motor von 170 auf 30 gesetzt in Einserschritten. int r_position = i;//i ist r_position Variable int l_position = map(r_position, 0, 180, 180, 0);//l_position ist r_position, aber spiegelverkehrt. l_hand.write(l_position);//der Stand von i wird auf den Servo Motor l_hand gesetzt, aber spiegelverkehrt wie r_position. r_hand.write(r_position);//der Stand von i wird auf den Servo Motor r_hand gesetzt. delay(5); } delay(2000); int r_position = 80;//r_position variable wird auf 80 gesetzt. int l_position = map(r_position, 0, 180, 180, 0);//l_position ist r_position, aber spiegelverkehrt. l_hand.write(l_position);//der Stand von i wird auf den Servo Motor l_hand gesetzt, aber spiegelverkehrt wie r_position. r_hand.write(r_position);//der Stand von i wird auf den Servo Motor r_hand gesetzt. delay(500); standby();//Funktion "standby" wird hier aufgeführt, um die Servos in ihre Uhrsprungsform zu bringen. } //Funktion r_Aufwaertschlag void r_Aufwaertschlag() { for (int i = 30; i <= 170; i++) {//for-Schleife i von 30 bis auf 170 in Einserschritten. Das heißt, in der Schleife wird alle 5 Millisekunden der Servo-Motor von 30 auf 170 gesetzt in Einserschritten. int r_position = i;//i ist r_position Variable. int l_position = map(r_position, 0, 180, 180, 0);//l_position ist r_position, aber spiegelverkehrt. l_hand.write(l_position);//der Stand von i wird auf den Servo Motor l_hand gesetzt, aber spiegelverkehrt wie r_position. r_hand.write(r_position);//der Stand von i wird auf den Servo Motor r_hand gesetzt. delay(5); } for (int count = 0; count <= 4; count++) {//diese for-Schleife wird 4-mal wiederholt. Halt solange bis "count" 4 erreicht hat. for (int i = 170; i >= 60; i--) {//for-Schleife i von 170 bis auf 60 in Einserschritten. Das heißt, in der Schleife wird alle 5 Millisekunden der Servo-Motor von 170 auf 60 gesetzt in Einserschritten. r_hand.write(i);//der Stand von i wird auf den Servo-Motor r_hand gesetzt. delay(1); } for (int i = 60; i <= 170; i++) {//for-Schleife i von 60 bis auf 170 in Einserschritten. Das heißt, in der Schleife wird alle 5 Millisekunden der Servo-Motor von 60 auf 170 gesetzt in Einserschritten. r_hand.write(i);//der Stand von i wird auf den Servo Motor r_hand gesetzt. delay(1);//Millisek } } standby();//Funktion "standby" wird hier aufgeführt, um die Servos in ihre Uhrsprungsform zu bringen. delay(100); } //Funktion smash void smash() { for (int i = 30; i <= 170; i++) {//for-Schleife i von 30 bis auf 170 in Einserschritten. Das heißt, in der Schleife wird alle 5 Millisekunden der Servo-Motor von 30 auf 170 gesetzt in Einserschritten. int r_position = i;//i ist r_position Variable. int l_position = map(r_position, 0, 180, 180, 0);//l_position ist r_position, aber spiegelverkehrt. l_hand.write(l_position);//der Stand von i wird auf den Servo Motor l_hand gesetzt, aber spiegelverkehrt wie r_position. r_hand.write(r_position);//der Stand von i wird auf den Servo Motor r_hand gesetzt. delay(5); } delay(2000); for (int i = 170; i >= 0; i--) {//for-Schleife i von 170 bis auf 0 in Einserschritten. Das heißt, in der Schleife wird alle 5 Millisekunden der Servo-Motor von 170 auf 0 gesetzt in Einserschritten. int r_position = i; int l_position = map(r_position, 0, 180, 180, 0);//l_position ist r_position, aber spiegelverkehrt. l_hand.write(l_position);//der Stand von i wird auf den Servo Motor l_hand gesetzt, aber spiegelverkehrt wie r_position. r_hand.write(r_position);//der Stand von i wird auf den Servo Motor r_hand gesetzt. delay(1); } delay(300); int r_position = 180;//Variable r_position auf 180 setzen. int l_position = map(r_position, 0, 180, 180, 0);//l_position ist r_position, aber spiegelverkehrt. l_hand.write(l_position);//Servo l_hand wird auf die Variable l_position gesetzt, nur spiegelverkehrt wie r_position. r_hand.write(r_position);//Servo r_hand wird auf die Variable r_position gesetzt, nur spiegelverkehrt wie l_position. delay(1000); standby();//Funktion "standby" wird hier aufgeführt, um die Servos in ihre Uhrsprungsform zu bringen. } //Funktion eye_detect ist noch leer und es wird einfach alles übersprungen, was in dieser Funktion nach return sein würde und man kann auch Variablen zurrückwerfen, also z.B i = 180 return i, dadurch kann man Funktionen etwas ausrechnen lassen und die Funktion wieder in die Haupt Schleife zurrückwerfen. void eye_detect() { return;//Funktion wird zurrückgeworfen. } //Haupt script (der Loop) es wird so lange wiederholt bis ein Fehler entsteht oder sie unterbrochen wird. void loop() { standby();////Funktion "standby" wird hier aufgeführt, um die Servos in ihre Uhrsprungsform zu bringen. if (Serial.available()) {//Überprüft, ob Serial-Monitor verfügbar ist, was zum Beispiel nicht der Fall wäre, wenn wir nicht "serial beginn" gemacht hätten. val = Serial.read();//hier ließt er den Serial-Monitor (den normalen 9600er) aus und setzt das neueste ausgelesene auf die Variable "val". } else if (BT.available()) {//wenn der normale Serial-Monitor nicht verfügbar ist, was dann im fertigem Gebrauch der Fall sein wird, wird überprüft, ob unser Serial-Monitor namens BT (für Bluetooth) der auf den Pins 5 (RX) und 6 (TX) verfügbar ist. val = BT.read();//hier ließt er den Serial-Monitor BT (den für das Bluetooth-Modul) aus und setzt die neueste ausgelesene Line auf die Variable "val". } else { //wenn beides nicht der Fall ist. return; //wird der if-Befehl "returned" und alles darunter wird übersprungen. } if (val == 'h') {//in diesem if-Befehl wird überprüft, ob die Variable val genau der Buchstabe h ist (Die wir vorher angegeben haben). lautsprecher.setVolume(5);//Die Lautstärke des Lautsprechers wird auf 5 gesetzt. lautsprecher.play("fstu.wav");//Die SD Karte spielt die Datei "abcd.wav" auf dem Lautsprecher ab (man kann maximal nur 4 buchstaben einer Datei geben, die abgespielt werden soll). hi();//Funktion hi wird hier ausgeführt. } else if (val == 'p') {//in diesem elseif-Befehl wird überprüft, ob die Variable val genau der Buchstabe p ist (Die wir vorher angegeben haben als wir den BT seriellen Monitor ausgelesen haben). lautsprecher.setVolume(5);//Die Lautstärke des Lautsprechers wird auf 5 gesetzt. lautsprecher.play("song.wav");//Die SD Karte spielt die Datei "song.wav" auf dem Lautsprecher ab (man kann maximal nur 4 buchstaben einer Datei geben, die abgespielt werden soll). doppel_punch();//Funktion doppel_punch wird hier ausgeführt. } else if (val == 'u') {//in diesem elseif-Befehl wird überprüft, ob die Variable val genau der Buchstabe u ist (Die wir vorher angegeben haben als wir den BT seriellen Monitor ausgelesen haben). haende_hoch();//Funktion haende_hoch wird hier ausgeführt. delay(3000);//3 Sekunden Verzögerung. } else if (val == 'l') {//in diesem elseif-Befehl wird überprüft, ob die Variable val genau der Buchstabe l ist (Die wir vorher angegeben haben als wir den BT seriellen Monitor ausgelesen haben). standby();//Funktion standby wird hier ausgeführt. links_schauen();//Funktion links_schauen wird hier ausgeführt. delay(2000);//2 Sekunden Verzögerung } else if (val == 'U') {//in diesem elseif-Befehl wird überprüft, ob die Variable val genau der Buchstabe u ist (Die wir vorher angegeben haben als wir den BT seriellen Monitor ausgelesen haben). r_Aufwaertschlag();//Funktion r_Aufwaertschlag wird hier ausgeführt. delay(2000); } else if (val == 's') {//in diesem elseif-Befehl wird überprüft, ob die Variable val genau der Buchstabe s ist (Die wir vorher angegeben haben als wir den BT seriellen Monitor ausgelesen haben). smash();//Funktion r_Aufwaertschlag wird hier ausgeführt. delay(2000); } }