Mathematica中Arduino的连接与调用

Mathematica和Arduino连接提供了很多有趣的玩法。在Mathematica的参考资料中提供了一些简单的应用,诸如向LCD显示器写数据,实现在PC端控制显示的目的。后面会提到的,用电位器控制参数图形在坐标系上的显示位置(我的“阳光探测器”类似这个东西)。比较神奇的是Mathematica之父Stephen Wolfram,他的儿子,13岁的Christopher Wolfram在Maker Faire上的一个演示,在Mathematic上写一个参数曲线,然后利用Arduino控制一台无人机按照这条参数曲线去飞行(果然虎父无犬子,我真是连一个13岁小孩也不如)。

(本文是暑期项目报告的一部分。)

内置连接方式

Mathematica 10内置了连接Arduino的特性,Mathematica官方参考文档对这个介绍十分详细。包括完整的使用方法和示例。

在DeviceOpen函数中提供的”Arduino”选项可以通过串行端口连接到Arduino Uno上(同样支持Yun),通过数字和模拟引脚提供底层的通用输入输出。 [2]

通过这种方式可以用Mathematica向Arduino中写入C程序,在Mathematica中调用程序。但是这种方法需要计算机上已经安装Arduino IDE,并保证已经配置好环境变量。

这种方式实践起来的资料官方已经讲得很详细了(Mathematica的官方参考资料实在是良心,非常详细,解释说明都很容易懂,例子非常全,而且提供了各种语言版本,包括中文),我只尝试过其中向LCD写数据的示例。很多地方我还没有想明白。

直接通过串行通信

这个作品就是采用这种比较底层,也非常简单的方法。Mathematica支持串行通信,向Arduino中写入程序,使Arduino向串口写数据,再在Mathematica中接收。在这种方式下,Arduino和Mathematica是相对独立的。当然,也可以向Arduino中写程序,使其接收来自Mathematica写入的信号。这和一般的串行通信没有任何区别,只是Mathematica作为一种功能强大的语言,为在PC端处理数据提供了更多的可能性。

向Arduino写Mathematica驱动程序

这种方法是Ian Johnson,Wolfram Research的一名员工提供的。他在Wolfram网站论坛上发帖,提出了这种方法,并开发了Arduino驱动程序和Mathematica程序包。

这种方法是将一段程序烧入Arduino,建立起Arduino和Mathematica通过串口的通信。在Mathematica上则实现了一个程序包,将相关的串口操作做了封装。

这样做的好处是,一次烧入程序,就可以不再重复上传。烧入这一驱动程序的Arduino,可以直接通过串口由PC发送指令来实现相关的功能。而Mathematica程序包则提供了很好的封装,可以以一种十分自然的方式,用Mathematica代码控制Arduino,就像直接向Arduino写入C++代码一样。
相关文档的翻译附在附录。

Mathematica底层的解决方案

这是在Mathematica开始正式兼容串行通信和Arduino连接之前的解决方案。时至今日,Arduino的文档提供的都是这种比较古老的方法,当然现在看来已经过时了。

SerialIO

Mathematica正式支持一系列的硬件操作是从10.0开始的。在此之前,串行通信的解决方法是由Wolfram Research的一位员工Rob Raguest-Schofield提供的。 [3]

SerialIO是一个Mathematica插件,通过Mathematica内核提供的MathLink(现在叫做WSTP, Wolfram Symbolic Transfer Protocol,Wolfram符号传输协议)接口与内核通信,从而实现Mathematica的串口通信。

调用.Net

在Windows上,可以通过调用.Net实现Mathematica中的串口通信,这是Arduino官方文档提供的第二种方式。

Mathematica提供了.Net接口,叫做NETLink,之前叫做MathLink的一部分,现在应该说是WSTP的一个功能了。 [4]

引用

[1] Arduino, “DS1302 Real Time Clock,” [联机]. Available: http://playground.arduino.cc/Main/DS1302. [访问日期: 25 7 2016].

[2] Wolfram, “Arduino——Wolfram语言参考资料,” [联机]. Available: http://reference.wolfram.com/language/ref/device/Arduino.html. [访问日期: 28 8 2016].

[3] Wolfram, “SerialIO – from Wolfram Library Archive,” 15 1 2009. [联机]. Available: http://library.wolfram.com/infocenter/Demos/5726/. [访问日期: 28 8 2016].

[4] Arduino, “Arduino Playground - Mathematica,” [联机]. Available: http://playground.arduino.cc/Interfacing/Mathematica. [访问日期: 28 8 2016].