65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Azure 和 Arduino 收集和分析汽车遥测数据

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.38/5 (9投票s)

2015 年 3 月 12 日

CPOL

13分钟阅读

viewsIcon

34884

本文讨论了如何使用 Arduino 通过 Windows Azure 将汽车的 OBD-II 数据收集并发送到云端。

引言

本文的目的是通过一个真实世界的场景向读者介绍一系列有趣的主题。我将记录如何创建一个基于 Arduino 的工具,从您的车辆的车载诊断端口 (OBD-II) 收集数据,并使用 Microsoft Azure 平台提供的各种服务将其流式传输到云端。这对我来说是一项相当有趣的尝试,因为我大约一周前才得到我的第一个 Arduino。这是一个进行中的项目。随着项目的推进,我将更新本文档。

背景

在推迟了几年之后,我终于因为物联网竞赛而“入坑”了。我对学习电子学已经很感兴趣很久了,但从未真正开始。我订购了一个 Arduino 入门套件,以及一本相关的入门书籍。在等待它到货的同时,我还购买了 Kindle 版本并开始阅读。我意识到,作为一名程序员,我已经懂得如何处理电子学了。作为程序员,我们处理软件组件(无论是现成的还是我们自己创建的),向这些组件发送输入并从它们接收输出。处理电子学本质上是相同的。

想连接到 Wi-Fi 吗?您可以购买一个集成了 Wi-Fi 功能的现成黑色盒子集成电路,并将其连接到您的电路。您可以购买一套价格在 50-100 美元的初学者 Arduino 套件。甚至还有一个 YouTube 视频展示了如何用大约 7 美元制作一个 Arduino,但对于像我这样的初学者来说,套件是在没有先验知识的情况下快速上手更好的方式。

Arduino 入门

如我所提到的,我从亚马逊订购了一个入门套件,其中包括 Arduino Uno、一个面包板、一系列组件和电线,以及一本提供“入门”项目的指南。我还另外订购了一本书,它将超越简单的实验,深入探讨电子学及其工作原理。我选择了 Jeremy Blum 的 《探索 Arduino》。这本书不仅组织得很好,而且在您动手实践项目时介绍和讨论了新概念,而且它还引用了作者的网站,他在那里创建了视频深入讨论每一章。基本上,您可以通过书籍、实验和视频获得三重学习强化。

这是 Arduino sketch 的最基本形式

void setup()
{
}

void loop()
{
}

它完全是空的,什么也不做。但它可以让我们讨论 sketch 的细节。首先,您会注意到 sketches 是用简化的 C 语法编写的(实际上是 Wiring Language)。其次,您会看到两个必需的函数 setup 和 loop。Setup 在程序首次运行时执行(在 Arduino 启动后)。Loop 会反复运行。它也是您应用程序的核心所在。

这不是很令人兴奋,所以让我们让 Arduino 真正做点什么。板子上有一个内置的 LED,您可以通过向其发送高电平或低电平信号来打开和关闭它。Arduino 的一个内置常量定义了连接到 LED 的引脚(控制器的一个输入或输出)。我们可以通过发送高电平信号,稍作等待,然后发送低电平信号,再暂停一下,来让 LED 闪烁。

void setup()
{
    //UNO has a built-in LED on pin 13, and we can use the LED_BUILTIN Macro
    pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{
    //Set the LED pin to HIGH. This gives power to the LED and turns it on
    digitalWrite(LED_BUILTIN, HIGH);
    delay(500);
    digitalWrite(LED_BUILTIN, LOW);
    delay(500);
}

在 setup 函数中,我们告诉 Arduino 我们想将连接到内置 LED 的引脚设置为输出引脚。在 loop 函数中,我们用高电平信号写入 LED 引脚(基本上我们允许电流流过它)。然后我们等待半秒(表示为 500 毫秒)。然后我们写入低电平信号(停止电流),然后再次等待。

尽管为 Arduino 编写代码比标准的应用程序编程要底层一些,但它仍然有足够的抽象,使得相同的代码可以在整个 Arduino 系列板子上运行,即使是那些具有不同微控制器型号的板子。

读取数据

正如我提到的,一个引脚可以用于输入或输出(为了清楚起见,输入/输出是相对于您所谈论的组件而言的。一般来说,当我谈论一个引脚时,我指的是 Arduino 本身的引脚。如果我指的是另一个组件的引脚,我会提前说明)。

有些组件(如 LED)只接收输入(来自 Arduino 的输出)。其他组件(如电位器)提供输出,而其他一些组件(如 ESP8266 WIFI 模块——我们稍后将详细介绍)则具有输入和输出引脚。简单来说,如果您将电流通过组件,它将根据接收到的输入(外部输入或来自 Arduino 的输入)执行其逻辑,并根据该逻辑提供任何输出。

现在,我在这里做了很多笼统的介绍,让我们采取更实际的方法。有一种常见的电子元件叫做电位器。简而言之,它是一个可以转动的旋钮,会改变电阻,减缓电流的流动。向一个方向转动旋钮会增加电阻,直到电流停止。向相反方向转动则会减小电阻,直到允许电流完全流过。电位器上有三个引脚,但只有一个是关键的。两个外侧引脚允许电流通过,一个连接到 5 伏电源(另一个连接到地,哪个是哪个并不重要)。

中间的引脚是发生奇妙变化的地方。中间引脚是在施加电阻后提供电流的来源。Arduino 可以将来自电位器的电流读取为模拟值(使用一个内置的电路,称为模数转换器或 ADC)。您可能会问,数字设备如何检索模拟值?也许 ADC 的读数范围会提供线索。当 Arduino 从电位器读取数据时,它会得到一个 0 到 1023 的值。0 表示没有电流,或者没有电压进入 ADC。1023 表示完整的 5 伏电压。

基本上,ADC 电路有一系列比较器,用于测量电流的某个值范围。比较器如何执行其功能是设计决策。它有点像有序集合上的搜索算法,就像有许多 ADC 类型来实现各种算法一样。

长话短说,Arduino 内置了六个 ADC,将电位器的输出引脚连接到 Arduino 的一个 ADC 引脚将允许您以 10 位分辨率读取电位器的模拟值。下面是一个使用 fritzing 应用程序生成的 图表,它允许您在三种模式下创建电路图:面包板、原理图和 PCB。它还允许您将图表导出为 gerber 文件格式,该格式在行业中用于生产电路板。此外,他们最近为图表添加了一个代码容器,允许您存储与电路相关的代码,并用于编译和上传 sketch 到 Arduino(带串行监视器)。这是一个简单的电路,演示了 Arduino 为 ADC 提供电源并通过模拟输入引脚读取其电压。

Arduino Breadboard Diagram

根据图表接好电路后,以下代码将在串行监视器上打印从电位器读取的值(在一个零到一千二十三的范围内)。

const int POT =0;
int val =0;

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    val = analogRead(POT);
    Serial.println(val);
    delay(500);
}

所以现在我们知道了 Arduino 的基本知识。我们学习了如何编写程序与板子上的内置元素进行交互。以及如何将 Arduino 连接到外部组件并从中读取数据。在读取汽车的 OBD-II 端口之前,我们还有一些路要走,更不用说将数据发送到 Windows Azure 了。但别担心,我们会做到的。

连接 Internet

没有互联网,很难实现“物联网”(它是这个名字的一半)。Arduino 有提供 Wi-Fi 支持的扩展板(卡扣式扩展),但价格在 50 美元左右。Arduino Yun 内置 Wi-Fi 和以太网支持,但比 Uno 贵 50 美元。好的一面是,这两种选择都提供了更“整体”的通过 Wi-Fi 连接到互联网的接口。

我已经花了 100 美元购买了我的入门套件,再花 50 到 80 美元给“Mrs.”来增加 Wi-Fi 功能,这很难说服。幸运的是,我找到了 ESP8266 Wi-Fi 模块,它的价格仅为 8 美元,远低于需要解释购买的门槛。

让 ESP 正常工作并非易事。我花了大约三个小时才完成最简单的场景(连接到 Wi-Fi 并通过串行控制台发送 HTTP 请求)。开箱即用,ESP 伪装成一个串行调制解调器。您向其发送一系列 AT 命令来设置无线模式(客户端、AP 或两者)。然后您可以列出附近的 SSID 并连接到一个,如果需要,可以传递 WPA 密钥。最后,您可以打开 TCP 通道并通过它们发送请求并接收响应。

虽然这个过程在编程时显得繁琐,但绝对是可以完成的。所以我开始着手处理手头的艰巨任务。直到我听说 ESP 也有自己的 SDK。事实证明,ESP 和 Arduino 一样是完全可编程的。查看 SDK,我发现 ESP 支持更高层的 Internet 通信 API。它围绕 FreeRTOS 构建。

所以我的任务变得清晰了,我需要下载 ESP SDK,开始我的“硬核”嵌入式编程的第一次冒险。

编程 ESP

ESP8266 是市场上一个相对较新的芯片。而且很难找到关于它的可靠文档。直到您找到它。我 fork 了一个 github 项目 khara/esp-open-sdk,该项目可以自动完成获取工具链和 SDK 的过程,让您能够对芯片进行编程。最简单的路径是使用类 Unix 环境(Linux、MacOS 或 Cygwin)来使用工具链。我在 Yosemite 上使用它时遇到了一些问题,但 找到了一个解决方案使其正常工作(请阅读最后一条评论)。在 Linux 和 Windows 上,您的体验可能会有所不同。

一旦您最终构建了工具链,您就可以采用其中一个示例并根据您的需求进行修改。我的需求是通过基于 REST 的 API 支持发布到 azure eventhubs。

幸运的是,我不是第一个有这些需求的人。 ESPDuino 项目是一个 ESP 的固件和 Arduino 的库,它允许您简单地进行 RESTful 调用。

利用 ESPDuino 项目,进行 RESTful 服务调用非常简单。连接到互联网(使用比 AT 命令集更简单的命令)后。您可以像这样调用您的网站

rest.begin("yourapihere.cloudapp.net");
rest.post("someendpoint","mydata");

"mydata" 可以是 json 字符串或数字字符串。无论您的 RESTful API 接受什么。

将网站发布到 Windows Azure 可以是 Azure 网站,也可以是通过 VM,具体取决于您应用程序的需求。我们的下一步是使用 STN1100 芯片从汽车中获取数据,并通过 REST 将它们发送到我们的应用程序。

ESP8266 的替代方案

物联网是一个快速发展的领域。自从我开始写这篇文章以来,已经发布了一个支持直接刷写 ESP 的 Arduino 插件。此外,还有 Oak 开发板,它与 Arduino 类似,但基于 ESP8266 构建。还有 Particle(以前称为 Spark)Photon,它开箱即用,功能非常完善,包括一个云服务和一个移动“tinker”应用程序,允许您直接从手机界面访问引脚。更好的是 Spark 即将推出的 Electron,它使用 2G 或 3G 移动连接来为您的应用程序启用云功能(当您进行汽车远程信息处理并且不想耗尽手机的热点数据时非常有用)。

在接下来的文章中,我们将使用 Photon 进行开发,直到 Electron 可用,因为它们简化了编程。

历史

  • 03/12/15:初始版本。Arduino 快速入门
  • 03/17/15:添加了读取外部组件数据的章节
  • 03/19/15:添加了 ESP8266 简介
  • 07/21/15:更新了 Spark Photon 的信息
© . All rights reserved.