A. Beware of the Dog!!!
Ruilin Wu & Steve Lu
Instructor: Rudi
B. Conception and Design
The concept of our project is basically about raising an electronic puppies which reacts to real-life moves. At first, in my previous preparatory research, the idea I came up with is building two puppies – a physical furry one and an electronic one.
(the preparatory research: the idea of two puppies)
And then that idea got expanded. In my proposal essay, after talking to Rudi, I decided to change “interacting with a physical puppy” into “making real-life actions” in order to avoid the awkward situation of two dogs existing at the same time, as well as challenge myself.
(the proposal essay: the conceptual sketch)
I made several decisions in order to make my project in line with my understanding of how my users are going to make interaction. To start with, I want to encouraging users to find the pattern without directly informing them what to do. Therefore, I designed some prompts. What’s more, I want to sustain their interest by motivating them to conduct more moves of interaction. Therefore, my project contains two steps, the latter one can be triggered only when the former one is done.
During the User Testing Session, the users were informed of our idea of the project, tested how the food bowl worked, and saw the pictures for animation.
(the User Testing Session)
Honestly, the advice and feedbacks given by the users are quite instructive. Instructor Margaret suggested we think about what emotion of the users can better lead them to conduct the second action. So we made the cute puppy walk out of the house before the users throw a bone into its food bowl (in case they are afraid of the previous scary shadow and do not want to feed the dog); One student wonder how the prompts can fit in our project. We carefully thought about it. Finally, inspired by the game Minecraft, we set the values of hunger and happiness for the puppy, indicating its state of feeling hungry, which serves as a clear and straightforward way to prompt users feed a bone to it. It turns out that both of the adaptations are successful and effective.
(The values of happiness and hunger, inspired by Minecraft)
C. Fabrication and Production
Considering the differences between ours and others’ projects, we didn’t need to do a lot of fabrication (for example, using hot glue guns to make all those wooden boxes). Instead, in order to achieve our expected effect, we shift the focus elsewhere.
Basically, our project can be divided into three parts: the leash, the food bowl, and the animation.
Firstly, the leash is used for waking up the puppy in the screen. The whole device contains a plastic leash we’ve bought, a stepper motor and a sliding resistor. We only showed the leash part, and stuck the motor and the sliding resistor under the table. One side of a thin string is connected to the motor’s turning wheel, tied around the resistor and the other side is connected to the end of the leash. Initially, the resistor is placed down its end closer to the motor. When the user pull the leash, The resistor will be driven by the rope, sliding to the other end of the bar. A signal will then be sent to Processing once the slider of the resistor reaches the end of the bar, which is used for triggering the next scene of the animation. What’s more, once the signal is sent, it will also trigger the stepper to pull the leash back.
(How the motor works) (credit: Steve Lu)
Next, the food bowl is one of the most time-consuming part during our production. It was not that easy to 3D print a perfect large dog food bowl and the trivial components inside of it. To be honest, we failed a couple a times and spent most of our time staying in 823 to continuously check the condition of the printer. Thanks to the genius design of my reliable partner Steve, the whole structure of the food bowl turns out to be more than perfect. Theoretically, when the user put a bone into the entrance, the infrared emitter will be triggered and let the bone fall down into the bowl. And then the bone will slip out of the food bowl though a slide pushed by the servo motor (see the annex for more relevant pictures). However, in reality, the device failed to perfectly do the work which it was suppose to do. We tested several times and found that there were too many possible positions for the bones to enter the bowl, thus making it hard to precisely fall down to the bottom of the bowl. In response to this unexpected error, we decided to change the way the users were going to throw the bones. Instead of throwing the bones before the motor works and the entrance is open, the users should hold the bone above the entrance and throw it into the bowl after the entrance is open. The entrance can serve as “a magical connection between the reality and the virtual world”.
(the design for 3D printing) (credit: Steve Lu)
(the only picture I’ve found related to the physical appearance of the bowl…I didn’t expect that its size fits my head so perfectly.)
Finally, the animation, which is also quite a time-consuming part, is something we really want to realize in order to present the optimal and most satisfying visual effects of our project. In my proposal essay, Steve and I wanted to realize the animation by using Adobe Character Animator. However, we found that this software is not beginner-friendly. We tried to make a prototype, but the effect was far from satisfactory. Plus, our time is so limited that we can’t afford carefully study how to use Adobe Character Animator from scratch. Considering all these factors, we finally decided to draw the sketches and integrate them into animation by using Premiere.
During the process of sketching, I believe the most difficult part for me, who has never tried making animation before and is just an amateur in drawing, is to think about how to ensure the consistency of the puppy’s movements. I had to picture how a puppy walk, squat down to eat, wag and walk back in my mind and then respectively broke down into small moves. There were many times when I tested the movement in Premiere, the effect was far from satisfactory, so I had to redraw the moves until they seemed to be consistent and smooth. This work takes a lot of patience and consideration. It is through continuous trail and error that we can finally present a cute, vivid little puppy on the screen.
(the final version of puppy’s movements)
What is also worth mentioning is the corresponding Processing code. At first, I referred to the code of Movie shown before in the class, upload four different videos for different reactions of the puppy. I used “loop” and “noloop”, hoping that the video could be played whenever the condition was triggered. However, there were significant delay between every loop, and the swift between videos were not smooth enough neither. So I asked instructor Rudi for help. By changing “noloop” into “play”, and adding “.jump()”, the loop can transit really well, effectively solving our problems. Better still, when I ask my partner Steve’s advice, he taught me an optimized way by using “.jump()” function. So I combined four short videos together, and when the conditions were triggered, the integrated video would jump to the corresponding part. In this way, I didn’t need to upload four video and write the same part of code for four times, which is quite smart and time-saving.
For the division of work, I’m responsible for the animation and part of the Processing code. Steve is responsible for the food bowl and the leash and the corresponding codes.
Attached below are some of the sketches for animation.
D. Conclusions
The goal of my project is to create a new and creative form of interaction—by taking real-life actions, users can influence and receive feedbacks from a virtual world, and the virtual feedback can encourage more actions to take place. Thus, users will feel like they are actually “raising” a pet.
I think we eventually achieve the stated goal. We expected our users to follow the subtle prompts on the screen and interact with the virtual puppy step by step. Ultimately, both of the users conducted the interactions as we desired, and successfully made the puppy return to his home, full and satisfied.
Attach below is the video.
👇don’t miss it!!!
Looking back to my definition of “interaction” and “how a successful interactive project should be”, I think my final project perfectly embodies and interprets it. I’ll show my reflections as follows.
- Humans interact THROUGH technology, rather than humans interacting WITH technology itself (Edmonds 2011)
—In order to create the feeling of “standing on the lawn in front of a dog house”, and lay emphasis on the experience of interaction, we covered the table with fake grass and other props and hid the motors and wires, trying to weaken the presence of technology and use it as a means of interaction, instead of interaction itself.
- Attracting: the project itself should bear certain artistic values and look creative and appealing.
—By adding animation, using props like artificial lawn and leash, 3D-printing the food bowl, we add a brilliant touch to our project.
- Sustaining: it should have further instructions or guide to motivate users to conduct more moves of interaction.
—As shown in the video, we do have some word prompts, as well as the values of happiness and hunger.
- Relating: it should serves a meaningful purpose to have long-term influence on users.
—I’m not quite sure if our project impress the users, but I do hope they enjoy the process of raising this cute little puppy, and appreciate our idea and this creative form of interaction:)
- Involve artifacts and audiences equally, and set up situations that develop in ways that are determined by the audience.
—We set different events in our project. For example, if the user do nothing and the puppy cannot get its food, it will continue being angry and the value of hunger and happiness will keep dropping; However, if the user feeds a bone to it, it will become happy and cheerful. Therefore, users’ action determines the situations.
To be honest, there indeed exists a few small regrets for our project. For example, the problem of the food bowl as I mentioned above. If we were given more time, we can figure out a better way of how to make the device work smoothly. Besides, before the presentation, the stepping motor became really mad and out of control, making a lot of noise as long as we connect it to the power. So we spent some time adjusting it, which made the whole class wait for a few minute (really sorry for that…:( ). If given more time, we can do more tests before demonstration. In addition, if time permits, we are able to think about more reactions of the puppy besides merely waking up, eating the bone and returning. That will be more fun.
I also want to share what I’ve learnt from this precious experience, from all these ups and downs. When I faced unexpected setbacks, for example, the food bowl does not work as the way we wanted, I’ve learn that flexibility matters and I should switch my mindset to adopt the most efficient way of dealing with problems; When I faced a difficult situation, for example, the animation of puppy walking, I’ve learnt that plenty of patience and attempts are necessary if I want to finish the work well.
Besides the lessons learnt from all these setbacks, I’ve also gained a lot from accomplishments. Compared to the midterm, I am more familiar with coding by the end of the semester. So instead of sticking to basic and time-consuming ways, I tried to challenge myself to find optimized and time-saving methods. With the help of Steve, we simplify the code of Processing by combing four videos into one and using the function “.jump()”. What’s more, I also became more proficient in some other skills, such as using both Processing and Arduino to send and receive values and acquiring some basic Premiere skills. Better still, I’ve learnt that teamwork matters when making a complicated and demanding project. Steve and I have a clear division of labor, but we also show respect to each other’s ideas. When it comes to important decisions within the scope of one’s duty, we never hesitate to ask each other’s opinions, reaching an agreement before we do the work. Overall speaking, it was a pleasure working with him. 🙂
To end my conclusion, I’d like to focus on the importance of my project, both for its value and for myself. Actually, the idea of “raising a virtual pet” has taken root in my mind as early as the group project began. So I’m more than glad to have the chance to eventually realize it in final project (special thanks to Rudi and Steve for giving me so much help and support). From the experience of my final project, I’ve learnt that if your idea is interesting and impressive enough (at least from your own perspective), you will have the motivation and initiative to realize it while enjoying the process. Likewise, the project that impresses you may have the potential to impress your audience as well. Therefore, here comes the questions: what is special about my project that have this potential to impress others? Why should anyone care? Well, from my perspective, the answer can be divided into two parts.
From a technical perspective, we present a creative but challenging way of interaction. Instead of following the old-fashioned method of interacting with a physical puppy, we think outside the box, managing to connect the reality with the virtual world.
From an emotional perspective, we design a small twist, making our project more interesting. Before coming out, the dog snores quite loudly in the house. Then, when the user pulls the leash, it barks fiercely, waking up and showing a scary big shadow. Both of them pave the way for the contradiction when the small, cute puppy walks out. In the presentation, I saw the expressions of the audience turn from shock to surprise, and eventually they relaxed. Judging from their reaction, I know we’ve succeeded in reaching the emotional effects we expected. Actually, in addition to the interesting effect, we also want our project to have a healing impact. I’m aware that many students and teachers come from other countries, far away from their pets at home. If they can somehow relate to the time spent together with their own pets, or just simply feel relieved after a tiring long-day work or study, then I think our project serves its purpose. After all, who can say no to a cute little puppy??
E. Annex
The code of Processing:
import processing.serial.*; import osteele.processing.SerialRecord.*; import processing.video.*; Serial serialPort; SerialRecord serialRecord; Movie video; PFont cute; int state = 0, bone_state, pull_state; boolean runChecker1 = false; boolean runChecker2 = false; void movieEvent(Movie m) { m.read(); } void setup() { cute = createFont("BalonkuRegular-la1w.otf", 128); frameRate(25); imageMode(CENTER); background(0); fullScreen(); //size(1920, 1080); textFont(cute); String serialPortName = SerialUtils.findArduinoPort(); serialPort = new Serial(this, serialPortName, 9600); serialRecord = new SerialRecord(this, serialPort, 2); serialRecord.logToCanvas(true); video = new Movie(this, "video.mp4"); video.loop(); } void draw() { println(video.time()); serialRecord.read(); int pull_state = serialRecord.values[0]; int bone_state = serialRecord.values[1]; if (pull_state==1) { state = 1; } if (bone_state==1 && state==1) { state = 2; } // sleep by default if (state==0) { if (video.time() > 3) { video.jump(0); } image(video, width/2, height/2); tint(255, 50); if (video.time() % 3 <1) { sleep(); } } // // pull leash enter anger angry and come out else if (state==1) { image(video, width/2, height/2); if (runChecker1==false) { video.jump(3.2); runChecker1 = true; } if (video.time() > 20.8) { feed(); video.jump(19); } if (video.time() >19) { tint(255, 99); feed(); } } //go for bone and return else if (state==2) { image(video, width/2, height/2); if (runChecker2==false) { video.jump(21); runChecker2 = true; } if (video.time() > 38) { runChecker1 = false; runChecker2 = false; delay(5000); video.jump(0); state = 0; } } } void feed() { textSize(80); text("Puppy's not happy,", 0.58*width, 0.53*height); textSize(65); text("Why not", 0.58*width, 0.63*height); text("him something?", 0.68*width, 0.72*height); textSize(135); text("feed", 0.76*width, 0.64*height); } void sleep() { textSize(80); text("Puppy's sleeping,", 0.62*width, 0.3*height); textSize(180); text("PLZ!!!", 0.62*width, 0.48*height); textSize(80); text("don't pull the leash,", 0.55*width, 0.59*height); text("it'll disturb him!", 0.55*width, 0.67*height); }
The code of Arduino:
#include <Stepper.h> #include "SerialRecord.h" #include <Servo.h> Servo myservo; // for serial record setup SerialRecord reader(1); SerialRecord writer(2); int slide; // from sliding resistance, know how much it goes int bone_state = 0; // to send whether there's bone in the bowl int pull_state = 0; // to send whether the leash is pulled enough bool infra = true; bool runChecker = false; unsigned long time; // for stepper setup const int stepsPerRevolution = 200; // change this to fit the number of steps per revolution // for your motor // initialize the stepper library on pins 8 through 11: Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11); void setup() { Serial.begin(9600); myservo.attach(12); // set the speed at 15 rpm: myStepper.setSpeed(15); } void loop() { // read(); // receive instructions from processing leash(); // control stepper motion boneCheck(); writer[0] = pull_state; writer[1] = bone_state; writer.send(); } // void read() { // if (reader.read()) { // gyrate = reader[0]; // } // } void leash() { // step one revolution in one direction: slide = analogRead(A0); // Serial.println(slide); // Serial.println(runChecker); delay(100); if (slide==1023) { pull_state = 1; // for the stepper motor to pull the leash back a bit // step(); } else { pull_state = 0; } } void step() { // step 1/100 of a revolution: if (runChecker==false) { time = millis(); runChecker = true; } while (millis()-time<=3000) { myStepper.step(stepsPerRevolution / 100); } if (millis()-time>3000) { runChecker = false; } } void boneCheck() { if (infra==true) { infra = digitalRead(3); myservo.write(140); runChecker = false; // Serial.println(infra); } if (infra==false) { if (runChecker==false) { time = millis(); runChecker = true; } if (millis()-time<3000) { myservo.write(180); bone_state = 1; } if (millis()-time>=3000) { myservo.write(140); bone_state = 0; // Serial.println("ueeu"); } if (millis()-time>=4000) { infra = true; } } }
The detailed design of the food bowl:
The 3D-printed bones:
The elements, background and initial sketches for the animation:
The full video of animation:
👇don’t miss it!!!
Reference
Ernest Edmonds. Art, Interaction and Engagement. https://drive.google.com/file/d/1YYyhVTtNTBXQP2dlK8vE_QRJnpmCGvTE/view
Great job sis!
Thank you sis 🙂
Nice work as well.
Good night sis! Merry Xmas!
Why don’t you approve my comment sis?