Conception & Design
My project is a device that helps users to look at the world from different scales. The users could see the micro/real/macro world through a pair of wearable wings. The users could go upward and downward according to the frequency of the flapping wings.
In my previous essay, I wrote about the link between “common sense in the physical world” and “interactivity”, which means a high degree of interactivity could be brought by the user’s understanding of the world. Additionally, I personally like projects that are in big sizes or wearable, so people can have more fun when interacting with them.
In this case, when I came up with this basic concept, I imagined myself as the user who is wearing the wings. I tried to think what kind of action I would take based on my common sense of a pair of wings. I realized I would flap it (as it is the only thing I could do with the wings), and then flap it faster/slower, or even stop flapping it to see what would happen. So I decided to make a pair of wings connected to a laptop that show different images according to the “flapping” action of the users.
During the user testing session, many users were attracted by the appearance of my project, because it is a big project and it is wearable. People like the idea that they would fall when they stop flapping their wings.
Besides, they gave me some suggestions:
- I could add some feedback or instructions to show why the users should flap the wings. (e.g. Adding some signs when they fly to the top “You made it!”)
- Instead of showing images on the screen of a laptop, I could consider using a projector to make it more immersive.
Initially, I did not think of making a game, I regard my project as a visual art device or a scientific device in a science museum, so I did not adopt the first suggestion. But I added a progress bar on the screen to show the user the flying process. But I borrowed a projector from ER, and a big screen did make my project more immersive.
Fabrication & Production
My project is consist of 2 fundamental parts: the image and the wings.
-THE IMAGES-
I wanted to make a new image for my project. After communicating with my instructor, I tried to make the images using video (Zooming pictures is too complex and the effect is not as good as video). To make the particular world, I learned the basic process of After Effect. For the real world and the universe part, I downloaded the authorized videos online.
With previous experience in making videos online, I clipped the video with Final Cut Pro.
I made the video extremely long so that I could adjust the movie speed in processing.
-THE WINGS-
- SENSOR
First, being inspired by recitation, I planned to use a tilt sensor. However, the tilt sensor is not precise enough, and to show the frequency of users’ flaps, I had to do some crazy maths with it. Then Rudy suggested I use an analog 3-axis accelerometer instead.
Using an accelerometer is another challenge. The value is affected by gravity, and there are 3 axes, which means simply using the value from one axis would make the project really unprecise. My instructor suggested I use the sum of the 3-axis, and this advice inspired me a lot. Acceleration is a vector, so I should use vector addition to calculate the acceleration of the flapping wings. And then, by timing the value with 100, the Arduino could send the integer to processing.
However, here comes another problem. Arduino is detecting acceleration randomly. This results in the user flapping their wings, but the video plays backward.
With only receiving a maximum of 10 values received by Arduino, the problem is solved.
2. FABRICATION
(My first sketch)
After learning how to laser cut, I decided to laser cut wooden boards for my wings as they are solid and shapable.
And I used wool and hot glue to make the fur.
Conclusion
I guess my project could have two uses:
- It could be placed in a science museum for kids to understand the world from a diver point of view.
- It could be a simple immersive visual art device if I could use multidimensional screen sets.
My project is not simply a process of the user taking an action, and the device response for once. My users change their speed of flapping wings as they want, and they could do experiments to see what happened. They could see different images shown on the screen according to their different movements. I believe this makes the interactivity interactive.
From this whole process of research, I learned that a good project should have fewer instructions, so it is important for users to take action based on their common sense. To make this happen, there is one effective way, which is the designer should imagine themselves as the users when they come up with new ideas and concepts so that they would know what is the easiest way for users to understand the concept.
If I have time, what I probably would do is make the video move according to the angle of the wings. This could be updated into a flight simulator. However, I am not sure if this is good as my main purpose is to show the different scales (heights) of the world, but not a game. And it seems unnecessary to change the flying direction in the micro/macro world.
The second thing is I would learn more about after effect, so I probably could make the video looks better.
ANNEX
Arduino Code:
/* SendSingleValue This sketch repeatedly sends a record that contains a single value. The value is the value of `millis()`, modulo 32768. This sketch pairs well with the ReceiveSingleValue example from the Processing SerialRecord library <https://osteele.github.io/Processing_SerialRecord/>. You can also use the Serial Monitor to inspect the values that the sketch sends to the serial port. Things to try: - Connect a potentiometer to the Arduino, and send its value instead. by Oliver Steele, 2020-2022 This example code is in the public domain. */ #include "SerialRecord.h" #include "ADXL335.h" ADXL335 accelerometer; SerialRecord writer(2); void setup() { Serial.begin(9600); //Serial.println("asd"); accelerometer.begin(); // always initialize the sensor first } int count = 0; float sum = 0; float maxVal = 0.0; float prevz = 0.01; void loop() { float x; float y; float z; int prevA = 2; int a = 2; accelerometer.getAcceleration(&x, &y, &z); // pointers to float if (z * prevz < 0){ a = 1; } else { a = 2; } if (prevA == 2 && a == 1){ writer[1]= 1; } else{ writer[1]=2; } float cur = sqrt(x*x + y*y + z*z); if (cur > maxVal) { maxVal = cur; } sum = sum + cur; count++; if (count == 150){ // this only works when the we do this every 100 samples writer[0] = maxVal * 100; writer.send(); sum = 0; count = 0; maxVal = 0; } // This delay slows down the loop, so that it runs less frequently. This // prevents it from sending data faster than a Processing sketch that runs at // 60 frames per second will process it. It also makes it easier to debug the // sketch, because values are received at a slower rate. //delay(10); }
Processing Code:
import processing.serial.*; import osteele.processing.SerialRecord.*; import processing.video.*; Movie myMovie; Serial serialPort; SerialRecord serialRecord; import processing.sound.*; SoundFile sample; float a = 0.01; int prevPlay = 1; float speed = 0; void setup() { background(0); fullScreen(); myMovie = new Movie(this, "fp6.m4v"); sample = new SoundFile(this, "Flapping2.0.wav"); myMovie.play(); myMovie.jump(500); // the movie starts from falling from buildings myMovie.pause(); String serialPortName = SerialUtils.findArduinoPort(); serialPort = new Serial(this, serialPortName, 9600); serialRecord = new SerialRecord(this, serialPort, 2); } void movieEvent(Movie movie) { myMovie.read(); } void draw() { background(255, 0, 0); serialRecord.read(); int val = serialRecord.values[0]; // acceloration of flapping wings int play = serialRecord.values[1]; // whether the wing is flapped if (val < 115 ) { // if users stop flapping float pos1 = myMovie.time(); if (pos1 > 3) { a+=0.05; pos1 -= a; myMovie.play(); myMovie.jump(pos1); myMovie.pause(); speed = -a; } if (pos1 > 1109) { myMovie.play(); myMovie.jump(1105); myMovie.pause(); speed = 0; } } else { // the faster the user flaps, the faster the video is played a = 0.01; float pos2 = myMovie.time(); float pos3 = map(val-110, 0, 230, 0.1, 3.5); if (pos2 < 1109) { pos2 += pos3; myMovie.play(); myMovie.jump(pos2); myMovie.pause(); speed = pos3 ; } if (pos2 < 3) { myMovie.play(); myMovie.jump(5); myMovie.pause(); speed = 0; } } image(myMovie, 0, 0, width, height); textSize(60); // the value of val text("Your Speed:", width- 500, height -100); textSize(100); text(speed*10, width-200, height-100); textSize(50); textAlign(CENTER); text("Press key to reset", width/2, 70); if (prevPlay == 1 && play == 2) { // once the wings is flapped sample.play(); } prevPlay = play; } void keyPressed() { myMovie.play(); myMovie.jump(500); myMovie.pause(); a=0.01; }