Analogy Clippy

by Cassie Kwok in Circuits > Arduino

229 Views, 1 Favorites, 0 Comments

Analogy Clippy

FullSizeRender 2.JPG
arc 385 a2 video

Project by: Cassie Kwok, Patricia Kuang

This is an interactive smart memo system that attaches to a book holder. It can be used in different ways depending on your needs, functioning both as a to-do list for a notebook and as a study reminder for textbooks or other reading materials.

The machine aims to prevent avoidance and encourage focus by physically interacting with the user. Instead of remaining a passive note, the memo actively responds to your behavior, making it harder to ignore your tasks.

As you flip through pages, the memo follows, ensuring your reminder stays visible at all times. If you attempt to remove the memo or close the book to avoid studying, the system detects the change and triggers a warning, creating an active and responsive study device that reinforces focus and task awareness.

At the same time, the project explores the idea of a “useless machine” that appears to be useful. Its constant presence can become annoying or unhelpful, covering parts of the page and making it difficult to step away once you begin. The machine’s responsiveness may create irritation or mild anxiety, subtly disrupting the focus it is meant to support. Yet, ironically, this same behavior still ensures that you remember what you wrote on the memo.

Supplies

Screenshot 2026-03-03 053223.png

Assembly Materials :

  1. Arduino
  2. Ultrasonic Distance Sensor x 1
  3. Photoresistors x 2
  4. 10kΩ Resistors x2
  5. Servo Motor x 1
  6. Buzzer x1
  7. Breadboard
  8. Jumper wires
  9. Plywood for building the book holder

Concept

IMG_9282.jpg
ezgif.com-video-to-gif-converter.gif

Our concept is inspired by a whiteboard eraser designed to clean everything. We aim to exaggerate the machine's original function to the point where it becomes self-destructive. The project presents an interactive machine that appears useful at first glance, but reveals itself to be inconvenient and unfriendly in actual use.

We give the machine a sense of life, allowing it to respond to users’ actions while misunderstanding their intentions, overreacting, and generating annoyance mixed with humour.


Mechanism

IMG_9202-ezgif.com-video-to-gif-converter.gif
IMG_9200-ezgif.com-video-to-gif-converter.gif

1. How does the memo know when to move with the page and not flip back too early?


When flipping a page, the user’s hand naturally moves from the left corner to the right corner. This movement creates a predictable range of motion. We define a specific detection zone at the page corner so the system only responds during intentional flipping.

When the hand leaves the detection range toward the right corner during the flip, the memo arm returns to its original position, creating a seamless memo flip that follows the page flipping. The logic is similar to an automatic door that stays open only while someone is within range.


  1. Input: Distance from ultrasonic sensor to user’s hand
  2. Output: Servo motor moves memo arm from 0° → 90°
  3. Condition: Hand detected within 20–25 cm (approximate book corner range)


2. How does the system detect when the memo is removed?


When the memo is lifted, more light reaches the surface beneath it. A photocell under the memo detects this brightness increase.


  1. Input: Brightness under memo, detected by a photocell
  2. Output:
  3. Servo arm moves 0° → 60° (repeat 3 times)
  4. Buzzer beeps
  5. Condition: Brightness level becomes higher than the dark threshold


3. How does it prevent the user from simply leaving?


If the book is removed, the brightness beneath the book increases. A photocell under the book detects this brightness increase.


  1. Input: Brightness under the book, detected by a photocell
  2. Output: Buzzer beeps
  3. Condition: Brightness exceeds the dark threshold

Debugging

IMG_9224-ezgif.com-video-to-gif-converter (1).gif
IMG_9226-ezgif.com-video-to-gif-converter.gif

Problem 1

Page flipping slightly increases brightness under the memo, falsely triggering memo removal detection.


Solution:

By adding another condition, the memo removal detection can only activate 2 seconds after a page flip is triggered.


Problem 2

Page flipping is too sensitive. Just slightly passing through the detection range triggers the servo.


Solution:

  1. Narrow the distance detection range
  2. Require the hand to remain within range for at least 0.5 seconds before triggering




Final Trigger Conditions

Page Flip

  1. Input: Ultrasonic distance
  2. Output: Memo arm 0° → 90°
  3. Condition:
  4. Hand within 19–25 cm
  5. Duration longer than 0.5 seconds


Memo Removal

  1. Input: Brightness under memo
  2. Output:
  3. Servo 0° → 60° (repeat 3 times)
  4. Buzzer beep
  5. Condition:
  6. Brightness exceeds dark threshold
  7. Occurs more than 2 seconds after the page flip trigger


Book Removal

  1. Input: Brightness under the book
  2. Output: Buzzer beep
  3. Condition: Brightness exceeds dark threshold


#include <Servo.h>
#define NOTE_A4 440

const int motorPin = 11;
const int trigPin = 10;
const int echoPin = 9;
const int lightPinBack = A2; // Photocell behind memo
const int lightPinBelow = A5; // Photocell below book
const int buzzerPin = 2;

Servo myMemoArm;

// change depends on env
int lightThresholdBack = 750; // memo want dark
int lightThresholdBelow = 600;// book want dark

float distance;
unsigned long lastFlipTime = 0; //cool down: prevent triggering memo removal

unsigned long minFlipTime = 0; //minimum flip time: prevent triggering from other hand movement

float readDistanceCM() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);


unsigned long t = pulseIn(echoPin, HIGH, 30000);
if (t == 0) return -1;
return t * 0.0343f / 2.0f; //distance = time × speed of sound


}

void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(lightPinBack, INPUT);
pinMode(lightPinBelow, INPUT);
pinMode(buzzerPin, OUTPUT);
myMemoArm.attach(motorPin);
myMemoArm.write(0);
}

void loop() {
distance = readDistanceCM();
int lightValueBack = analogRead(lightPinBack);
int lightValueBelow = analogRead(lightPinBelow);

Serial.print("Distance: ");
Serial.print(distance);
Serial.print(" cm | Memo Back: ");
Serial.print(lightValueBack);
Serial.print(" | Below Book: ");
Serial.println(lightValueBelow);
// ------ Book removal
// condition: photocell at the back of the book detect higher light
if (lightValueBelow > lightThresholdBelow) {
Serial.println("Detect Book Removal");
myMemoArm.write(0);
tone(buzzerPin, 440, 300);
delay(250);
noTone(buzzerPin);
}

// ------ Page flip
// condition: stay in distance range (20-25cm) for more than 1000ms
else if (distance > 20 && distance < 25) {
if (minFlipTime == 0) {
minFlipTime = millis(); // start counting only once when entering range
}

if (millis() - minFlipTime > 500) {
Serial.println("Detect Page Flip, Memo Flip");
myMemoArm.write(90);
delay(800); // cool down
lastFlipTime = millis(); // prevent triggering memo removal
minFlipTime = 0; // reset so it won't retrigger Page Flip immediately
}
}


// ------ Memo removal
//condition: photocell at the back of the memo detect higher light
else if ( millis() - lastFlipTime > 2000 && lightValueBack > lightThresholdBack) {
Serial.println("Detect Memo Removel");
delay(1000);

for (int i = 0; i < 3; i++) {
myMemoArm.write(60);
delay(100);
myMemoArm.write(0);
delay(100);
tone(buzzerPin, 880, 100);
delay(200);
}
noTone(buzzerPin);
}

// ------ Idle behavior
else {
myMemoArm.write(0);
}

delay(100);
}

Downloads

Book Holder Fabrication

FullSizeRender.JPG
FullSizeRender 3.JPG

The holder integrates and hides all electronic components while maintaining usability.

  1. Slightly tilted surface for comfortable reading and writing
  2. Hole for memo arm extension
  3. Hole for the photocell under the book
  4. Opening for the ultrasonic sensor
  5. Hollowed back panel for efficient wiring and material reduction


Conclusion & Next Steps

Screenshot 2026-03-03 090622.png

We learned that even when the code works, it requires constant adjustment to better fit user experience and real-world conditions. Physical testing, instead of simulation in Tinkercad, revealed problems we had not fully considered, allowing us to refine and improve the design.

Next Steps:

  1. Use a camera to detect more accurate hand movements and page flips, reducing misread gestures.
  2. Add more features to make the machine more lively and interactive.