Arduino 是一个开源嵌入式软硬件平台。如果你看过我写的《自己动手设计物联网》,又或者是和大学同学翻译的《Arduino 编程:实现梦想的工具和技术》,那么对于些,你应该是有些体会的:Arduino 是一个非常有意思的组合式软件 + 硬件平台。
Arduino 的有意思之处在于,它的软件和硬件都是开源的,并且都能以模块化的形式组装:
从技术能力上来说,我们编写的 Arduino 代码,只需要配置一下不同的 Arduino 开发板,就能直接在不同的硬件上运行。这对于传统式的嵌入式开发来说,有点不可想象。传统的嵌入式开发模式下,我们需要根据不同的开发板和芯片,来编写不同范式的代码。当我们需要更强的处理能力时,只需要购买更好的硬件即可。
除此,对于传统的硬件开发商来说,它们可以借鉴已经开源的 Arduino 开发板、扩展板,就能售卖出相关的硬件。而随着 Arduino 的标准化能力的成熟,对于芯片厂商来说,也能实现类似的能力。诸如国内厂的芯片 ESP8266、ESP32 的开发板,也能运行在 Arduino 的 IDE 上。
从硬件上来说,Arduino 在不同类型的开发板上(如 Arduion UNO、Arduino YUN、Arduino Due、Arduino Mega2560 等),都尽可能设计成可兼容的模式。尽管 Arduino 的不同开发板在引脚上稍有差异,但是基于标准的 UNO 板,基本上都可以在其它开发板上运行。当然,还有一些是相同的 IO,但是硬件接入方式不是扩展板的方式,而是需要手动焊接,诸如于 Arduino Mini、Arduino Nano。
不同的相同的硬件设备,使用相同的输入输出口,如数字信号、模拟信号、串口处理等。如此一来,就可以确保硬件的扩展板上都是可以随意替换的。
Arduino 提供了一个标准化的 HAL(《Harware Abstraction Libraries》),提供基础的 Arduino 函数。如针对于不同的硬件底层,为了确保上层是兼容的,需要提供统一的硬件接口,诸如于:pinMode、digitalWrite、digitalRead、analogRead、analogWrite、millis、delay。
针对于不同类型、不同处理速度的芯片等(如 AVR、Intel X86、Arm)等,它们都可以转换到统一的接口。
Arduino 基于 Processing 的 IDE 构建,语法上也是类似的,一个新的默认代码模板如下:
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
而从源码的层面,它应该是:
int main(void)
{
init();
initVariant();
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
从流程上,定义了硬件的处理流程和顺序。对于简单的开发来说,开发人员相当于是在流程引擎定义的步骤上进行编程。
在系统的底层,内置了对一系列系统的对接协议,如 SPI、Serial、Wire 等。这些都可以用于与不同的硬件进行通信,包括 Arduino - Arduino 开发板,又或者是 Arduino - Raspberry Pi 开发板等。
从模式上来说,Arduino 借助于已有的软件生态,减少系统的开发成本;借助开放的标准,以让不同的硬件能接入。
围观我的Github Idea墙, 也许,你会遇到心仪的项目