When Trump tweets anything sexist, racist, or oppressive the tie becomes erected.
Created: February 16th, 2017
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.
"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.
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.
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
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.