Tips & Tricks

使用 CLion 进行 Arduino 开发:从业余爱好到专业项目 – 第一部分

Read this post in other languages:

如今,许多开发者都在尝试基于 Arduino 的项目。 Arduino 很容易上手,通过灯光闪烁或机器人移动看到自己的编码成果是一种令人愉快的体验。 但大多数 Arduino 开发者止步于此。 他们像周末勇士一样从事自己的项目,只是把它们当作小爱好和编外项目。 在这一系列博文中,我们会探讨如何将您的私人兴趣项目提升到更专业的水平,以及像 CLion 这样的 IDE 如何帮助您实现这一目标。

我们要构建什么

我们为这个项目设定了一个宏大的目标。 我们将构建一个电子气压计,这是一种测量气压并将其绘制在图表上以预测未来几个小时天气状况的设备。 这比传统的气压计更有用,因为跟踪压强变化比跟踪绝对值更重要。 该设备应当由电池供电,充一次电应当可以工作几周。

我们将从构建经典项目 DIY 气压计开始。我们将使用:

  • Bosch BMP085 气压传感器。 我们将使用 GY-65 模块,不过也可以用 BMP180 (GY-68) 代替。
  • Arduino Uno 开发板。 我们使用 DFRduino UNO R3,因为它有彩色连接器 :)
  • Waveshare 4.2 英寸电子纸屏幕。
  • 导线、USB 线缆、几个塑料 PCB 支架、M3 螺栓和螺母。
  • IKEA 塑料平板电脑支架,用于将所有原型部件固定在一起。

听起来很有趣,对吗? 我们开始吧!

从原型开始

电子装置安装

我们首先在平板电脑支架上钻了几个洞,然后将所有部件安装在上面。 其中一个固定 Arduino 开发板的螺栓同时固定传感器模块。

开发板安装

电子纸屏幕模块使用一个单向 SPI 接口(CS、MOSI、SCK),两个输入控制信号(RESET、DC)和一个 BUSY 输出信号。 该模块随附一根 8 芯线缆,我用 2.54mm 边缘引脚排针将其连接到 Arduino。 为了尽量减少需要使用的排针数量,我们将显示屏电源线连接到 Atmega8 在线串行编程 (ICSP) 排针的电源引脚。 压强传感器使用 I2C 接口 (SDA、SCL),并与标准 F-M 跳线连接。

所有连接见下表:

连接

现在是时候对 Arduino 原型进行编码了。

接通压强传感器

官方 Arduino 指南详细解释了 Arduino sketch 开发。 因此,我们将简要介绍一下设置:

  1. 创建一个新项目并为其命名。
  2. 然后,使用 Sketch -> Include Library… -> Manage Libraries…(Sketch -> 导入库… -> 管理库…)菜单项添加 Adafruit_BMP085 库。
  3. 接下来,添加一些实际代码,比如这个
  4. 之后,您可以连接 Arduino,上传 sketch,并使用 Arduino 串口监视器验证它是否正常工作。

接通屏幕

对于这个项目,我使用了屏幕供应商 WaveShare 在 GitHub 上共享的代码,并另外添加了一些代码来启动和运行我们的屏幕。 您可以在这里查看最终的项目代码。 现在我们来运行一下!

屏幕已接通

Arduino sketch

Sketch 是 Arduino 用于程序的名称。 它是上传到 Arduino 开发板并在上面运行的代码单元。 Arduino sketch 使用的语言是 C 和 C++。 更准确地说,可以编写一组 C/C++ 函数,然后对其进行一些预处理(例如,添加一个或多个 Arduino 特定的 #include 子句)。 结果最终直接传递给 C/C++ 编译器 (avr-g++)。 您可以在官方文档中阅读有关 Arduino 构建过程的内容。

由于最终只使用 C++,任何通用的 C++ IDE 都可以用来编写代码。 使用 Arduino 以外的 IDE 确实需要一些手动步骤,您可以从官方构建过程说明中找到这些步骤。 但我们来看看您能否得到任何好处作为回报!

CLion 如何提供帮助

如果您对嵌入式开发感兴趣,并且正在寻找一个项目来进行尝试,Arduino 是一个很好的起点。 它有一个庞大而友好的社区、丰富的基础架构,以及数十个不同的代码示例和库。 它非常适合那些希望在嵌入式领域迈出第一步的人,或者那些想要实现一些简单想法的人。 随着项目的发展,它开始需要更多的努力、更复杂的代码、更高的嵌入式处理器性能、更多 MCU 内存和更多外设。 此时,诸如 IDE 之类的开发工具对于维护代码质量和帮助我们更高效地开发非常有用。 我们来看看 CLion 如何提供帮助。

应用广泛的更智能的代码编辑器

如果您不熟悉,CLion 是一个用于 C 和 C++ 的 通用跨平台 IDE。 它理解 C 和 C++ 代码,并运用这些知识来提供编辑器内操作。 可以搜索上下文用法或一键跳转到类、文件或符号的导航操作,智能快速文档弹出窗口,以及形参名称提示能够帮助开发者更好地阅读和理解代码。 自动补全、实时模板重构(如提取函数、形参或变量,内联,当然还有重命名和更改签名)都有助于更快地编写代码。 当涉及到代码质量时,内置的静态分析工具动态分析是必不可少的帮助程序。 在嵌入式开发领域中,错误的代价可能比其他地方高得多,因为当软件在硬件上运行时,错误通常会在运行时出现。 因此,在输入代码时实时捕获错误,显然可以减少您最终可能面临的麻烦。

CLion 提供的另一个绝佳机会是调试代码的功能。 它允许您逐行跟踪代码执行、检查变量的值、监视外设寄存器的内容等。 这一切都可以在模拟器中完成,也可以在实际的 MCU 上完成,具体取决于是否存在正确的模拟器以及 MCU 的调试功能是什么。

您可以从我们的网站下载 CLion,并按照快速入门指南轻松入门。 我们还推荐两个入门视频 – CLion 快速导览,以及更详细(也更长)的工作效率演示

您还可以从这个专用教程学习如何在 Windows 上配置 CLion,包括编译和调试所需的工具链。 在我们的 Arduino 案例中,您需要安装 MinGW

与世界分享您的项目

随着业余爱好项目的发展,它通常会在 GitHub、GitLab、Bitbucket 或其他地方共享,让更多的贡献者加入进来。 在 VCS 上发布、处理拉取请求、将工作分布到多个分支 – 所有这些基础任务都可以在 CLion 中正确完成。 对于编辑代码,未提交的更改会在编辑器中高亮显示,并且支持作者注解。 所有这些功能都减少了切换上下文的需要,节省了您实现新想法的时间。

有一个关于所有基于 IntelliJ 的 IDE(如 CLion)中的 VCS 支持的概览视频

顺便提一下,当发布到 VCS 时,不要忘记添加 Readme.md 文件,让其他人知道这个项目是关于什么的,并提供如何使用它的详细信息(需要什么设置,要使用哪个工具链等)。 CLion 默认支持 Markdown,因此您可以轻松预览 Readme.md 文件:

Markdown

迁移到 PlatformIO

PlatformIO.org 是一个丰富的嵌入式开发生态系统,支持各种目标硬件类型、编译器和框架,包括 Arduino 项目。

我们看看如何在 CLion 中开始使用 PlatformIO:

  1. 首先,您需要安装 PlatformIO Core
  2. 并在 Settings/Preferences | Plugins(设置/偏好设置 | 插件)下安装 PlatformIO for CLion 插件

现在,我们已经准备好创建一个新的 PlatformIO 项目,在我们的示例中,我们将选择 Arduino Uno。 点击 File->New Project(文件 -> 新建项目),然后选择 Arduino Uno 作为目标,并选择项目位置。 由于列表中有很多开发板,您开始可以只输入“Uno”,然后使用方向键在开发板列表中导航。 为了避免以后出现故障,我们不建议在位置中使用国际字符、特殊符号或空格。

搜索开发板

下一步是启用我们的传感器库。 在 CLion 编辑器中打开 platformio.ini,并在 [env:uno] 部分添加 lib_deps = Adafruit BMP085 Library,然后调用 Tools | PlatformIO | Re-Init(工具 | PlatformIO | 重新初始化)。

现在,是时候向我们的项目添加一些代码了。 将 Arduino sketch 文件夹中的所有头文件复制到项目的 include 文件夹,复制所有源文件,并将 .ino 文件从 Arduino sketch 文件夹复制到项目的 src 文件夹。 您可以删除空白的 main.c 文件,我们不需要它。

由于我们不依赖 Arduino IDE 进行 Arduino 相关的预处理程序转换,需要手动执行一些额外的步骤:

  1. 将 sketch 转换为 C++。 为此,只需将主 .ino 文件重命名 (Shift+F6) 为 .cpp。 在本例中,CMake 文件将由 CLion 自动更新。 然后,您只需要重新加载 CMake 项目:Tools | CMake | Reload CMake project(工具 | CMake | 重新加载 CMake 项目)
  2. 打开 arduino-barograph.cpp 并将 #include <Arduino.h> 添加到文件的开头。
    Include 补全

您现在可以构建项目了! 我们开始吧。

将电子装置连接到计算机,然后启动 Platformio Upload 运行配置。 固件现在已被刷写到 MCU,我们的设备又可以工作了。 很简单!

让我们退后一步,看看我们到目前为止所取得的成就:

  1. 我们一开始使用了一些其他软件(PlatformIO、CLion)来获得更强大的嵌入式环境,并从 C++ IDE 有助于提高工作效率的功能中受益。
  2. 由于采用了 PlatformIO 方式,应用可以通过少量工作轻松迁移到许多其他硬件平台上。
  3. 通过使用 CLion 中的 VCS 集成和 Markdown 支持,我们使项目生命周期的维护变得更加方便。

掌控项目

PlatformIO 确实很有帮助,但如果您想要完全控制项目并自定义构建步骤,要怎么做? 现在,我们将把我们的项目转换为纯 CMake 项目。 这将涉及到使用 CLion IDE、CMake 构建系统、适用于 AVR 的 GCC 工具链,以及 avrdude 刷写实用工具。

我们将继续使用 Arduino 库。 可以从 Microchip 网站下载 AVR 工具链,从 Savannah 下载 avrdude 实用工具。

在 CLion 中,工具链和 CMake 配置文件的配置方式如下:

编译器
工具链

项目本身的代码可以在 GitHub 上找到。 它是与手动复制到项目源代码的 Arduino 库相同的 PlatformIO 代码。 您可以随意克隆并使用。 但是,当涉及到 CMakeLists.txt 文件中以下依赖于用户的形参时,您应该小心:

  • avrdude 位置
  • Arduino COM 端口名称
  • 特殊构建目标 FLASH

当一切都设置正确后,您可以在 CLion 中触发构建操作(而非运行!),它将尝试刷写您的 Arduino。

我们来看看这与我们之前使用 PlatformIO 进行的设置有何不同:

  1. 我们需要处理更多的设置,如 COM 端口名称、avrdude 位置等。
  2. 我们现在完全掌控构建过程,并可以根据我们的需要进行调整。
  3. 应用可以迁移到其他硬件平台(甚至那些不受 PlatformIO 支持的硬件平台)。

未来计划

我们现在已经有了一个可以启动和运行的早期原型,它使用最少的组件,并且功能有限。 我们该如何改进它?

  1. 更好的呈现方式
    有了这个大屏幕,当前的天气和时间数据可以用更大的数字来显示。 这就需要更多的 ROM 内存来存放字体。 Arduino 仍然有相当多的可用闪存,我们也许可以用当前的硬件设置实现更大的字体。
  2. 气压图
    气压对预测天气很重要,但跟踪它随时间的变化实际上更有帮助。 我们有一个相当大的屏幕,完全可以将气压图放在上面。 为了绘制这样的图表,我们需要一个实时时钟电路 (RTC),因为板载振荡器不够精确,无法测量时间。
    Arduino 只有 2KB 内存,但 400*300 的黑白屏幕需要 15KB 内存 (400*300/8 = 15KB) 来进行屏幕外的图形操作。 于是,我们想到更换 MCU。 请注意,一些现代 MCU 确实很便宜,并且包含足够的 RAM 和片上 RTC。
  3. 电池电量
    此类设备可以针对功耗进行优化,如果优化得当,一块很小的电池就可以让它一次工作几个月。 遗憾的是,Arduino 有一个 USB-UART 适配器和一个常亮的电源 LED。 因此,为了降低功耗,我们需要自己制作开发板,或者对现有的开发板进行硬件改造。 如果更换电子装置,我们可以改用另一个更省电的 MCU 或开发板。 AVR MCU 问世已经有一段时间了,现代电子技术在功耗方面要好得多。
  4. 开发过程
    要支持上面提到的所有增强功能,我们需要编写一些额外的代码。 而且我们必须进行测试! Arduino 和 AVR MCU 一般只允许我们通过 UART 发送诊断信息。 然而,现在许多其他 MCU 可以在这方面提供更多的选择。 例如,当代码在实际的 MCU 上运行时,片上调试功能允许开发者跟踪代码执行和变量值。

未完待续…

本系列将持续更新。 很快,我们将讨论如何通过使用另一个开发板并尝试利用其最佳功能来进一步推进此项目。 敬请关注! 请在评论中告诉我们您希望我们重点介绍嵌入式开发的哪些方面,特别是 Arduino。

您的 CLion 团队
JetBrains
The Drive to Develop

本博文英文原作者:

image description

Discover more