Front view of the reading pacer device, already clipped on to a book and ready to be used.
This assistive device is designed to help me maintain focus and speed when reading physical books. Engineered to clip onto any book like a portable reading lamp, it utilizes a red line laser that sweeps vertically down pages and acts as a guide for the eyes. Users can customize the sweep speed with the potentiometer based on content difficulty etc.
Overall photo of device in scale (repeat of top-page image). The width of the book is 15.24 cm.
Detail 1: Close-up of the device’s control board, showing clean soldering and a deliberate layout.
Shows the device powered and being used
Detail 2: The two clear acrylic housing sheets are separated by white standoffs.
Detail 3: To ensure precise laser projection, vertical arm is slanted using two points of contact to the housing sheets.
In this video, I demonstrate the functionality of the reading pacer in real-time. With the device already clipped to the top of an open book, a red line laser performs a slow, steady sweep down the page. Next, I reach for the potentiometer which is mounted on the base of the clip. As I manually rotate the knob clockwise, the laser visibly sweeps faster. Finally, I show myself flipping a page of the book without needing to remove or adjust any of the hardware.
An initial mockup of a physical sheet with a slot to highlight a line of text. The design included side wheels to roll down the page, but was eventually abandoned because it did not allow for easy page turning.
At this point, I realized that the protoboard, designed to hold the Arduino Pro Micro and potentiometer, would not physically fit onto the back of the book clip housing.
Pivoted to using line lasers.
The video shows a laser module mounted to a servo motor arm. The laser line moving up and down as the servo rotates.
Tested with cardboard and tape how to attach the Arduino, servo and laser to the book clip. Made an effort to use flat solutions as I had limited 3D printing experience.
Assembled using nuts and bolts which allows components to be loosened and re-tightened by finger to change the laser angle, swap out the Arduino Pro Micro, or collapse the device for portable storage. Silver tape is used to safely secure wires to the clear acrylic boards.
Designing the CAD for laser cutting was challenging but building and refining cardboard prototypes to figure out the exact shape and dimensions made the process slightly easier. Soldering was also time-consuming, as mistakes often forced me to restart from scratch. To avoid errors, I settled on a system where I build a complete working model on a breadboard that I can replicate precisely. If the breadboard and protoboard sizes don’t match, I use a larger breadboard and tape off an area that mirrors the protoboard, then strictly stay within those boundaries. I now also know that it is important not to move wires or components during the transfer; instead, I make sure to use duplicate parts from the inventory to recreate the setup cleanly on the protoboard.
3. Discussion
(instructions are embedded below)
I am technically satisfied with the coding and wiring but I am disappointed with the physical execution and the overall "flimsiness" and “aesthetic” of the final build. My original goal was to create a rugged, durable device that could be thrown into a backpack or used at the beach, yet the current iteration feels far from that vision. I think this gap between my vision and reality stemmed largely from my struggle with 3D visualization and my limited experience in CAD modeling. I also lacked the design sense to have a clear mental image of how the components should intersect. This resulted in me having to use glue gun glue and tape. I ideally would have designed interlocking panels and proper cable management with built-in hoops.
If I were to continue developing this, I would start by exploring existing hardware like a gooseneck arm, possibly combined with the kind of book clamp already used for reading lights, and adapt my system to fit within that structure. I would also 3D print a more refined, circular housing for the servo motor and laser at the top of the arm to improve both stability and aesthetics.
During the in-class critique, a judge suggested implementing a calibration system where users can define the reading range by using a potentiometer to select the top and bottom lines. This aligns with a goal I had but wasn’t able to achieve in time. I would implement this right away. I also received peer feedback about the laser color, including “is it comfortable to read text highlighted in red?” and “Would you have different light color for the highlight?”. There were also suggestions like “would be nice to be able to pause the device, in case i want to go back and read.” and “Maybe in the future you could add a pause button if I get interrupted or something”. While these weren’t changes or features I felt I wanted, if I were to develop this into a consumer product, I would want to conduct more user research to better understand preference.
/*
Project 2: Reading Pacer
60-223 Intro to Physical Computing
Uses a servo motor to drive a horizontal line laser vertically across a book to pace a reader.
*Note: sweep distance is mapped to the size of a specific book: "Artists Re:thinking Games" by Ruth Catlow (Dimensions. 15.24 x 1.02 x 22.86 cm)
Code written for an Arduino Pro Micro.
pin mapping:
Arduino Pin | Role | Description
___________________________________________________________________
A0 Input Potentiometer for speed control
10 Output Drives servo motor
VCC Power 5V to servo, potentiometer, and red laser
GND Ground common ground for servo, potentiometer, and red laser
Code released to the public domain by the author, 04/02/2026
Rion Kurihara, rkurihar@andrew.cmu.edu
*/
#include <Servo.h>
Servo verticalServo;
const int potPin = A0; // potentiometer
// define sweep range of laser + servo
const int TOP_ANGLE = 60; // top of page
const int BOTTOM_ANGLE = 100; // bottom of page
void setup() {
verticalServo.attach(10);
verticalServo.write(TOP_ANGLE); // sets laser + servo position on startup
delay(1000);
}
void loop() {
// 1. Sweep down by moving 1 angle at at a time
for (int angle = TOP_ANGLE; angle <= BOTTOM_ANGLE; angle++) {
verticalServo.write(angle);
int potVal = analogRead(potPin);
// translates potentiometer knob position into sweep speed = delay time
int stepDelay = map(potVal, 0, 1023, 100, 3000);
delay(stepDelay);
}
// 2. Snap back to the top before next sweep
verticalServo.write(TOP_ANGLE);
// 3. Pause for page turn
delay(2000);
}