Tomorrow could be different
R = Proces G = Project B = Research
Wave forms Random Function TouchDesigner Audio PixelSorting Typographic Creative Coding CELLULAR AUTOMATA neither is without the other construction neither is without the other Transition of values Spotify streaming history I accept, but do not read Poster 2.0 Theoretical Research Visual Research Dummy Contact Concept

neither is without the other

NEITHER IS WITHOUT THE OTHER is a semi-automatic project that experiments with the relation between artists and machines. Technology has started to play an increasingly important role in our livers. Devices are becoming part of our bodies. It is this relationship between man and machine that provides an interesting dialogue about the future of art. Therefore, the idea to use a machine (robot) came from the initial curiosity to test if it could be possible to replace an artist in making a work and whether the use of automation has any impact on creativity.

The robot used in this experiment, is a so called Obstacle Avoiding Car. It uses an HC-SR04 sensor mounted on top of a servo to locate walls in a maze using echolocation. The 4 DC-motors are powered by 4 AA batteries. An L293D Motor Driver Shield drives four geared motors, one on each wheel. An Arduino UNO on top of the L293D Motor Driver Shield controls everything. The car moves forward until it sees a wall that is closer than a given distance. If this condition is met, the car backs up and the servo rotates 90 degrees to the left for the sensor to scan how far away the left wall is. The servo then rotates 180 degrees to the right to scan the distance to the right wall. If the left wall is more distant, the car will turn for a certain amount (this is adjustable) of time to the left, and vice versa. See the system diagram for further explanations.

Run 1 / Run 2 / Run 3 / Run 4 / Run 5 / Run 6 / Run 7 / Run 8 / Run 9 / Run 10 / Run 11

Conclusion/reflection

The conclusion I can draw from this experiment, is that the artist can not completely be replaced by this particularly robot. The artist was always present during the process, even when the artist was not in physical contact with the work itself. After all, the artist programs the robot. The robot that was used could not have functioned without the presence of the artist. However, this view of who is present can also be reversed. Thus, the work could not have been created without the presence of the robot. The works that were created can be seen more as a dialogue between two components. This reasoning is inspired the German philosopher Martin Heidegger, and in particularly his book ‘The origin of the work of art’ (2009).[1] In this work, Heidegger argues that the artist and the work consist of a dynamic in which each is a supplier of the other. The artist is the origin of the work. The work is the origin of the artist. Neither is without the other. Nonetheless, neither is the sole support of the other. Artist and work are each, in themselves and in their reciprocal relation, on account of art.

[1] Heidegger, M. (2009). Kleine Klassieken - De oorsprong van het kunstwerk (1ste editie). Boom Lemma.
Heidergger-1

Perspective 1

Heidergger-2

Perspective 2

System Diagram Robot

systemdiagram

Code ARDUINO OBSTACLE AVOIDING CAR

//Code ARDUINO OBSTACLE AVOIDING CAR
//AFMotor Library https://learn.adafruit.com/adafruit-motor-shield/library-install //
//NewPing Library https://github.com/livetronic/Arduino-NewPing// 
//Servo Library https://github.com/arduino-libraries/Servo.git //

#include   
#include 
#include  

#define TRIG_PIN A0 
#define ECHO_PIN A1 
#define MAX_DISTANCE 200 
#define MAX_SPEED 190 // sets speed of DC  motors
#define MAX_SPEED_OFFSET 20

NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE); 

AF_DCMotor motor1(1, MOTOR12_1KHZ); 
AF_DCMotor motor2(2, MOTOR12_1KHZ);
AF_DCMotor motor3(3, MOTOR34_1KHZ);
AF_DCMotor motor4(4, MOTOR34_1KHZ);
Servo myservo;   

boolean goesForward=false;
int distance = 100;
int speedSet = 0;

void setup() {

    myservo.attach(10);  
    myservo.write(90); 
    delay(2000);
    distance = readPing();
    delay(100);
    distance = readPing();
    delay(100);
    distance = readPing();
    delay(100);
    distance = readPing();
    delay(100);
}

void loop() {
    int distanceR = 0;
    int distanceL =  0;
    delay(40);
    
    if(distance<=15)
    {
    moveStop();
    delay(100);
    moveBackward();
    delay(300);
    moveStop();
    delay(200);
    distanceR = lookRight();
    delay(200);
    distanceL = lookLeft();
    delay(200);

    if(distanceL>=distanceR)
    {
    turnRight();
    moveStop();
    }else
    {
    turnLeft();
    moveStop();
    }
    }else
    {
    moveForward();
    }
    distance = readPing();
}

int lookRight()
{
    myservo.write(45); 
    delay(500);
    int distance = readPing();
    delay(100);
    myservo.write(90); 
    return distance;
}

int lookLeft()
{
    myservo.write(135); 
    delay(500);
    int distance = readPing();
    delay(100);
    myservo.write(90); 
    return distance;
    delay(100);
}

int readPing() { 
    delay(70);
    int cm = sonar.ping_cm();
    if(cm==0)
    {
    cm = 250;
    }
    return cm;
}

void moveStop() {
    motor1.run(RELEASE); 
    motor2.run(RELEASE);
    motor3.run(RELEASE);
    motor4.run(RELEASE);
    } 
    
void moveForward() {

    if(!goesForward)
    {
    goesForward=true;
    motor1.run(FORWARD);      
    motor2.run(FORWARD);
    motor3.run(FORWARD); 
    motor4.run(FORWARD);     
    for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2)
    {
    motor1.setSpeed(speedSet);
    motor2.setSpeed(speedSet);
    motor3.setSpeed(speedSet);
    motor4.setSpeed(speedSet);
    delay(5);
    }
    }
}

void moveBackward() {
    goesForward=false;
    motor1.run(BACKWARD);      
    motor2.run(BACKWARD);
    motor3.run(BACKWARD);
    motor4.run(BACKWARD);  
    for (speedSet = 0; speedSet < MAX_SPEED; speedSet +=2)
    {
    motor1.setSpeed(speedSet);
    motor2.setSpeed(speedSet);
    motor3.setSpeed(speedSet);
    motor4.setSpeed(speedSet);
    delay(5);
    }
}  

void turnRight() {
    motor1.run(FORWARD);
    motor2.run(FORWARD);
    motor3.run(BACKWARD);
    motor4.run(BACKWARD);     
    delay(500);
    motor1.run(FORWARD);      
    motor2.run(FORWARD);
    motor3.run(FORWARD);
    motor4.run(FORWARD);      
} 
    
void turnLeft() {
    motor1.run(BACKWARD);     
    motor2.run(BACKWARD);  
    motor3.run(FORWARD);
    motor4.run(FORWARD);   
    delay(500);
    motor1.run(FORWARD);     
    motor2.run(FORWARD);
    motor3.run(FORWARD);
    motor4.run(FORWARD);
}  
                

Run 1

Black marker on 120 gr white paper. Duration of run was 5 minutes, 8,91 x 4,20cm. The biggest problem was that the car was not responding as it should. It was going forward a distance less than 15cm instead of more.

ObstacleCar-Test-Run-1

Run 2

ObstacleCar-Test-Run-2

Run 3

By using the if conditional it is possible to write a code that allows the program to make a decision about a specific action. In this case I let the program define the time and colour output.


//Time
void setup() {

    int w = int(random(11));

    if (w==0) {
    println("1MIN");
    } else if (w==1) {
    println("2MIN");
    } else if (w==2) {
    println("3MIN");
    } else if (w==3) {
    println("4MIN");
    } else if (w==4) {
    println("5MIN");
    } else if (w==5) {
    println("6MIN");
    } else if (w==6) {
    println("7MIN");
    } else if (w==7) {
    println("8MIN");
    } else if (w==8) {
    println("9MIN");
    } else {
    println("10MIN");
    } 
}
                    

//Color
void setup() {

    int w = int(random(12));
    
    if (w==0) {
        println("Zwart");
    } else if (w==1) {
        println("Grijs");
    } else if (w==2) {
        println("Bruin");
    } else if (w==3) {
        println("LichtBruin");
    } else if (w==4) {
        println("Roze");
    } else if (w==5) {
        println("Groen");
    } else if (w==6) {
        println("LichtGroen");
    } else if (w==7) {
        println("Blauw");
    } else if (w==8) {
        println("LichtBlauw");
    } else if (w==9) {
        println("Rood");
    } else if (w==10) {
        println("Oranje");
    } else {
        println("Geel");
    }
}
                    

Ouput Run 3


println("Groen");
                    

println("Lichtgroen");
                    

println("8 minuten");
                    

End Result

ObstacleCar-Test-Run-3

Run 4

Ouput Run 4


println("Blauw");
                    

println("LichtBruin");
                    

println("9 minuten");
                    

End Result

ObstacleCar-Test-Run-4

Run 5

First attempt with the new frame (see construction page). Time and colour were not defined during this run.

ObstacleCar-Test-Run-5

Run 6

In this run, I tried to use acrylic paint. However, that it is a fast-drying paint made of pigment suspended. Therefore, it is not a practical solution for this experiment. Secondly, I changed the turnRight() and turnLeft() turning time from 500 ms to 1000 ms to see what the difference could be.


//Turning time
void turnRight() {
    motor1.run(FORWARD);
    motor2.run(FORWARD);
    motor3.run(BACKWARD);
    motor4.run(BACKWARD);     
    delay(1000);
    motor1.run(FORWARD);      
    motor2.run(FORWARD);
    motor3.run(FORWARD);
    motor4.run(FORWARD);      
} 

    void turnLeft() {
    motor1.run(BACKWARD);     
    motor2.run(BACKWARD);  
    motor3.run(FORWARD);
    motor4.run(FORWARD);   
    delay(1000);
    motor1.run(FORWARD);     
    motor2.run(FORWARD);
    motor3.run(FORWARD);
    motor4.run(FORWARD);
}
                    

Ouput Run 6


println("12MIN");
                    

println("RED");
                    

End Result

ObstacleCar-Test-Run-6

Run 7

In this run, I used Winsor & Newton blue ink (it was the only colour I had available) with a SAKURA Koi Water Brush. There were two problems during this run. One, the brush needed more pressure otherwise it would not leave a trace. Second, the sensor broke down after 7 minutes.

ObstacleCar-Test-Run-7

Run 8

Stabilo Easy Start filling - 0,5 mm. During this run I let the robot drive for 50:55,16 minutes. Time and colour were not defined.

ObstacleCar-Test-Run-8
ObstacleCar-Test-Run-8

Run 9

Three Stabilo Easy Start fillings - 0,5 mm. Let the robot run even longer: 1:00:12,56 minutes. Time and colour were not defined.

ObstacleCar-Test-Run-9

Run 10

In this run I tried to experiment with the interaction between human and machine. While the robot was active, I painted around it so that afterwards the robot would create a mark. The problem that I encountered was that the acrylic paint was too thick so the robot was getting stuck.

ObstacleCar-Test-Run-10

Run 11

This time, I used water-based paint hoping it would not get stuck. And instead of brushing all over the place, I focused only on the current position of the robot. While it is a better paint to use, it still got stuck a couple of times. The robot is very sensitive when it comes to what for surface it is on. The video itself is in my opinion the most interesting part of this experiment.

ObstacleCar-Test-Run-11