The Donnie Pack by The Buttercups:
Final Documentation

Introduction

The Donnie Pack is an assistive device designed to support our client, Donnie, who is navigating the challenges of traumatic brain injury and the associated short-term memory loss. This project represents the culmination of our efforts in the 60-233 Intro to Physical Computing course as our final project, with the goal of creating a practical tool to enhance the daily life of someone living with a disability. Through a series of interviews and prototype testing sessions with Donnie, we developed a specialized fanny pack equipped with reminder alerts. These alerts prompt Donnie to jot down notes throughout the day, aiding in the retention of important daily details as per his specific request. Reflecting on Donnie's experience as a waiter in the 90s, where he relied on an appointment notebook to keep track of customer orders, our final product revitalizes this familiar habit. By adapting it to his current needs, The Donnie Pack aims to mitigate the effects of his short-term memory loss, offering a tailored, user-friendly solution.

What we built

An up close and personal image with our final product. Showing our home screen of the device.

An up close and personal image with our final product. Showing our home screen of the device.

The Donny Pack is a fanny pack equipped with a display screen. At predetermined times—8 AM, 12 PM, and 5 PM—the Donny Pack will attract the user's attention by flashing and ringing. This signal indicates it's time for the user to engage with the pack. When the user checks the screen, they will see a prompt: "Prompt 1" in the morning, "Prompt 2" at noon, and "Prompt 3" in the late afternoon. Outside these specific times, the screen displays a cheerful smiley face as if it were an idle screen. Inside the fanny pack lies a notebook, its cover with a glossary. This glossary serves as a key, connecting each prompt number to a specific question currently related to the user's meals: "Prompt 1" asks, "What did you have for breakfast?" "Prompt 2" inquires, "What did you have for lunch?" and "Prompt 3" prompts the question, "What did you have for dinner?". Following each prompt, the user is encouraged to record the answer in the notebook. This practice allows the user to create a personal record that the user can reflect upon in the future, aiding in the retention of daily details.

Narrative Sketch  

While eating a hearty breakfast of eggs, Donnie notices that his Donnie Pack has chirped a little six-note melody, and the front of the pack has begun emitting green light. Having caught his attention, Donnie looks down at the screen of the Donnie Pack, tilting the bottom of the pack upwards so that he can more clearly read the words "Prompt 1" on the screen. He then takes out the spiral notebook and pen from the Donnie Pack, and checks the front of the notebook to see that "Prompt 1" corresponds to the question, "What did you have for breakfast?" Donnie opens the notebook to a blank page, sees that a plate of eggs is in front of him on the table, and writes "Eggs" on the page, before putting the notebook and pen back into the Donnie Pack and resuming his breakfast. 

Detail Images

Up close view of the screen, showing the home screen

Up close view of the screen, showing the home screen

Diagonal view of our pack. Showing the insert lifted out of the inside.

Diagonal view of our pack. Showing the insert lifted out of the inside.

Showing the insides of the box, both the electronics and the notebook.

Showing the insides of the box, both the electronics and the notebook.

Showing the top of the box with the insert in, only leaving the notebook visible.

Showing the top of the box with the insert in, only leaving the notebook visible.

Top down view of the notebook and pen, with our box at the top in the background.

Top down view of the notebook and pen, with our box at the top in the background.

Product Video  

SarabosingNatalieFinal.mov

A demonstration of our notification process. The screen resets and shows which prompt is up. The lights then turn on and our sound notification goes off to alert our client it is time to respond to a prompt. The notebook is then shown being removed from the pack, the correct prompt being observed and then responded to inside the notebook.

Prototype

Peyton wearing our prototype, with the lights on and the screen showing

This is our assembled prototype, which combines all of our prototypes to demonstrate our product and help us understand Donnie's user experience. The product was designed as a neck pouch featuring a display screen enhanced by LED lighting and equipped with a buzzer that would activate at predetermined times throughout the day.

The front of our prototype, and the inner electronics of our prototype

This is our electronic prototype designed to demonstrate the notification system alongside the screen display. This setup featured an LED that flashed in, of course, forest green (Donnie's favorite color) and a beeping buzzer. These alerts were designed to notify Donnie when it was time to check the display for a new prompt regarding his day, ensuring he could respond promptly.

Up close image of our two box prototypes.

This is our product prototype designed to evaluate comfort and interaction with the product's form. We crafted two distinct boxes, varying mainly in thickness. Additionally, we incorporated weights to more accurately simulate the final product's feel once it's 3D-printed.

Photo of our 4 different notebook prototypes, all different shapes and sizes

This is our prototype for a notebook. Its goal is to determine the optimal size for the user's writing preferences, which will, in turn, dictate the final dimensions of the product. We requested Donnie to test writing with additionally different pens to identify his preference. In doing so, we also discovered that a click pen would be more suitable, as it eliminates the concern of a lost cap.

1.MOV

This is a video demonstration showcasing our notification system along with the screen display. Although the display screen was not yet functional, we were able to demonstrate interaction as the user opened the lid after being alerted. We later decided to remove the lid from the screen as it proved inconvenient.

2.MOV

This is a video demonstration showcasing the functionality of our notification system within the product. It also demonstrates the assembled product prototype we used to conduct tests during the prototype critique session.

Donnie on the left, looking at the notebooks we made for him, with Natalie in the middle and Peyton on the left looking at him

This photograph was captured during the critique session of our prototype, and it features Donnie experimenting with the notebook prototypes we've developed. We proactively adjusted and revised our prototypes on the spot to ensure maximum efficiency and satisfaction with our product upon development.

Donnie trying on and using our prototype

This is an image captured during the prototype critique session, featuring Donnie modelling our prototype product. Originally designed as a neck pouch, we modified it on-site to function as a fanny pack, catering to Donnie's preference.

Group photo, with Natalie on the left, Brandt in the middle holding our prototype, and Peyton on the right

A photo of the Buttercups team, proudly showcasing our prototype product, ready for the prototype critique session.

Group photo with our client, with Brandt, Donnie, Peyton, Natalie from left to right

This is a photo taken during a prototype critique session with the Buttercup team and Donnie following a successful and insightful prototype demonstration. ✌️.


Our prototype review session was highly successful. We demonstrated and thoroughly tested each prototype, incorporating valuable feedback from Donnie on every aspect. A couple of 'minor' yet insightful feedbacks were Donnie's preference for a top-bound 3 X 5 notebook and Donnie's preference for notifications, leading us to modify the LED and buzzer for lesser interference with daily use. The initial LED indicator was overly flashy, and the buzzer's beeping sound was found to be irksome. Responding to this, we developed a subtler LED flash and changed the buzzer sound to a less intrusive melody.

 A significant insight that led to a pivotal change in our product's functionality was the difficulty Donnie faced in reading the questions displayed on the screen. Originally, the screen would show questions for Donnie to answer in his notebook. While we were unable to determine how to operate the screen before the prototype critique, we composed questions and positioned them atop the screen to simulate its functionality for user testing. To address the readability issue, we collaborated closely with Donnie to develop a prompt system. In this new system, the screen displays a number that Donnie can refer to in a glossary on the cover of a notebook to find the corresponding question. This modification allowed for an effective and productive adjustment to Donnie's feedback, ensuring the new system was well-received.  Additionally, we discovered that rather than positioning the number to face forward, it would be more efficient to flip the text. This way, Donnie can simply lift the product to read the words without the need to remove it or awkwardly crane his neck. We developed the system collaboratively with him on the spot to ensure its effectiveness.

The team learned a valuable lesson in adaptation; rather than introducing a completely new system for Donnie to adjust to, we found success in integrating elements from a routine Donnie was already comfortable with, inspired by Donnie's nostalgic storytelling of his as a waiter in the 90s. We took two major inspirations from this: transforming the product into a fanny pack for easier note-taking, reminiscent of Donnie's apron that held his notebook, and adopting the prompt system with a glossary on the notebook cover, similar to how Donnie used to refer to his notebook cover for the day's specials. The prototype review session was incredibly beneficial. We were able to refine our product to not only align with our envisioned solution but also to fully embrace Donnie's feedback fully, ensuring a design that was both functional and user-centric.

Process

A picture of the whiteboard table during one of our initial work sessions, featuring sketches, lists, an simple schematic, and sheets of scrap cardboard.

A picture of the whiteboard table during one of our initial work sessions, featuring sketches, lists, an simple schematic, and sheets of scrap cardboard used to create early vertically-oriented mockups of the Donnie Pack. 

A picture of sketches done after the prototyping process, showing how we were going to proceed.

Following the prototype critique, we returned to the drawing board to sketch out what would be our final design for the Donnie Pack, focusing now on deciding our final dimensions and form factor (based on the winning cardboard prototype on the left).  


A failed 3d print of our pack, top down view.

One of the biggest unanticipated challenges of our build process was our struggles and delays caused by a malfunctioning 3D printer. This picture illustrates the state of our 2nd failed print.

A picture of an early mock of the final product, fitting the screen into the front panel.

In this picture, Natalie's testing how the screen will fit into the front of the box by lining it up with the panel. The un-soldered electronics and breadboard can be found attached via wires to the screen behind the panel. 

A picture of the front of our pack, showing the screen giving an error in the code.

This is a picture of a minor bug that Peyton found in the code on the night before the final critique. Peyton was able to fix it pretty easily, but it did produce this interesting-looking error screen. 

A picture of our box, after the straps had been sewn on, to the left. On the right is the sewing machine used.

This picture was taken the day before the final critique, when Natalie was sewing on the straps for the Donnie Pack. In the background, one can see the fully-mounted electronics to the front panel, which was glued onto the rest of the box after the straps were sewn on. 


A screenshot of our gantt chart used for planning the final project.

Above is the Gantt Chart that the Buttercups used to plan out the tasks for this project. We didn't really end up sticking to our plan, but taking the time to list out the different components of our build and clearly establish responsibilities was very valuable for our productivity as a group. Our actual work schedule ended up being essentially this Gantt chart shifted forward a few days, due to code taking longer than expected, and due to unforeseen delays with the 3D printer. Coda Soska, the Technical Specialist for IDeATe, was extremely helpful with making sure that the 3D printer got up and running, and with communicating with Brandt about the status of our prints. Because of the issues with the printer, Brandt requested that two versions of our box be printed: one in the desired green filament, and one in gray, just in case of a printing defect in the first one. This actually ended up working to our benefit--not only did we then end up with a "test box" that we could practice gluing together, but we also found that we liked the two-tone nature of a green box and a gray inner divider better. In general, though, the Buttercups had a fairly "chill" build process, and the way that we divided up tasks allowed us to work very effectively with each other. 

Conclusions and Lessons Learned

Overall, final critique was very successful. It was super cool to see Donnie wearing the Donnie Pack after weeks of working on the project! We recieved a lot of really helpful and insightful feedback on our project. One piece of feedback that we got was that "the box’s edge [should be] more round, especially for the corners that is attached to the body, so that user won’t get hurt if the box hits something." This makes total sense to us. We decided to 3D print the box in order to make a rounded edge for where the fanny pack sits on the lap, but due to the way the box was constructed, not all of the edges could have been rounded. Another piece of feedback we received had to do with the way that the notebook and pen were attached to the Donnie Pack, with one critic saying that "the strings for the notebook seemed cumbersome," suggesting that we could "maybe have them on a zip cable." We also definitely agreed with this--we didn't fully consider the implications of simply tying the notebook and pen to the fanny pack with string, and because it was such a simple task to do, we didn't implement it until the night before (after all the electronics and fabrication was done). The day of the critique, we quickly realized how tangled this system could become. In terms of the final integration of the product, one person wrote that the Donnie Pack would "really [need] a reliable real-time clock" and "with more integration it could be a lot smaller." Though we had the Donnie Pack on "demo mode" to change the prompt screen once every 3 minutes (the minimum time for the E-Ink screen to update), this would definitely be a consideration we'd need to have for a final product. Finally, one critic suggested that the Donnie Pack's notification system could have the volume "regulated by atmospheric level of sound".  This was a really cool comment during the live discussion. That critic noted that if Donnie was in a movie theater or another quiet place, the audible notification sound could be quite disruptive, with no real way to anticipate the notification occurring or to (at the moment) decrease the volume. Since the Donnie Pack is supposed to be a memory aid, the volume of the notification would ideally be something that could self-adjust, rather than needing to be something that Donnie has to be aware of. 

We believe we learned a lot from not just working with our client Donnie, but the whole process of going to CLASS and seeing their facilities and getting to learn about how people with disabilities. It was interesting listening to Donnie and hearing the input he had to give us that was catered towards his needs. Getting feedback from him was a very useful and insightful process in creating ideas to try and create something that would help Donnie. The whole process taught us a lot about the needs of people with brain injuries and how, despite the injury, they are the same as people without disabilities and should be treated as such. They shouldn't be looked down upon just because of a disability.

In terms of our process, there are some things we would do differently if we were to do it all over again. I think we would try some different notification methods, like vibration being a clear front-runner. Also potentially having a cloth part to the bag to make it softer and easier to wear, or putting the screen on top of the box to maybe make it easier to use. The process overall was very enjoyable and we feel very proud of our final product. We learned a lot about creating something specifically for someone's needs, a lot about a whole new coding language, Circuit Python, and also about designing our bag.

Technical information

"""

The Donnie Pack


Brandt Li, Natalie Sarabosing, Peyton Moffatt


This is code that will give notifications for responding to prompts.


  Pin mapping:


    Feather pin | role  | details

    ------------------------------------------

    ~05           output  E-Ink Screen

    ~06           output  E-Ink Screen

    ~09           output  E-Ink Screen

    ~10           output  E-Ink Screen

    ~11           output  buzzer

    ~12           output  LED strip

    

Part of this code was taken from example code provided by adafruit. (The screen setup).

"""



import time

import rtc

import board

import displayio

import fourwire

import adafruit_il0373

import simpleio

import neopixel



"""################### LIGHTS SETUP ###################"""

pixels = neopixel.NeoPixel(board.D12, 21, pixel_order=neopixel.RGB)

led_count = 21


def updateLEDColor(red, green, blue):

    for index in range(led_count):

        pixels[index] = (red, green, blue)

    pixels.show()


def runLights():

    updateLEDColor(240, 6, 10)


"""################### BUZZER SETUP ###################"""

# Define pin connected to piezo buzzer.

PIEZO_PIN = board.D11


# Define a list of tones/music notes to play.

TONE_FREQ = [2349,  # D7

             3136,  # G7

             3520,  # A7

             2349,  # D7

             3136,  # G7

             3520]  # A7


# Main loop will go through each tone in order up and down.

def playBuzzer():

    # Play tones going from start to end of list.

    for i in range(len(TONE_FREQ)):

        simpleio.tone(PIEZO_PIN, TONE_FREQ[i], duration=0.5)



"""################### SCREEN SETUP ###################"""

# Used to ensure the display is free in CircuitPython

displayio.release_displays()


# Define the pins needed for display use

# This pinout is for a Feather M4 and may be different for other boards

spi = board.SPI()  # Uses SCK and MOSI

epd_cs = board.D9

epd_dc = board.D10

epd_reset = board.D5

epd_busy = board.D6



# Create the displayio connection to the display pins

display_bus = fourwire.FourWire(

    spi, command=epd_dc, chip_select=epd_cs, reset=epd_reset, baudrate=1000000

)

time.sleep(1)  # Wait a bit


# Create the display object - the third color is red (0xff0000)

display = adafruit_il0373.IL0373(

    display_bus,

    width=296,

    height=128,

    rotation=270,

    busy_pin=epd_busy,

    highlight_color=0x000000,

)


# Create a display group for our screen objects

g = displayio.Group()


r = rtc.RTC()

r.datetime = time.struct_time((2024, 4, 24, 10, 0, 0, 0, 0, -1))


def display_image(image):

    with open(image, "rb") as f:

        pic = displayio.OnDiskBitmap(f)

        # Create a Tilegrid with the bitmap and put in the displayio group

        # CircuitPython 6 & 7 compatible

        t = displayio.TileGrid(

            pic, pixel_shader=getattr(pic, "pixel_shader", displayio.ColorConverter())

        )

        # CircuitPython 7 compatible only

        # t = displayio.TileGrid(pic, pixel_shader=pic.pixel_shader)

        g.append(t)


        # Place the display group on the screen

        display.root_group = g


        # Refresh the display to have it actually show the image

        # NOTE: Do not refresh eInk displays sooner than 180 seconds

        display.refresh()

        print("refreshed")


t1 = 0

t2 = 0

t3 = 0

t4 = 0

screentimer = time.monotonic()

ledtimer = time.monotonic()

startup = 0



"""################### MAIN LOOP ###################"""


while True:

    now = r.datetime

    curmin = now.tm_min

    if curmin % 12 >= 0 and curmin % 12 <= 2:

        if t1 == 0:

            if screentimer + 180 < time.monotonic() or startup == 0:

                print("running 1")

                display_image("/prompt_1_flipped.bmp")

                time.sleep(8)

                runLights()

                playBuzzer()

                t1 = 1

                t2 = 0

                t3 = 0

                t4 = 0

                startup = 1

                screentimer = time.monotonic()

                ledtimer = time.monotonic()

    elif curmin % 12 >= 3 and curmin % 12 <= 5:

        if t2 == 0:

            if screentimer + 180 < time.monotonic() or startup == 0:

                print("running 2")

                display_image("/prompt_2_flipped.bmp")

                time.sleep(8)

                runLights()

                playBuzzer()

                t2 = 1

                t1 = 0

                t3 = 0

                t4 = 0

                startup = 1

                screentimer = time.monotonic()

                ledtimer = time.monotonic()

    elif curmin % 12 >= 6 and curmin % 12 <= 8:

        if t3 == 0:

            if screentimer + 180 < time.monotonic() or startup == 0:

                print("running 3")

                display_image("/prompt_3_flipped.bmp")

                time.sleep(8)

                runLights()

                playBuzzer()

                t3 = 1

                t1 = 0

                t2 = 0

                t4 = 0

                startup = 1

                screentimer = time.monotonic()

                ledtimer = time.monotonic()

    else:

        if t4 == 0:

            if screentimer + 180 < time.monotonic() or startup == 0:

                print("running bmo")

                display_image("/bmo.bmp")

                t4 = 1

                t1 = 0

                t2 = 0

                t3 = 0

                startup = 1

                screentimer = time.monotonic()


    if ledtimer + 15 < time.monotonic():

        if ledtimer + 25 < time.monotonic():

            updateLEDColor(0, 0, 0)

        else:

            updateLEDColor(15, 0, 0)


Conclusions and Lessons Learned