topical media & game development

talk show tell print

graphic-processing-site-examples-Libraries-Serial-SerialCallResponse-SerialCallResponse.pde / pde



  
Serial Call-Response by Tom Igoe. Sends a byte out the serial port, and reads 3 bytes in. Sets foregound color, xpos, and ypos of a circle onstage using the values returned from the serial port. Thanks to Daniel Shiffman and Greg Shakar for the improvements. Note: This sketch assumes that the device on the other end of the serial port is going to send a single byte of value 65 (ASCII A) on startup. The sketch waits for that byte, then sends an ASCII A whenever it wants more data.

  
   
  
  import processing.serial.*;
  
  int bgcolor;                             // Background color
  int fgcolor;                             // Fill color
  Serial myPort;                       // The serial port
  int[] serialInArray = new int[3];    // Where we'll put what we receive
  int serialCount = 0;                 // A count of how many bytes we receive
  int xpos, ypos;                             // Starting position of the ball
  boolean firstContact = false;        // Whether we've heard from the microcontroller
  
  void setup() {
    size(256, 256);  // Stage size
    noStroke();      // No border on the next thing drawn
  
    // Set the starting position of the ball (middle of the stage)
    xpos = width/2;
    ypos = height/2;
  
    // Print a list of the serial ports, for debugging purposes:
    println(Serial.list());
  
    // I know that the first port in the serial list on my mac
    // is always my  FTDI adaptor, so I open Serial.list()[0].
    // On Windows machines, this generally opens COM1.
    // Open whatever port is the one you're using.
    String portName = Serial.list()[0];
    myPort = new Serial(this, portName, 9600);
  }
  
  void draw() {
    background(bgcolor);
    fill(fgcolor);
    // Draw the shape
    ellipse(xpos, ypos, 20, 20);
  }
  
  void serialEvent(Serial myPort) {
    // read a byte from the serial port:
    int inByte = myPort.read();
    // if this is the first byte received, and it's an A,
    // clear the serial buffer and note that you've
    // had first contact from the microcontroller. 
    // Otherwise, add the incoming byte to the array:
    if (firstContact == false) {
      if (inByte == 'A') { 
        myPort.clear();          // clear the serial port buffer
        firstContact = true;     // you've had first contact from the microcontroller
        myPort.write('A');       // ask for more
      } 
    } 
    else {
      // Add the latest byte from the serial port to array:
      serialInArray[serialCount] = inByte;
      serialCount++;
  
      // If we have 3 bytes:
      if (serialCount > 2 ) {
        xpos = serialInArray[0];
        ypos = serialInArray[1];
        fgcolor = serialInArray[2];
  
        // print the values (for debugging purposes only):
        println(xpos + "\t" + ypos + "\t" + fgcolor);
  
        // Send a capital A to request new sensor readings:
        myPort.write('A');
        // Reset serialCount:
        serialCount = 0;
      }
    }
  }
  
  /*
  
  //  Serial Call and Response
  //  by Tom Igoe
  //  Language: Wiring/Arduino
    
  //  This program sends an ASCII A (byte of value 65) on startup
  //  and repeats that until it gets some data in.
  //  Then it waits for a byte in the serial port, and 
  //  sends three sensor values whenever it gets a byte in.
    
  //  Thanks to Greg Shakar for the improvements
    
  //  Created 26 Sept. 2005
  //  Updated 18 April 2008
  
  int firstSensor = 0;    // first analog sensor
  int secondSensor = 0;   // second analog sensor
  int thirdSensor = 0;    // digital sensor
  int inByte = 0;         // incoming serial byte
  
  void setup()
  {
    // start serial port at 9600 bps:
    Serial.begin(9600);
    pinMode(2, INPUT);   // digital sensor is on digital pin 2
    establishContact();  // send a byte to establish contact until Processing responds 
  }
  
  void loop()
  {
    // if we get a valid byte, read analog ins:
    if (Serial.available() > 0) {
      // get incoming byte:
      inByte = Serial.read();
      // read first analog input, divide by 4 to make the range 0-255:
      firstSensor = analogRead(0)/4;
      // delay 10ms to let the ADC recover:
      delay(10);
      // read second analog input, divide by 4 to make the range 0-255:
      secondSensor = analogRead(1)/4;
      // read  switch, multiply by 155 and add 100
      // so that you're sending 100 or 255:
      thirdSensor = 100 + (155 * digitalRead(2));
      // send sensor values:
      Serial.print(firstSensor, BYTE);
      Serial.print(secondSensor, BYTE);
      Serial.print(thirdSensor, BYTE);               
    }
  }
  
  void establishContact() {
   while (Serial.available() <= 0) {
        Serial.print('A', BYTE);   // send a capital A
        delay(300);
    }
  }
  
  */
  


(C) Æliens 20/2/2008

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.