Projekt CapitalMachine
Obsah
CapitalMachine (umělecká instalace)
Umělecký objekt vybízí k diskuzi o povaze současného kapitalismu. CapitalMachine představuje fiktivní "okno" do světa kapitálu a jeho abstraktních pochodů. Průhledná krychle neustálé bliká a na displeji zobrazuje částečně reálné a částečně fiktivní údaje o stavu světového kapitalismu, data z kapitálových trhů, nárůst akcelerace nebo abstrakce (viz kód). Divák je nalepenou cedulkou TOUCH THE CAPITAL i samotnou fyzickou přítomností vybízen k tomu, aby se ke CapitalMachinu přiblížil. Jakmile to udělá, je detekován, CapitalMachine na displeji zobrazí jednu z několika zpráv oznamujících, že kapitál je jako entita nedotknutelný a nepolapitelný. Cílem je poukázat na tekutost současného kapitalismu, který veškeré entity a děje převádí na směnnou hodnotu a činí tak způsobem, který je fyzicky i konceptuálně obtížné pochopit.
Autor
Ondřej Trhoň
Použitý materiál
Breadboard Kopie Arduina Nano 3 Pyroelektrický detektor pohybu typu HC-SR501 LED displej 16x2 s rozhraním I2C Modrá dioda Červená dioda 2x 220ohm rezistor propojovací kabely bublinková fólie (vystlání krabice) tvrdá průhledná fólie (nařezaná, stěny krychle) izolepa (slepení), papír (cedulky, explikace)
Zapojení
Vlastní zdrojový kód
//inicializace knihoven a displeje
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
//inicializace pinů s diodami a senzorem, deklarace
const int analogInPin = A0; // Analog input pin that the potentiometer is attached to
const int analogOutPin = 9; // Analog output pin that the LED is attached to
const int redPin = 11; // Red LED connected to digital pin 12
const int bluePin = 12;
int sensorValue = 0; // value read from the pot
int outputValue = 0; // value output to the PWM (analog out)
int timeCheckVar = 0;
unsigned long lastChange;
//unsigned long difference;
void setup() {
// initialize serial communications at 9600 bps:
lcd.begin();// inicializuje displej
lcd.backlight(); // zapne podsvětlení
Serial.begin(9600);
pinMode(redPin, OUTPUT); // sets the digital pin as output
pinMode(bluePin, OUTPUT); // sets the digital pin as output
}
//funkce pro čtení stavu senzoru pohybu
void readSensor() {
// read the analog in value:
sensorValue = analogRead(analogInPin);
// map it to the range of the analog out:
outputValue = map(sensorValue, 0, 1023, 0, 255);
// change the analog out value:
analogWrite(analogOutPin, outputValue);
}
bool checkTime(unsigned long interval) {
unsigned long difference = millis() - lastChange;
if (difference > interval) {
Serial.println("checkTime true");
lastChange = millis();
return true;
} else {
return false;
}
}
void idleMessage() {
lcd.clear();
int pocitadlo = random(1, 9);
digitalWrite(bluePin, HIGH);
switch (pocitadlo) {
case 1 :
lcd.print("EndrophineLvl");
lcd.setCursor(0, 1);
lcd.print("+10 / SATISFIED");
break;
case 2 :
lcd.print("NASDAQprice");
lcd.setCursor(0, 1);
lcd.print("7692.82 / -0.26%");
break;
case 3 :
lcd.print("ColtanMiningRate");
lcd.setCursor(0, 1);
lcd.print("-3.55% LOW_ALERT");
break;
case 4 :
lcd.print("AbstractionIndex");
lcd.setCursor(0, 1);
lcd.print("+898 +5.35% good");
break;
case 5 :
lcd.print("S&P 500");
lcd.setCursor(0, 1);
lcd.print("2754.88 / +0.19%");
break;
case 6 :
lcd.print("CapitaloceneRate");
lcd.setCursor(0, 1);
lcd.print("IceMelt+30/m3/hr");
break;
case 7 :
lcd.print("MoodGenerator");
lcd.setCursor(0, 1);
lcd.print(">LoadingDystopia");
break;
case 8 :
lcd.print("Accelerating?");
lcd.setCursor(0, 1);
lcd.print(">SOMEWHAT");
break;
default :
lcd.print("error");
}
}
void activeMessage() {
lcd.clear();
int pocitadlo = random(1, 3);
switch (pocitadlo) {
case 1 :
lcd.print("Capital is ");
lcd.setCursor(0, 1);
lcd.print("untouchable!");
break;
case 2 :
lcd.print("Capital resists");
lcd.setCursor(0, 1);
lcd.print(" tangibility!");
break;
default :
lcd.print("error");
}
}
void idle() {
bool changeMessage = checkTime(1000);
if (changeMessage) {
idleMessage();
digitalWrite(bluePin, LOW);
}
}
void active() {
activeMessage();
digitalWrite(redPin, HIGH);
delay(2000);
digitalWrite(redPin, LOW);
}
void loop() {
readSensor();
Serial.println(outputValue);
if (outputValue > 161) {
active();
} else {
idle();
}
}
Popis vývoje a konečná verze vlastního produktu
Základní loop funkce neustále kontroluje stav senzoru pohybu. Pokud vrací nulu, spouští funkce idle - ta zobrazí jednu z několika zpráv (náhodně) a blikne diodou. Pokud začně senzor posílat data (vždy vyšší než 161), spustí funkci active - ta zobrazují jednu ze dvou aktivních zpráv na delší dobu spolu s červenou diodou. Největším problémem během vývoje bylo vymyslet strukturu skriptu tak, aby do sebe správně zapadaly jednotlivé loopy a přístroj neměl nepříjemná zpoždění. Jediný vážnější nedostatek jsou limity HC-SR501 čipu - senzor má delay 2,5 vteřiny po aktivaci, což efektivně znamená, že znovu začne měřit až dvě a půl vteřiny po jedné aktivaci a relativně široký záběr jeho buňky (cca 3m).
Zhodnocení
Projekt jsem prezentoval na MakerFaire, slušel by mu ale víc kontemplativní kontext. Síla objektu není v jeho technické rafinovanosti a provedení, ale v myšlence a působení na diváka. Během tvorby jsem se naučil hodně, samotný skript má poměrně sofistikovanou strukturu a bez pomoci bych ho nevymyslel. Pro budoucí verze bych rád vylepšil obal (místo lepení izolepou slepit lepidlem a stěny místo nožem řezat přesně na řezačce, případně použít lepší verzi displeje s více řádky.
Fotodokumentace
Videogalerie
https://www.instagram.com/p/BkcmSqrh-Xn/?taken-by=ondrejtrhon