diff --git a/.gitignore b/.gitignore index 85f269a..1ed9360 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,5 @@ application.linux64 application.windows32 application.windows64 application.macosx + +ephimera/data/ diff --git a/arduino/arduino.ino b/arduino/arduino.ino new file mode 100644 index 0000000..7d4c5e0 --- /dev/null +++ b/arduino/arduino.ino @@ -0,0 +1,59 @@ +#include +#include + +Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); + +#define SERVOMIN 150 // this is the 'minimum' pulse length count (out of 4096) +#define SERVOMAX 600 // this is the 'maximum' pulse length count (out of 4096) + + +int atomPins[] = {2,3,4,5,6,7,8,9}; +int currentValue = 0; +int values[] = {0,0,0,0,0,0,0,0,0}; +int cycle = 0; + +void setup() { + Serial.begin(9600); + + for(int i=0; i<8; i++) { + pinMode(atomPins[i], OUTPUT); + } + + pwm.begin(); + pwm.setPWMFreq(60); // Analog servos run at ~60 Hz updates + + delay(10); +} + + +void loop() { + if(Serial.available()){ + int incomingValue = Serial.read(); + + values[currentValue] = incomingValue; + + currentValue++; + if(currentValue > 8){ + currentValue = 0; + } + cycle = 0; + } + + while(cycle != 8) { + for(int i=0; i<8; i++) { + if(values[i]>0) { + values[i]--; + digitalWrite(atomPins[i], HIGH); + pwm.setPWM(i, 0, 400); + if(values[i]==0) { + digitalWrite(atomPins[i], LOW); + pwm.setPWM(i, 0, 100); + cycle++; + } + } + } + delay(100); + } + + +} diff --git a/ephimera/ephimera.pde b/ephimera/ephimera.pde new file mode 100644 index 0000000..d974ae4 --- /dev/null +++ b/ephimera/ephimera.pde @@ -0,0 +1,43 @@ +import processing.io.*; +import processing.serial.*; +import processing.video.*; +import processing.serial.*; + +Serial port; +Capture video; +PImage img; + +int videoWidth = 640; +int videoHeight = 480; + +void setup() { + size(640, 480, P2D); + frameRate(10); + colorMode(HSB, 100, 100, 100); + + String portName = Serial.list()[0]; + port = new Serial(this, portName, 9600); + + video = new Capture(this, width, height); + video.start(); + + background(0); +} + +void draw() { + ephPercentage(); +} + +void keyPressed() { + if (key == 'S' || key == 's') { + video.stop(); + printArray(colorValues); + makePicture(); + } + if (key == 'B' || key == 'b') { + backupFrame(); + } + if (key == 'G' || key == 'g') { + video.start(); + } +} diff --git a/ephimera/frames.pde b/ephimera/frames.pde new file mode 100644 index 0000000..0ba497e --- /dev/null +++ b/ephimera/frames.pde @@ -0,0 +1,14 @@ +void makePicture() { + saveFrame("data/shot.gif"); + img = loadImage("shot.gif"); + ephSerial(); +} + +void backupFrame() { + // save picture with results for backup + saveFrame("history/shot_" + + nf(year(), 4) + nf(month(), 2) + nf(day(), 2) + "_" + + nf(hour(), 2) + nf(minute(), 2) + nf(second(), 2) + + ".gif"); + println("color count image saved"); +} diff --git a/ephimera/history/shot_20190927_175024.gif b/ephimera/history/shot_20190927_175024.gif new file mode 100644 index 0000000..db5400c Binary files /dev/null and b/ephimera/history/shot_20190927_175024.gif differ diff --git a/ephimera/history/shot_20190927_175028.gif b/ephimera/history/shot_20190927_175028.gif new file mode 100644 index 0000000..e2b29b3 Binary files /dev/null and b/ephimera/history/shot_20190927_175028.gif differ diff --git a/ephimera/percentage.pde b/ephimera/percentage.pde new file mode 100644 index 0000000..6d4059a --- /dev/null +++ b/ephimera/percentage.pde @@ -0,0 +1,68 @@ +int cellSize = 20; +int cols = videoWidth / cellSize; +int rows = videoHeight / cellSize; +int cellN = (cols)*(rows); +int[] colorValues = {0, 0, 0, 0, 0, 0, 0, 0}; +byte[] colorByteValues = {0, 0, 0, 0, 0, 0, 0, 0}; +int colorsN = colorValues.length; +float colorsRange = float(100)/float(colorsN-2); + +void ephPercentage() { + + if (video.available()) { + video.read(); + video.loadPixels(); + + for(int i = 0; i 20 && briVal < 80) { + colorValues[constrain(int(hueVal/colorsRange),0,colorsN-3)]++; + } else if(briVal <= 20) { + colorValues[colorsN-2]++; + } else if(briVal >= 80) { + colorValues[colorsN-1]++; + } + + pushMatrix(); + translate(x+cellSize/2, y+cellSize/2); + rectMode(CENTER); + fill(c); + noStroke(); + rect(0, 0, cellSize+6, cellSize+6); + popMatrix(); + } + } + + // Print colors percentage values + for(int i = 0; i