Here is the overall schematic and connections
KIROKAZE
"I'm Dorothy Gale from Kansas"

ellievsbear

Discoholic 🪩
art blog(derogatory)

Love Begins
Xuebing Du

oozey mess

blake kathryn
Cosimo Galluzzi

No title available
hello vonnie
dirt enthusiast
almost home

pixel skylines
No title available
Today's Document
NASA
trying on a metaphor

izzy's playlists!
seen from United States

seen from Mexico
seen from United States
seen from United States

seen from United States

seen from United States
seen from United States

seen from United States
seen from United States
seen from United States
seen from United States
seen from United States
seen from United States
seen from United States

seen from United States

seen from United States
seen from United States
seen from United States
seen from Indonesia
seen from Türkiye
@ethereal-project
Here is the overall schematic and connections
Here is the logic of the process.
Pixel forever!
(If we raise the persistence timing and/or the voltage the result might change drastically)
more pixels!
After 30 seconds for the PRI calibration we start to see some pixel on the surface!
Here we test the whole system as it is supposed to work.
RPi-->OF-->Camera-->Arduino(Serial)
PRI-->Arduino(Resistors)
We are finally testing the box and the resistors.
In this video we are using the laptop camera for debugging. It's easier as we can have control of the Arduino Serial and we can quickly change code if needed.
Here is a quick look on the serial communication RPi-->Arduino and a peek into the drawer.
Here is some documentation of the process to build the enclosure.
We opted for perspex that is a nice and resistant material.
We also found the base that was pretty much what we needed so we adapted it and created a drawer where we could fit the Raspberry Pi and the wires and having access to the power.
The Arduino was enclosed in the perspex box mostly to reduce the distance to the thermochromic surface.
Ideally we would like to have a mobile panel where the arduino and RPi stand and a mobile attachable matrix to integrate with the perspex box.
Maybe in the version 1.2 :)
The matrix is almost ready and we need to check it!
Building and soldering the matrix of 4 x 4 resistor pixel.
was definitely one of the the most challenging part of this project!
We really dreamt of a printed circuit board.
3D printing it is not our strongest skill...
Glitchy Reset
Hm, just guess... The Arduino goes crazy and gets 'stk500_recv(): programmer is not responding' I/O error due reset pin should be properly shut down before uploading a new code or powering off.
{Ethe}{Real} Matrix Schematics [ 4 x 4 ]
Pixeled Video Grabber on OpenFrameworks.
Project to be integrated with Raspberry Pi B, Arduino and a portable web camera.
NO EASTER EGGS THIS TIME :(
Ethereal Project, MA Computational Arts, Goldsmiths University, 2014
Antonio Daniele & Vladimir V. Kuchinov
Hardware:
2 x TPIC6B595 shift registers attached to pins 2, 3, 4 and 5 of the Arduino
16 x SMD 51R resistors attached to each of the outputs of two shift registers connected in serial.
1 x HC-SR501 Human Sensor Module Pyroelectric Infrared
accompanying with web camera, OpenFrameworks & Raspberry Pi ...
Based on the examples created by Tom Igoe & Kristian Gohlke
EASTER EGGS INCLUDED, EVEN IT'S CHRISTMAS TIME :)
{Ethe}{Real} Project Sketch [Release Candidate]
/*
Ethereal Project, MA Computational Arts, Goldsmiiths University 2014 Antonio Daniele & Vladimir V. Kuchinov Hardware: * 2 x TPIC6B595 shift registers attached to pins 2, 3, 4 and 5 of the Arduino, as detailed below. * 16 x SMD 51R resistorsattached to each of the outputs of two shift registers conected in serial. * 1 x HC-SR501 Human Sensor Module Pyroelectric Infrared Based on the exampled created by Tom Igoe & Kristian Gohlke Comments: Through experimentations we have figured out that shift registers work more accurate if every output goes one by one. There is one little 'hack' - due resistor requires 1-3 seconds to heat up, the code not just bypassing "turned off" resistors, but stays for a little time there. */
/* BUGS: Human sensor never goes to 'motion ended' mode. This could be a potential Achilles' heel 7 Unfortunate Events - 1 reset! Go for #12!
*/
//Due cooldown takes more time that heating, we reserved 1 minute //for matrix to rest after initialization
const int coolingDown = 30000;
//Define shif register pins //One set on pins for every shift register in serial const int clearPin = 2; const int latchPin = 3; const int dataPin = 4; const int clockPin = 5;
const int skippingTime = 250; const int heatingTime = 3000;
//byte #1: //The array for shift register #1 const int seq2[16] = { 1, 2, 4, 8, 16, 32, 64, 128, 0, 0, 0, 0, 0, 0, 0, 0 }; //byte #2: The array for shift register #2 const int seq1[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 8, 16, 32, 64, 128 };
/* There 17 elements instead of 16, because fist elemnt is a virtual initialization, not a pixel (output)
Initial value of 250ms is basically skipping the pixel, enough for shift register to change states */
int frameData[17]; int frameCount = 1; // pasring counter
//Define human sensor data pin int humanPin = 10; const int calibrationTime = 30;
//the time when the sensor outputs a low impulse long unsigned int lowIn;
//the amount of milliseconds the sensor has to be low //before we assume all motion has stopped long unsigned int pause = 5000;
boolean lockLow = true; boolean takeLowTime;
int incomingByte = 0;
int resetPin = 12;
void setup() {
//setting reset digitalWrite(resetPin, HIGH); pinMode(resetPin, OUTPUT); //HAVE TO BE AFTER digitalWrite!!!!
delay(200);
Serial.begin(9600);
//setting frame array frameData[0] = 49; //initialization byte, not output for(int b = 1; b < 17; b++){ frameData[b] = skippingTime; //set OFF state to all pixels by default } //Initializing output pins pinMode(dataPin, OUTPUT); pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(clearPin, OUTPUT);
pinMode(humanPin, INPUT); digitalWrite(humanPin, LOW); Serial.println("pins: end of initializing");
delay(200);
//cooling down Serial.println("calm down and chill out"); delay(coolingDown); Serial.print("sensor: calibration started"); for(int i = 0; i < calibrationTime; i++){ Serial.print("."); delay(1000); } Serial.println("sensor: now active"); delay(200);
}
void loop(){
if(digitalRead(humanPin) == HIGH){
if (Serial.available() > 0 ) {
// read the incoming byte: incomingByte = Serial.read();
if( incomingByte != 45 && incomingByte != 36){
//digitalWrite(ledPin, HIGH); //the led visualizes the sensors output pin state // say what you got: Serial.print(incomingByte); if(incomingByte == 1 && frameCount <= 17) { frameData[frameCount] = heatingTime; } Serial.print(","); frameCount++;
}
else if (incomingByte == 45){ Serial.println("EOF"); digitalWrite(humanPin, LOW); Serial.println("rendering matrix"); renderMatrix(frameData);
} }
if(lockLow){
//makes sure we wait for a transition to LOW before any further output is made: lockLow = false; Serial.print("sensor: motion detected at "); Serial.print(millis()/1000); Serial.println(" sec"); delay(200);
}
takeLowTime = true;
}
if(digitalRead(humanPin) == LOW){ //digitalWrite(ledPin, LOW);//the led visualizes the sensors output pin state
if(takeLowTime){ lowIn = millis(); //save the time of the transition from high to LOW takeLowTime = false; //make sure this is only done at the start of a LOW phase } //if the sensor is low for more than the given pause, //we assume that no more motion is going to happen if(!lockLow && millis() - lowIn > pause){
//makes sure this block of code is only executed again after //a new motion sequence has been detected lockLow = true; Serial.print("motion ended at "); //output Serial.print((millis() - pause)/1000); Serial.println(" sec"); delay(200); } }
}
void renderMatrix(int delays[]){
Serial.println("parsing frame: start"); for(int d = 0; d < 17; d++) { Serial.print(delays[d]); Serial.print(", "); }
Serial.println("parsing frame: end"); digitalWrite( clearPin, HIGH);
Serial.println("matrix: rendering"); for (int x = 0; x < 17; x++) { digitalWrite(latchPin, LOW); //Pull latch LOW to start sending data shiftOut(dataPin, clockPin, MSBFIRST, seq1[x]); //Send the data byte 1 shiftOut(dataPin, clockPin, MSBFIRST, seq2[x]); //Send the data byte 2 digitalWrite(latchPin, HIGH); //Pull latch HIGH to stop sending data delay(delays[x]); }
Serial.println("matrix: rendered"); delay(200);
//reseting everything digitalWrite(resetPin, LOW);
}
Typographic Test "HI THERE!"
//Shift pins const int clearPin = 2; const int latchPin = 3; const int dataPin = 4; const int clockPin = 5;
int seq2[16] = {1, 2, 4, 8, 16, 32, 64, 128, 0, 0, 0, 0, 0, 0, 0, 0}; //The array for storing the // byte #1 value int seq1[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 8, 16, 32, 64, 128}; //The array for storing the // byte #2 value
const int turnOFF = 250; const int turnON = 3000;
// HI_THERE! int hello[9][17] = { { 49, turnON, turnOFF, turnOFF, turnON, turnON, turnON, turnON, turnON, turnON, turnON, turnON, turnON, turnON, turnOFF, turnOFF, turnON}, //h { 49, turnOFF, turnON, turnON, turnOFF, turnOFF, turnOFF, turnOFF, turnOFF, turnOFF, turnON, turnON, turnOFF, turnOFF, turnON, turnON, turnOFF}, //i { 49, turnOFF, turnOFF, turnOFF, turnOFF, turnOFF, turnOFF, turnOFF, turnOFF, turnOFF, turnOFF, turnOFF, turnOFF, turnOFF, turnOFF, turnOFF, turnOFF}, //space { 49, turnON, turnON, turnON, turnON, turnOFF, turnON, turnON, turnOFF, turnOFF, turnON, turnON, turnOFF, turnOFF, turnON, turnON, turnOFF}, //t { 49, turnON, turnOFF, turnOFF, turnON, turnON, turnON, turnON, turnON, turnON, turnON, turnON, turnON, turnON, turnOFF, turnOFF, turnON}, //h { 49, turnON, turnON, turnON, turnON, turnON, turnOFF, turnOFF, turnOFF, turnON, turnON, turnON, turnOFF, turnON, turnON, turnON, turnON}, //e { 49, turnON, turnON, turnON, turnON, turnON, turnON, turnON, turnON, turnON, turnOFF, turnON, turnOFF, turnON, turnOFF, turnOFF, turnON}, //r { 49, turnON, turnON, turnON, turnON, turnON, turnOFF, turnOFF, turnOFF, turnON, turnON, turnON, turnOFF, turnON, turnON, turnON, turnON}, //e { 49, turnOFF, turnON, turnON, turnOFF, turnOFF, turnON, turnON, turnOFF, turnOFF, turnOFF, turnOFF, turnOFF, turnOFF, turnON, turnON, turnOFF} //exclamation }; int letter = 0;
void setup() { Serial.begin(9600); pinMode(dataPin, OUTPUT); //Configure each IO Pin pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(clearPin, OUTPUT);
// delay for setting up delay(2000); Serial.println("End of initializing"); }
void loop() { digitalWrite( clearPin, HIGH); Serial.println("process matrix"); for (int x = 0; x < 17; x++) //Array Index { Serial.println(seq1[x]); Serial.println(seq2[x]); digitalWrite(latchPin, LOW); //Pull latch LOW to start sending data shiftOut(dataPin, clockPin, MSBFIRST, seq1[x]); //Send the data byte 1 shiftOut(dataPin, clockPin, MSBFIRST, seq2[x]); //Send the data byte 2 digitalWrite(latchPin, HIGH); //Pull latch HIGH to stop sending data delay(hello[letter][x]); } Serial.println("stop matrix"); digitalWrite(clearPin, LOW); if(letter >= 9) { letter = 0; Serial.println("matrix is cooling down for 30 sec"); delay(30000); } letter++; }
*/