按动Arduino控制器相连的右按钮,Processing花布上的矩形彩条,从0度到360度顺时针旋转,按动左按钮,从360度到0度逆时针旋转,彩条填充颜色随机变幻。旋转彩条下方的“Merry Christmas!”,也变幻颜色。按动按钮后,会先清屏,再彩条旋转。
Arduino与Processing的通讯是RS232串口通讯,端口号为COM3。
视频:(把喇叭打开,好听的圣诞歌曲)
互动媒体技术是电子学与美学结合的产物,我想可以用于广告、展会和玩具、电子竞技游戏等产品中,现在只有一些美术院校开设这类课程并有新媒体人士进行了一定的探索。我作为机电专业人士,最近也对此感兴趣,为啥搞机电的人不能玩玩数位艺术,机电学院的学生为啥不能学下互动媒体技术,学理科的学生为啥不能玩下Processing,Processing起码可以让我们可视化、图形化地感受到我们所学的电学知识、物理知识、高等数学知识,不能让那些枯燥的知识,更有趣味吗?
实验照片:
实验用到了一个Arduino控制器和一个传感器接口板,两个大按钮模块和一个LED模块。这些实验设备购买于DFRobot官方淘宝: http://dfrobot.taobao.com/。按钮模块教程请看: http://www.roboticfan.com/blog/user_2005/1229/archives/2009/200912919317.shtml。
下面分别是Arduino程序和Processing程序,我用蓝色字体标注了与串口通信相关的程序段。
Arduino程序:
const int forward_button = 7;//定义forward按钮连在数字端口7
const int back_button = 6; //定义back按钮连在数字端口6
const int ledPin = 9;
void setup()
{
pinMode(ledPin,OUTPUT);//设置食人鱼为输出
pinMode(forward_button,INPUT);//设置forward按钮为输入
pinMode(back_button,INPUT);//设置back按钮为输入
digitalWrite(ledPin,HIGH);//初始化是食人鱼熄灭
Serial.begin(9600);//设置串行通信的波特率
}
void loop()
{
// int 前面有 const说明以下定义的是变量:
// 读forward按钮状态到局部变量read_forwardbutton:
int read_forwardbutton = digitalRead(forward_button);
// 读back按钮状态到局部变量read_backbutton:
int read_backbutton = digitalRead(back_button);
if (read_forwardbutton ==LOW) //判断forward按钮是否按下
{
delay(50);//延时50毫秒
read_forwardbutton = digitalRead(forward_button);
if (read_forwardbutton ==LOW)//为防抖,再次判断forward按钮是否按下
{
Serial.print(1,BYTE);//向processing发送forward按钮按下标志
while(digitalRead(forward_button)==LOW);//等待forward按钮松开
Serial.print(0,BYTE);//向processing发送按钮松开标志
digitalWrite(ledPin, LOW);//点亮食人鱼
}
}
if (read_backbutton ==LOW)//判断back按钮是否按下
{
delay(50);//延时50毫秒
read_backbutton = digitalRead(back_button);
if (read_backbutton ==LOW)//为防抖,再次判断back按钮是否按下
{
Serial.print(2,BYTE);//向processing发送back按钮按下标志
while( digitalRead(back_button)==LOW);//等待back按钮松开
Serial.print(0,BYTE);//向processing发送按钮松开标志
digitalWrite(ledPin,HIGH);//熄灭食人鱼
}
}
}
Processing程序:
/*接收到Arduino控制器传来的右按钮按下的信息,
彩条从0度到360度顺时针旋转,
接收到Arduino控制器传来的左按钮按下的信息,
彩条从360度到0度逆时针旋转。*/
import processing.serial.*;//导入serial通信库
Serial duankou;//创建对象duankou
PFont f;
int frame=0;//变量frame为旋转角度值
int flag=0;//变量flag标志哪个按钮是否按下
int data;//变量data作为接受到的数据
void setup() {
//设定通讯端口为COM3,波特率为9600
duankou = new Serial(this,"COM3",9600);
//设定画布大小和背景颜色
size(600, 700);
background(255);
smooth();
noStroke();
//字体为“Arial”
f= createFont("Arial",48,true);
}
void draw()
{
//当processing接受到Arduino传来的字节
if(duankou.available()>0)
{
//把Arduino传来的字节存入变量data
data=duankou.read();
//把Arduino传来的字节显示在控制台中
println(data);
//如果data为1,说明forward_button被按下
if(data==1)
{
flag=1;//彩条顺时针旋转标志
background(255);//清屏
}
//如果data为2,说明back_button被按下
if(data==2)
{
flag=2;//彩条逆时针旋转标志
background(255);//清屏
}
//如果data为0,并不会改变旋转标志
}
//如果彩条顺时针旋转,且旋转角度小于等于360度
if(flag==1 && frame<=360)
{
frame+=1;//增加旋转角度
//每增加10度
if (frame % 10 == 0 )
{
//"Merry Christmas!"字体大小为48,填充颜色随机变幻
fill(random(255),random(255),0);
textSize(48);
text("Merry Christmas!",100,650);
//矩形彩条顺时针旋转10度位置
fill(frame * 3 % 255, frame * 5 % 255,
frame * 7 % 255);
pushMatrix();
translate(300, 300);
rotate(radians(frame % 360));
rect(0, 0, 280, 40);
popMatrix();
}
}
//如果彩条逆时针旋转,且旋转角度大于等于0度
if(flag==2 && frame >=0)
{
frame -= 1;//减小旋转角度
//每减少10度
if (frame % 10 == 0)
{
//"Merry Christmas!"字体大小为48,填充颜色随机变幻
fill(random(255),random(255),0);
textSize(48);
text("Merry Christmas!",100,650);
//矩形彩条填充颜色随机变幻
fill(frame * 3 % 255, frame * 5 % 255,
frame * 7 % 255);
//矩形彩条逆时针旋转10度位置
pushMatrix();
translate(300, 300);
rotate(radians(frame % 360));
rect(0, 0, 280, 40);
popMatrix();
}
}
}
祝大家2011年圣诞节快乐!