The Fisherman
Gwangun Kim
Rodolfo Cossovich
Context and Significance
In my definition, “interaction” is “traveling”. Just like a journey where one can experience and move towards their desired destination, I hoped that interaction would be the same.
The activity of creating a kinetic wearable using sensors and micro servo motors had a profound impact on me. I wanted interaction to be not just simply pressing a button to light on LEDs, but to let users take their own actions within a given environment. For instance, Wolverine does not press a button to make his claws come out, but gives a certain amount of force to make it move!
Additionally, while creating objects for playing whack-a-mole and hide-and-seek, I found it fascinating to see the interaction between the user and objects that felt alive.
Considering these aspects, we decided to create a fishing game in which a user can catch the “moving fish” under the sea, using a magnetic fishing rod, similar to the toy we used to play with in childhood. Since the targeted users were not young kids just feeling interested in the act of fishing itself, we wanted our project to convey some social or environmental message so that the users could notice and learn something while playing the game. As we wanted to raise the issue of “the negative impact of human beings on the marine ecosystem”, we thought about “overfishing”. Firstly, we decided to catch the fish by putting magnets on both the fish and the rod. Then, we decided to put sensors on each fish to indicate how many fish were caught by humans, so that we could connect it to the overfishing problem.
Conception and Design
Fish: We thought that the user would naturally engage in fishing if we created a fishing rod and an environment where some fish move under the sea, just like the fishing toy. If the number of catching fish increased, our device would detect the increase, and when the user caught more than five fish, everything would stop. Then there would pop up a sudden message saying, “Please stop fishing for the sake of the ecosystem.”
Thus, we needed sensors indicating whether the fish were caught or not. Also, there should be red lights indicating “overfishing”. For the location of the fish, we decided to put them under the cardboard sea by making holes in it. Additionally, we planned to put micro servos under the fish to simulate the fish’s movement.
Fishing Rod: To catch the fish, we needed magnets on the fishing rod like the toy, and we also needed another sensor for the computer to recognize whether the fish were caught on the fishing rod. In this process, we experimented with a magnetic reed switch, which could detect the presence of magnets, and an ultrasonic sensor, which could calculate the distance between the fish and the rod. The reed switch successfully detected when a fish with magnet approached the rod, but the ultrasonic sensor faced interference from the surrounding environment and was too sensitive for calculating the approaching distance of the fish. Eventually, we decided to use the reed switch for our project.
Fabrication and Production
To make a fishing rod, I referred to a YouTube video to create a lever-operated fishing rod, attaching a reed switch at the end.
Adding a sensor and LED to each fish required too many Arduino pins and wires to indicate when the fish got caught. The most important thing was that these wires hindered the fish’s free movement. Therefore, I created a device which gives feedback to the user that “A fish is caught” by putting a buzzer and green LED next to the cardboard sea.
Cassie implemented a cardboard mechanism that allowed the fish to move up and down according to the waves, referring to another YouTube video.
Cassie also implemented the red LED lights on the cardboard sea to indicate the end of the game and overfishing.
Finally, the initial process we created was as follows:
1. The user brings the fishing rod close to the fish. (Reed switch is attached to the reed switch)
2. The fish sticks to the magnet of the rod.
3. The user pulls the fish up using the lever and triggers the reed switch.
4. Each time the reed switch is triggered, the fishAmount variable increases by 1.
5. When fishAmount exceeds 2, the game stops(a Stepper motor stops its rotation), and a red LED light turns on.
6. The red LED light indicates overfishing.
Here is the code snippet:
const int REEDPIN = 2; const int LEDPIN = 4; //green light const int LEDPIN1 = 9; //red light const int LEDPIN2 = 10; const int LEDPIN3 = 11; long catchingStartTime; long catchingTimeOn; int fishAmount = 0; bool fishCaught = false; int melody[] = {390, 262}; int LedBuzzerTime = 500; #include int DIR_PIN = 5; int STEP_PIN = 6; int EN_PIN = 7; AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN); void setup() { Serial.begin(9600); pinMode(REEDPIN, INPUT_PULLUP); pinMode(LEDPIN, OUTPUT); pinMode(LEDPIN1, OUTPUT); pinMode(LEDPIN2, OUTPUT); pinMode(LEDPIN3, OUTPUT); pinMode(EN_PIN, OUTPUT); digitalWrite(EN_PIN, LOW); stepper.setMaxSpeed(200); stepper.setSpeed(50); } void loop() { stepper.runSpeed(); int proximity = digitalRead(REEDPIN); Serial.println(proximity); if (proximity == LOW) { catchingStartTime = millis(); catchingTimeOn = 0; fishCaught = false; digitalWrite(LEDPIN,LOW); noTone(3); } if (proximity == HIGH && !fishCaught) { //when fish magnet hits the reed switch for 500~1000 time catchingTimeOn = millis() - catchingStartTime; if (catchingTimeOn > 500 && catchingTimeOn < 1000) { fishAmount = fishAmount + 1; digitalWrite(LEDPIN,HIGH); for (int i = 0; i < 2; i++) { tone(3, melody[i], LedBuzzerTime); delay(LedBuzzerTime); noTone(3); delay(50); } Serial.println(fishAmount); fishCaught = true; } } if (fishCaught && millis() - catchingStartTime >= LedBuzzerTime) { digitalWrite(LEDPIN, LOW); noTone(9); fishCaught = false; } //LED and Buzzer on for 0.5 secs if(fishAmount > 2){ stepper.stop(); digitalWrite(LEDPIN1, HIGH); digitalWrite(LEDPIN2, HIGH); digitalWrite(LEDPIN3, HIGH); delay(1000); digitalWrite(LEDPIN1, LOW); digitalWrite(LEDPIN2, LOW); digitalWrite(LEDPIN3, LOW); delay(1000); } }
All the issues began to arise during “User testing”. Here is a feedback list:
The fishing rod lacked strength at the end, making it only possible to wind the thread but not release it. The feedback device (LED and buzzer) installed next to the cardboard sea was not easily heard due to the noise from the stepper motor. Most importantly, the game suddenly stopped with blinking red lights, and we explained our message “overfishing”. It was an awkward transition. Contrary to our expectations, users found more enjoyment in the simplicity of the game rather than seriousness. In other words, our message was too serious for this fun game.
We started changing everything. We added heavy hooks to the fishing rod to enable winding and releasing the line. We directly attached LEDs and a buzzer to the fishing rod for immediate feedback to the user.
Here is the improved version of the rod:
Most importantly, we modified the game to allow users to become more immersed in the gameplay rather than abruptly stopping the game to deliver a message. We added more diverse marine creatures and included trash as an element that could disrupt the game.
This empty sea changed into…
By starting the game with a button press and allowing a total of 1 minute of gameplay, users could focus more on the game, and occasionally, the trash could interfere, clearly defining its role. (During the presentation, there was actually an inconvenience where trash got caught on the fishing rod, and the user had to manually remove it!)
Here is the video playing our final version of fishing game:
Here is the final version of the code snippet (added time duration of the entire game and the start button):
//variables const int REEDPIN = 2; // reed switch const int LEDPIN = 4; //green light const int LEDPIN1 = 9; //red light const int LEDPIN2 = 10; // red light2 const int LEDPIN3 = 11; // red light 3 //variables for catching fish interaction long catchingStartTime; long catchingTimeOn; int fishAmount = 0; bool fishCaught = false; int melody[] = {390, 262}; int LedBuzzerTime = 500; //variables for stepper motor #include int DIR_PIN = 5; int STEP_PIN = 6; int EN_PIN = 7; AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN); //button and game state const int buttonPin = 12; unsigned long startTime = 0; unsigned long elapsedTime = 0; const unsigned long gameDuration = 60000; bool gameRunning = false; void setup() { Serial.begin(9600); pinMode(REEDPIN, INPUT_PULLUP); pinMode(LEDPIN, OUTPUT); pinMode(LEDPIN1, OUTPUT); pinMode(LEDPIN2, OUTPUT); pinMode(LEDPIN3, OUTPUT); pinMode(buttonPin, INPUT); pinMode(EN_PIN, OUTPUT); digitalWrite(EN_PIN, LOW); stepper.setMaxSpeed(200); //speed of stepper motor stepper.setSpeed(80); } void loop() { if (digitalRead(buttonPin) == LOW && !gameRunning) { //if button pressed, start the game startGame(); } if (gameRunning) { //set the duration of game elapsedTime = millis() - startTime; Serial.println(elapsedTime); if (elapsedTime >= gameDuration) { endGame(); } } } void startGame() { //start the game after button pressed gameRunning = true; startTime = millis(); Serial.println("Game started!"); while (gameRunning){ stepper.runSpeed(); // stepper motor activated int proximity = digitalRead(REEDPIN); //interaction between magent and reed switch if (proximity == LOW) { catchingStartTime = millis(); catchingTimeOn = 0; fishCaught = false; digitalWrite(LEDPIN,LOW); noTone(3); } if (proximity == HIGH && !fishCaught) { //when fish magnet hits the reed switch catchingTimeOn = millis() - catchingStartTime; if (catchingTimeOn > 500 && catchingTimeOn < 1000) { fishAmount = fishAmount + 1; digitalWrite(LEDPIN,HIGH); //green led lights on and buzzer makes sound for (int i = 0; i < 2; i++) { tone(3, melody[i], LedBuzzerTime); delay(LedBuzzerTime); noTone(3); delay(50); } Serial.println(fishAmount); fishCaught = true; } } if (fishCaught && millis() - catchingStartTime >= LedBuzzerTime) { //turning off green led and buzzer digitalWrite(LEDPIN, LOW); noTone(9); fishCaught = false; } if(fishAmount > 2){ Serial.println("You win!"); //fishAmount = 0; stepper.stop(); for (int i = 0; i < 4; i++) { //all red lights on when user wins the game digitalWrite(LEDPIN1, HIGH); digitalWrite(LEDPIN2, HIGH); digitalWrite(LEDPIN3, HIGH); delay(1000); digitalWrite(LEDPIN1, LOW); digitalWrite(LEDPIN2, LOW); digitalWrite(LEDPIN3, LOW); delay(1000); } endGame(); } } } void endGame() { //end the game after setted time stepper.stop(); gameRunning = false; fishAmount = 0; fishCaught = false; Serial.println("Game ended!"); }
Conclusions
Traveling allows us to experience a variety of things and later reminisce and create memories from those experiences. Our interaction aimed to make playing the game enjoyable, like a journey, and to encourage users to think about the environment afterward. In the end, we created a good interaction by adding various marine creatures and introducing trash that could disrupt the game. This provided users with the opportunity to experience different variables. However, some limitations affected the users, such as the fishing rod handle being fixed for right-handed users, the limited vertical movement of the fish, and the only binary ending(win or lose). Despite these limitations, I believe we created an engaging and fresh interaction, a way more improved than the fishing toy.
If we could expand this project further, I would like to add the following features:
1. Create a small pond with real water instead of a cardboard sea.
2. Make robotic fish that float in the water and move in random directions.
3. Introduce the concept of trash affecting the fish’s behavior, such as slowing the fish’s movement or flipping it over to represent its death.
Interactions do not always provide the exact expected values, and I think that is part of the charm. During user testing, no one followed the exact intended process I imagined. People dropped the fish, manually triggered the reed switch by bringing it close to the fish, or even picked up the fish with their hands. The responses were diverse. The sensors also behaved similarly. Sometimes the magnet of some fish wouldn’t trigger the reed switch even when it was close enough, or the stepper motor did not move sometimes. Users were free-spirited, and the sensors were sensitive. I learned that creating a perfectly precise mechanism all at once is challenging, and only continuous “user testing” and “feedback” can help improve the shortcomings.
Furthermore, we were able to learn how to incorporate various tasks into a single artwork by creating the framework of our piece with sensors and circuits, writing code to build the system, adding cardboard and various decorations to give it life, and going through a process of user testing for modification and improvement.
Disassembly
Appendix
After user testing, we decided to introduce a new obstacle called “trash” into our artwork. The problem was how to differentiate between the trash and the fish using a reed switch. We came up with the idea of attaching a different number of magnets to the trash and the fish to distinguish them based on the strength of the magnetic field. However, since the reed switch could only read digital values, we needed a sensor capable of reading analog values to measure the strength of the magnetic field. The sensor that could read the strength of the magnetic field as an analog value was a “hall effect sensor”, but we couldn’t find it at our campus, so we directly purchased it from Taobao.
During testing, we found that the sensor readings varied depending on the number of magnets. However, adding another condition to the fishing rod, which already had a reed switch, would make it more sensitive. It created a problem where the interaction became even less responsive when attached to the fishing rod. Therefore, we decided to give up this sensor.
References
1. Fishing Rod
2. Cardboard Sea Craft
3. Fishes