23. November 2010
SHOEO - You won't get past him if your shoes are not as clean as a baby popo. Riccardo, Gian Andrea KONZEPT Unser Projekt SHOEO handelt um einen intelligenten Schuhabtreter mit Charakter. SHOEO lässt einen nur dann passieren, wenn man seine Schuhe gründlich genug gereinigt hat. Wenn nicht, drückt er seine Unzufriedenheit dem Schuhabtretenden damit aus, dass er seine Miene verzieht. SHOEO ist etwas kleinlich und pedantisch, was das Schuhabtreten angeht. So kann es durchaus vorkommen, dass man seine Schuhe öfter über die Matte fahren lassen muss, als man es sich gewohnt ist. Den genügend fleissigen Schuhabtreter verabschiedet SHOEO mit einem sympathischen Augenzwinkern - auf bis zum nächsten Mal, mit SHOEO! VIDEO RECHERCHE Zu Beginn suchten wir Inspiration über Videos und Berichte im Internet von ähnlichen Projekten im Bereich des Physical Computing. Die eigene Ideeentwicklung erfolgte über Iterationen: es wurden jeweils in einem Zug grundlegende Features wie z.B. "Fahren", "Künstliche Intelligenz", "Reden", etc. notiert und zu einem realisierbaren Wesen zusammengesetzt. Nach einigen Durchgängen konnten wir uns mit der Idee eines "intelligenten" Schuhabtreters, welcher mit dem Benutzer interagiert und einen Charakter besitzt, anfreunden. ARBEITSPROZESS Nachdem unsere Idee sich verfestigte, ging es an die Planung unserer Schuhmatte. Dazu erstellten wir Umsetzpläne und Materiallisten. Danach war sägen, bohren, zusammenschrauben und leimen in der Werkstatt angesagt. Als das Grundgerüst stand, kümmerten wir uns um die Verkabelung der Motoren, Sensoren und dem Arduino. Ab diesem Zeitpunkt konnten wir uns der Programmierung des Charakters widmen. Immer wieder testen, Fehler suchen und bereinigen bestimmte die Endphase. Im ganzen Arbeitsprozess stiessen wir immer wieder auf Probleme, welche wir möglichst schnell und effizient lösen mussten. Zum Teil war das anstrengend aber gleichzeitig lernten wir auch viel dazu. Bilder zum Arbeitsprozess:/* * * THE INCREDIBLE SHOE CLEANING CHIEF * noone will ever trespass him with dirty shoes * --- SHOEO --- * v. 0.9 beta * Gian Gadient & Riccardo Lardi * */ #include <SoftwareSerial.h> #define rx 4 #define tx 7 #define sensor1 A0 #define sensor2 A1 SoftwareSerial mySerial = SoftwareSerial(rx, tx); /* states * * 0 = start * 1 = sleep * 2 = happy * 3 = sad * 4 = blink * */ int state = 0; // variables for sensor checking boolean goingToSleep = false; boolean goingHappy = false; boolean goingSad = false; boolean counting = false; boolean check1 = false; boolean check2 = false; boolean check3 = false; boolean checkLeft1 = false; boolean checkLeft2 = false; boolean checkLeft3 = false; boolean checkLeft4 = false; boolean checkLeft5 = false; boolean checkLeft6 = false; boolean checkRight1 = false; boolean checkRight2 = false; boolean checkRight3 = false; boolean checkRight4 = false; boolean checkRight5 = false; boolean checkRight6 = false; boolean leftOkay = false; boolean rightOkay = false; int checkNr = 1; int checkNrLeft = 1; int checkNrRight = 1; int lastCheckNrLeft = 1; int lastCheckNrRight = 1; int sleepTimer = 0; void setup() { pinMode(rx, INPUT); pinMode(tx, OUTPUT); pinMode(sensor1, INPUT); pinMode(sensor2, INPUT); Serial.begin(9600); mySerial.begin(9600); } void loop() { if (state == 0) { goSleep(); } checkSerialInput(); checkSensors(); } void checkSerialInput() { if (Serial.available() > 0) { char tmpString = Serial.read(); if (tmpString == '1') { goSleep(); } if (tmpString == '2') { goHappy(); } if (tmpString == '3') { goSad(); } if (tmpString == '4') { goBlink(); } } } void checkSensors() { sensorDebug(); // WAKING UP if (state == 1) { if (((analogRead(sensor1) < 350) && (analogRead(sensor1) > 100)) && ((analogRead(sensor2) < 350) && (analogRead(sensor2) > 100))) { if (goingToSleep == true) { resetSensorCheck(); goingToSleep = false; } goingHappy = true; switch(checkNr) { case 1: Serial.println("happy check1 true"); check1 = true; checkNr++; break; case 2: Serial.println("happy check2 true"); check2 = true; checkNr++; break; case 3: Serial.println("happy check3 true"); check3 = true; checkNr++; break; case 4: goHappy(); break; } } else { if ((checkNr == 2) || (checkNr == 3)) { resetSensorCheck(); } } delay(1000); } // HAPPY STATE if (state == 2) { if ((leftOkay == true) && (rightOkay == true)) { goBlink(); delay(5000); goSleep(); } // DEBUG sleep timer /* Serial.println(lastCheckNrLeft); Serial.println(checkNrLeft); Serial.println(lastCheckNrRight); Serial.println(checkNrRight); */ if ((lastCheckNrLeft == checkNrLeft - 1) || (lastCheckNrRight == checkNrRight - 1)) { //Serial.println(sleepTimer); sleepTimer++; if (sleepTimer >= 70) { sleepTimer = 0; goSad(); } } if (((analogRead(sensor1) < 350) && (analogRead(sensor1) > 100))) { counting = true; switch (checkNrLeft) { case 1: Serial.println("shoe left 1 ok"); checkLeft1 = true; lastCheckNrLeft = checkNrLeft; checkNrLeft++; break; case 3: Serial.println("shoe left 3 ok"); checkLeft3 = true; lastCheckNrLeft = checkNrLeft; checkNrLeft++; break; case 5: Serial.println("shoe left 5 ok"); checkLeft5 = true; lastCheckNrLeft = checkNrLeft; checkNrLeft++; break; case 7: leftOkay = true; break; } } else { switch (checkNrLeft) { case 2: Serial.println("shoe left 2 ok"); checkLeft2 = true; lastCheckNrLeft = checkNrLeft; checkNrLeft++; break; case 4: Serial.println("shoe left 4 ok"); checkLeft4 = true; lastCheckNrLeft = checkNrLeft; checkNrLeft++; break; case 6: Serial.println("shoe left 6 ok"); checkLeft6 = true; lastCheckNrLeft = checkNrLeft; checkNrLeft++; break; } } if (((analogRead(sensor2) < 350) && (analogRead(sensor2) > 100))) { switch (checkNrRight) { case 1: Serial.println("shoe right 1 ok"); checkRight1 = true; lastCheckNrRight = checkNrRight; checkNrRight++; break; case 3: Serial.println("shoe right 3 ok"); checkRight3 = true; lastCheckNrRight = checkNrRight; checkNrRight++; break; case 5: Serial.println("shoe right 5 ok"); checkRight5 = true; lastCheckNrRight = checkNrRight; checkNrRight++; break; case 7: rightOkay = true; break; } } else { switch (checkNrRight) { case 2: Serial.println("shoe right 2 ok"); checkRight2 = true; lastCheckNrRight = checkNrRight; checkNrRight++; break; case 4: Serial.println("shoe right 4 ok"); checkRight4 = true; lastCheckNrRight = checkNrRight; checkNrRight++; break; case 6: Serial.println("shoe right 6 ok"); checkRight6 = true; lastCheckNrRight = checkNrRight; checkNrRight++; break; } } // GOTO SLEEP IF NO ACTIVITY /* if ((analogRead(sensor1) < 100) && (analogRead(sensor2) < 100)) { goingToSleep = true; switch(checkNr) { case 1: Serial.println("sleep check1 true"); check1 = true; checkNr++; break; case 2: Serial.println("sleep check2 true"); check2 = true; checkNr++; break; case 3: Serial.println("sleep check3 true"); check3 = true; checkNr++; break; case 4: goSleep(); break; } } else { if (goingToSleep == true) { resetSensorCheck(); goingToSleep = false; } } */ delay(100); } } void goSleep() { Serial.println("going into sleep..."); moveTo(1, 50); moveTo(2, 50); moveTo(3, 50); delay(1000); state = 1; resetSensorCheck(); } void goHappy() { Serial.println("going into happy..."); moveTo(1, 105); moveTo(2, 120); moveTo(3, 115); delay(1000); state = 2; resetSensorCheck(); } void goSad() { Serial.println("going into sad..."); moveTo(1, 170); moveTo(2, 170); moveTo(3, 180); delay(1000); if (counting = false) { state = 3; resetSensorCheck(); } } void goBlink() { Serial.println("going into blink..."); moveTo(1, 105); moveTo(2, 50); moveTo(3, 115); delay(1000); state = 4; resetSensorCheck(); } void moveTo(int servo, byte degree) { switch (servo) { case 1: mySerial.print(255, BYTE); mySerial.print(8, BYTE); mySerial.println(degree, BYTE); break; case 2: mySerial.print(255, BYTE); mySerial.print(10, BYTE); mySerial.println(255 - degree, BYTE); break; case 3: mySerial.print(255, BYTE); mySerial.print(12, BYTE); mySerial.println(degree, BYTE); break; } } void sensorDebug() { Serial.println(analogRead(sensor1)); Serial.println(analogRead(sensor2)); } void resetSensorCheck() { Serial.println("resetting sensor check..."); goingToSleep = false; goingHappy = false; goingSad = false; counting = false; check1 = false; check2 = false; check3 = false; checkLeft1 = false; checkLeft2 = false; checkLeft3 = false; checkLeft4 = false; checkLeft5 = false; checkLeft6 = false; checkRight1 = false; checkRight2 = false; checkRight3 = false; checkRight4 = false; checkRight5 = false; checkRight6 = false; leftOkay = false; rightOkay = false; checkNr = 1; checkNrLeft = 1; checkNrRight = 1; lastCheckNrLeft = 1; lastCheckNrRight = 1; }