E16: Interface and Application Programming


How to MAKE it

I wanted to use my ADCInputBoard from week 11 to read the magnatic field from the hall sensor I have attached to the board and to produce a visual output.

For this assigment I used Processsing.
As a basis I used this simple Graph example, by David A. Mellis, Tom Igoe and Scott Fitzgerald
However, I did modifications to make it work and to improve. First, I had to change the baud rate to 4800.
I also wanted to visualize not just a value read from the serial input, I also wanted to distingush between the orientation of the magnet (north and south pole). Thus, I added some conditions and changed the output graph.

Here is the code

/* Processing example for serial communication and visual output


// This program takes ASCII-encoded strings
// from the serial port at 4800 baud and graphs them. It expects values in the
// range 0 to 1023, followed by a newline, or newline and carriage return

// Original by David A. Mellis, modified by Tom Igoe and Scott Fitzgerald
// and finally modified by Karsten Nebe for FabAcademy 2016
// This example code is in the public domain.

*/

import processing.serial.*;

Serial myPort;        // The serial port
int xPos = 1;         // horizontal position of the graph
float inByte = 0;

void setup () {
  // set the window size:
  size(800, 400);

  // List all the available serial ports
  // if using Processing 2.1 or later, use Serial.printArray()
  println(Serial.list());

  // I know that the first port in the serial list on my mac
  // is always my  Arduino, so I open Serial.list()[0].
  // Open whatever port is the one you're using.
  myPort = new Serial(this, Serial.list()[1], 4800);

  // don't generate a serialEvent() unless you get a newline character:
  myPort.bufferUntil('\n');

  // set inital background:
  background(0);
  
}
void draw () {
  
  
  // draw the line (in differnt colors for N/S): 
  if ( inByte > height/2 ){ 
    stroke(127, 34, 255); // blue
    line(xPos, height/2 , xPos, height - inByte);
  }
  else{
    stroke(255, 0, 0); // red
    line(xPos, height - inByte, xPos, height/2 );
  }

  // 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);
  
    inByte = map(inByte, 0 , 1023, 0, height);
    
    println(inByte);
  }
}

Downloads

Processing file 'serialCommunicationADCInputBoard.pde'

Take Away's

Using serial communication in processing is surprisingly easy - it is almost similar to the way you do it in the Arduino environment (using standard libraries).