“A Mind Reader”—-Final Project documentation
1.Conception and Design
As I mentioned in my proposal essay, my project is adapted from a magic performance and it’s for providing some interesting interaction experiences, and I believe how it works is already well-stated in my proposal essay and can be seen in my demonstration video, so I’m not going to talk about it now. However, there are surely some detail that I didn’t cover can show some of my thoughts about interaction. First, I used physical cards made with cardboard instead of directly showing them on the screen . Because I believe taking the card in the users’ hand and watch them will make them feel more involved in this interaction, as feeling and sight are both used. Second, I could have chosen ways such as “keyPressed” “mousePressed” or “buttonPressed” for users to judge whether the number was on the card, but I didn’t, why? That’s because these kind way is peculiar given that it’s an interaction with some kind of amazing magician. I tried to use something like nod, however, the accelerometer didn’t work well, so it’s some simpler way: putting the card in different sections as if the user is showing the magician the situation. Also, I designed a mechanism to deal card from a totally closed box, trying to accomplish the following effect: the user was informed that he or she should watch the card now, but they can’t find a card anywhere, and suddenly “puff” there comes the card, then the way of showing the card also become a magic.
I didn’t attend the user testing session because the card-dealer was not finished that time. However, I did ask several peers to test it afterwards. Their suggestions includes making more decoration, adjusting the speed of showing the instruction, and adding more animations. What is really a pity is that for the first and third suggestion, I had noticed them myself, however I was lack of time to improve as making the mechanism ran out all of my time. I adjusted the time used to play some long sentences of the instruction to make sure everyone can read and understand the instruction, which is crucial for a magic performance.
2.Fabrication and Production
I will divide this section into three parts: Circuit, Programming and Fabrication.
(1)Circuit
The circuit is quite simple, two light sensors for input and a servo for output, of course there are pull-up resistors for light sensors. As I mentioned before accelerometer maybe a better choice, but it didn’t work well with my project, so I abandoned it. The sketch and circuit is as shown.
(2) Programming
Processing is mainly used for output, and Arduino for input and compute and controlling devices. The code mainly works like this: Processing plays the instruction first, after that Arduino starts to deal cards and gather information, every time it gets information, it sends a signal to processing, which will ask the user to try the next card, then Arduino will deliver the next card. After seven rounds, Arduino will calculate the conclusion and send it to processing and processing will present that on the screen. When using processing to play the instruction, I used a photo of a magician as an NPC
When doing the coding, the major difficulty I encountered was the feedback given by processing. My intension was that every time processing receives the message, it will randomly pick one from 3 sentences to present, and switch to another one when another message was received. It didn’t work at first, what happened is that the sentences keeps on switching from one to another without stopping. With professor Gottfried’s help, I changed the number sent from Arduino: It was always 1 at first, and was changed to different numbers. Also, I added another variable in processing to show the previous sent number, so processing will only pick a new sentence when the previous number differed from the number sent know, then problem solved. The attached are my codes.
Arduino: #include #include "SerialRecord.h" SerialRecord writer(3); SerialRecord reader(3); Servo myservo; int a=0; int b=0; int c=0; int state=1; int prestate=1; int sensorValue1; int sensorValue2; int n1; int n2; int n3; int n4; int n5; int n6; int n7; void setup() { Serial.begin(9600); myservo.attach(9); myservo.write (120); delay(24000); } 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(); } else if (state==6){ state6(); } else if (state==7){ state7(); } else if (state==8){ state8(); } writer[0] = a; writer[1] = b; c=reader[2]; if(a<7){ writer.send(); //Serial.println(a); a=0; } if(a==7){ writer.send(); //Serial.println(b); } delay(20); } void state1(){ myservo.write(120); delay(1000); myservo.write(180); delay(1000); myservo.write(120); delay(500); delay(3000); state=prestate+1; prestate=state; } void state2(){ reader.read(); if(c==10){ myservo.write(120); delay(1000); myservo.write(180); delay(1000); myservo.write(120); delay(500); c=0; } int sensorValue1 = analogRead(A0); int sensorValue2 = analogRead(A1); if (sensorValue1<5 && sensorValue2>10){ a=1; n1=0; state=1; } else if (sensorValue1>10 && sensorValue2<5){ a=1; n1=16; state=1; } delay(3000); } void state3(){ reader.read(); if(c==10){ myservo.write(120); delay(1000); myservo.write(180); delay(1000); myservo.write(120); delay(500); c=0; } int sensorValue1 = analogRead(A0); int sensorValue2 = analogRead(A1); if (sensorValue1<5 && sensorValue2>10){ a=2; n2=0; state=1; }else if (sensorValue1>10 && sensorValue2<5){ a=2; n2=1; state=1; } delay(3000); } void state4(){ reader.read(); if(c==10){ myservo.write(120); delay(1000); myservo.write(180); delay(1000); myservo.write(120); delay(500); c=0; } int sensorValue1 = analogRead(A0); int sensorValue2 = analogRead(A1); if (sensorValue1<5 && sensorValue2>10){ a=3; n3=0; state=1; }else if (sensorValue1>10 && sensorValue2<5){ a=3; n3=32; state=1; } delay(3000); } void state5(){ reader.read(); if(c==10){ myservo.write(120); delay(1000); myservo.write(180); delay(1000); myservo.write(120); delay(500); c=0; } int sensorValue1 = analogRead(A0); int sensorValue2 = analogRead(A1); if (sensorValue1<5 && sensorValue2>10){ a=4; n4=0; state=1; }else if (sensorValue1>10 && sensorValue2<5){ a=4; n4=4; state=1; } delay(3000); } void state6(){ reader.read(); if(c==10){ myservo.write(120); delay(1000); myservo.write(180); delay(1000); myservo.write(120); delay(500); c=0; } int sensorValue1 = analogRead(A0); int sensorValue2 = analogRead(A1); if (sensorValue1<5 && sensorValue2>10){ a=5; n5=0; state=1; }else if (sensorValue1>10 && sensorValue2<5){ a=5; n5=64; state=1; } delay(3000); } void state7(){ reader.read(); if(c==10){ myservo.write(120); delay(1000); myservo.write(180); delay(1000); myservo.write(120); delay(500); c=0; } int sensorValue1 = analogRead(A0); int sensorValue2 = analogRead(A1); if (sensorValue1<5 && sensorValue2>10){ a=6; n6=0; state=1; }else if (sensorValue1>10 && sensorValue2<5){ a=6; n6=2; state=1; } delay(3000); } void state8(){ reader.read(); if(c==10){ myservo.write(120); delay(1000); myservo.write(180); delay(1000); myservo.write(120); delay(500); c=0; } int sensorValue1 = analogRead(A0); int sensorValue2 = analogRead(A1); if (sensorValue1<5 && sensorValue2>10){ a=7; n7=0; b=n1+n2+n3+n4+n5+n6+n7; state=1; }else if (sensorValue1>10 && sensorValue2<5){ a=7; n7=8; b=n1+n2+n3+n4+n5+n6+n7; state=1; } } Processing:
import processing.serial.*; import osteele.processing.SerialRecord.*; Serial serialPort; SerialRecord sender; SerialRecord receiver; PImage magician1; float t; int r=0; int prea=0; void setup(){ size(1400,800); background(0); magician1 = loadImage("2.jpeg"); String serialPortName = SerialUtils.findArduinoPort(); serialPort = new Serial(this, serialPortName, 9600); sender = new SerialRecord(this, serialPort, 3); receiver = new SerialRecord(this, serialPort, 2); } void draw(){ receiver.read(); int a = receiver.values[0]; int b = receiver.values[1]; imageMode(CENTER); image(magician1, 700,300); t=millis(); textSize(40); if(t>0 && t<3000){ text("Hi, I'm a magician, you can call me Klein",350,700); } if(t>3000 && t<3500){ fill(0); rect(0,550,1400,800); } if(t>4000 && t<8000){ fill(255); text("I can read your mind, if you don't believe , I will show you",250,700); } if(t>8000 && t<8500){ fill(0); rect(0,550,1400,800); } if(t>9000 && t<19000){ fill(255); text("Just select a random number from 1 to 100, Keep it in mind, Don't tell me",50,650); textSize(30); text("I will show you some cards, if you found your number on it, put it on the left.Otherwise, put it on the right",20,700); } if(t>19000 && t<19500){ fill(0); rect(0,550,1400,800); } if(t>20000 && t<23000){ fill(255); text("Clear? Let's begin", 300,700); } if(t>23000 && t<23500){ fill(0); rect(0,550,1400,800); } if(t>24000){ textSize(30); fill(255); text("Check the cards, if you found your number on it, Put it on the left.Otherwise, put it on the right",20,650); if(a<7 && prea!=a){ sender.values[2]=0; sender.send(); fill(0); rect(0,660,1400,800); r= int(random(0,4)); prea=a; } if(r==1){ text("Ah, I feel something, let's go on to the next card", 400,700); } if(r==2){ fill(255); text("I think I nearly found it in your mind, try the next card", 400,700); } if(r==3){ fill(255); text("Emm, I have some clues, but I'm not sure by now, check the next card", 300,700); } } if(a==7){ fill(0); rect(0,550,1400,800); delay(500); fill(255); textSize(30); text("I found it, I believe the number is...", 450,650); delay(2000); fill(255,0,0); textSize(50); text(b,700,700); } }
(3)Fabrication
One of the most attracting parts of my project is the mysterious card-dealer, which is really a huge challenge. As we didn’t have pistons for Arduino, so I need to make something similar on my own. I got my inspiration from Recitation4 about how to use a motor to make a piston: using two poles and connect them with rivet so that they can rotate. which is as illustrated.
And the whole mechanism works in the following way. It’s a box with the length and width a bit bigger than the length and width of the cards, the box was totally closed except for two gaps on two opposite boards at the bottom, the width of the gap is bigger than the thickness of the card and less than twice the thickness, the piston was connected with a board on the front and the board can reach into the box through the gap on the bottom.
The piston will push the card in the bottom out of the box through the other gap and the cards above it will be stopped by the box, then the piston goes back and the whole pile will fall as the there’s nothing at the bottom, after that it’s just repeating.
I made a prototype for the whole fabrication thing, and use laser-cutting products as my final work, I designed every piece of wood myself, some of the sizes were wrong at the first time as I forgot to calculate the thickness when designing some of the boards, after making adjustments, they were all settled.
And here’s the device
But the problem is I can’t tackle with the friction, the force given by the servo was too small to push the card at the bottom and the cards on the top always stuck there, which means they are not falling down even though there’s nothing under it. I tried different ways including sticking paper to both sides of the cardboard, polishing where the card and the box may get touched etc. but they are not helpful. Finally, I chose to ruin the appearance of the box, I tilted the two boards on the sides to make sure they won’t touch the card, and added some extra weight on the top of the pile of card, it did work at last! The work doesn’t loon perfect, but the cards move quite smoothly.
Here’s the photo of the work
Here are two videos from Leon’s testing and the presentation in class
3.Conclusion
My project aims at applying some interesting, eye-catching and surprising interaction experience, to accomplish this goal, I performed a magic, I built the surprise box, I used the image of a magician as an NPC, these all contributed greatly to the project. Especially the box, actually, when I first planned to make it, I only wanted it to be a card-dealer, but when Isabel was testing, she said “wow” when seeing the card appears from the box, that is a surprise also for me. Although the project is lack of more details related to magic, but the main part is completed and the interaction is quite successful, the only problem is I didn’t say the number of cards, which may cause some confusion. I believe I have already done my best I’m the interacting. So, if I have more time, I will definitely perfect my project, I will make the animation more vivid, I will deal with those confusing instructions, I will add more magic elements to the physical device, to make the whole project more magical. Maybe I will also make a bigger box, and adjust some statistics about the piston so that it can push the whole card out of the box.
This time I also learnt something. It came with the major difficulty I encountered: fabrication. The lesson I learnt was: when doing designing and making, we should never think only. When I was designing the box, I measured the scale of the card and “think” let the width and length of the card-dealer both be 3mm bigger than that of the card will work, then I made it with Cuttle. But when I put everything together , the card didn’t move as the friction force is too large. And when designing the piston, I also encountered the similar problem as the rivets and the element used to connect with the servo all have thickness but I ignored it, then the piston can’t rotate. So, when making these things like laser-cut pieces which can’t be easily changed when completed, it’s always important to test ahead of time. We can make cardboard prototypes, we can use computers, we can ask others to help consider it, with these preparations we can be more assured that the final work will succeed.
For my final project, I created a rather interesting interaction experience, me myself is really satisfied with it, Although, not many, but I do consider how the audience will feel during the experience and apply some details, which I believe is crucial for designing. I still didn’t do well in the appearance of the physical device, but this time it’s because of time management. I learnt another important lesson for interaction designing, which is also important: we should never only think.
The time I spent in 825 and 826 this semester was a great period of time. I really appreciate having the chance to take Interaction Lab. Here I learnt to make all those things with Arduino, with Processing, with cardboard, with laser-cutting. I made friends, worked together with them to make the drama “Crime Detecting Glass” and the mid-term project “Self-Leveling Maze”. With the help of fellows and friends, I made those interesting small gadgets through recitations. And finally, I accomplished something I have never imagined before: making my own project without anyone telling me what to do and how to do, every piece of wood, every resistor, every line of code, were all designed and made by myself, professors and fellows helped, but the main work was all done myself. It’s the best experience I ‘ve ever had.
And thank you Professor Gottfried. You are among the best teachers I’ve ever met. You are so kind and helped me really really a lot. Good luck for everything!
Leave a Reply