极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13028|回复: 1

Arduino和Processing连接

[复制链接]
发表于 2016-11-10 10:04:22 | 显示全部楼层 |阅读模式
    Arduino和Processing作为交互媒体艺术学习的两个主要部分,各自承担着不同的角色。

      作为一个交互作品传感器是一个输入的感知器件,感知器件通过Arduino的转换将“模拟量”数字化,将“开关”信号编码数据化,将外界的各种物理变换成数据传给计算机,计算机再去处理各类事件,形成交互过程。传感器+Arduino可以说是交互系统的“输入”端。

      Processing在交互系统中是充当“表达”角色,Processing起源于数据可视化,经过进化加入了很多多媒体处理能力,因此他不仅可以用图形来表达,也可以用处理视频、声音来表达。因此在交互系统中Processing的角色是“信号处理”和“输出”。

      传感器+Arduino+Processing+投影、音箱是一个完整的媒体交互艺术的系统

       其中传感器+Arduino和Processing间有个数据传递通道,简单的应用通常用USB当串口连接,稍复杂的应用也可以用RS232串口连接(但是现在计算机已经很少有此接口了),稍复杂的应用可以用网络(LAN)来连接,当然也有通过有线、无线和互联网相接。

       本文为了解决初学者的困难,就简单的应用,USB连接做些说明:

       在交互媒体作品中USB连接最方便,最容易。各种交互媒体作品个各类应用输入无外乎,单一开开关,多开关和模拟量信号的传递。不少杂志,书籍和网站根据不同的应用有不少方法的介绍,这往往是的初学者无法适从,现在介绍用一种方法解决这三类简单的应用。

       1、单一开关,输入往往是表达“通”与“不通”,如按键,红外传感,磁开关等;

       2、多路开关,有多路表示通短,按键键盘,仿电子琴键盘,以上键盘的组合;

       3、模拟量的传递,如电压的变化,声音的轻响,光的明暗等变化的参数。

     不管上述的哪一类首先需要建立正确的连接,用下面最简单的测试程序看看是否正确连接了,步骤如下:

    一、Arduino程序

              int valt=0;                            //输入参数进行调试
                  void setup() {
                       Serial.begin(9600);        // 打开串口设置波特率
                    }

                 void   loop(){

                    //Serial.println(valt);        //在Arduino 的串口监视器中打印val值,检查Arduino是否正常工作

                    Serial.write(valt);              // 送一个数到Processing

                   delay(100);
                }




  二、Processing程序


             import processing.serial.*;
             Serial myPort;                                              // 建立一个端口
              int valr;                                                       // 接收到的数据

         void setup()
                {
              myPort = new Serial(this, "com3", 9600);//建立一个通道和速率,必须和Arduino一致
          }

         void draw()
               {

                if ( myPort.available() > 0) {  // 如果有新数据输入
                     val = myPort.read();         // 就将串口收到数据给val
                          }
                      println(valr);                     //打印收到的数据
                  }

         从Processing下面的小黑窗中可以看到收到的数据是否正确。

         假设Arduino的valt=0,或valt=1可以模仿第一种单一开关情况,收到正确的“0”或“1”可以模仿按键“按下”或“放开”;

         进一步实验在Arduino的valt给个有规律值,“0”,”10“~~”70“,”01“,”11“~~”71“可以定义多键的状态,可以任意定义。这里为了便于阅读,将十位数定义为各个按键,将个位数定义各个键的状态,功能同单一键。

    再进一步实验,如果Arduino使用模拟输入的值给了valt,看看是否在processing能否得到正确的值,这里往往会有问题,因为Arduino模拟输入的AD是10位精度的,也就是这数值范围是0~1023,但是Arduino和Processing间的通讯是8位数的,范围在0~255,在大于256时收到数字就出现了异样,因此为了得到全范围的传感在Arduino的avlt的值需要除4,这样收到的值就被限制在0~255的范围内了,在要求不高的情况下基本够用了(还原出1024个状态的方法不在这里讨论了)。

三、需要注意的问题

      在arduino里在调试程序时,需要在串口监视器中看数字的变化使用的是Serial.print() 和Serial.println() 语句,在Arduino和Processing连线时要改为Serial.write()语句。

      如果用没有改回来或用错了会有假象,视乎数据收到了,但是会得到“乱蹦”的数据。

      Serial.print()和Serial.write()不要同时用,在最简的UNO小板上他们是共用一个口,一起用会混乱的。

四、总结

      1、在Arduino和Proseccing连线时,先在Ardiuino输入简单的测试程序看看Arduino运行是否正确;

      2、在Processing上输入简单的测试程序,需要注意使用同样的COM数,同样的波特率;

      3、在Processing上观测得到数字的正确性,如单一开关只要得到“0”和“1”就可以了,多键能得到自己定义的值,模拟输入的值需要在Arduino程序输出前除4,否则输入从小到大的值,在输出会有从小到达4次反复。

      4、两边关系理清了就可以和各自的程序关联起来了。

      5、动手试一下,就会有体会了。
回复

使用道具 举报

发表于 2016-12-22 13:28:26 | 显示全部楼层
这是用串口通讯,要是改成wifi通讯该怎么写代码?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2019-8-25 16:16 , Processed in 0.063064 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表