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