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