在 Pi 上进行原型设计和使用微控制器之间是否有很大的飞跃?

物联网 微控制器 树莓派
2021-06-09 22:33:26

这个问题询问,除其他外,在 Raspberry Pi 上使用 Python 来构建端点原型与使用微控制器之间是否存在很大的学习曲线。

显然,功耗有很大改善(以降低处理器吞吐量为代价),因此有充分的理由为需要电池供电的产品采用 MCU 方法。

坚持使用运行 Linux 的单板计算机的潜在原因之一是假设应用程序可以用高级语言编写(应该有大量标准图书馆)。

在嵌入式开发平台上,可能的选择是 C++(mbed 或 arduino)或 micropython。我的印象是这些与编写在 Linux 下运行的代码没有显着不同或更复杂 - 尽管平台确实具有各自的优势。我是否遗漏了与软件开发人员相关的任何内容?

具体来说,我问的是 IoT 端点 - 因此,对于我在这里感兴趣的应用程序,拥有 Linux 系统的全部资源并不是必需的。还值得强调的是,功耗和延迟方面的考虑使 mcu 实现成为此类应用程序中的一项硬性要求。

4个回答

这取决于你想要做什么。

  1. 最大的差距是你提到的微控制器(比如Arduino)没有运行Linux这样的多任务操作系统。这意味着如果您的应用程序依赖于多任务或多线程,这在 Arduino 上运行可能会更加困难甚至不可能。

  2. 第二个差距是硬件支持。例如,Raspberry Pi 支持开箱即用的相机、USB 音频、以太网、WiFi。Arduino 不直接支持这些,虽然您可以使用各种扩展板(例如 USB 主机、以太网或 WiFi),但使用它们并不像在 Raspberry Pi 上使用网络那么简单。

  3. 第三个缺口是可用资源。大多数微控制器甚至无法与 Raspberry Pi 提供的资源相提并论。例如,即使是第一个 Raspberry Pi 也提供了一个运行频率为 700MHz 的 CPU,具有 256Mb 的 RAM,并且可以与 32Gb 的存储一起使用。基于 ATMEGA328 的典型 Arduino Uno 运行频率为 16MHz,具有 32Kb 的存储空间和 2Kb 的 RAM。

因此,对于来自 PC 的开发人员来说,使用 Raspberry Pi 绝对容易得多。使用微控制器的主要优点是:

  • 成本(中国版 Arduino Nano 的运费不到 2 美元)
  • 功耗(微控制器可以很好地优化以实现低功耗——如果你必须依靠电池运行,这一点很重要);
  • 实时可用性,即实时对信号变化做出反应的能力;
  • 尺寸(Arduino Mini 比 Raspberry Pi Zero 窄两倍,如果你不需要那么多针脚,ATTINY85 的尺寸不到一美分,而且它可以在没有晶体的情况下工作)。

如果这些都不重要,那么使用 Raspberry Pi 肯定更有意义。

添加到George 的综合答案和第 2 点)硬件支持。即使通过扩展板或类似的扩展板将所需的硬件(例如以太网、WiFi、SD 卡)添加到微控制器/Arduino 中,运行它们的库也会给小内存(即 ATMEGA328(典型的 Arduino 控制器)带来很大压力)有 32Kb 的 FLASH 和 2Kb 的 RAM)。特别是在结合多种功能(网络、显示、SD 卡)时,这可能是一个严重的限制。

来自 Arduino 世界的一些例子:

支持 SD 卡和简单文件系统 (FAT):

  • SD 卡(代码大小未知,但如果使用硬件 SPI 可能不是那么大的问题),至少 512 字节的 RAM 缓冲区
  • Petit FAT FS需要 ~ 2..4 kB FLASH 和 ~44 字节的 RAM

使用矩阵显示:

具有 TCP/IP 协议栈的以太网:

  • uIP:在典型数据包大小 (>1 kB) 范围内的 RAM 要求,但是,单芯片以太网控制器通常带有片上缓冲区,可以容纳几个最大大小的以太网帧。

    可以使用低至 200 字节的 RAM 来运行 uIP 实现,但这样的配置将提供极低的吞吐量,并且只允许少量的同时连接。来源。

  • 用于 Arduino 的带有 TCP 和 UDP 协议的 IP 堆栈:最少 128 kB 外部存储器

  • 串行接口上​​的 IP:SerialIP ~9 kB FLASH 和“足够”的RAM

总而言之,具有这些限制的编程需要完全不同的方法,并要求在程序空间和代码大小 (FLASH)、运行时数据 (RAM) 和执行速度方面进行优化。这个答案很好地充实了它。

由于问题专门询问 mbed 平台,当然值得注意的是,它包括与物联网最相关的功能,即连接性以及加密、身份验证和授权。据推测,它通过低功耗无线个人局域网提供对蓝牙低功耗和 IPv6 的硬件支持。尽管这些连接功能仅在列出的开发板上可用,通常 >= 128 kB FLASH 和 >= 16 kB RAM。另一方面,较小的开发板包括具有 ARM Cortex-M0+ 内核等小型微控制器的系统,具有 16KB 闪存、4KB RAM(即不比中型 Arduino 多多少)而没有专用连接。

是的,从 Python 编程到在微控制器上使用典型的基于 C 的语言工具进行编程是一个巨大的飞跃。事实上,在许多情况下,您可能需要用汇编语言编写部分(如果不是全部)应用程序。

正如其他答案中已经指出的那样,微控制器的资源受到很大限制,因此您将失去 Linux 操作系统的所有便利以及您可以在本地运行的所有工具。与运行本地脚本相比,使用 Arduino IDE 进行迭代非常慢。

尽管我在微控制器和微处理器方面拥有丰富的专业经验,但我更喜欢使用 RPi 硬件和一些 Arduino 来运行我的个人项目,以处理实时关键的东西。我还涉足过 Beagle Bone Black,在某些方面,它比使用带有一个或多个 Arduino 的 RPi 更方便。

是的,差别很大

硬件和软件的区别就像白天和黑夜一样。根本没有有效的比较。

何时使用哪个

使用 Arduino,如果...

  • 空间限制使 Pi 不可行。
  • Pi 的用电量会太多。
  • 资金是一个问题(特别是如果您的项目中需要多个或多个单独的控制器,每个控制器仅执行非常简单的逻辑)。
  • 你想要变得真实和坚韧,并为了乐趣或获得知识而在低得多的水平上工作。
  • 您需要极其简单和/或 100% 定义的实时行为,以及您无法控制的事情杀死您的程序的可能性为零。
  • 您不需要以太网、困难的 USB 主机功能(即访问硬盘驱动器;在客户端使用它,例如作为 HID 设备,是可以的)等等。其中大部分都可以安装到 Arduino(慢慢地),但在 RAM/EPROM 和功能方面的成本很高。由于没有抢占式多任务处理,解锁任务很快就会变得非常复杂。
  • 您可以使用简单的 Arduino 开发 IDE,或者进行更深入的挖掘(即自己构建程序),并且 - 如果您不打算购买 Pro Micro 之类的 USB 上传设备 - 购买或自制的开发套件/刻录机。

在所有其他情况下,Pi 对用户更加友好。Pi 只是另一台(慢速)计算机。

不要误会我的意思。我拥有一个 Pi 并将其用于我网络中的多个 Linux 服务。我也经常编程 Arduinos(主要是 Pro Micros)。两者都很棒,我喜欢它们一样,但它们的使用场景却大不相同。

关于难度的问题 - 这是相对的。Arduino 唯一让我感到困难的时候是很难调试时序问题,尤其是在与有问题的电子设备(即,EM 干扰、电缆太长等)结合使用时。如果您对自己选择的语言(即 Arduino IDE 的 C 语言)有把握,那么您应该能够破解您正在使用的任何库。尽管如此,它总是比 Pi 更复杂,例如,您可以在其中使用您选择的脚本语言来处理非时间关键的事情——这些总是更容易开发和调试。