摄像头互动
05月 11th, 2009

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与processing联动 2
06月 7th, 2008
如果想使用多个传感器怎么办?串口只有一个 ,既然只能从同一条路出去,就要排个对。刚才是用一个“分隔符”(回车)分开不同时间的数值,这回要用不同的符号把不同的数据“标号”,分别加入对应的“标识符”,下面以两个传感器为例:
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联动 1
06月 7th, 2008
我们需要从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);
}
}
