好了,继续我们的Arduino之旅,Arduino与processing的交互在前面已经实现,所以这次我们要干啥呢?首先,我们得看看Labview,Labview是一个适用于工业控制与实验控制的软件,但是如果纯粹的把它认为是软件就太简单了,从软件的角度来看,软件对硬件的实时的方便的控制给实验或是工业过程提供了很大的方便,其实这一切在我们的生活中也是比较普遍的存在的,首先,在我们的汽车上,当我们在触摸屏上轻轻的按了一下,我们的空调开启了,我们的雨刷开启了,这都是一种软件和硬件的良好的结合,通过这样的方式,我们可以完成对复杂过程的定制和监控,当然还有适当的调整,这就是一个非常好的做法。
而我们在这里,就要实现这样的东西,还记得前面我们的LED小灯吗?我们可以在面包板上通过连上开关来控制小灯的明和灭,但是这样似乎比较呆板和普通,如果我们在自己的软件界面中设置一个虚拟的开关,然后当我们鼠标点击的时候就能看到直接的效果,也能实现一种控制,这样的控制是不是更为的吸引人呢?
确实是的,我们正要做这样的事情,在这之前,必须好好的探究一下蕴藏在其中的原理,那么,原理是啥呢?就是我们曾经用过的COM3通讯端口,原来是我们往着里面写过数据,而通过Arduino来控制processing也就是这样的方式,在这里,就是变换一下,我们把这个数据的方向换一下,也就是让processing往里面写入数据由Arduino接收来控制Arduino上连接的小灯,好了,看起来是不难的,或者说,说到这里你应该已经会编程了。
设定好相关的串口波特率,这里我设置的是9600,也可以有变化下,不过两端必须一致,然后通过processing中的myPort(一个Serial变量)来执行已经固化的write函数,把数据传入,然后在Arduino段读出,也就是通过Read(相同的原理)函数读出,好了,订好相关的交流的协议,这里就是你自己定了,这里有很大的发展空间,所以你可以去发挥啦!当然在processing中中特定的信号的发出是通过鼠标点击来辨别的,那么在这里我们就需要mousepressed这个函数,这方面的函数可以查找一下,在processing本身提供的范例中是有这样的一个的,当鼠标点击后,这个函数的存在使程序负责自动的获取点击的坐标(相对坐标,也就是相对整个程序创造的框图),根据这个位子我们就可以完成很多的判断,然后如果条件为真,那么就可以发出相应的信号,其实很多的自动化的工业过程中软件控制的流程也就是这样,当然,别人可能设计的比较鲁棒,所以这里只能算是一个雏形了。当需要增加的控制信号变得很多的时候,而且这些过程也必然与很多的相似的地方,我们也可以把这样的操作简化为函数化的封装过程,这样就能比较方便的开发了,当然,如果就规范而言,那么JAVA的语言开发中的对象面向的编程的思想完全应该用进去,所以着里面是有很多的可以改进的地方的。
好了,下面贴出代码吧:
Processing端:
import processing.serial.*;
float lefttop1=60;
float leftbottom1=10;
float length1=30;
float width1=30;
float lefttop2=60;
float leftbottom2=70;
float length2=30;
float width2=30;
float top3=200;
float bottom3=10;
float length3=30;
float width3=30;
float top4=200;
float bottom4=70;
float length4=30;
float width4=30;
int LED1flag=0;
Serial myPort;
void setup()
{
myPort = new Serial(this,"COM3", 9600);
size(400,200);
fill(75);
text("LED1 on",lefttop1+49,leftbottom1+20);
text("LED1 off",lefttop1+49,leftbottom1+80);
text("LED2 on",top3+49,bottom3+20);
text("LED2 off",top3+49,bottom3+80);
fill(0,200,129);
rect(lefttop1,leftbottom1,length1,width1);
fill(120,29,120);
rect(lefttop2,leftbottom2,length2,width2);
fill(136,120,129);
rect(top3,bottom3,length3,width3);
fill(10,230,10);
rect(top4,bottom4,length4,width4);
}
void draw()
{
if(LED1flag==1)
{
myPort.write(1);
}
if(LED1flag==2)
{
myPort.write(2);
}
if(LED1flag==0)
{
myPort.write(0);
}
if(LED1flag==3)
{
myPort.write(3);
}
delay(100);
}
void mousePressed()
{
if(mouseX>lefttop1&&mouseX<lefttop1+length1&&mouseY>leftbottom1&&mouseY<leftbottom1+width1)
{
if(LED1flag==0)
LED1flag=1;
else
LED1flag=0;
}
if(mouseX>lefttop2&&mouseX<lefttop2+length2&&mouseY>leftbottom2&&mouseY<leftbottom2+width2)
{
if(LED1flag==3)
LED1flag=2;
else
LED1flag=3;
}
if(mouseX>top3&&mouseX<top3+length3&&mouseY>bottom3&&mouseY<bottom3+width3)
LED1flag=2;
if(mouseX>top4&&mouseX<top4+length4&&mouseY>bottom4&&mouseY<bottom4+width4)
LED1flag=3;
}
Arduino端:
int duchu=0;
void setup() {
// initialize the digital pin as an output.
// Pin 13 has an LED connected on most Arduino boards:
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
Serial.begin(9600);
}
void loop() {
duchu=Serial.read();
if(duchu==1)
digitalWrite(13,HIGH);
if(duchu==0)
digitalWrite(13,LOW);
if(duchu==2)
digitalWrite(12,HIGH);
if(duchu==3)
digitalWrite(12,LOW);
}
附加一些说明,在这个例子中,我们控制的灯是在12,13号口的,这里可以放上两个LED小灯,而我们就要对这两个灯进行相应的控制,运行processing以后我们可以看到相应的界面上的控制的按钮,也就是LED1 on ,和LED1 off ,还有LED2 on和LED2 off ,好了,这就是完整的构建,当然你可以在这个基础上进行加工和拓展。
这两个按钮的运行方式有一些方式,其实在代码中你可以看出来,我后来把LED1做了改变,使得原来需要两个按钮来控制LED1的事情变成只用一个按钮就能做到,具体的原理就由你来探究喽!
好了,至此,我们的processing和Arduino的双向的通信已经完成,下面还能有啥呢?这个得下次在说喽!
用户1636929 2012-10-28 20:38
用户1393808 2012-10-24 08:43