Trump Tie

Made by svitoora and johnnywu

When Trump tweets anything sexist, racist, or oppressive the tie becomes erected.

Created: February 16th, 2017

0


Intention

Male dominance plays a vital role in political polarization. Arguably, underlying everything from sexist language to immigrant racial profiling is a politician's sense of masculinity being threatened. As males, it's often easier to avoid thinking about the oppression of other minority groups, because males are rarely ever systemically oppressed. By manifesting everyday sexism, racism, and injustice on Donald Trump's Twitter into the physical world through an ambient display’s glanceability, we hope that we can help raise awareness to the degree of toxic masculinity in today's politics.

Example of Trump tweet.


Little precedent of such political ambient data visualization can be found on the internet.

0

Context

"We are currently being assaulted by the 24-hour news cycle that and a hostile political climate that extends into all facets of our media consumption". The vast amount of data we consume through the media every day is incomprehensible and paralyzing. In design, there is a concept called information paralysis. Information paralysis refers to the notion that when given too much information within a short timeframe, we tend to become paralyzed and don't know how to act. Such is the case for a powerpoint slide filled with too much text or a table with too many numbers. Data visualization can help us reduce information paralysis, but often time the visualizations are cold, rational, and not effective in rousing people's feelings and actions because the representation is too abstract (Ambient Influence Can Twinkly Lights Lure and Abstract Representations Trigger Behavioral Change, Rogers et al). Thus, to make the visualization more visceral and compelling, we have chosen to use a metaphor of a phallic tie in order to illustrate the abstract concept of political oppression.


Example of an data abstract representation that fails to rouse emotion and thereby behavioral change.

0

Process

Concept Generation:

Working rapidly and visually to generate and articulate ideas.


Selected concept after consulting with Eric on feasibility.

Software:

There were a few challenges we encountered along the building process. On the software side, there were issues finding methods for splitting a string into a list of strings by a delimiter. I ended up writing the method manually. There were also issues with the Photon hard resetting each time the event was called. It turned out to be an issue with memory, as the lists it was looping through were too long. I solved this by reducing list lengths, and ensuring more efficiency by taking out redundant steps. 

0
int ledPin = D0;

long frameCount = 0;
Servo myservo;  // create servo object to control a servo
                // a maximum of eight servo objects can be created

int Input = 0;
int pos = 0;    // variable to store the servo position
int ErrectDuraction = 7000;
int ErrectPos = 170;
int RestingPos = 80;


void setup() {
    Particle.subscribe("new_tweet", readTweet);
    pinMode(ledPin, OUTPUT);
    Serial.begin(9600);
    Serial.println("begin");
    
    pinMode(D1, OUTPUT);
    myservo.attach(D1);  // attaches the servo on pin 0 to the servo object
    
    
    myservo.write(RestingPos);
    delay(500);
    myservo.detach();  // attaches the servo on pin 0 to the servo object
    
    

}

void loop() {
    if (frameCount % 10000 == 0) {
        Serial.print("checking in: ");
        Serial.println(frameCount);
    }
    
    frameCount++;
    
}

void readTweet(const char *event, const char *data) {
    
    Serial.println("read tweet");
    const char* wordList[] = {"alternative facts", "atheism", "censorship", 
    "civil rights", "climate change", "drug legalization", 
    "energy crisis", "extremism", "foreign aid", 
    "gay rights", "hacking", "health insurance", "immigration", "labor unions", 
    "minimum wage", "nuclear energy", "offshore drilling", "privacy", "racial profiling", "social security", 
    "stem cells","women's rights","fat","Pig","Dog","Slob","Disgusting animal","ass","wife","women","nail","dating","skin","sex","flirt","make out","sexual","attractive"
    "unattractive","husband","bimbo","fat","crooked","pussy","miss","Miss USA","black"
    };
    
    int spaceIndex = -1;
    int startIndex = 0;
    String tweetWord = "";
    String tweetList[50];
    int wordNum = 0;
    String dataa = String(data);
    Serial.println("started");
    if (dataa.indexOf(" ", startIndex) == -1) {
        Serial.println(dataa);
    } else {
        while(dataa.indexOf(" ", startIndex) != -1) {
            spaceIndex = dataa.indexOf(" ", startIndex);
            tweetWord = dataa.substring(startIndex, spaceIndex);
            tweetList[wordNum] = tweetWord;
            startIndex = spaceIndex + 1;
            wordNum++;
        }
    }
    int breakNum = 0;
    Serial.println(wordNum);
    for (int i = 0; i < wordNum; i++) {
        for (int j = 0; j < sizeof(wordList); j++){
            if (Contains(wordList[j], tweetList[i])) {
                Serial.println("KEYWORD");
                digitalWrite(ledPin, HIGH);
                 myservo.attach(D1);  // attaches the servo on pin 0 to the servo object
                
                //hardcode jitter
                
                myservo.write(ErrectPos*1);              // tell servo to go to position in variable 'pos'
                delay(800);
                myservo.write(ErrectPos*1.2);              // tell servo to go to position in variable 'pos'
                myservo.write(ErrectPos*1.3);              // tell servo to go to position in variable 'pos'
                delay(800);
                myservo.write(ErrectPos*1.1);              // tell servo to go to position in variable 'pos'
                myservo.write(ErrectPos*1.4);              // tell servo to go to position in variable 'pos'
                delay(250);
                myservo.write(ErrectPos*1.0);              // tell servo to go to position in variable 'pos'
                delay(250);
                myservo.write(ErrectPos*1.5);              // tell servo to go to position in variable 'pos'
                delay(250);
                myservo.write(ErrectPos*1.0);              // tell servo to go to position in variable 'pos'
                 myservo.write(ErrectPos*1.2);              // tell servo to go to position in variable 'pos'
                myservo.write(ErrectPos*1.3);              // tell servo to go to position in variable 'pos'
                delay(800);
                myservo.write(ErrectPos*1.1);              // tell servo to go to position in variable 'pos'
                myservo.write(ErrectPos*1.4);              // tell servo to go to position in variable 'pos'
                delay(250);
                myservo.write(ErrectPos*1.0);              // tell servo to go to position in variable 'pos'
                delay(250);
                myservo.write(ErrectPos*1.0);              // tell servo to go to position in variable 'pos'
                delay(250);
                myservo.write(ErrectPos*1.5);              // tell servo to go to position in variable 'pos'
                delay(250);
                myservo.write(ErrectPos*1.0);              // tell servo to go to position in variable 'pos'
                delay(250);
                myservo.write(ErrectPos*1.5);              // tell servo to go to position in variable 'pos'
                delay(250);
                myservo.write(ErrectPos*1.0);              // tell servo to go to position in variable 'pos'
                 myservo.write(ErrectPos*1.2);              // tell servo to go to position in variable 'pos'
                myservo.write(ErrectPos*1.3);              // tell servo to go to position in variable 'pos'
                delay(800);
                myservo.write(ErrectPos*1.1);              // tell servo to go to position in variable 'pos'
                myservo.write(ErrectPos*1.4);              // tell servo to go to position in variable 'pos'
                delay(250);
                myservo.write(ErrectPos*1.0);              // tell servo to go to position in variable 'pos'
                 myservo.write(ErrectPos*1.2);              // tell servo to go to position in variable 'pos'
                myservo.write(ErrectPos*1.3);              // tell servo to go to position in variable 'pos'
                delay(800);
                myservo.write(ErrectPos*1.1);              // tell servo to go to position in variable 'pos'
                myservo.write(ErrectPos*1.4);              // tell servo to go to position in variable 'pos'
                delay(250);
                
                //Hardcode animation end
                
                myservo.write(RestingPos);              // tell servo to go to position in variable 'pos'
                delay(100);
                myservo.detach();  // attaches the servo on pin 0 to the servo object

                breakNum++;
                break;
            }
            if (breakNum > 0) {
                break;
            }
        }
        if (breakNum > 0) {
            break;
        }
    }
    
    delay(1000);
    digitalWrite(ledPin, LOW);
}

//http://stackoverflow.com/questions/5029612/how-to-match-text-in-string-in-arduino
//determines if one string is inside another
bool Contains(String s, String search) {
    int max = s.length() - search.length();

    for (int i = 0; i <= max; i++) {
        if (s.substring(i) == search) return true; // or i
    }

    return false; //or -1
}
Click to Expand
0
Hardware:


Working through ideas visually and consulting Engineers.

Consulting the mechanical engineers in the classroom, I was recommended to use a step motor to simulate the curviness in the flaccid state of the tie. Turns out, according to Jessie, step motors are really difficult to work with coding wise. Given the time limit, I opted for a less elegant solution of a servo and modifying the aesthetic of the metaphor slightly.

Hooking up my first servo and using the Arduino Sweep.ino to understand how it works. Here I also learn that 360˚ servos exist, and requires a different set of code to work with. Knowing this, I opted for a non 360˚ servo I found from the Robotics Club.


Zip tie is attached with fishing-wire and hot glue. Zip ties provides the perfect blend of elasticity, lightness, and strength at an affordable price and availability.


First iteration of Trump tie. The tie is just taped to zip tie in these photo. 

Circuitry of Trump tie.


Fabricating Trump tie's box out of white foam core to emphasis Trump's whiteness.


Finding a way to put the zip tie into the neck tie so that masking tape isn't visual on the surface.


Circuitry inside Trump Tie's box.


Trump tie completed.

0

Product


The final outcome turned out well. It is a tie mounted on a white box that raises itself when Trump tweets certain controversial words. The prototype is complete, since it meets our goal requirements. Another thing that could be added is perhaps a more solid box. Additional articles of clothing with their own unique motions could represent other politicians. The code can also be cleaned up and improved upon. Functions could be more modular and extensible. While there are many avenues of improvement, in the end, the device reached our expectations.  


Flaccid state


Erected State

0

Reflection

Johnny:

We learned more about programming with Photon’s C++ based language. We had wrongly assumed it would have more pre-built functions like Python. However, it was a good learning experience and exercise to write functions out. We also learned that the Photon has a memory limit, and space is valuable in this context. It will help us be more wary in the future. There is not necessarily something we would do differently, since we reached our goals without too many setbacks. 

Supawat:

Getting the hardware to work was difficult. There wasn't an online tutorial I can look up in terms of getting the tie to become flaccid and erected, therefore I had to improvise through rapid prototyping. Fabricating this hardware is a confusing and ambiguous design space, and I'm really glad for my first semester Design Studio experience.

As a team of design and information systems student, I was responsible majorly for ideating the concept and hardware side of things. Working through ideas rapidly and visually helped me generate and articulate concepts. And while I generated the concept, alone I would be unable to complete my idea for I lacked the data-scraping skill Johnny possess. While I'm interested in learning more about the data scraping side of things, this project has helped inform me of the values of my role as a designer can bring to a team in tech.

0

Living with Trump Tie

Living with Trump Tie for a day in the freshman studio it never became erected. Sadly the goal of illustrating the frequency of which oppressive language is used in Trump's twitter isn't met. This is due to two factors: time zone difference and Trump really doesn't tweet oppressive tweets frequent enough on a daily scale that makes this product worth having.

Another thing that I discovered was that the servo was noisy when inactive for I forgot to servo.detach it when its not being used. Adding a line of servo.detach made Trump Tie truly recede into background when it's inactive.


x
Share this Project


Focused on
About

When Trump tweets anything sexist, racist, or oppressive the tie becomes erected.