With the rise of AAPI hate in the past year, we set out to create defensive vests to start a conversation on what it means to feel unsafe as Asian American women. Our vests remind us of the precautions and protections that women take to feel safe. However, we also add our identity as Asian Americans to the purpose of the vest to highlight our vulnerability caused by race tensions in our nation.

Our vests are customized to represent our needs and defensive strategies in times of distress. However, they both retain two key components: one part of the vest is inflated with a hand pump and one part of the vest is inflated with a motor pump.

When the user presses their hand pump to inflate their vest, a signal is sent via a soft touch sensor to inflate their partner’s vest using their motor pump. The vest allows the user to seek physical comfort by squeezing a hand pump. It also allows the user to communicate their emotional state to their partner. Their partner’s vest flies into a protective mode, almost like a call to action or like someone rushing to rescue.

The Vests

Helen’s Vest

Exposed Organs

My vest is an abstract quilt of our major organs, with many individual pieces filled with different fabrics and stitched together. Besides the heart organ and the collar, which are inflated using the hand pump and motor pump, the other organs are inflated to varying degrees. The more vital the organ, the more inflated it is.

Controlling transparency of vest with different shirts

I paired my inflatable vest with a black long-sleeved shirt and a neutral-colored tank top to see how different bases can bring out different elements of the vest.


The infill in the vest is mainly pink, blue, and gray lace, with hints of sequins and glitter. Some organs support a variety of colors to represent its function, oxygen level, and value. The lace confetti is incased in the vest, juxtaposing both the delicacy of the lace with the protective purpose of the vest.


The exposed lace on the collar is reminiscent of a lion’s mane. The raw edges of the lace border creates a delicate yet prickly effect. It is both beautiful and unsettling, as the lace tassels flare out of the collar.

Rebecca’s Vest

In its resting state, my vest is boxy and asymmetrical. I created coral-like edges around the neckpiece; the ridges droop like wings on the shoulders. Brackets and lines coat the body of the vest.

While experimenting with patterns, I explored one-piece construction — having one body and vacuum as opposed to disassembled parts. The style mimicked a life vest and was visually consistent with the clear tubing I used to attach to the motors. I ended up using two pieces: one spanned from the entire left side to the right shoulder, and the other piece was a linear pouch motor to be actuated by the motor pump.

Heart Pump: sending signals

The heart pump has a soft sensor attached to it, so each squeeze is detected. The air itself is pumped into a compartment that is closed off and separated from the rest of the vest. It is coated with one layer of white paint to distinguish it from the other panels of the vest, and it is marked with the phrase “HELP OTW”.

Motor Pump: receiving signals


I used a layer of white paint to create a frosted effect on the part of the vest that is actuated by the motor so the vinyl wouldn’t be as revealing.


As someone who likes to slowly refine my work as I progress, I felt exposed while working with a transparent medium. I addressed this by painting some areas of the vest and drawing patterns on both sides. I also appreciated Helen’s use of filling to beautify and also conceal some elements of her vest. Vinyl offered a lot of opportunities to play around with linework and edges, and I had a lot of fun with that.

I can now say I “used telematics to physically actuate and inflate a wearable,” which is an impressive sentence. It actually was really exciting to watch something on your body move at someone else’s signal, especially when that person is a distance away from you. It was also reaffirming to send a (homemade, on top of everything else) help signal and knowing a familiar person was at the other end of it. However, if Helen were to actually be in danger, I would feel helpless watching my vest slowly ascend to reveal some safety tools. If we had more time, Helen and I could refine this idea to make it more functional.

Given more time, we would explore adding more vests to this line, such that when one person is in distress, all the vests fly into action. The vests are meant to represent the need for safety when someone in our communities are distresses. In a sense, we are gearing up to protect our fellow community members as well as feeling their sense of danger and being affected by their distress as well.


Project 2: Defensive Vests

Helen Yu (heleny1), Rebecca Kim

Written by Helen Yu
Last Updated: 5/6/21

Summary: When you clench your pump and inflate your vest, your
partner's vest leaps into defense mode. A hobby servo helps control
the defense mechanism, be it spikes, projectiles, webs, etc.

Inputs: Soft Touch Sensor on A1
Outputs: Motor Pump on A2
# ----------------------------------------------------------------
# Import any needed standard Python modules.
import time, math, sys

# Import the board-specific input/output library.
from adafruit_circuitplayground import cp

# Import the low-level hardware libraries.
import board
import digitalio
import analogio
import pwmio

# Import the Adafruit helper library.
from adafruit_motor import servo

# Import the runtime for checking serial port status.
import supervisor

# ----------------------------------------------------------------
# Initialize hardware.

# Configure the digital input pin used for its pullup resistor bias voltage.
bias = digitalio.DigitalInOut(board.D10)        # pad A3

# Configure the analog input pin used to measure the sensor voltage.
sensor = analogio.AnalogIn(board.A1)
scaling = sensor.reference_voltage / (2**16)

# Create a PWMOut object (motor pump) on pad A2 to generate control signals.
pwm = pwmio.PWMOut(board.A2, duty_cycle=0, frequency=2000)

# ----------------------------------------------------------------
# Initialize global variables for the main loop.

remote_touch = [0]

# Measure the time since the last remote move message, and reset after a period without data.
remote_touch_timer = False

# Convenient time constant expressed in nanoseconds.
second = 1000000000

# Integer time stamp for the next console output.
sensing_timer = time.monotonic()

# Integer time stamp for next behavior activity to begin.
next_activity_time = time.monotonic_ns() + 2 * second

# Flag to trigger motion.
inflate_state = False

phase_angle = 0.0
cycle_duration = 12                       # seconds per cycle
phase_rate  = 2*math.pi / cycle_duration  # radians/second

# Integer time stamp for next servo update.
next_pump_update = time.monotonic_ns()

# The serial port output rate is regulated using the following timer variables.
serial_timer    = 0.0
serial_interval = 0.5

# ----------------------------------------------------------------
# Begin the main processing loop.
while True:

    # Read the current integer clock.
    now = time.monotonic()

     #---- soft sensor input and display -----------------------------
    # Read the integer sensor value and scale it to a value in Volts.
    volts = sensor.value * scaling

    # Normalize the soft sensor reading.  Typically you'll need to adjust these values to your device.
    low_pressure_voltage  = 0.65
    high_pressure_voltage = 0.20
    pressure = abs((high_pressure_voltage - volts) / (high_pressure_voltage - low_pressure_voltage))

     # Check the serial input for new line of remote data
    if supervisor.runtime.serial_bytes_available:
        line = sys.stdin.readline()
        tokens = line.split()
        if len(tokens) == 1:
                remote_touch = [int(token) > 0 for token in tokens]
                remote_touch_timer = 4.0
            except ValueError:

    #---- periodic console output -----------------------------------
    # Poll the time stamp to decide whether to emit console output.
    if now >= sensing_timer:
        sensing_timer += 100000000 #0.1sec

    if pressure > 0.5:
        remote_touch_timer = now + 4000000000 # 4 sec timeout

    if now >= serial_timer:
        serial_timer += serial_interval
        touch = ["1" if pressure > 0.5 else "0"]
        print(" ".join(touch))

    # If a slow movement has been received, sweep twice at a constant speed
    if inflate_state is True:
        pwm.duty_cycle = 2**16-1
        print("Defense activated.")
        pwm.duty_cycle = 0
        print("Defense deactivated")
        inflate_state = False

    if any(remote_touch):
        # Check whether there was any remote movement
        if remote_touch[0]:
            inflate_state = True
            print("Engage defense")
        remote_touch = [False]

    #---- periodic servo motion commands ----------------------------
    # If the time has arrived to update the servo command signal:
    if now >= next_pump_update:
        next_pump_update += 20000000  # 20 msec in nanoseconds (50 Hz update)