Self-leveling maze-Leon Chen-Professor Gottfried Haider

Context and significance:

My project was influenced by a book called “The Maze Runner”, where the maze in it can change its own structure. The maze in the book was designed for trapping and testing the protagonists, but viewing from another point, it can also be of great fun playing it. Besides, in my group project, the cleaning machine was intended to be more automatic, but ended up activated mannually, however, the performance turned out to be satisfying. Therefore, it gave me an idea that interaction should include the pyhsical movement of users. Inspired by the two thoughts above I came up with the maze that alters its level according to the time player uses for level 1.

I remembered playing a kind of maze that requires users to tilt to control the ball. My design can automatically change its level, so that users won’t be bored at it. I intend to warn people who are so busy working, studying or doing anything that forget to enjoy the pure fun. The sincere joy is especially vital for them.

Conception and design:

In my understanding, user have to actually touch the artifact to interact with it, so I design the maze to enable the user to hold and play with it, so the maze doesn’t need to be very big.

As for the maze, we had the idea of changing the walls of the maze to alter the leve, which is closer to the maze in the book. But this meant that more servo motors and programming were required, so instead, we decided to make a gate for directing users to different route.

The body of the maze can be made through cardboard. As for the sensors, we considered using pressure sensor, but we were afraid that the ball may be to light to be detected. After discussion with professor, we finally targeted light sensor, because it can be hide in the hole under the cheching point and changes its routes according to the ohms given. However, it was not the best option, because magnetic sensor can be more accurate, since the light sensor is easily affected by lights from surroundings. In the absence of a magnetic ball, we had to gave up magnetic sensor.

Fabrication and production:

During the process, my partner was responsible for the code, and my job was to build the maze. First, I had to carefully design the maze. Level 1 is rather easy, but since Level 2 has three routes, I had to balance the difficulty. The third route is a bonus route, which is open when your time is at a certain number. Designing was far from enough, measurement was inevitable when applying theory to practice, meaning that all the length of the walls needed reexamine. This was the most significant step. Because my work was doubled when I found out the thickness of the cardboard should also took into account, which meant that some of the original design wouldn’t work. What’s more, it turned out that I had to pinch them so as to make them thiner.

the original design looks much more difficult
the last edition

After finishing building, we assembled and tested the maze together——whether the ball could go through all the tunnels, and whether the checking point could send the ball into different routes.  The latter one took us a long time, since the servo motors can only rotate 180 degrees, so for each route the degree rotated must be modified. In this phase, I told my partner the angle of the servo motor, then he modified the code. But it was still not enough for three routes, we struggled for a long time, then I came up with the idea of using two servo motors, so that one motor for the bonus route and one for the other two.

there was only one servo motor at first
we added the second one later

During the user testing, we had to manually block the sensor to activate the gate, due to the lack of fabricating time. We recieved suggestions on the sensor, the start and end, and the reward when finished. To solve the problems, we hide the sensor in the hole of the checking points, which are sticked to the back of the maze. We wrote some words to indicate the start and the end. To signal one has finished the game, we added a buzzer to it. These adaptationsa are very effective, because their purpose is to make the experience smoother, so that the maze automatically operates.

The bonus route was not in my original idea, but I added it later. The reason is that I want the game to be more exciting. You see, I put in a second servo motor just because of it. In this perspective, I  can say I really accomplish my goal.

Conclusion:

My project goal is to let users play with my maze and have fun. I once defined interaction as a conversation between two individuals (man or objects) that conveys messages with each other without limitation. In fact, I think in playing the maze, the users are pyhsically engaged in it. Many users during the user testing and final presentation played the maze and explored different routes. I think they get my message of having fun. Besides, they also interact with the maze, because it changes their route according to their time. Therefore, there is certainly interaction in it. 

To improve the maze, I can make the walls more smooth by using other materails. Decoration can be considered to improve the outlook. More importantly is the start and the end, because I found most of the time users are unable to identify them.

In conclusion, the midterm project may be the most difficult and most insightful project I ever made. But the ultimate question returns to “So what?” and “Why should anybody care?”. To answering these questions, I also want to go back to the goal of my project——having fun. In this busy era, everyone is in a big competition with those around, which is a tendency called involution. But we all gradually forget the real fun of taking a rest and relaxing. I want to send out the message to those who play my maze.

Annex:

#include <Servo.h>

Servo myservo;
Servo yourservo;
int sensorValue1;
int sensorValue2;
int state=1;

void setup() {

Serial.begin(9600);
myservo.attach(9);
yourservo.attach(8);
Serial.println(“Game starts, LET’S GO!!!!”);

}
void loop() {
if (state==1){
state1();
} else if (state==2){
state2();
} else if (state==3){
state3();
} else if (state==4){
state4();
} else if (state==5){
state5();
}

}

void state1() {
int sensorValue1= analogRead(A0);

//Serial.println(sensorValue1);
myservo.write(120);
yourservo.write(60);
delay (500);
if (sensorValue1<70){

if (millis()<8000){
state=2;
} else if (millis()>8000 && millis()<9000){
state=3;
} else if (millis()>9000){
state=4;
}
}
}

void state2() {
Serial.print(“First round finished, you spent “);
Serial.print(millis()/1000.0);
Serial.println(“s, Go to Level 1”) ;
myservo.write (0);
delay(1000);
//yourservo.write(170);
delay(1000);
state=5;
}
void state3() {
Serial.println(“Surprise! You’ve triggered a bonus scene, just go all the way to the end”);
myservo.write (30);
delay(500);
yourservo.write(170);
delay(1000);
state=5;
}
void state4() {
Serial.print(“First round finished, you spent “);
Serial.print(millis()/1000.0);
Serial.println(“s, Go to Level 2”) ;
myservo.write (180);
delay(1000);
state=5;
}
void state5() {
int sensorValue2= analogRead(A1);
//Serial.println(sensorValue2);
if (sensorValue2<65) {
Serial.print(“Yeah, you’ve finished, you spent “);
Serial.print(millis()/1000.0);
Serial.println(“s”) ;
//Serial.println(sensorValue2);
tone(10,440);
delay(1000);
noTone(10);
state=1;
}

}

state2() {

Serial.print(“First round finished, you spent “);
Serial.print(millis()/1000.0);
Serial.println(“s, Go to Level 1”) ;
myservo.write (0);
delay(1000);
//yourservo.write(170);
delay(1000);
state=5;
}
void state3() {
Serial.println(“Surprise! You’ve triggered a bonus scene, just go all the way to the end”);
myservo.write (30);
delay(500);
yourservo.write(170);
delay(1000);
state=5;
}
void state4() {
Serial.print(“First round finished, you spent “);
Serial.print(millis()/1000.0);
Serial.println(“s, Go to Level 2”) ;
myservo.write (180);
delay(1000);
state=5;
}
void state5() {
int sensorValue2= analogRead(A1);
//Serial.println(sensorValue2);
if (sensorValue2<65) {
Serial.print(“Yeah, you’ve finished, you spent “);
Serial.print(millis()/1000.0);
Serial.println(“s”) ;
//Serial.println(sensorValue2);
tone(10,440);
delay(1000);
noTone(10);
state=1;
}

}

Leave a Reply

Your email address will not be published. Required fields are marked *