Willkommen auf unserem Seminar-Blog

Immer auf dem aktuellen Stand bleiben

Dieser Seminar-Blog befindet sich noch im Aufbau und wird in den kommenden Tagen entsprechend verfeinert.

Member Login

Lost your password?

Registration is closed

Sorry, you are not allowed to register by yourself on this site!

You must either be invited by one of our team member or request an invitation by email at viad.info {at} zhdk {dot} ch.

SHOEO

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: FLUSSDIAGRAMM
/*
 *
 * 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;

}