使用 kst 和微控制器进行实时绘图
许多程序可以从文件中读取数据,并在 Linux 下创建 X-Y 图。像 xplot、gnuplot 甚至 PHPlot 这样的桌面应用程序在这方面做得非常出色。但是,如果您想查看物理过程如何变化,并在您的 Linux 机器上使用实时绘图,该怎么办?
很长一段时间我都找不到这种功能。然后,我发现了 kst。kst 是一款快速、大数据集、实时查看和绘图程序,它是 KDE 套件的一部分。
您需要某种方法将实时传感器数据输入到 kst 程序中。我曾使用 Arduino 微控制器来自动化不同的事物,因此将这些板子之一与 kst 结合起来构建一个易于使用且功能非常强大的实时数据采集系统似乎是很自然的。由于它是基于开源的,因此可以进行扩展和定制。
在本文中,我将展示如何将所有部件连接在一起以生成实时数据的实时绘图,并解释如何安装和测试 kst。我还将介绍 Arduino 编程环境的安装,以便您可以对板子进行编程并将数据直接流式传输到 Linux 笔记本电脑中。
kst 可以从文件中读取基于文本的数据,并具有基本的数据分析功能。作为 KDE 应用程序套件的一部分,它几乎可以在所有现代 Linux 发行版上使用。
在您的机器上安装 kst 最简单的方法是使用您发行版的软件包管理器。我在 Xubuntu 下使用了 Synaptic,在我的 ASUS 64 位 Core Duo X83-VM 笔记本电脑上进行了安装。
安装完成后,kst 会出现在桌面任务栏上的“应用程序”和“附件”下拉选项卡下。
下面是我捕获的一些温度和光照强度数据的小片段。数据快照将用于测试 kst。稍后,将使用相同的格式将实时数据从 Arduino 流式传输到我们的 Linux 机器中。将数据复制到一个名为 testdata.txt 的文本文件中
74.64|444 74.64|448 74.64|452 74.64|450 74.64|447 74.64|439 74.64|435
然后启动 kst。主 kst 窗口将显示顶部的任务栏和中间的 kst QuickStart 窗口。
单击 Kst QuickStart 弹出窗格底部的“数据向导”按钮。图 1 显示了 kst 工具栏、数据源和配置数据源窗口。将出现弹出“数据源”窗格。输入数据文件名 testdata.txt。按下“配置”按钮。“配置数据源”窗格出现。输入自定义分隔符字符以分隔数据集中的值。我使用竖线作为温度和光照强度值之间的分隔符。
设置分隔符字符后,单击“应用”,然后单击“确定”按钮以保存设置并关闭窗口。单击“数据源”窗格上的“下一步”以调出“选择数据”弹出窗口。
在“数据源”窗格中,按住 Ctrl 键并在左侧窗格中选择数字 1 和 2。这些数字对应于数据文件中的温度(左侧)和光照强度(右侧)值。选择后,单击右箭头将数据流复制到右侧窗格。使用两个数据流将生成两个单独的图表,一个用于温度,一个用于光照强度,由一个公共行号引用。温度和光照强度将出现在 y 轴上,行号将出现在每个相应图表的 x 轴上。
图表自定义是通过几个弹出窗口完成的。单击顶部(温度)图表标签上的任意位置以调出“编辑图表”弹出窗口。选择“外观”选项卡以编辑标签。kst 会分配自己的默认标签。在我的例子中,我更改了 x 轴和 y 轴标签以反映图表显示的数据,即温度、光照强度和时间间隔。根据您的喜好修改标签字体、字体大小、对齐方式和其他各种选项。此窗口下的其他选项卡控制数据如何在 x 轴和 y 轴上绘制以及显示的数字范围。无论何时在这些选项卡之一上进行更改,请务必单击“应用”按钮,然后单击“确定”按钮以保存更改。
这将为将来使用该数据文件运行设置模板。文件是静态的还是随时间增长都无关紧要。下次选择模板时,kst 将开始绘制文件中的内容。为模板文件指定一个合适的名称。
现在您已经安装并使用静态数据文件测试了 kst,现在是时候对 Arduino 进行编程以感知环境(温度和光照强度),然后通过 USB 线将数据流式传输到笔记本电脑了。
微控制器的简化描述是,它是一个小尺寸的计算机,可以读取和解释输入引脚值,进行一些计算或决策,然后根据嵌入式程序控制输出引脚信号。
Arduino 微控制器被称为开源硬件。秉承开源软件的传统,电路板设计、原理图和代码都可以免费下载、修改和增强。Arduino 主页有活跃的论坛用于信息交流,并且有一套全面的参考文档。
当然,电路板和原始组件需要花钱。有许多 Arduino 克隆可用,为各种专门应用提供电路板配置。焊接式电路板的价格从 20 美元左右起。完整的、即插即用的电路板,带有内置 USB 接口,价格约为 30 美元。您还需要一个面包板、一些电阻器、一些跳线、一个墙式适配器或电池以及一些传感器(供应商列在本文章的“资源”部分)。
输入可以是模拟的或数字的。模拟设备可能是电位器或光电池,而数字设备可能是磁簧开关或按钮。
输出控制事物。您可以使用数字输出通过继电器或晶体管打开灯。在本文中,我们将不使用输出引脚控制任何东西。相反,Arduino 将通过 USB 线将传感器数据传输到 Linux 笔记本电脑。
像 Arduino 这样的现代微控制器模块利用了所谓的在线编程。处理器芯片使用闪存存储程序,并通过 USB 连接访问。闪存是一种电可擦可编程只读存储器 (EEPROM),这意味着可以使用适当的电信号多次擦除和重写。如今,术语 EEPROM 通常仅用于指代更传统的 EEPROM 类型(由于其其他一些优点,它仍然用于较小的尺寸)。在线编程非常棒,因为它最大限度地降低了设备成本和原型制作周转时间。
旗舰 Arduino 模块被称为 Duemilanove。它是一块 2.7 英寸 x 2.1 英寸的电路板,具有 14 个数字 I/O(输入/输出)引脚和 6 个模拟输入引脚。它还具有内置 USB 端口,使用 Atmel Atmega 328 处理器,并以 16MHz 的速度运行。模块由电池或墙式适配器供电,推荐范围为 7-12 伏直流电。
Arduino 使用一种名为 Processing 的语言进行编程。Arduino 集成开发环境 (IDE) 管理 Processing 源代码的编译,将其编译为机器代码,然后上传到 Arduino 板。资深程序员会很快注意到 Processing 在格式和语法上与 C 语言的惊人相似之处。
Arduino IDE 可以在 32 位或 64 位 Linux 笔记本电脑和上网本上运行。显然,上网本很酷,因为它们非常便携。Windows 版本的 IDE 也可用。因此,您始终有能力对 Arduino 进行编程,即使您遇到困难并且手边没有 Linux 笔记本电脑。
从网站下载最新的 Arduino 软件。需要安装各种 Java 包、gcc-avr 和 avr-libc,以及 Arduino 集成开发环境。有关在 64 位 Ubuntu 环境中使一切正常运行的良好教程,请参阅“资源”。
打开终端,并移动到安装 Arduino IDE 的目录。在命令行中,启动 IDE
rreilly> ./arduino
将出现主 Arduino 代码编辑器屏幕。从下拉“文件”菜单中,选择“新建”以获取空白代码窗口。键入您的程序。您也可以从其他来源复制代码,例如 Web 示例或 IDE 捆绑的示例代码,这些代码位于 Examples 目录中。
示例提供了读取各种输入传感器和控制输出引脚的标准例程。Arduino Web 论坛和参考页面包含各种代码片段,您可以直接使用这些代码片段,而无需从头开始编写所有内容。就像 Linux 世界中的开源一样,鼓励 Arduino 用户开发和共享他们的代码。
清单 1. 本项目的源代码
#include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged into digital port 10 on the Arduino #define ONE_WIRE_BUS 10 // Setup oneWire instance to communicate with OneWire temp device OneWire oneWire(ONE_WIRE_BUS); // Pass oneWire reference to Dallas Temperature DallasTemperature sensors(&oneWire); // Photocell input pin number int potPin = 0; // Declaration for photocell value int val = 0; // Arduino init functions void setup(void) { // Start serial port Serial.begin(9600); // Start up the library sensors.begin(); } // Celsius to Fahrenheit conversion function float c2f(float val){ float aux = (val * 9 / 5); return (aux + 32); } // Main Arduino program loop void loop(void) { // Read photocell for light value val = analogRead(potPin); // Send command to get temperature from Dallas device sensors.requestTemperatures(); // Convert returned C temp to F, print value Serial.print(c2f(sensors.getTempCByIndex(0))); // Print delimiter character in serial stream Serial.print("|"); // Print (w/line feed) light-level value Serial.println(val); delay(1000); }
在新文件中输入代码后,在“文件”下拉选项卡下选择“另存为”。给您的文件起一个有意义的名称(在我的例子中,simple_temp_f)。该文件将以 .pde 扩展名保存在 Sketchbook 目录中。Arduino 源代码文件称为草图,因此,它们当然存储在那里。
输入并保存程序后,您需要编译它。在“草图”选项卡下,选择“验证/编译”以生成机器代码。短暂时间后,程序大小的消息将出现在主编辑器窗口底部的状态窗口中。错误将以红色突出显示。我的大多数错误通常是错别字或忘记变量声明。与 C 语言一样,不要遗漏任何分号。
确保 Arduino 模块通过 USB 电缆连接到 Linux 笔记本电脑,然后单击工具栏上带有朝右箭头的上载按钮。一些消息可能会出现在编辑器屏幕底部的状态窗口中。同样,错误将再次以红色显示。
如果您碰巧使用的是旧版本的 Arduino,例如 NG,则必须在按下上载按钮之前按下板载复位按钮才能开始上载。在 Arduino 引导加载程序启动之前,有一个很短的上载窗口,用于通过 USB 连接上载程序。较新的 Arduino 型号运行复位,无需手动按下按钮。
在 Arduino 模块的中间,两个板载 RX/TX LED 将显示机器代码已从笔记本电脑传输到电路板。
Arduino IDE 和相关程序会经常更新,我很高兴地报告,版本 0018 在编译和上载方面比版本 0012 快得多。速度的提高与在线编程功能息息相关。这些步骤最大限度地减少了程序/编译/上载周期,并增加了可用的原型制作时间。
机器代码上载后,Arduino 将执行复位,两秒钟后,引导加载程序将运行程序并开始读取输入和写入输出。
您将看到电源 LED 亮起,如果通过 USB(或可选串行线)发送数据,则 RX/TX LED 将在数据来回移动时闪烁。
编辑器最中间的工具栏按钮将打开一个新屏幕,以查看来自 Arduino 的数据。它被称为串行监视器,用于监视从 Arduino 传输到笔记本电脑的数据。请注意,Arduino 上的 USB 端口是 USB 到串行转换器(FTDI 芯片),因此 Arduino 在您的计算机上显示为串行端口。
关于 Arduino 程序就说这么多。让我们将它们链接在一起并制作一个实时绘图。
图 4 显示了读取光电池和连接 Dallas DS18B20 单线温度传感器所需的电路。光电池产生电压变化,电压变化由 Arduino 中内置的模数转换器之一处理。
Dallas 传感器是一项很酷的技术,因为一大堆传感器可以在简单的三线总线上工作。每个传感器都有一个唯一的 64 位设备编号。Arduino 代码 ping Dallas 传感器,并接收来自每个传感器的编码数据流,其中包含设备编号和温度读数。需要将 Dallas 传感器和单线库添加到 Libraries 目录。Miles Burton 构建了一些很棒的库和代码;从他的网站下载它们(请参阅“资源”)。
代码细节有点超出本文的范围。简而言之,Arduino 读取光电池和温度传感器值,并将它们转换为数据流,每个程序循环一行数据,通过 USB 端口输出。同样,我们在此特定项目中不更改任何输出引脚。
确保 USB 串行端口配置为接受来自微控制器的数据。打开终端并使用 stty 命令设置端口的波特率。如果您的波特率错误,您将得到无法读取或导入到 kst 中的奇怪字符
rreilly> stty -F /dev/ttyUSB0 9600 clocal
将 USB 电缆插入端口,等待几秒钟,Arduino 将开始向您的笔记本电脑发送数据。在终端中使用 cat 命令将数据记录到 testdata.txt 输入文件中
rreilly> cat /dev/ttyUSB0 > testdata.txt
使用 Ctrl-C 停止数据流。
一旦您从 USB 端口获得数据,请启动 kst 以查看它。记住,您之前设置了 kst 模板文件。当 kst 启动时,从菜单中选择您的模板文件。
应该出现两个图表,并且绘图将随着数据流的进入而变化。默认情况下,缩放是自动的,并且适用于许多情况(图 5)。
这就是使用 kst、Arduino 微控制器和 Linux 笔记本电脑绘制实时数据的简要概述。探索 kst 程序以获得更多显示选项。
本文介绍了在 Linux 机器上使用 Arduino 微控制器和 kst 查看器程序进行实时数据绘图。使用此系统作为具有多个输入和传感器的更高级设置的基础。该系统还可以扩展到包括无线或电池操作。我没有谈论从 Linux 笔记本电脑向 Arduino 发送数据,所以也许这将是后续文章的主题。
资源
Arduino 主页:www.arduino.cc
Arduino IDE 下载页面:www.arduino.cc/en/Main/Software
Ubuntu 上的 Arduino IDE 教程:www.codetorment.com/2009/11/02/tutorial-getting-started-with-arduino-ide-on-linux-ubuntu-9-10
Miles Burton Dallas 温度传感器库:www.milesburton.com/index.php/Dallas_Temperature_Control_Library
Sparkfun:www.sparkfun.com/commerce/product_info.php?products_id=666
Adafruit:www.adafruit.com/index.php?main_page=index&cPath=17
Maker Shed:www.makershed.com/ProductDetails.asp?ProductCode=MSGSA
Rob Reilly 是一位技术顾问、作家和便携式计算专家。早期采用者技术趋势、研讨会和媒体项目是他的专长。他的许多已发表文章的链接都出现在他的网站 home.earthlink.net/~robreilly 上。联系 Rob,邮箱地址为 robreilly@earthlink.net。