"Secret Garden" ——Cynthia & Alice ——Andy
CONTEXT AND SIGNIFICANCE
When we talk about the interaction between people and devices, I think it is the whole process in which people react according to the hints that exist on the device, and the machine recognizes this trigger and gives interesting feedback so that people feel some emotions and then continue to explore more.
In order to complete the effect of opening and closing the flowers, we searched on the Internet and found a mechanical structure. It is a small handiwork, using push and pull to realize the effect. However, since we are building a small garden, it's obviously not feasible to push and pull by hand, and the connection between "push and pull" and"open and close" is very weak. So we used the servo and a wire to simulate the push and pull of the human hand and the ultrasonic sensor covered by a cotton "cloud" to detect when people came close to it, which made the interaction between people and the device easier to understand and more attractive.
In the previous group project, we used the shape of a telephone to evoke a more nostalgic way of communicating, which triggered me to rethink nostalgia. Therefore, our target group is everyone who has childhood memories. And our work aims to awaken this sense of nostalgia, to make people enjoy the happiness of childhood while feeling the sentimentality of the passage of time and the irretrievable past.
CONCEPTION AND DESIGN
Our design went through an interesting journey:) We made changes while constructing it and finally finished with such an outcome. At first, we wanted to make a playable piano, but it was a bit monotonous and boring. On this basis, we thought of making a flower piano, but we could not fully realize it due to technical limitations. Eventually, we focused on creating an interactive garden based on previous flowers. And you can see that in the final version, the "piano" effect of the big flower is retained(a random note is emitted to generate a piece of "music."
The inspiration for the "Secret Garden" is my personal preference. Recently, I enjoyed the elements related to "Dreamcore". As I said in the presentation, this garden is a garden in dreams and memories. We chose to make flowers larger than the swing to realize the "distortion effect in dreams." We also decided not to color the flowers but to leave them white to create a dreamy, innocent feeling. There is a child's laughter when the swing moves, with no one on the swing, blurring the boundary between the real world and the memory world, showing the theme of "you can go back, but there is no one there."
We used wood, grass, and other materials to add the sense of nature, but as you can see there are some parts are very real(such as the bushes and the moss on the swing), and some parts are more abstract and symbolic(such as flowers with distorted size, petals with obvious geometric edges). We intend to put the interactor into a strange situation: it is neither a complete dream nor a complete reality. The interactor may feel "wrong," thus leading to the feeling of being "excluded" by both dream and reality. Rather than "immersive", we prefer to let the interactor feel this "strangeness" so that he can wander on the boundary of dream and reality.
As for the name"Secret Garden," on the one hand, it can be interpreted as a garden full of secrets waiting for you to explore. On the other hand, the "Secret Garden" is a coloring book that almost all my peers played with in their childhood. At that time, coloring blank flowers became a rare way for children like me who couldn't sit still to calm down and focus. This is another reason to leave the flowers blank. We want to create a garden like this, hoping that you can calm your mind with soothing music, bringing you to the garden in your memories or dreams, and to your childhood when you had a curiosity to explore everything.
Draft
FABRICATION AND PRODUCTION
The most significant steps are the construction of the flower and the swing. As for the flower, we had a hard time fixing the structure and testing the angle to make it open and close to the greatest extent. Undoubtedly, it was harder than simply using the hand to push and pull. Due to the limitation of the material, we couldn't use too hard paper so that the flower could open, which meanwhile made the flower a little fragile, and we spent a long time repairing the structure and holding the flower firmly to resist the force of the servo's rotation. As for the swing, we learned how to use the mp3 player and the related new code, and the numerical testing of the accelerometer was a little difficult, so it took us a whole evening to build the circuit, write the code, and make it work. What a sense of achievement!
My teammate and I don't have a clear division of the work, and we do almost everything together. Maybe I did more of the actual work and the"first" one(draft, prototype, code, decoration, etc.), while my teammate finished the second one and went to the teacher to ask for questions and details.
During the user testing session, though we received many good comments, Andy pointed out that our interaction form was too simple and not engaging enough, and we need to make this garden more discoverable. Thus, we added an interactive swing and a bunny jumping out of bushes. Moreover, we found that our tester didn't know the ultrasonic sensor wrongly interacted with the flower and seemed a little confused, and Angy said the sensors were too obvious. So we added some cotton to represent clouds while hiding the sensors and making them more direct and attractive. To be honest, I realized these three parts are too separated and not good enough. So in the next project, I will try to make different parts combine better as a whole.
Flower mechanism: https://www.xiaohongshu.com/explore/63e8ae31000000000703ae0c?app_platform=ios&app_version=8.42&share_from_user_hidden=true&xsec_source=app_share&type=video&xsec_token=CBZCuAlbpDkKFmKkQzkHbP7JHLcAM303RqV6j_h9H9plU=&author_share=1&xhsshare=WeixinSession&shareRedId=ODZIMTQ9OU42NzUyOTgwNjY0OTdGSzo8&apptime=1728628089&share_id=6991bad1309c4d948a9697647f6b70a5&wechatWid=3c9d90d29ccba8c97cdd199680e79217&wechatOrigin=menu
User testing...
3x Breadboard
2x Arduino Uno
1x USB Cable
2x 10 kOhm Resistors
1x 1kOhm Resistor
1x buzzer
A handful of M/M jumper cables
1x Hot glue gun
1x Paper tape
1x Scissors
1x Wire cutter
1x Box
Cardboard
1x Accelerometers
1x DFPlayer Mini Mp3 Player
1x Micro SD card
2x Speakers
#include <Servo.h>
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
// Pins for the ultrasonic sensor
const int trigPin = 9;
const int echoPin = 10;
// Servo and buzzer pins
Servo myServo;
const int servoPin = 3;
const int buzzerPin = 8;
// Tone frequencies (in Hz)
int toneDo = 261;
int toneRe = 293;
int toneMi = 329;
int toneFa = 349;
int toneSo = 392;
int toneLa = 440;
int toneTi = 493;
int tones[] = {toneDo, toneRe, toneMi, toneFa, toneSo, toneLa, toneTi};
int lastTone = -1;
// DFPlayer Mini related
int xValue;
SoftwareSerial mySoftwareSerial(6, 11); // RX, TX for DFPlayer Mini
DFRobotDFPlayerMini myDFPlayer;
int currentTrack = 0; // To record the currently playing track
bool playMusic1 = false; // To indicate whether to play music 1
void setup() {
// DFPlayer Mini initialization
Serial.begin(9600);
mySoftwareSerial.begin(9600);
if (!myDFPlayer.begin(mySoftwareSerial, false, false)) {
Serial.println("DFPlayer Mini initialization failed!");
}
myDFPlayer.volume(20); // Set volume
Serial.println("DFPlayer Mini initialized successfully!");
// Ultrasonic sensor and servo initialization
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(buzzerPin, OUTPUT);
myServo.attach(servoPin);
myServo.write(0); // Initial position set to 0 degrees
randomSeed(analogRead(0)); // Initialize random seed
}
void loop() {
// 1. Process ultrasonic sensor and servo control
long duration, distance;
// Send ultrasonic signal
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Read echo signal and calculate distance
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2; // Convert time to centimeters
// Print distance information
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// If the distance is less than 15 cm, rotate the servo to 180 degrees and play a random tone
if (distance < 15) {
myServo.write(180); // Rotate servo to 180 degrees
// Select a random tone, ensuring it is different from the last tone
int randomTone;
do {
randomTone = tones[random(0, 7)]; // Select a frequency randomly from the tone array
} while (randomTone == lastTone); // Ensure the same tone is not repeated
lastTone = randomTone; // Update the last played tone
tone(buzzerPin, randomTone); // Play the random tone
delay(500); // Tone duration 500 ms
noTone(buzzerPin); // Stop buzzer sound
delay(100);
} else {
myServo.write(0); // If distance is greater than 15 cm, return servo to initial position
}
// 2. Process analog input and DFPlayer music playback
xValue = analogRead(A0);
Serial.print("x = ");
Serial.println(xValue);
if (xValue > 230) {
// If xValue is greater than 235, continuously play music track 2
if (currentTrack != 2) {
myDFPlayer.loop(2); // Loop music track 2
currentTrack = 2; // Record the current music track
}
} else {
// If xValue is less than or equal to 235, play music track 1 for 4 seconds
if (currentTrack != 1 && !playMusic1) {
myDFPlayer.play(1); // Play music track 1
currentTrack = 1; // Record the current music track
playMusic1 = true; // Indicate that music 1 needs to be played
delay(4000); // Play music 1 for 4 seconds
}
// Automatically switch to music track 2 after playing music 1
if (playMusic1) {
myDFPlayer.loop(2); // Play music track 2
currentTrack = 2; // Switch to music track 2
playMusic1 = false; // Reset flag
}
}
delay(100); // Delay of 100 ms to avoid overly frequent loops
}
Example 1: mp3 player
#include "DFRobotDFPlayerMini.h"
#include <SoftwareSerial.h>
SoftwareSerial softSerial(10, 11); //rx, tx
DFRobotDFPlayerMini myDFPlayer;
void setup() {
Serial.begin(115200);
softSerial.begin(9600);
if (!myDFPlayer.begin(softSerial, /*isACK = */ false, /*doReset = */ false)) { //Use serial to communicate with mp3.
Serial.println("Error starting DFplayer");
}
myDFPlayer.volume(2); //Set volume value. From 0 to 30
myDFPlayer.play(1); //Play the first mp3
}
void loop() {
static unsigned long timer = millis();
if (millis() - timer > 10000) { //switching to next song every 10 seconds
timer = millis();
myDFPlayer.next();
}
}
Example 2: accelerometer
//initialize x,y,z values
int xValue;
int yValue;
int zValue;
void setup() {
Serial.begin(9600);
}
void loop() {
//analogRead the 3 axes
xValue = analogRead(A0);
yValue = analogRead(A1);
zValue = analogRead(A2);
//results
Serial.print("x,y,z = ");
Serial.print(xValue);
Serial.print(", ");
Serial.print(yValue);
Serial.print(", ");
Serial.print(zValue);
Serial.println();
//small delay for stability
delay(10);
}
CONCLUSIONS
Again, our goal is to make experiencers go back to a discoverable, dream-like garden feeling like deja vu and raise their emotions. Experiencers can explore the garden and get different feedback from different items, which is very interactive, and we are glad to see some experiencers create other ways to interact with our artifact effectively, which is beyond our expectations and quite interesting. However, I do think the hints are not strong enough for experiencers to interact with, which could lead to confusion. And the parts are too separated as a whole.
If we have more time, I will definitely try to add more holistic interactive effects, such as an action that can trigger a series of reactions(e.g., blowing air to simulate the wind blowing through the whole garden). Moreover, we will try to revise our hints, making them more direct while still open for individual exploration.
I learned from this project that to make a successful interactive artifact, we should first come up with the form of interaction itself, then add more decorated parts, which can reduce the possibility of creating separated and meaningless, confused items.
DISASSEMBLY