- CHOCO QUEST by Noelia Yang & Katy Wang
- INSTRUCTOR: Gottfried Haider
Basic Content: Following hints, the audience has to interact with three capybaras in three certain ways to get the chocolate hidden inside the tree stump.
- CONTEXT AND SIGNIFICANCE
In the first reading and analysis assignment, I wrote: “In my idea, Interaction is a relationship between at least two subjects where the subjects can all feel each other’s existence or thoughts.” This is the basic idea I carried into this midterm project. Moreover, we’ve learned how to use the basic sensors and motors, so I was thinking of utilizing them in our project to achieve my understanding of interaction. Previous experience also led us to our final idea: we first started with the rough idea I put in the answer to the sensor recitation report, and then we developed it into the idea that I put in the second reading and analysis report. They will be discussed more detailedly in the conception and design part.
- CONCEPTION AND DESIGN
First of all, we shifted our main idea to better meet our understanding of interaction. Originally, we were planning to make a magic tree at which people shout and trigger the apples on the tree to flash and the chocolates inside the tree to drop out. But from the audience’s perspective, shouting as the only action is not giving enough interactive experience so we eventually decided to set three tasks from different positions and in different ways.
We also made such decisions in our specific designs. First, we printed out “detective notes” talking about the habits of each capybara as a hint for the audience to guess how to interact with them. Second, we shaped a bowl in front of the first capybara and wrote “food bowl” on it to imply the nut attached to a magnet should go into the bowl as the first task. Third, we squeezed the but of the second capybara and kept its shape that way to imply that “squeezing” is the right action to take.
Moreover, a certain tune will be played after one mission is completed to give instant feedback. The second task is about squeezing the butt three times, which can’t be naturally implied in the detective notes so we decided to play one-third of the tune after the first squeezing and two-thirds of it after the second, and then the whole tune after three squeezing all completed.
In addition, we chose light and furry materials so that they can be supported by our servo and give a cute vibe to fit our theme and targeted audience. More detailed material choices in the sense of mechanism will be explained in the fabrication and production.
- FABRICATION AND PRODUCTION
During the building and testing process, we found that many tools and materials couldn’t function in this project as we hoped. The biggest change we made was replacing the solenoid with a servo motor in the chocolate releasing step because once we put over two chocolates in the platform connected to the solenoid, part of the force would be taken to hold against gravity and it wouldn’t be able to stretch out and draw back as usual. So we placed a servo motor in a way that rotates in the horizontal plane which could achieve the function of opening a little space for the chocolate to drop and it’s not affected by gravity as long as we put a stick underneath to support the plane. We also replaced the force-sensitive sensor with a flex sensor because the pressure the force sensor detected when inside the capybara is always exceeded. Thirdly, we filled the stomach of the gatekeeper capybara (the one that has to be removed to disconnect the magnet) instead of attaching one little magnet on the surface to ensure the connection of the magnet and we made “fake grass” to help stabilize its connection.
Noelia made perfect codes for our project and I was in charge of building the hardware and designing hints. But I would say we did most of the work together, including planning the tasks, testing the sensors, checking the circuit, and making the decisions on our materials. We spent a lot of time together in the fourth-floor studio, which left us a very memorable cooperation experience.
During the User Testing Session, we collected valuable feedback and decided on some changes according to what we observed from our users. Following is the list I made after the User Testing Sessions. Part of the content has also been covered above when talking about the significant changes we made to deal with failures. The left was more detailed, such as making a hole on top of it to allow refilling. Using a buzzer to give instant positive feedback suggested by Professor Gottfried is the most important takeaway from the session. Also, we were more determined to let go of our solenoid after the testing. Based on how our user “free explored” our project, I came up with hints in the way of detective notes and more decorations related to the tasks. Our goal was to provide a puzzle game of moderate difficulty and a chill interactive experience so we created the hints with a certain amount of certainty and freedom.
- CONCLUSIONS
My definition of interaction is a relationship between at least two subjects where the subjects can all feel each other’s existence or thoughts. In our project, the capybaras can “feel” the audience’s feeding, squeezing, and removing in order to give feedback. Meanwhile, the audience can touch the capybaras and stumps and feel their existence and their changes from the feedback provided by a buzzer and chocolates.
Ultimately, the audience interacted with the capybaras correctly without my explanation and got the chocolate successfully, which met our expectations. If I had more time, I would install an mp3 buzzer in order to better personate the capybaras and add more fun to the interactive experience. Also, following the suggestion from Professor Rudy and Professor Gottfried, we could activate some movements of the capybaras to make them more alive.
Giving instant feedback when building task-based interactive installations is the most important and practical takeaway I had from this project. Moreover, I learned how many things can go wrong in the process of building and creating and how they can all be solved as long as we put effort into thinking and designing. And it’s always a good strategy to ask advice from the more experienced or just the general audience to shift an angle thinking about our own project.
- DISASSEMBLY:
- APPENDIX
- Random Pictures:
2. Special Thanks: donator Doris; tester Wes
3. The Full Code:
//the melody code #include "pitches.h" #include Servo myservo; // notes in the melody: /** This was adapted from a the tutorial found here: **https://www.arduino.cc/en/Tutorial/BuiltInExamples/toneMelody** / int melody[] = { NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_F4, }; int melodySeg1[] = { NOTE_C4, NOTE_C4, }; int melodySeg2[] = { NOTE_D4, NOTE_C4, }; int noteDurations1[] = { 4, 4, }; int noteDurations2[] = { 4, 4, }; int noteDurations[] = { 4, 4, 4, 4, 4, }; //the state variables int pos = 0; int Bribe = 0; int Bribedone = 0; int Hit = 0; int Hitdone = 0; int HitNumber1done = 0; int HitNumber2done = 0; int Guard = 0; int Guarddone = 0; int HitNumbers = 0; //the value variables int BribeMagnet = 0; int GuardMagnet = 0; int Hitforce = 0; int PreHitforce = 0; int GameDone = 0; void setup() { Serial.begin(9600); pinMode(2, INPUT); pinMode(4, INPUT); pinMode(9, OUTPUT); pinMode(11, OUTPUT); myservo.attach(9); myservo.write(0); } void loop() { BribeMagnet = digitalRead(2); GuardMagnet = digitalRead(4); PreHitforce = Hitforce; Hitforce = analogRead(A0); Serial.print("Bribe: "); Serial.println(Bribe); Serial.print("Guard: "); Serial.println(Guard); Serial.print("Hit: "); Serial.println(Hit); Serial.print("HitForce: "); Serial.println(Hitforce); Serial.print("PreHitForce: "); Serial.println(PreHitforce); if (BribeMagnet == 1 && Bribedone == 0) { Bribe = 1; Bribedone = 1; for (int thisNote = 0; thisNote < 5; thisNote++) { int noteDuration = 1000 / noteDurations[thisNote]; tone(8, melody[thisNote], noteDuration); int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); // stop the tone playing: noTone(8); } } if (GuardMagnet == 0 && Guarddone == 0) { //remeber to change the 1 back into zero Guard = 1; Guarddone = 1; for (int thisNote = 0; thisNote < 5; thisNote++) { int noteDuration = 1000 / noteDurations[thisNote]; tone(8, melody[thisNote], noteDuration); int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); // stop the tone playing: noTone(8); } } if (PreHitforce < 300 && Hitforce > 500) { HitNumbers = HitNumbers + 1; PreHitforce = Hitforce; } if (HitNumbers == 1 && HitNumber1done == 0) { HitNumber1done = 1; for (int thisNote = 0; thisNote < 2; thisNote++) { int noteDuration = 1000 / noteDurations1[thisNote]; tone(8, melodySeg1[thisNote], noteDuration); int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); noTone(8); } } if (HitNumbers == 2 && HitNumber2done == 0) { HitNumber2done = 1; for (int thisNote = 0; thisNote < 2; thisNote++) { int noteDuration = 1000 / noteDurations2[thisNote]; tone(8, melodySeg2[thisNote], noteDuration); int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); noTone(8); } } if (HitNumbers >= 3 && Hitdone == 0) { Hit = 1; Hitdone = 1; for (int thisNote = 0; thisNote < 5; thisNote++) { int noteDuration = 1000 / noteDurations[thisNote]; tone(8, melody[thisNote], noteDuration); int pauseBetweenNotes = noteDuration * 1.30; delay(pauseBetweenNotes); noTone(8); } } if (Guard == 1 && Bribe == 1 && Hit == 1) { for (pos = 0; pos <= 60; pos += 1) { myservo.write(pos); delay(15); } for (pos = 60; pos >= 0; pos -= 1) { myservo.write(pos); delay(15); } for (pos = 0; pos <= 60; pos += 1) { // in steps of 1 degree myservo.write(pos); delay(15); } for (pos = 60; pos >= 0; pos -= 1) { myservo.write(pos); delay(15); } Guard = 0; Bribe = 0; Hit = 0; } } /************************************************* Public Constants *************************************************/ #define NOTE_B0 31 #define NOTE_C1 33 #define NOTE_CS1 35 #define NOTE_D1 37 #define NOTE_DS1 39 #define NOTE_E1 41 #define NOTE_F1 44 #define NOTE_FS1 46 #define NOTE_G1 49 #define NOTE_GS1 52 #define NOTE_A1 55 #define NOTE_AS1 58 #define NOTE_B1 62 #define NOTE_C2 65 #define NOTE_CS2 69 #define NOTE_D2 73 #define NOTE_DS2 78 #define NOTE_E2 82 #define NOTE_F2 87 #define NOTE_FS2 93 #define NOTE_G2 98 #define NOTE_GS2 104 #define NOTE_A2 110 #define NOTE_AS2 117 #define NOTE_B2 123 #define NOTE_C3 131 #define NOTE_CS3 139 #define NOTE_D3 147 #define NOTE_DS3 156 #define NOTE_E3 165 #define NOTE_F3 175 #define NOTE_FS3 185 #define NOTE_G3 196 #define NOTE_GS3 208 #define NOTE_A3 220 #define NOTE_AS3 233 #define NOTE_B3 247 #define NOTE_C4 262 #define NOTE_CS4 277 #define NOTE_D4 294 #define NOTE_DS4 311 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_FS4 370 #define NOTE_G4 392 #define NOTE_GS4 415 #define NOTE_A4 440 #define NOTE_AS4 466 #define NOTE_B4 494 #define NOTE_C5 523 #define NOTE_CS5 554 #define NOTE_D5 587 #define NOTE_DS5 622 #define NOTE_E5 659 #define NOTE_F5 698 #define NOTE_FS5 740 #define NOTE_G5 784 #define NOTE_GS5 831 #define NOTE_A5 880 #define NOTE_AS5 932 #define NOTE_B5 988 #define NOTE_C6 1047 #define NOTE_CS6 1109 #define NOTE_D6 1175 #define NOTE_DS6 1245 #define NOTE_E6 1319 #define NOTE_F6 1397 #define NOTE_FS6 1480 #define NOTE_G6 1568 #define NOTE_GS6 1661 #define NOTE_A6 1760 #define NOTE_AS6 1865 #define NOTE_B6 1976 #define NOTE_C7 2093 #define NOTE_CS7 2217 #define NOTE_D7 2349 #define NOTE_DS7 2489 #define NOTE_E7 2637 #define NOTE_F7 2794 #define NOTE_FS7 2960 #define NOTE_G7 3136 #define NOTE_GS7 3322 #define NOTE_A7 3520 #define NOTE_AS7 3729 #define NOTE_B7 3951 #define NOTE_C8 4186 #define NOTE_CS8 4435 #define NOTE_D8 4699 #define NOTE_DS8 4978 #define NOTE_C4 262 #define NOTE_D4 294 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_G4 392 #define NOTE_A4 440 #define NOTE_AS4 466 #define NOTE_C5 523
Leave a Reply