19. Oktober 2012
Kevin sucht Kevin kommt nicht an Kevin geht immer weiter Kevin geht immer weg Kevin geht davon Kevin geht weg, will aber nicht alleine sein Ist Kevin an einem leeren Punkt angekommen bleibt er stehen Ist Kevin alleine, hinterlässt das Spuren - einen schwarzen Fleck Dieser Fleck bleibt Kevin fährt weiter Der Fleck wird grösser Zieht Spuren Kevin zeichnet seine eigene Karte Es ist schwierig einem Roboter ein Gesicht zu geben, welches die Abbilden von Emotionen ermöglicht. Die Konstruktion ist aufwändig und beschäftigt Maschinenbauer und Robotik-Experten schon seit Jahrzehnten. Einem Roboter jedoch Charakter zu verleihen ist einfacher. Ein Hadern, Zögern ein kurzer Unterbruch, der vom Menschen gerne als Unsicherheit gewertet wird, eine gewisse Scheu, lassen Bewegungen als “natürlich” betrachtet werden. Kevin hat ein Problem, welches heute als Gesellschaftsphänomen angesehen werden kann. (Das einfach mal als Behauptung in den Raum gestellt). Ein Prototyp aus Lego Technik diente dazu, das Funktionsprinzip und die Konstruktion zu überprüfen und zu verbessern. Der Prototyp, welcher bereits alle Funktionen in sich vereinte, diente dann als Vorlage für die Umsetzung aus Holz. Für die Umsetzung des Konstruktion aus Holz wurde ein Tag eingeplant. Natürlich wurden es zwei. Um Kevin beim Testen flexibel anpassen zu können und um jederzeit Zugang zu den einzelnen Komponenten zu ermöglichen musste die Konstruktion steckbar sein. Die Komponenten sind so eingepasst, dass die Stabilität gewährleistet ist, die Flexibilität jedoch bestehen bleibt. Leider hat das in der Verbindung mit einem doch erstaunlich starken Servomotor zu Schwierigkeiten geführt. Die Festigkeit und Genauigkeit die Lego mit sich bringt in Holz nachzubilden war nur an Hand vieler Versuchen und Korrekturen möglich. Kevin kann mit Gesten gesteuert werden. Wobei "steuern" nicht zu direkt interpretiert werden darf. Man kann Kevin eine Richtung vorgeben, steuern jedoch lässt er sich nicht.#include <Servo.h> #define SENSOR_LEFT A2 #define SENSOR_RIGHT A1 #define SENSOR_FRONT A3 #define SENSOR_BACK A0 int signal_left; int signal_right; int signal_front; int signal_back; int signal_left_old; int signal_right_old; int signal_front_old; int signal_back_old; int tempoRechts = 0; int tempoLinks = 0; boolean alleine = false; int alleinTolleranz = 5000; int alleinZeit = 0; Servo myservo; int motor01AnschlussRechts = 5; int motor01AnschlussLinks = 3; int motor02AnschlussRechts = 11; int motor02AnschlussLinks = 6; long lastDebounceTime = 0; int debounceDelay = 2000; int servoState = 0; void setup(){ pinMode(motor01AnschlussLinks, OUTPUT); pinMode(motor01AnschlussRechts, OUTPUT); pinMode(motor02AnschlussLinks, OUTPUT); pinMode(motor02AnschlussRechts, OUTPUT); myservo.attach(10); myservo.write(0); Serial.begin(9600); } void loop(){ //motor01Rechts(); //motor01Links(); //motor01SpeedRechts(); //motor01SpeedLinks(); //roboVorwaerts(); //roboDrehungRechts(); signal_left = map(analogRead(SENSOR_LEFT), 80, 620, 100, 0); signal_right = map(analogRead(SENSOR_RIGHT), 80, 620, 100, 0); signal_front = map(analogRead(SENSOR_FRONT), 80, 620, 100, 0); signal_back = map(analogRead(SENSOR_BACK), 80, 620, 100, 0); /* if(millis()-lastDebounceTime > debounceDelay){ servoState += 30; myservo.write(servoState); lastDebounceTime = millis(); } */ Serial.println(); Serial.print("left "); Serial.print(analogRead(SENSOR_LEFT)); Serial.print(" "); Serial.print("right "); Serial.print(analogRead(SENSOR_RIGHT)); Serial.print(" "); Serial.print("font "); Serial.print(analogRead(SENSOR_FRONT)); Serial.print(" "); Serial.print("back "); Serial.print(analogRead(SENSOR_BACK)); Serial.println(); drive(); verlassen(); } void roboDrehungRechts(){ digitalWrite(motor01AnschlussLinks, HIGH); digitalWrite(motor01AnschlussRechts, LOW); digitalWrite(motor02AnschlussLinks, LOW); digitalWrite(motor02AnschlussRechts, HIGH); } void roboDrehungLinks(){ digitalWrite(motor01AnschlussLinks, HIGH); digitalWrite(motor01AnschlussRechts, LOW); digitalWrite(motor02AnschlussLinks, LOW); digitalWrite(motor02AnschlussRechts, HIGH); } void roboVorwaerts(){ digitalWrite(motor01AnschlussLinks, HIGH); digitalWrite(motor01AnschlussRechts, LOW); digitalWrite(motor02AnschlussLinks, HIGH); digitalWrite(motor02AnschlussRechts, LOW); } void motor01Rechts(){ digitalWrite(motor01AnschlussLinks, LOW); digitalWrite(motor01AnschlussRechts, HIGH); } void motor01Links(){ digitalWrite(motor01AnschlussLinks, HIGH); digitalWrite(motor01AnschlussRechts, LOW); } void motor01SpeedRechts(){ for(int i=0; i<255; i++) { analogWrite(motor01AnschlussRechts, i); // Den Wert i an LED_PIN setzen delay(10); } for(int i= 255; i>0; i--) { analogWrite(motor01AnschlussRechts, i); // Den Wert i an LED_PIN setzen delay(10); } } void motor01SpeedLinks(){ for(int i=0; i<255; i++) { analogWrite(motor01AnschlussLinks, i); // Den Wert i an LED_PIN setzen delay(10); } for(int i= 255; i>0; i--) { analogWrite(motor01AnschlussLinks, i); // Den Wert i an LED_PIN setzen delay(10); } } void drive(){ tempoRechts = signal_front + signal_right - signal_left - signal_back; tempoLinks = signal_front + signal_left - signal_right - signal_back; tempoRechts = map(tempoRechts, -100, 100, -255, 255); tempoLinks = map(tempoLinks, -100, 100, -255, 255); Serial.print("tempoRechts "); Serial.print(tempoRechts); Serial.print(" "); Serial.print("tempoLinks "); Serial.print(tempoLinks); Serial.println(); if(tempoRechts > 40){ analogWrite(motor01AnschlussLinks, LOW); digitalWrite(motor01AnschlussRechts, tempoRechts); alleine = false; } if(tempoRechts < -40){ int tempoRechtsMinus = 0 - tempoRechts; digitalWrite(motor01AnschlussLinks, tempoRechtsMinus); analogWrite(motor01AnschlussRechts, LOW); alleine = false; } if(tempoRechts > - 40 && tempoRechts < 40){ digitalWrite(motor01AnschlussLinks, LOW); analogWrite(motor01AnschlussRechts, LOW); if(alleine == false){ istAlleine(); } } if(tempoLinks > 40){ analogWrite(motor02AnschlussLinks, LOW); digitalWrite(motor02AnschlussRechts, tempoLinks); alleine = false; } if(tempoLinks < -40){ int tempoLinksMinus = 0 - tempoLinks; digitalWrite(motor02AnschlussLinks, tempoLinksMinus); analogWrite(motor02AnschlussRechts, LOW); alleine = false; } if(tempoLinks > -40 && tempoLinks < 40){ digitalWrite(motor02AnschlussLinks, LOW); analogWrite(motor02AnschlussRechts, LOW); if(alleine == false){ istAlleine(); } } } void istAlleine(){ Serial.println("+++++++++++++++++++++++++++++++++HERE+++++++++++++++++++++++++++++++++++++++++"); alleine = true; alleinZeit = millis(); } void verlassen(){ if(alleine && millis() - alleinZeit > alleinTolleranz && servoState <= 70){ servoState += 10; myservo.write(servoState); delay(2000); alleinZeit = millis(); } }