02 February 2026

Unconventional Switch

 

Cheers!





For our unconventional switch, we decided to use two cans of soda to act as our switch. We thought it would be fun to light up an LED every time you “cheered” with a buddy, making any hang out that much more fun! The alligator clips are attached to each piece of tin foil on the respective can of soda, this made the transfer more conductive for better results. When the two cans of soda touch each other, the LED lights up! Then, when the two cans of soda are pulled away from each other, the LED turns off. There is not necessarily a practical purpose for this switch, it is used mostly for entertainment value and for enhancing cheering to be more eventful and momentous.

(5v – 3v) = 0.02A * R

2v = 0.02A * R

2v / 0.02A = R

R = 100Ω


Made by:

Aidan Huggins

Andrew Parkinson

30 January 2026

Multi switch - Ignacio Vergara

Multi Switch

Description

For this multi-switch assignment, I connected the Arduino board to a breadboard using the 5V and GND pins to supply power. To make the layout more organized, I bridged the power rails from one side of the breadboard to the other using jumper wires, allowing me to distribute power across both halves of the board. I placed the three buttons side by side on the breadboard. Each button is connected on one side to the positive power rail, and on the other side to a digital input pin on the Arduino to read its state. A 10kOhm resistor connects each button to ground, acting as a pull-down resistor to make the button behave as expected.

For the LEDs, I used three different colors: red, yellow, and green. Each LED is connected to a separate digital output pin on the Arduino, with the negative leg connected to ground through a 100Ohm resistor to limit current. The behavior of each LED is controlled through conditional logic in the code. The first button turns the green LED on only while the button is pressed. The second button acts as a toggle, switching the yellow LED on or off with each press. The third button controls all three LEDs by triggering a looping animation sequence..

 Video Demonstration

 


 Photos



 Sketch

  

 

Schematic

Code

 

int buttonLastState = 0;
int buttonState = 0;
int led1on = 0;
int led2on = 0;
int led3on = 0;
int btn1 = 2;
int led1 = 8;
int led2 = 9;
int btn2 = 3;
int btn3 = 4;
int led3 = 10;
int ledSequencePlaying = 0;

void setup()
{
  pinMode(btn1, INPUT);
  pinMode(led1, OUTPUT);
 
  pinMode(btn2, INPUT);
  pinMode(led2, OUTPUT);
 
  pinMode(btn3, INPUT);
  pinMode(led3, OUTPUT);
 
  Serial.begin(9600);
}

void loop()
{
  //First Button
 
  if (digitalRead(btn1) == HIGH) {
    digitalWrite(led1, HIGH);
  } else {
    if(!ledSequencePlaying){
      digitalWrite(led1, LOW);
    }
  }
 
 
 
  //Second Button
 
  if(digitalRead(btn2) == HIGH && buttonLastState == LOW){
    if(led2on == 0){
      led2on = 1;
      digitalWrite(led2, HIGH);
    }else{
      if(led2on == 1){
        led2on=0;
        digitalWrite(led2,LOW);
      }
    }
  }
  buttonLastState = digitalRead(btn2);
  //Serial.print("Button last state is= ");
  //Serial.println(buttonLastState);
 
  // Third Button
 
  if(digitalRead(btn3) == HIGH){
    ledSequencePlaying = 1;
  }
 
  if(ledSequencePlaying == 1){
    digitalWrite(led1, HIGH);
    delay(500);
    digitalWrite(led1, LOW);
    delay(500);
    digitalWrite(led1, HIGH);
    delay(150);
    digitalWrite(led2, HIGH);
    delay(500);
    digitalWrite(led2, LOW);
    digitalWrite(led3, HIGH);
    delay(200);
    digitalWrite(led3, LOW);
    delay(500);
  }
 

  Serial.print("the red light is: ");
  Serial.println(led1on);


 
}

 

 


27 January 2026

Armature Touch: Unconventional Switch

 


This project aims to represent the connection between two people through physical touch. Through physically touching the two wire people together, the circuit completes itself to glow an LED. The design itself was meant to hide the underlying circuitry to emphasize the connection of the two wire armatures. The materials chosen were aluminum wire, a white LED, a half-sized breadboard, alligator clips, and a warm-toned wood. The aluminum wire allows the user to bend and manipulate the gestures while still allowing a current to pass through. The white LED was picked to allow higher visual contrast between the light and the dark aluminum, and metaphorically opens the work to more people; it establishes a connection as something without color. Logistically, the breadboard was used to hide the internals, while the alligator clips were the only consistent way to connect the non-solderable aluminum to the circuit. The warm-toned wood is meant to represent the warm connection created. The form of the two gestures also lacks detail, each with one arm to create a juxtaposition that the user can recognize. This is meant to lead the user tomake these two "arms" to touch. 



https://youtu.be/Asvel0r1A08

26 January 2026


The Unconventional Bulbasaur Switch

This project transforms a plush Bulbasaur into a soft, interactive electronic interface using basic circuit design and conductive materials. A conductive necklace wrapped around the plush and alligator clips are attached to the necklace. This then connects Bulbasaur to wires on a breadboard-based circuit that includes a push-button, 9-volt power source, a USB power supply and an green LED. While the plush serves as an adorable tactile and conceptual interface. Whereas, the LED is activated when a physical button on the breadboard is pressed. Which allows users to manually trigger the system and observe the electrical response.

When the push-button on the breadboard is pressed, current flows from the 5-volt power source through the button, into the conductive necklace attached to Bulbasaur then through a resistor and LED before returning to ground. The resistor limits current to protect the LED from burning out. While the LED provides a visual signal that the circuit is active.

This project explores how soft materials--or adorable anime critters--and traditional electronics can be combined into playful, experimental interface. By connecting a plushie to a functioning electronic system, this highlights the expressive potential of physical computing and invites users to think of using everyday objects as interactive components.

Sketch


Schematic

Pictures





Video Demonstration 


 

21 January 2026

Unconventional switch

Unconventional switch - Squeezing out the light

Description 

For this project, I created an unconventional switch that lights up an LED by squeezing a lemon. I used components from my most complete starter kit, including a breadboard, jumper cables, an alligator clamp, a power source adapter set to the 5V configuration, and a multimeter to check everything was working properly. 

What did I use for this? A metal lemon squeezer and an actual lemon. The objective was to demonstrate how electricity can flow through everyday items, even edible ones like fruit, and how a simple action we normally use to make lemonade or juice can be transformed into something completely different, like turning on a light. 

It's a fun way to show that conductive materials are everywhere, and sometimes the most interesting circuits come from thinking outside the box.

 

Video demonstration

 


 


 Photos

 

 

 

Sketch

 Schematic


 

22 April 2025

Final Team 12 : The SpeedRunner's Suitcase

We created a custom controller for the fast-paced competitive platformer, SpeedRunners. The controller is housed withing a custom 3D-printed box designed to resemble the suitcase obstacle that shows up frequently in the game. Our conceptual model focuses on taking this harmful game element and making it the main way for the player to interact with the game. Instead of being an obstacle, the suitcase becomes a tool for the player to physically interact and manipulate from the game world to control their character. This increases immersion and creates a unique gameplay experience based on the game’s own iconography.

The input to output mapping involves interactions with the controller components to make game actions. A potentiometer is used as the directional control, turning the knob is mapped directly to the character’s left and right movement. The accelerometer is used to make the player jump or slide. A toggle switch is used to control the grappling hook, flipping the switch on and off activates and deactivates the hook, very similar to how it works in the game. The ultrasonic distance sensor is connected to boost activation and item use, putting your hand over the sensor at different distances leads to different actions.

The controller’s design has simple signifiers to show how to use it. The suitcase links it to the game, the knob is the only input that fits direction, the switch is to activate and deactivate (the grapple is the obvious one but can also see this applied to the boost), and the motion sensor shows that there is an element of interaction with movement in that area. The player knows these actions worked by seeing the character in the game perform the actions and hearing the switch flipping or the knob turning.

All these elements combine to use the player’s familiarity to the game and common input devices such as a knob or switch, while introducing uncommon interactions such as the distance sensor that can make gameplay more rewarding for the player.

Question:

Do you think the use of the ultrasonic sensor for potentially fast actions like boosting and item use is effective? Can the player maintain precise control over distance while in a fast-paced match of SpeedRunners?


Contributions:

Concept- Rodrigo C & Ralfo M

Wiring – Rodrigo C

Initial Code – Ralfo M

Updated Code + bug testing – Rodrigo C

Final Code – Ralfo M

Description – Rodrigo C

Prototype Enclosure – Rodrigo C

3D Print Enclosure – Ralfo M

Video and Photograph – Ralfo M

Schematics – Rodrigo C


Code:

#include <Adafruit_CircuitPlayground.h>

#include <Keyboard.h>

#include <NewPing.h>


// Map pins for Ultrasonic sensors

#define trigPin 9

#define echoPin 6


// Map pins for Potentiometer, Toggle Switch & Kill Switch

#define POT_PIN A5

#define SWITCH_PIN A6

#define MASTER_SWITCH_PIN A4


void setup() 

{

    CircuitPlayground.begin();

    Keyboard.begin();


    // Initialize Serial Monitor

    Serial.begin(9600);


    // Map Potentiometer

    pinMode(POT_PIN, INPUT);


    // Map Toggle switch & Kill switch with pull-up resistor

    pinMode(SWITCH_PIN, INPUT_PULLUP);

    pinMode(MASTER_SWITCH_PIN, INPUT_PULLUP);


    // Map Ultrasonic sensor pins as inputs

    pinMode(trigPin, OUTPUT);

    pinMode(echoPin, INPUT);


    // CPX initialization buffer

    delay(1000);

}


void loop() 

{

    // Check if master switch is OFF

    if (digitalRead(MASTER_SWITCH_PIN) == HIGH) 

    {

        Serial.println("Controller disabled");

        Keyboard.releaseAll();

        delay(100);

        return;

    }


    int potValue = analogRead(POT_PIN);

    float accelY = CircuitPlayground.motionY();

    int switchState = digitalRead(SWITCH_PIN);


   //Debugging: Print sensor values to Serial Monitor

   //Serial.print("Boost Sensor: "); Serial.println(boostDistance);

   //Serial.print("Item Sensor: "); Serial.println(itemDistance);

   //Serial.print("Potentiometer: "); Serial.println(potValue);

   //Serial.print("Accelerometer Z: "); Serial.println(accelZ);

   //Serial.print("Switch State: "); Serial.println(switchState);

    Serial.println(accelY);


    //Declaring variables for Ultrasonic sensor use

    long duration, distance;

    digitalWrite(trigPin, LOW);

    delayMicroseconds(2);

    digitalWrite(trigPin, HIGH);

    delayMicroseconds(10);

    digitalWrite(trigPin, LOW);

    duration = pulseIn(echoPin, HIGH);

    distance = (duration/2) / 29.1;


    Serial.print(distance);

    Serial.println(" cm");


    //If hand detected close to sensor, use boost

    if (distance <= 7)

    {

      Keyboard.press(0X20);

      Serial.println("Boost used!");

    }

    else

    {

      Keyboard.release(0X20);

    }


    //If hand detected far from sensor, use item

    if (distance >= 8 && distance <= 100)

    {

      Keyboard.press('c');

      Serial.println("Item used!");

    }

    else

    {

      Keyboard.release('c');

    }


    delay(100);


    // Potentiometer for left/right movement

    if (potValue > 500) 

    {

        Keyboard.press(KEY_LEFT_ARROW);

        Keyboard.release(KEY_RIGHT_ARROW);

        Serial.println("Moving Left!");

    }

    else if (potValue < 500) 

    {

        Keyboard.press(KEY_RIGHT_ARROW);

        Keyboard.release(KEY_LEFT_ARROW);

        Serial.println("Moving Right!");

    }


    // CPX Accelerometer for jump & slide

    if (accelY > 2.00)

    {

       Keyboard.press('z');

       Serial.println("Jump used!");

    } 

    else 

    {

        Keyboard.release('z');

    }


    if (accelY < -2.00)

    { 

        Keyboard.press(KEY_DOWN_ARROW);

        Serial.println("Slide used!");

    } 

    else 

    {

        Keyboard.release(KEY_DOWN_ARROW);

    }


    // Toggle Switch for grappling hook

    if (switchState == LOW) 

    {

        Keyboard.press('x');

        Serial.println("Grappling hook used!");

    } 

    else 

    {

        Keyboard.release('x');

    }


    // Small delay to prevent excessive key presses

    //delay(50);

}


Image:



           Schematic:


            Video:



21 April 2025

Project: Game Controller: Frogger - Team 17

 Our Frogger controller transforms the classic arcade gameplay into a physical, hands-on experience by replacing traditional keyboard inputs with interactive, pressure-sensitive lily pads. Rather than tapping arrow keys, players move a small frog figurine to one of four large lily pads—each corresponding to a direction: up, down, left, or right. When the frog is placed on a lily pad, a pressure sensor detects the weight and sends the appropriate signal through the Circuit Playground, moving the frog in-game. This one-to-one input-to-output mapping allows players to intuitively understand how their actions influence the game. The conceptual model draws directly from Frogger’s core mechanics: precision, timing, and spatial awareness. In the original game, players must carefully navigate hazards by choosing when and where to move. Our controller mirrors this concept by encouraging players to physically mimic that movement, moving across pads as if the frog were hopping from lily pad to lily pad. This embodied interaction creates a deeper connection to the game and adds a new layer of engagement. It also transforms a passive seated experience into one that is more active and involved. The lily pads serve as clear signifiers. Each pad’s position in a cross-shaped arrangement makes its purpose obvious and directly reflects its directional function. These affordances support the game’s theme and create an experience rooted in movement, timing, and playful risk-taking.


Open Question:

Do you feel as though it would be difficult to hit the lily pad due to it's size with the frog while also watching the game?

Team contributions:

Caio: Painted box, 3D printed frog and lily pads, brought and used most of the components for the controller.

Logan: Coded, soldered, brought boxes,  bought pressure sensors, and wired the circuit board.

Code:#include <Keyboard.h>

#include <KeyboardLayout.h> #include <Adafruit_CircuitPlayground.h> #include <Adafruit_Circuit_Playground.h> #define THRESHOLD 600 void setup() { Serial.begin(9600); while (!Serial); // Wait for serial to be ready CircuitPlayground.begin(); Keyboard.begin(); Serial.println("Pressure sensor readings:"); } void loop() { int sensor1 = analogRead(1); // Pin 1 int sensor2 = analogRead(3); // Pin 3 int sensor3 = analogRead(4); // Pin 4 int sensor4 = analogRead(7); // Pin 7 // Print sensor readings to the Serial Monitor Serial.print("Sensor 1: "); Serial.print(sensor1); Serial.print(" | Sensor 2: "); Serial.print(sensor2); Serial.print(" | Sensor 3: "); Serial.print(sensor3); Serial.print(" | Sensor 4: "); Serial.println(sensor4); if (sensor1 < 950) { Keyboard.press(KEY_UP_ARROW); // Forward } else { Keyboard.release(KEY_UP_ARROW); } if (sensor2 < 950) { Keyboard.press(KEY_LEFT_ARROW); // Left } else { Keyboard.release(KEY_LEFT_ARROW); } if (sensor3 < 950) { Keyboard.press(KEY_DOWN_ARROW); // Backward } else { Keyboard.release(KEY_DOWN_ARROW); } if (sensor4 < 950) { Keyboard.press(KEY_RIGHT_ARROW); // Right } else { Keyboard.release(KEY_RIGHT_ARROW); } delay(50); }

Image: 


Schematic:


Video: