CONTEXT AND SIGNIFICANCE
As a project that somewhat raised from the ashes of our first project idea of a box where a dragon flies on top, we got the idea from the previous recitation where we used a step motor to create a liner movement mechanism. However, due to the limitation of material and time we had no choice but to came up with something new. With the guidance of Professor Andy we build on the paper model of the dragon and decided to use a set of servos to make the dragon “fly”, the dragon would be hang in midair with strings and the servos will make it move. The usage of servos is also affected by our last Kinetic Wearable project where we used two servos to central the opening and closing of a hallmate. For the interaction with audiences we decided to use a distance sensor, which will change the speed of the dragon’s movement according to the distance of the audience’s hand.
CONCEPTION AND DESIGN
As we aimed to design and create an interactive artwork, thus we focused majorly on two aspects: interaction and aesthetic. With the theme settled on dragon, the interaction relation would be how the audience will change the movement or behavior of the dragon. With this guideline we designed many possible ways of interaction. As stated in our proposal we hope to create an investigative interaction experience, in other words to provide minimum information and use hints to guide the audience to solve the “puzzle”, combining with the dragon culture we planned to use a marble shaped token to activate the dragon and use the distance of the audience to change the speed of movement. However, due to the constraint of time we have no choice but to abandon the marble plan. Also considering that during the presentation the distance of the audience would be unstable and hard for the distance sensor to detect we put the distance sensor to face upwards instead, the audience could move their hand on top of the sensor to interact with the dragon. In case of other possible choices we did think about using light sensor but compare with distance sensor which directedly interacts with the audience light sensor seems a bit less straight forward, and is might confuse the audience due to the lack to connection with the theme of the project. Other considerations such as sound effect with buzzers have to be put aside as we run low on time.
FABRICATION AND PRODUCTION
Our project starts with the designing and prototyping of the servo powered movement mechanism. It is quite difficult due to two problems, how to coordinate all four servos to make the movement realistic and smooth and how to build them into the dragon. For prototyping we decided to install the servos onto cardboards of similar size to the dragon. At first we put all servos on the same side and direction however due to the height of the servo this will cause each cardboard to be higher than the previous one. To solve this issue we but the servos upside-down to each other. At the same time we figured out that the starting angle for all servos will be 90 degrees due to the need for each servo to turn to both directions.
After the completion of the hardware we turn to the programming of the servos, I was doing most part of the programming and I simplified the four servos into two groups, the first and the third is group one, the second and the fourth is group two, each group will tern to the same degrees as they are of the same side as well. I also labeled all four servos so we would not make any mistake when we remove them to the dragon. For the entire program the logic and structure is quite simple, the dragon have to mode of movement which will be decided by the input from the distance sensor.
I named the two modes as “龙” (Long) and slow. But the difficulty lies in the programming of these modes. To make the movement natural and smooth I experimented with many degrees and intervals. Because it is hard to directly control the speed that servos move, so I could only change the interval between the servos to change the speed of the entire dragon’s movement. At the same time to make sure the distance sensor would not be affected by the intervals I used “millis” instead of “delay”.
But we made one mistake of putting the renew start time code outside of the last movement, which caused the start time to constantly renewing itself and thus the dragon would never move. Luckily with the help from Professor Rudi we realized the problem and our “dragon” came to life.
After removing all the servos onto the dragon we faced some problem due to the dragon model itself, the model’s design restricted the movement and friction between each parts made it hard for the servos to turn. To solve this we simply cut the connecting edge of each parts to give it more space to move.
Finally we reached the step to put everything together and finish the major structure. All the wires and electronics are well hidden behind the background board making the project looks clean and tidy. To create an immersive environment for the dragon, we decided to create a background. Because that the roof on top of the dragon would make it seems darker so Phuong Anh decorated the background as the night sky.
To add more depth to the dragon’s flying we decorated the base with some white fabric as clouds and added three LEDs in them to create a interesting light affect. At that time we have no idea this would lead to a lot of trouble.
After programming the LEDs to do the breathing affect I tried to fit its codes into the dragon’s codes and due to the concern of the “delay” inside the LED’s program I deleted the “delay” code. However, this stopped everything from working, the dragon and the LEDs would just vibrate and flash violently.
So in the end we adapted a “silly” solution, by adding a second Arduino just to control the LEDs. And that’s the best we could do in time.
CONCLUSIONS
Our goal in creating an interactive artwork with the theme of the year of the dragon is firmly followed throughout our project, the final result achieved the fundamental ability in interaction with the audience while maintaining a good aesthetic. However, it didn’t achieved the ideal level, the interaction is too simple, too direct and lack of possibilities. The lack of depth and multilayered interaction is a big regret for the project due the short amount of time we had to start over, which is a great lesson to both of us, I think is taught us to better schedule our time, always have a plan B as back up and never give up! In the presentation we did observe that the Audience had a difficult time understanding the relationship between the distance sensor and the dragon’s movement, which we could made it more obvious by covering the distance sensor with some guiding decorations that could draw a connection between the two. I see huge potential and room for improvement of our project, both the aesthetic and the interaction aspects, as mentioned above. “Never give up!” would be our biggest takeaway from this project.
DISASSEMBLY
APPENDIX
Here is our code:
#define Trig 2 #define Echo 3 long startTime = 0; float cm; float temp; int intal = 150; int i; #include Servo myservo1; Servo myservo2; Servo myservo3; Servo myservo4; void setup() { Serial.begin(115200); myservo1.attach(8); myservo2.attach(7); myservo3.attach(10); myservo4.attach(11); pinMode(Trig, OUTPUT); pinMode(Echo, INPUT); pinMode(5, OUTPUT); digitalWrite(5, 0); pinMode(9, OUTPUT); digitalWrite(9, 0); pinMode(6, OUTPUT); digitalWrite(6, 0); } void loop() { digitalWrite(Trig, LOW); delayMicroseconds(2); digitalWrite(Trig, HIGH); delayMicroseconds(10); digitalWrite(Trig, LOW); temp = float(pulseIn(Echo, HIGH)); cm = (temp * 17) / 1000; Serial.print("Distance = "); Serial.print(cm); Serial.println("cm"); if (cm <= 20) { Long(); } else if (cm >= 20 && cm <= 60) { slow(); } } void Long() { intal = 150; if (millis() - startTime < 1 * intal) { myservo1.write(125); } if (millis() - startTime > 1 * intal && millis() - startTime < 2 * intal) { myservo2.write(55); } if (millis() - startTime > 2 * intal && millis() - startTime < 3 * intal) { myservo3.write(125); } if (millis() - startTime > 3 * intal && millis() - startTime < 4 * intal) { myservo4.write(55); } if (millis() - startTime > 4 * intal && millis() - startTime < 5 * intal) { myservo1.write(55); } if (millis() - startTime > 5 * intal && millis() - startTime < 6 * intal) { myservo2.write(125); } if (millis() - startTime > 6 * intal && millis() - startTime < 7 * intal) { myservo3.write(55); } if (millis() - startTime > 7 * intal) { myservo4.write(125); startTime = millis(); } } void slow() { intal = constrain(map(cm, 20, 60, 150, 300), 150, 300); if (millis() - startTime < 1 * intal) { myservo1.write(105); } if (millis() - startTime > 1 * intal && millis() - startTime < 2 * intal) { myservo2.write(75); } if (millis() - startTime > 2 * intal && millis() - startTime < 3 * intal) { myservo3.write(105); } if (millis() - startTime > 3 * intal && millis() - startTime < 4 * intal) { myservo4.write(75); } if (millis() - startTime > 4 * intal && millis() - startTime < 5 * intal) { myservo1.write(75); } if (millis() - startTime > 5 * intal && millis() - startTime < 6 * intal) { myservo2.write(105); } if (millis() - startTime > 6 * intal && millis() - startTime < 7 * intal) { myservo3.write(75); } if (millis() - startTime > 7 * intal) { myservo4.write(105); startTime = millis(); } }
Here are some records of our effort on the first project idea. Even though it failed, I think it is a great experience and rememberable effort.