16. Oktober 2012
Video
LostInSpac360
Ideenfindung
1. Fitness Uhr Eine sportliche Aktivität eines Users wird von einem Bewegunssensor erfasst und die relevante Daten an einer Armbanduhr angezeigt. Der Bewegungssensor wird davor an das Nutzer Objekt angebracht 1.Modus Digitalanzeige = Zählt die gewünschte Wiederholungsanzahl der Übung. 0 = Ende der Übung LED Ring = Wiederholungsfrequenz (Taktrate) der Übung 2.Modus Digitalanzeige = Abstrakte Streckendistanz. 0.0 = Ziel. LED Ring = Rückstand oder Vorsprung zum Mitstreiter.![](../../../../files/2012/10/Skizze01-300x300.png)
Konzept
Lost in Space Hilf dem orientierungslosen Roboter „Roll E“ nach Hause zu finden.![](../../../../files/2012/10/Skizze02-300x300.png)
![](../../../../files/2012/10/Prorotyp-300x300.png)
Umsetzung
1. Antriebsmechanik aus Lego Technik Bauteilen und zwei 9Volt DC-Motoren. Verdrahtung der elektrischen Komponenten.![](../../../../files/2012/10/Lego1-300x300.png)
![](../../../../files/2012/10/Motoranschluss-300x300.png)
#include int RFIDResetPin = 13; SoftwareSerial mySerial(2,3); char lastTagCard[] = "BBBBBBBBBBBB"; //Gruppen zum Vergleichen const int anzahlDerGruppen = 10; const int anzahlDerEintraege = 4; char* tagCards[anzahlDerGruppen][anzahlDerEintraege] ={ { "35021E5DD8AC", "", "", "" } // TagCardHome , { "84003399CFE1", "35021CF723FF", "08B0A4210D30", "89B0A4A15C60" } // TagCardR , { "21A12600983E", "840033973111", "81B186A1C9DE", "29B1060020BE" } // TagCardL , { "35021E7C0055", "", "", "" } // TagCardZ , { "35021D1F0336", "", "", "" } // TagCardAusruhen , { "35021EB149D1", "", "", "" } // TagCardSD , { "35021D00163C", "", "", "" } // TagCardOelspur , { "01B3A4A15DEA", "", "", "" } // TagCardVirus , { "", "", "", "" } // TagCardSpeedPlus , { "00B0A6A1C770", "", "", "" } // TagCardSpeedMinus , }; boolean tagCardHome = false; boolean tagCardR = false; boolean tagCardL = false; boolean tagCardZ = false; boolean tagCardAusruhen = false; boolean tagCardSD = false; boolean tagCardOelspur = false; boolean tagCardVirus = false; boolean tagCardSpeedPlus = false; boolean tagCardSpeedMinus = false; boolean run360 = false; boolean erstesMal = true; int geschwindigkeit = 150; //100 char SDlastTagCard[] = "BBBBBBBBBBBB"; char nullNummer[] = "BBBBBBBBBBBB"; const int motor01AnschlussRechts = 5; const int motor01AnschlussLinks = 6; const int motor02AnschlussRechts = 10; const int motor02AnschlussLinks = 11; long vorherigeMillis = 0; long timerOnOff = 1; long Timer90Grad = 800; //310 long Timer180Grad = 2000; //800 long Timer360Grad = 3200; //1600 long Timer1080Grad = 4800; //4800 long TimerAusruhen = 3000; //3000 long TimerPause = 1000; // 1000 boolean roboEingeschaltet = false; const int buttonPin = 7; const int led01 = 8; const int led02 = 4; const int led03 = 12; int buttonState = 0; boolean loslassen = true; void setup(){ Serial.begin(9600); pinMode(motor01AnschlussLinks, OUTPUT); pinMode(motor01AnschlussRechts, OUTPUT); pinMode(motor02AnschlussLinks, OUTPUT); pinMode(motor02AnschlussRechts, OUTPUT); mySerial.begin(9600); pinMode(RFIDResetPin, OUTPUT); digitalWrite(RFIDResetPin, HIGH); pinMode(buttonPin, INPUT); pinMode(led01, OUTPUT); pinMode(led02, OUTPUT); pinMode(led03, OUTPUT); } //----------------------------------------------------------------------------------- void loop(){ onOff(); if (roboEingeschaltet == true){ RFiDreader(); if (tagCardHome == true){ roboHome(); } else if (tagCardR == true){ roboDrehungRechts(); } else if (tagCardL == true){ roboDrehungLinks(); } else if (tagCardZ == true){ roboDrehungZurueck(); } else if (tagCardSD == true){ roboSdCard(); } else if (tagCardAusruhen == true){ roboAusruhen(); } else if (tagCardOelspur == true){ roboOelspur(); } else if (tagCardSpeedPlus == true){ roboSpeedPlus(); } else if (tagCardSpeedMinus == true){ roboSpeedMinus(); } else{ roboVorwaerts(); } } else{ roboStillstand(); for(int n=0; n TimerPause){ erstesMal = true; } else{ roboPause(); } } void roboStillstand(){ Serial.println("Robo stop"); digitalWrite(motor01AnschlussLinks, LOW); digitalWrite(motor01AnschlussRechts, LOW); digitalWrite(motor02AnschlussLinks, LOW); digitalWrite(motor02AnschlussRechts, LOW); } void roboVorwaerts(){ Serial.println("Robo vorwaerts"); analogWrite(motor01AnschlussLinks, geschwindigkeit); analogWrite(motor01AnschlussRechts, LOW); analogWrite(motor02AnschlussLinks, geschwindigkeit); analogWrite(motor02AnschlussRechts, LOW); } void roboAusruhen(){ Serial.println("robo ausruhen"); if (erstesMal == true){ erstesMal = false; vorherigeMillis = millis(); } if(millis() - vorherigeMillis > TimerAusruhen){ tagCardAusruhen = false; erstesMal = true; roboPause(); TimerAusruhen = 3000; return; } digitalWrite(motor01AnschlussLinks, LOW); digitalWrite(motor01AnschlussRechts, LOW); digitalWrite(motor02AnschlussLinks, LOW); digitalWrite(motor02AnschlussRechts, LOW); } void roboHome(){ Serial.println("Robo Home"); if (erstesMal == true){ erstesMal = false; vorherigeMillis = millis(); } if(millis() - vorherigeMillis > Timer1080Grad){ tagCardHome = false; erstesMal = true; roboPause(); roboEingeschaltet = false; return; } digitalWrite(motor01AnschlussLinks, HIGH); digitalWrite(motor01AnschlussRechts, LOW); digitalWrite(motor02AnschlussLinks, LOW); digitalWrite(motor02AnschlussRechts, HIGH); } void roboDrehungRechts(){ if (tagCardVirus == true){ tagCardR = false; tagCardL = true; tagCardVirus = false; } else{ Serial.println("Robo nach rechts"); if (erstesMal == true){ erstesMal = false; vorherigeMillis = millis(); } if(millis() - vorherigeMillis > Timer90Grad){ tagCardR = false; erstesMal = true; roboPause(); return; } digitalWrite(motor01AnschlussLinks, HIGH); digitalWrite(motor01AnschlussRechts, LOW); digitalWrite(motor02AnschlussLinks, LOW); digitalWrite(motor02AnschlussRechts, HIGH); } } void roboDrehungLinks(){ if (tagCardVirus == true){ tagCardL = false; tagCardR = true; tagCardVirus = false; } else{ Serial.println("Robo nach links"); if (erstesMal == true){ erstesMal = false; vorherigeMillis = millis(); } if(millis() - vorherigeMillis > Timer90Grad){ tagCardL = false; erstesMal = true; roboPause(); return; } digitalWrite(motor01AnschlussLinks, LOW); digitalWrite(motor01AnschlussRechts, HIGH); digitalWrite(motor02AnschlussLinks, HIGH); digitalWrite(motor02AnschlussRechts, LOW); } } void roboDrehungZurueck(){ if (tagCardVirus == true){ tagCardZ = false; tagCardAusruhen = true; TimerAusruhen = 0; tagCardVirus = false; } else{ Serial.println("Robo umkehren"); if (erstesMal == true){ erstesMal = false; vorherigeMillis = millis(); } if(millis() - vorherigeMillis > Timer180Grad){ tagCardZ = false; erstesMal = true; roboPause(); return; } digitalWrite(motor01AnschlussLinks, HIGH); digitalWrite(motor01AnschlussRechts, LOW); digitalWrite(motor02AnschlussLinks, LOW); digitalWrite(motor02AnschlussRechts, HIGH); } } void roboOelspur(){ Serial.println("Robo Zufallswert"); if (run360 == true){ robo360(); } else{ int _wuerfel = random(1,5); Serial.print("XXXX XXXXXXX xXXXXXX xXXXX xX xXXXXXX _wuerfel = "); Serial.println(_wuerfel); if (_wuerfel == 1){ tagCardOelspur = false; tagCardR = true; } else if (_wuerfel == 2){ tagCardOelspur = false; tagCardL = true; } else if (_wuerfel == 3){ tagCardOelspur = false; tagCardZ = true; } else if (_wuerfel == 4){ run360 = true; } } } void robo360(){ Serial.println("Robo 360 Drehung"); if (erstesMal == true){ erstesMal = false; vorherigeMillis = millis(); } if(millis() - vorherigeMillis > Timer360Grad){ run360 = false; tagCardOelspur = false; erstesMal = true; roboPause(); return; } digitalWrite(motor01AnschlussLinks, HIGH); digitalWrite(motor01AnschlussRechts, LOW); digitalWrite(motor02AnschlussLinks, LOW); digitalWrite(motor02AnschlussRechts, HIGH); } void roboSpeedPlus(){ Serial.println("robo Speed Plus"); geschwindigkeit = 150; TimerAusruhen = 0; if (erstesMal == true){ erstesMal = false; vorherigeMillis = millis(); } if(millis() - vorherigeMillis > TimerAusruhen){ tagCardSpeedPlus = false; erstesMal = true; TimerAusruhen = 3000; roboPause(); return; } digitalWrite(motor01AnschlussLinks, LOW); digitalWrite(motor01AnschlussRechts, LOW); digitalWrite(motor02AnschlussLinks, LOW); digitalWrite(motor02AnschlussRechts, LOW); } void roboSpeedMinus(){ Serial.println("robo Speed Minus"); geschwindigkeit = 75; TimerAusruhen = 0; if (erstesMal == true){ erstesMal = false; vorherigeMillis = millis(); } if(millis() - vorherigeMillis > TimerAusruhen){ tagCardSpeedMinus = false; erstesMal = true; TimerAusruhen = 3000; roboPause(); return; } digitalWrite(motor01AnschlussLinks, LOW); digitalWrite(motor01AnschlussRechts, LOW); digitalWrite(motor02AnschlussLinks, LOW); digitalWrite(motor02AnschlussRechts, LOW); } void roboSdCard(){ Serial.println("Robo SD Setzen"); tagCardSD = false; for(int i = 0; i for(int j = 0; j < anzahlDerEintraege; j++){ if(strcmp(SDlastTagCard, tagCards[i][j]) == 0){ aktionAusfuehren(i); } } } } void RFiDreader() { char tagString[12]; int index = 0; boolean reading = false; while(mySerial.available()) { int readByte = mySerial.read(); // Nächstes Byte lesen if(readByte == 2) reading = true; //Indentifizierung für den Anfang des Tags if(readByte == 3) reading = false; //Indentifizierung für das Ende des Tags if(reading && readByte != 2 && readByte != 10 && readByte != 13) { tagString[index] = readByte; // Tag speichern index ++; } } if(tagString[0] != 0) { Serial.print("tagString = "); Serial.println(tagString); for(int i = 0; i for(int j = 0; j < anzahlDerEintraege; j++) // Check Eintrag nach Tag-Nummer { if(strcmp(tagString, lastTagCard) != 0) //Neue Tag-Nummer? { if(strcmp(tagString, tagCards[i][j]) == 0) //Die neue Nummer hat welche Aktion? { for(int m=0; m { SDlastTagCard[m] = lastTagCard[m]; } for(int k=0; k { lastTagCard[k] = tagString[k]; } roboPause(); aktionAusfuehren(i); //Aktion starten break; } } } } } memset(tagString,0,strlen(tagString)); //Tag freigeben (mit NULL überschreiben) resetReader(); //Den RFiD Reader resetten } void resetReader() { // Reset Funktion digitalWrite(RFIDResetPin, LOW); digitalWrite(RFIDResetPin, HIGH); delay(150); } void aktionAusfuehren(int aktionsNummer) { switch(aktionsNummer) { case 0: tagCardHome = true; break; case 1: tagCardR = true; break; case 2: tagCardL = true; break; case 3: tagCardZ = true; break; case 4: tagCardAusruhen = true; break; case 5: tagCardSD = true; break; case 6: tagCardOelspur = true; break; case 7: tagCardVirus = true; break; case 8: tagCardSpeedPlus = true; break; case 9: tagCardSpeedMinus = true; break; default: break; } } void onOff() { buttonState = digitalRead(buttonPin); Serial.print("buttonState = "); Serial.println(buttonState); if (buttonState == LOW){ loslassen = true; } else if (buttonState == HIGH && loslassen == true){ roboEingeschaltet = !roboEingeschaltet; loslassen = false; ledEins(); } } void ledEins() { if (roboEingeschaltet == true) { digitalWrite(led01, HIGH); digitalWrite(led02, HIGH); digitalWrite(led03, HIGH); } else { digitalWrite(led01, LOW); digitalWrite(led02, LOW); digitalWrite(led03, LOW); } }
![](../../../../files/2012/10/Arduino-300x300.png)
![](../../../../files/2012/10/cards-300x300.png)
![](../../../../files/2012/10/Lasern-300x300.png)
![](../../../../files/2012/10/Huelle-300x300.png)
![](../../../../files/2012/10/wallE1-300x300.png)
![](../../../../files/2012/10/card02-300x300.png)
![](../../../../files/2012/10/run01-300x300.png)
![](../../../../files/2012/10/run02-300x300.png)
![](../../../../files/2012/10/run03-300x300.png)
![](../../../../files/2012/10/run04-300x300.png)