摄像头互动

05月 11th, 2009

r0018590

2009年5月9日   La Plantation璃墟

arduino与processing联动 3

06月 10th, 2008

参考了一下processing官网中关于串口通信的例子,发现了更为简便的方法,而且这种方法不会限制传感器的个数。

给大家最简化的代码,这样的代码没有对异常状况的处理,有时间的话,大家可以参考http://processing.org/learning/libraries/serialcallresponse.html

 

 

arduino端:

 

  int analogInput_1 = 2;  

  int analogInput_2 = 3; 

  int analogInput_3 = 4;

  int value_1 = 0;  

  int value_2 = 0; 

  int value_3 = 0;

 

 

void setup() {   

 

  pinMode(analogInput_1, INPUT);

  pinMode(analogInput_2, INPUT);

  pinMode(analogInput_3, INPUT);

 

  beginSerial(9600);

}

 

void loop() 

{

  value_1 = analogRead(analogInput_1);  

  value_2 = analogRead(analogInput_2);

  value_3 = analogRead(analogInput_3);

 

// 这里和前面例子的区别是输出格式不同,输出的直接是传感器获得的完整值   

    Serial.print(value_1, BYTE); 

    Serial.print(value_2, BYTE);      

    Serial.print(value_3, BYTE);

}

 

 

 

 

processing端:

 

import processing.serial.*;

 

Serial port;

String portname = “你的端口名”;

int baudrate = 9600;

int value, value1, value2, value3;

int[] serialInArray = new int[3];

int serialCount = 0;  

 

void setup(){

  size(111, 222); 

  frameRate(22);

  port = new Serial(this, portname, baudrate);

}

 

void serialEvent(int serial){

  serialInArray[serialCount] = serial;

  serialCount++;

 

  if (serialCount > 2 ) {

    //这里的value1、value2、value3是我们要用到的值

    value1 = serialInArray[0];

    value2 = serialInArray[1];

    value3 = serialInArray[2];

//把三个值打印出来以供测试,“\t”的作用是把数值分开,相当于输入几个空格

    println(value1 + “\t” + value2 + “\t” + value3);

 

    serialCount = 0;

  }      

}

 

void draw(){

  while(port.available() > 0){

    value = port.read();

    serialEvent(value);

  }

}

 

如果想使用多个传感器怎么办?串口只有一个 ,既然只能从同一条路出去,就要排个对。刚才是用一个“分隔符”(回车)分开不同时间的数值,这回要用不同的符号把不同的数据“标号”,分别加入对应的“标识符”,下面以两个传感器为例:

arduino端:

// 定义两个传感器的模拟输入端口

int analogInput_1 = 2;

int analogInput_2 = 3;

int value_1 = 0;

int value_2 = 0;

// 设两个标识符

int id_1 = ‘A’;

int id_2 = ‘B’;

void setup() {

// 端口初始化

pinMode(analogInput_1, INPUT);

pinMode(analogInput_2, INPUT);

beginSerial(9600);

}

void loop()

{

// 分别读出两个传感器的值

value_1 = analogRead(analogInput_1);

value_2 = analogRead(analogInput_2);

// 先输出一个标识符,然后输出那个数据,同样也加一个回车,再输出第二个

// (that allows us to know where the values end and when to expect the id)

printByte(id_1);

printInteger(value_1);

printByte(10);

printByte(id_2);

printInteger(value_2);

printByte(10);

delay(10);

}

processing端:

import processing.serial.*;

Serial port;

String portname = “你的端口名”;

int baudrate = 9600;

int value = 0;

// bufA和bufB是两个数值的缓冲区,buf决定读哪个数值

String bufA=”", bufB=”";

int buf;

int value1, value2;

void setup(){

size(111, 222);

frameRate(22);

port = new Serial(this, portname, baudrate);

}

void serialEvent(int serial){

if(serial!=10) {

if (serial==’A') buf = true;

if (serial==’B') buf = false;

if (buf){

if (serial!=’A') bufA += char(serial);

}

else{

if (serial!=’B') bufB+= char(serial);

}

}

else {

if (buf){

value1 = int(bufA);

bufA=”"; //value1是第一个传感器的值

}

else {

value2 = int(bufB);

bufB=”"; //value2是第二个传感器的值

}

}

}

void draw(){

while(port.available() > 0){

value = port.read();

serialEvent(value);

}

}

我们需要从arduino得到一个值,在processing里头利用起来。原理是通过串口输出字符串,每次输出的数值中用一个其他符号隔开,在processing中判断那个符号就可以知道应该获得什么值。

以一个模拟的传感器的输入为例(比如光敏、超声波。。)

 

 

arduino这边的的代码如下:

 

// 输入的端口编号

int analogInput = 3;

//存传感器得到数值的变量

int value = 0;

 

void setup(){

  // 初始化输入端口

  pinMode(analogInput, INPUT);

  // 开始向串口传数据,设置波特率

  beginSerial(9600);

}

 

void loop(){

  // 从arduino的模拟端口读入传感器得到的数值

  value = analogRead(analogInput);

  // 把数值通过串口传出去

  printInteger(value);

  // 加一个分隔符

  printByte(10);

  // 加一个延迟,控制发出数据的频率

  delay(10);

}

 

关于分隔符, printByte(10)其实输出的是一个回车,因为10是回车的ASCII码,这个数只要不是48~59就行。有兴趣的话可以看看ASCII码的对照表 http://dev.csdn.net/article/41/41977.shtm

 

 

接着是processing那边的代码:

 

// 引入必要的类

import processing.serial.*;

// 设一些变量。。。

Serial port;

String portname = “这里填你自己的端口名(比如COM3)”;

int baudrate = 9600;

int value = 0;

String buf=”";

int value1=0;

 

void setup(){

  size(395, 756);

  frameRate(30);

  // 建立和串口的联系,设置端口名和波特率

  port = new Serial(this, portname, baudrate);

  println(port);

}

 

//这个函数处理得到的字符串,得到我们需要的数值

void serialEvent(int serial){

  // 判断是不是分隔符

  if(serial!=10) {

    // 把十进制的ASCII码转化为字符,加入到缓冲区

    buf += char(serial);

  } 

  else {

    // 如果是分隔符,把缓冲区中的字符串转成十进制的数字,并清空缓冲区,这个value1就是我们要用的值

    value1 = int(buf);

    buf=”";

  }

}

 

void draw(){

  // 从串口读出数据,作为serialEvent()的参数

  while(port.available() > 0){

    value = port.read();

    print(”value: “+value+” “);

    serialEvent(value);

  }

}