Projekt CapitalMachine

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