A. Choco Quest – Huiyi (Noelia) Yang & Kaidi (Katy) Wang – Gottfried Haider
B. CONTEXT AND SIGNIFICANCE
Our project drew indirect inspiration from the NUCA camera, which employs AI to generate personalized deepfake images based on user characteristics. While this technology is innovative, it carries the risk of alienating users by exploiting their vulnerabilities without their consent. This concern led us to pursue a direction that empowers users, incorporating elements of playfulness and user agency. To bring this concept to life, we crafted a narrative involving three Capybaras hiding chocolates. Users engage with the story by following clues left by a detective who once investigated the Capybaras, unraveling the mystery behind their actions. We hold the belief that people benefit from seemingly purposeless, playful, and unstructured time to spark inspiration despite our continuous search for meaning. In an environment where there is no pressure to produce something of significance, individuals are free to experiment, make mistakes, or even accomplish nothing. These moments of ’emptiness’ are fertile ground for the birth of extraordinary ideas.
C. CONCEPTION AND DESIGN
Our project is a puzzle game where participants must discover clues and solve puzzles to earn a reward. It features three interactive stages, each with its own response, plus a final reward. The setting is whimsical, involving a stump, three Capybaras, nuts, and chocolates, designed to immerse players in a charming forest tale.
Players assume the role of explorers on a quest to find chocolates hidden by Capybaras within the stump. To succeed, they must complete three tasks: interacting with our devices in scenarios that involve outwitting or bribing the Capybaras. Guidance is provided through detective notes, which reveal that the first Capybara can be bribed with nuts found around the stump; the second must be outmaneuvered with three precise strikes; and the third, guarding the cave entrance, must be distracted to activate the servo that dispenses chocolates. Completing these tasks signifies the successful completion of the mission.
We have constructed a stump and pedestal from cardboard, incorporating sensors in both the pedestal and Capybara figures. A servo motor within the tree root will dispense candies. Additionally, we’ll customize three fuzzy Capybara puppets to be interactive. The game involves three steps, guided by hints. First, players “bribe” a Capybara by selecting a movable hazelnut from a pedestal, triggering a reed switch in the Capybara’s food bowl. Next, players must “hit” another Capybara, equipped with a pressure sensor, three times to proceed. Finally, moving a magnet-equipped Capybara from its pedestal position triggers a solenoid motor to release candy, completing the game.
D. FABRICATION AND PRODUCTION
In the development process, we began by drafting initial sketches, cutting the cardboard, assembling the electronics, integrating the electronics with the cardboard, and decorating our device. This process involved overlapping stages and repeated iterations.
As for task distribution, my main responsibilities were programming, constructing the electronics, and testing the sensor motors. Katy, in contrast, concentrated on cutting the cardboard, assembling the components, and applying decorative elements. Our collaboration was dynamic, without a rigid separation of tasks, enabling us to support each other effectively.
Before conducting user tests, we deliberately limited the clues provided to encourage users to independently explore the three Capybaras. This strategy was intended to foster a sense of discovery. However, it resulted in confusion among users, who either misunderstood the project’s objective or had difficulty activating most sensors. To mitigate this, we introduced “detective notes” and buzzer feedback. The detective notes, which included illustrations and descriptions of the Capybara figures in a booklet, aimed to guide users in interacting with the project.
The project presented several electronic challenges. For the “Bribe Process,” which involves placing a nut in the Capybara’s bowl, we initially used a pressure sensor. Due to its sensitivity to any object, it proved to be impractical. We then switched to a reed switch (magnet sensor), which was a more intuitive choice because of the magnetic interaction. To enable the release of chocolate, we initially installed a solenoid motor, but it struggled with the weight of the items, especially chocolate. Ultimately, we opted for a strong servo motor as the best solution, despite our initial reservations about the extensive modifications needed for the stump’s internal structure and the subsequent code revisions.
E. CONCLUSIONS
Our project aligns with my perception of interactive design. Specifically, users engage with various components of the device, listen for feedback, and ultimately receive a reward: chocolate. However, the feedback from the Capybaras could be more varied. For instance, we could use an MP3 Module to produce different sound effects. To elaborate, the “Bribe” capybara could emit a pleasing animal sound. Furthermore, we could equip a capybara with a motor to animate it when the user activates it.
I learned many valuable lessons from this project. The most crucial lesson is the importance of being bold enough to start over. As previously mentioned, we hesitated for a long time about whether to replace the solenoid motor with a servo motor, fearing the loss of our progress. We could have saved more time if we had the courage to begin anew. This approach is how advancements are made: by recognizing the potential for improvement and, more importantly, being willing to dismantle the old. Additionally, I learned the importance of seeking help when feeling stuck, instead of repeatedly trying the same approach and hoping for a miraculous solution to the problem.
F. DISASSEMBLY
G. APPENDIX
1. 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
2. Pictures
Leave a Reply