For this assignment week we had to write an application that interfaces with an input &/or output device that we made, comparing as many tool options as possible.
For this assignment week we had to write an application that interfaces with an input &/or output device that we made, comparing as many tool options as possible.
For me it was the first time that I tried to do an application interface and I started with processing with a simple read example, and I change the shape and the color of the element. I draw a purple triangle associate to the COM5, the same port that I used in Arduino, so when I press the button (pin2) in Arduino blue led (pin 10) is high and in processing the purple triangle became darker. I used the board of the sensor distance that I did in the input device class but with this example I just used the button and the led of the board to show the serial connection between Arduino and processing.
Processing arduino test1 from vretana on Vimeo.
// Processing code reading port test_Arduino import processing.serial.*; Serial myPort; // Create object from Serial class int val; // Data received from the serial port void setup() { size(400,400); // Open port COM5. String COM5 = Serial.list()[0]; myPort = new Serial(this, COM5, 9600); } void draw() { if ( myPort.available() > 0) { // If data is available, val = myPort.read(); // read it and store it in val } background(210); // Set background to white if (val == 0) { // If the serial value is 0, fill(160,0,160); // set fill to purple } else { // If the serial value is not 0, fill(215,184,245); // set fill to light purple } triangle(250, 200, 20, 300, 300, 360); }
//Arduino code_test processing reading port int switchPin = 2; // Switch connected to pin 4 void setup() { pinMode(switchPin, INPUT_PULLUP); // Set pin 0 as an input Serial.begin(9600); // Start serial communication at 9600 bps } void loop() { if (digitalRead(switchPin) == HIGH) { // If switch is ON, Serial.write(1); // send 1 to Processing digitalWrite(10,LOW); } else { // If the switch is not ON, Serial.write(0); // send 0 to Processing digitalWrite(10,HIGH); } delay(100); // Wait 100 milliseconds }
Then I tried to show visually the data that I receive from the sensor distance that I used in the input device class, so I started with the Arduino Graph example.
This was more difficult for me, at the beginning I just got two values from Arduino so it was just like a presence sensor but I couldn’t get gradual values, but I realized that one of the problems was that I wasn´t using a newline in Arduino so processing was taking every new value so as it just read the first time, also I had a problem because I was doing a serial print of ASCII values to see the distance in Arduino, but to do a serial connection with processing I can just print one value.
At the beginning I was taking the values directly from the sensor but it was too fast, so I decided to get an average of the sensor values and do a “serial.prinln” of them.
video processing distance graph from vretana on Vimeo.
// Processing code reading port test_Arduino graph import processing.serial.*; Serial myPort; // The serial port int xPos = 1; //We declare a variable of integers, horizontal position of the graph float inByte = 0; //We declare a variable with decimal numbers void setup () { // set the window size: size(400, 300); // List all the available serial ports println(Serial.list()); // Open port COM6 to do serial comunication myPort = new Serial(this, "COM6", 9600); // Establishes a specific byte to buffer before calling up serialEvent myPort.bufferUntil('\n'); // set inital background, 0 black background(0); } void draw () { // draw the line, stroke is the colour and line: stroke(127, 7,7 ); line(xPos, height, xPos, height - inByte); // at the edge of the screen, go back to the beginning: if (xPos >= width) { xPos = 0; background(0); } else { // increment the horizontal position: xPos++; } } void serialEvent (Serial myPort) { // get the ASCII string: String inString = myPort.readStringUntil('\n'); if (inString != null) { // trim off any whitespace: inString = trim(inString); // convert to an int and map to the screen height: inByte = float(inString); println(inByte); inByte = map(inByte, 0, 50, 0, height); } }
//Arduino code_Arduino graph #include#define TRIGGER_PIN2 5 // Arduino pin tied to trigger pin on the ultrasonic sensor. #define ECHO_PIN2 6 // Arduino pin tied to echo pin on the ultrasonic sensor. #define MAX_DISTANCE2 50 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm. NewPing sonar(TRIGGER_PIN2, ECHO_PIN2, MAX_DISTANCE2); // NewPing setup of pins and maximum distance. int medida=0; // We set the variable "medida" (measure) int suma=0; // We set the variable "suma" (sum) int media=0; // We set the variable "media" (average) void setup() { Serial.begin(9600); // Open serial monitor at 9600 baud to see ping results. } void loop() { for(int i=0 ; i<5 ; i++){ // for loop (We set the variable "i",initial value 0 end value 4, so we have 5 values, we add 1 to each value in the next round ) delay(50); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings. medida=sonar.ping_cm(); //We say that the "medida" variable is the data we collect function with sonar.ping from the new ping library(cm) suma=suma+medida; // We say that to each value of the "suma" collected will let us add the loop collected as sensor value } media=suma/5; // "media" value is the sum value between 5 suma=0; // to start the loop again Serial.println(medida); // Print the values stored in the "medida" variable }