2015年2月9日 星期一

靜聽花開的聲音

這是一個 Arduino 與 Processing 互動的實例,改變 Arduino A0 pin 輸出的值就可以讓 Processing 裏的樹狀結構改變形狀。

原文詳 http://playground.arduino.cc/Interfacing/ProcesssHackForFirmata



Arduino Code

請開啟並上載 File > Examples > Firmata > StandardFirmata.ino


Processing Code

/*
* Recursive Tree
 * by Daniel Shiffman
 *
 * Renders a simple tree-like structure via recursion
 * Branching angle calculated as a function of horizontal mouse  location
 */
import processing.serial.*; // reference the serial library

import cc.arduino.*; // reference the arduino library

Arduino arduino; // create a variable arduino of the Arduino data type

float theta;
void setup() {
  size(200, 200);
  smooth();
  println(Serial.list()); // List all the available serial ports:

  //arduino = new Arduino(this, Arduino.list()[0], 57600);
  arduino = new Arduino(this, "COM4", 57600);
}

void draw() {

  background(0);
  frameRate(30);
  stroke(255);
  // Let's pick an angle 0 to 90 degrees based on the mouse position
  /* float a = (mouseX / (float) width) * 90f; // original line */

  float a = (arduino.analogRead(0) / (float) width) * 90f;

  // Convert it to radians
  theta = radians(a);
  // Start the tree from the bottom of the screen
  translate(width/2, height);
  // Draw a line 60 pixels
  line(0, 0, 0, -60);
  // Move to the end of that line
  translate(0, -60);
  // Start the recursive branching!
  branch(60);
}

void branch(float h) {
  // Each branch will be 2/3rds the size of the previous one
  h *= 0.66f;

  // All recursive functions must have an exit condition!!!!
  // Here, ours is when the length of the branch is 2 pixels or less
  if (h > 2) {
    pushMatrix();    // Save the current state of transformation (i.e. where are we now)
    rotate(theta);   // Rotate by theta
    line(0, 0, 0, -h);  // Draw the branch
    translate(0, -h); // Move to the end of the branch
    branch(h);       // Ok, now call myself to draw two new branches!!
    popMatrix();     // Whenever we get back here, we "pop" in order to restore the previous matrix state

    // Repeat the same thing, only branch off to the "left" this time!
    pushMatrix();
    rotate(-theta);
    line(0, 0, 0, -h);
    translate(0, -h);
    branch(h);
    popMatrix();
  }
}


建議您

你也可以把 Processing Code 這一行

 float a = (arduino.analogRead(0) / (float) width) * 90f;

改成

float a = (mouseX / (float) width) * 90f;

如此,即可不必透過讀取 Arduino A0 pin 的值,只要左右移動滑鼠就可以改變樹的形狀。






沒有留言:

張貼留言