<aside> 🏠 Back to IMA Documentations

</aside>

Concept

Hayeon Hwang's Expressive Tactile Controls really stuck in my head. I really love how it translate subtle movements into human emotions. I also love how it transform the button to something else. I want to try to make something resemble this fun tactile feeling. Initially, I tried to focus on how to make a button that isn't a button. After talking to Viola and Morgan, I decided to focus on the emotional aspect of the button interaction. I want to translate my indecisiveness to a button, creating a tension between the physical form and the its propose.

Sketches

Viola told me I could add a second element to the interaction. She suggested to look into talking to the button to encourage and support it to have it make a decision. I love this idea. However, due to the time constraints and technical challenges, I decided to shift away for this amazing idea.

I was drawn to the idea of how a person's interaction to the button itself could be the act of encouragement or listening. The end goal could be allowing the device or the narrative of the interaction to show vulnerability.

Sorry, I don't know how to spell😭

Sorry, I don't know how to spell😭

I finally decided to use the thermal printer to print out some words that represent what the button is thinking and presenting its thoughts in physical form.

Code

// add the NeoPixel and Thermal Printer library
#include <Adafruit_NeoPixel.h>
#include "Adafruit_Thermal.h"

#define BUTTON_PIN   5  // Connected Button Pin
#define PIXEL_PIN    6  // Digital IO pin connected to the NeoPixels.
#define PIXEL_COUNT 1  // Number of NeoPixels

// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(PIXEL_COUNT, PIXEL_PIN, NEO_GRB + NEO_KHZ800);

Adafruit_Thermal printer(&Serial1);

const int buttonPin = 5;

boolean oldState = HIGH;
int     mode     = 0;    // Currently-active animation mode, 0-9

void setup() {
  
  Serial1.begin(19200);
  printer.begin(); 

  printer.setFont('A');
  printer.justify('L');
  printer.boldOn();

  pinMode(BUTTON_PIN, INPUT_PULLUP);
  strip.begin(); // Initialize NeoPixel strip object (REQUIRED)
  strip.show();  // Initialize all pixels to 'off'

}

void loop() {

  // Get current button state.
  boolean newState = digitalRead(BUTTON_PIN);

  // Check if state changed from high to low (button press).
  if((newState == LOW) && (oldState == HIGH)) {
    // Short delay to debounce button.
    delay(20);
    // Check if button is still low after debounce.
    newState = digitalRead(BUTTON_PIN);
    if(newState == LOW) {      // Yes, still low
      if(++mode > 9) mode = 0; // Advance to next mode, wrap around after #8
      switch(mode) {           // Start the new animation...
        case 0:
          colorWipe(strip.Color(  0,   0,   0), 10);    // Black/off
          break;
        case 1:
          colorWipe(strip.Color(  0,   0,   0), 10);    // Black/off
          break;
        case 2:
          colorWipe(strip.Color(  0,   0,   0), 10);    // Black/off
        break;
        case 3:
          printer.println(F("I don't know if can do it..."));
          printer.println();
          printer.println();
          colorWipe(strip.Color(10, 10, 10), 10);
          break;
        case 4:
          printer.println(F("I have been worrying a lot lately..."));
          printer.println();
          printer.println();
          colorWipe(strip.Color(  10, 10,   50), 10);
          break;
        case 5:
          printer.println(F("Can I still lit up the led correctly?"));
          printer.println();
          printer.println();
          colorWipe(strip.Color(  20, 20,   20), 10);
          break;
        case 6:
          printer.println(F("Is it what you looking for?"));
          printer.println();
          printer.println();
          colorWipe(strip.Color(  255, 255,   255), 10);
          
          break;
        case 7:
          printer.println(F("Ahh did I messed up the color?"));
          printer.println();
          printer.println();
          colorWipe(strip.Color(  255, 100,   255), 10);
          break;
        case 8:
          printer.println(F("I hope I did it right"));
          printer.println();
          printer.println();
          colorWipe(strip.Color(  100, 100,   100), 10);
          break;
        case 9:
          printer.println(F("Ahhh don't think about! It's done"));
          printer.println();
          printer.println();
          colorWipe(strip.Color(  255, 255,   255), 10);
          break;
      }
    }
  }

  // Set the last-read button state to the old state.
  oldState = newState;
}

void colorWipe(uint32_t color, int wait) {
  for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...
    strip.setPixelColor(i, color);         //  Set pixel's color (in RAM)
    strip.show();                          //  Update strip to match
    delay(wait);                           //  Pause for a moment
  }
}

Final Look

https://youtu.be/gFYu6lTrPzY

Reflection

Thinking back, I should have spend more time to focus on exploring the emotional parts of the device. I also having a hard time to think beyond a box with a button. I would like to explore more or make more projects with different exterior.