diff --git a/positionfinder/positionfinder.pde b/positionfinder/positionfinder.pde new file mode 100644 index 0000000..49dcf41 --- /dev/null +++ b/positionfinder/positionfinder.pde @@ -0,0 +1,176 @@ +/** + * Simple Read + * + * Read data from the serial port and change the color of a rectangle + * when a switch connected to a Wiring or Arduino board is pressed and released. + * This example works with the Wiring / Arduino program that follows below. + */ + + +import processing.serial.*; + +Serial myPort; // Create object from Serial class +int analoglow; // Data received from the serial port +int analoghigh; // Data received from the serial port +int newdata=0; + +int screenwidth=1024; +int screenheight=768; + +int xstart; +int ystart; +int xend; +int yend; + +int testpart=1; //0=finished, 1=left, 2=right, 3=up, 4=down + +int readingA=0; +int readingB=0; + +int stopsize=30; //minimum rect height and width +int minvaluedistance=50; //how far analog values need to be apart + +void setup() +{ + size(1024, 768); + + xstart=0; + ystart=0; + xend=width; + yend=height; + + printArray(Serial.list()); + //String portName = Serial.list()[35]; + String portName="/dev/ttyUSB0"; + myPort = new Serial(this, portName, 115200); +} + +void draw() +{ + if ( myPort.available() > 0) { // If data is available, + String inBuffer = trim(myPort.readString()); + if (inBuffer != null) { + //println(inBuffer); + String[] list = split(inBuffer, ';'); + //print("list="); + //printArray(list); + if (list.length>=2){ + analoglow=parseInt(list[0]); + analoghigh=parseInt(list[1]); + //print("->"); + //print(analoglow); + //print(","); + //println(analoghigh); + newdata+=1; + } + } + } + + + + + + if (newdata>=3){ //wait some reading + newdata=0; //reset counter + + int reading=analoglow; //use only one analog value + + switch(testpart){ + case 1: //left + readingA=reading; + print("A="); println(readingA); + testpart++; //next part + break; + case 2: //right + readingB=reading; + print("B="); println(readingB); + //apply to positions + if (readingA>readingB+minvaluedistance){ //left part was brighter + xend=xstart+(xend-xstart)/2; + println("Left"); + testpart++; //next part + }else if(readingB>readingA+minvaluedistance){ + xstart=xstart+(xend-xstart)/2; + println("Right"); + testpart++; //next part + }else{ + print("No definitely better part found: "); + print(readingA); print(" vs. "); println(readingB); + float randommove=random(-(xstart-xend)/20,(xstart-xend)/20); + while (abs(randommove)<1){ + randommove*=2; + } + xstart+=randommove; //move rect a bit + xend+=randommove; + testpart--; + } + break; + case 3: //up + readingA=reading; + print("A="); println(readingA); + testpart++; //next part + break; + case 4: //down + readingB=reading; + print("B="); println(readingB); + if (readingA>readingB+minvaluedistance){ //upper part was brighter + yend=ystart+(yend-ystart)/2; + println("Up"); + testpart++; //next part + }else if(readingB>readingA+minvaluedistance){ + ystart=ystart+(yend-ystart)/2; + println("Down"); + testpart++; //next part + }else{ + print("No definitely better part found: "); + print(readingA); print(" vs. "); println(readingB); + float randommove=random(-(ystart-yend)/20,(ystart-yend)/20); + while (abs(randommove)<1){ + randommove*=2; + } + ystart+=randommove; //move rect a bit + yend+=randommove; //move rect a bit + testpart--; + } + break; + } + + + if (testpart>4){ + testpart=1; + } + + print("Testing Part:"); + println(testpart); + } + + if (yend-ystart<=stopsize){ + testpart=0; //stop + } + + + + background(0); // Set background to white + clear(); + fill(255); + rectMode(CORNERS); + switch(testpart){ //draw current segment + case 1: //left + rect(xstart, ystart, xstart+(xend-xstart)/2, yend); + break; + case 2: //right + rect(xstart+(xend-xstart)/2, ystart, xend, yend); + break; + case 3: //up + rect(xstart, ystart, xend, ystart+(yend-ystart)/2); + break; + case 4: //down + rect(xstart, ystart+(yend-ystart)/2, xend, yend); + break; + } + + + + + +} \ No newline at end of file