Background/context

We have all been frustrated with our computers at some point. We are dependent on computers in many ways, and when they fail to work properly

  • we have all been frustrated
  • lack of empowerment when we don't understand the internals
  • * but sometimes knowing the insides is even more frustrating
  • have had urge to smash the computer
  • * destroy the black box
  • take the computational power of computer and use it to simulate it's own destruction
  • provide the opportunity for a physical expression of frustration against the unfeeling computer
  • explore issues of simulated violence
  • * does it make us more or less violent?
  • * will you smash your computer when you get home?

Audience

  • anyone who has been frustrated with their computer

User scenario

  • user sees progress meter on screen
  • after certain point (or pressure sensor) computer will crash
  • user can press reset button to reboot
  • at any point, can hit with sledgehammer
  • projected image of computer breaks apart depending on force from sledgehammer

Implementation

  • custom software written using OpenGL, Open Dynamics Engine for physics simulation
  • AVR microcontroller code written using BASCOM-AVR
  • beige computer case instrumented with sensors
  • projection screen and projector
  • plastic/rubber sledgehammer

Conclusion

  • provides a safe environment to vent frustration
  • cathartic experience
  • computational power of computer can be turned against itself

References

Code for reading from ADXL210 from PIC (adapted from ITP Sensor Workshop report):

DEFINE OSC 8

xTilt VAR WORD
yTilt VAR WORD
XPin VAR portc.2
YPin VAR portc.3
tx VAR portc.6
rx VAR portc.7
n9600 CON 16468
inbyte VAR BYTE
PAUSE 500

serout2 portc.6, 16468, ["Damn, this works.",10,13]

main:

    SERIN2 rx, n9600, [inbyte]
    'serout2 portc.6, 16468, ["Got this thing - ",dec inbyte, 10,13]    
    PULSIN XPin, 1, xTilt
    PULSIN YPin, 1, yTilt

    SEROUT2 tx, n9600, [DEC xTilt.HighByte, ",", DEC xTilt.LowByte]
    SEROUT2 tx, n9600, ["-", DEC yTilt.HighByte, ",", DEC yTilt.LowByte, 10,13]
    'SEROUT2 tx, n9600, [xTilt.HighByte, xTilt.LowByte, yTilt.HighByte, yTilt.LowByte]
    PAUSE 100

GOTO main

More code. Works! Programmed onto chip labelled "16".

DEFINE OSC 8

xTilt VAR WORD
yTilt VAR WORD
xTiltMax var word
yTiltMax var WORD
xTiltMin var word
yTiltMin var word
XPin VAR portc.2
YPin VAR portc.3
tx VAR portc.6
rx VAR portc.7
n9600 CON 16468
inbyte VAR BYTE
PAUSE 500

LEDPin var portb.7  

'system test---LED blinks five times to verify code is running
i var byte
    for i = 0 to 4
        high LEDpin
        pause 200
        low LEDPin
        pause 200
        next

serout2 portc.6, 16468, ["Damn, this works.",10,13]

' Initialize to current value
initialize:
    pulsin xpin, 1, xTilt
    pulsin ypin, 1, ytilt

    xtiltMax = XTILT
    YTILTMAX = YTILT
    xTiltMin = xTiltMax
    yTiltMin = yTiltMax

main:
    PULSIN XPin, 1, xTilt
    PULSIN YPin, 1, yTilt
 
    if xTilt > xTiltMax then
        xtiltMax = xtilt
    else
        if xTilt < xTiltMin THEn
            xTiltMin = xTilt
     endif
    endif
    
    if ytilt > ytiltmax then
     ytiltmax = ytilt
    else
        if yTilt < yTiltMin THEN
         yTiltMin = yTilt
        endif
    endif
 
    'look for some serial, and if it doesn't arrive, keep sampling
    SERIN2 rx, n9600, 2, main, [inbyte]
    'serout2 portc.6, 16468, ["Got this thing - ",dec inbyte, 10,13] 

    SEROUT2 tx, n9600, ["x",hex2 xTiltMax.HighByte, hex2 xTiltMax.LowByte]
    SEROUT2 tx, n9600, [",", HEx2 xTiltMin.HighByte, HEX2 xTiltMin.LowByte, 10,13]
    SEROUT2 tx, n9600, ["y",Hex2 yTiltMax.HighByte, hex2 yTiltMax.LowByte]
    SEROUT2 tx, n9600, [",", HEx2 yTiltMin.HighByte, HEX2 yTiltMin.LowByte, 10,13]      
    'SEROUT2 tx, n9600, [xTilt.HighByte, xTilt.LowByte, yTilt.HighByte, yTilt.LowByte ]
    PAUSE 100
    goto initialize

GOTO main

M = max, m = min

Untested.. should output as xHMLMhmlmyHMLMhmlm\10\13

DEFINE OSC 8

xTilt VAR WORD
yTilt VAR WORD
xTiltMax var word
yTiltMax var WORD
xTiltMin var word
yTiltMin var word
XPin VAR portc.2
YPin VAR portc.3
tx VAR portc.6
rx VAR portc.7
n9600 CON 16468
inbyte VAR BYTE
PAUSE 500

LEDPin var portb.7  

'system test---LED blinks five times to verify code is running
i var byte
    for i = 0 to 4
        high LEDpin
        pause 200
        low LEDPin
        pause 200
        next

serout2 portc.6, 16468, ["Ready to smash.",10,13]

' Initialize to current value
initialize:
    pulsin xpin, 1, xTilt
    pulsin ypin, 1, ytilt

    xtiltMax = XTILT
    YTILTMAX = YTILT
    xTiltMin = xTiltMax
    yTiltMin = yTiltMax

main:
    PULSIN XPin, 1, xTilt
    PULSIN YPin, 1, yTilt
 
    if xTilt > xTiltMax then
        xtiltMax = xtilt
    else
        if xTilt < xTiltMin THEn
            xTiltMin = xTilt
     endif
    endif
    
    if ytilt > ytiltmax then
     ytiltmax = ytilt
    else
        if yTilt < yTiltMin THEN
         yTiltMin = yTilt
        endif
    endif
 
    'look for some serial, and if it doesn't arrive, keep sampling
    SERIN2 rx, n9600, 2, main, [inbyte]
    'serout2 portc.6, 16468, ["Got this thing - ",dec inbyte, 10,13] 

    SEROUT2 tx, n9600, ["x", HEX2 xTiltMax.HighByte, HEX2 xTiltMax.LowByte]
    SEROUT2 tx, n9600, [HEX2 xTiltMin.HighByte, HEX2 xTiltMin.LowByte]
    SEROUT2 tx, n9600, ["y", HEX2 yTiltMax.HighByte, HEX2 yTiltMax.LowByte]
    SEROUT2 tx, n9600, [HEX2 yTiltMin.HighByte, HEX2 yTiltMin.LowByte, 10,13]      
    PAUSE 10
    goto initialize

GOTO main