本帖最后由 正点原子官方 于 2025-2-21 17:38 编辑
第二章 Arduino基础知识
本章,我们将向大家介绍Arduino是一个什么东西?让大家对Arduino有一个大概了解。 本章将分为如下几个小节: - 2.1什么是Arduino
- 2.2 Arduino的由来
- 2.3 Arduino的优势
- 2.4 Arduino语言
- 2.5 Arduino程序结构
2.1 什么是Arduino Arduino即为开源硬件。可以说Arduino从真正意义上推动了开源硬件的发展,在Arduino出现以前,虽然也有很多公司在推广一些简单易用的可编程控制器,但是由于开发平台种类繁多,而且使用这些控制器基本上都需要对电子技术、数字逻辑、寄存器等内容进行多方面的了解和学习,才能完成一个电子产品的制作。这就给开源硬件的推广和普及设定了一个很高的门槛,电子爱好者需要花很多时间和精力才能开始开发和制作自己的作品。而使用Arduino能很快地完成一个电子产品的制作,这是由于Arduino提供了一个开放易学,进入门槛相对较低的开发平台,让电子爱好者对于开源硬件的广泛使用变成了可能。 广泛来说,Arduino指的是一个生态,这里就包括Arduino开发板、Arduino IDE以及周边资料,其中包括社区、驱动库以及示例代码等,如下图2.1.1所示: 图2.1.1 Arduino生态图 现今,Arduino开发板有很多,正点原子ESP32-S3开发板也是属于Arduino开发板,简单来说,只要是搭载Arduino支持芯片的开发板都可以称为Arduino开发板。目前支持Arduino开发的芯片有很多,比如Mega系列芯片(Mega328p/Mega2560/Mega32u4等)、STM32系列芯片(STM32F0/F1/F2/F3/F4/F7/H7等)、ESP系列芯片(esp32/esp32s2/esp32c3/esp32s3等)以及树莓派系列芯片等。这里的实质就是有每个系列芯片对应要有一个Arduino库,比如乐鑫官方的arduino-esp32库,ST的stm32duino库,只要在Arduino安装这种芯片库便可以使用Arduino的语法在Arduino IDE上对芯片进行开发。 Arduino IDE是Arduino Integrated Development Environment集成开发环境的简称。本教程就是基于该软件对ESP32-S3进行开发。该IDE比较遗憾的是没有调试功能,在后面“Arduino开发环境搭建”章节会对这个软件进行讲解。 得益于广大的电子爱好者对于开源硬件的贡献,Arduino的社区活跃度很高,驱动库种类繁多而且有些一直存在更新迭代,不断完善,示例代码功能也越来越健全。使用Arduino IDE进行开发,由于驱动库是相互兼容的,很多代码不需要修改就可以直接使用,这就可以让从芯片替代成本变得很低,也让越来越多电子爱好者参与Arduino生态的建设。
2.2 Arduino的由来Arduino是一种基于开源硬件和软件的电子原型平台,它由一个意大利的团队于2005年创建。该团队的成员包括Massimo Banzi、David Cuartielles、Carlo Galoppini和Michael Margolis,如下图2.2.1所示。 图2.2.1 Arduino创始团队 在2005年冬天,Massimo Banzi和David Cuartielles为了解决找不到既便宜又好用的微控制器的现状,两人决定设计自己的电路板,并且在这期间吸收了Banzi学生David Mellis为电路板设计编程语言。两天以后,David Mellis就写出了程序代码。又过了三天,电路板就完工了。 据说这个Arduino名字的由来是,Massimo Banzi喜欢去一家名叫di Re Arduino的酒吧,这酒吧是以1000年前意大利国王Arduin的名字命名的,为了纪念这个地方,他将这块电路板命名为Arduino。 随后,Banzi、Cuartielles和Mellis把设计图放到了网上。版权法可以监管开源软件,却很难用在硬件上,为了保持设计的开放源码理念,他们决定采用Creative Commons(CC)的授权方式公开硬件设计图。在这样的授权下,任何人都可以生产电路板的复制品,甚至还能重新设计和销售原设计的复制品。人们不需要支付任何费用,甚至不用取得Arduino团队的许可。然而,如果重新发布了引用设计,就必须声明原始Arduino团队的贡献。如果修改了电路板,则最新设计必须使用相同或类似的Creative Commons(CC)的授权方式,以保证新版本的Arduino电路板也会一样是自由和开放的。唯一被保留的只有Arduino这个名字,它被注册成了商标,在没有官方授权的情况下不能使用它。短短的几年时间,Arduino在全球积累了大量用户,推动了开源硬件、创客运动,甚至是硬件创业领域的发展,越来越多的芯片厂商和开发公司宣布自己的硬件支持Arduino。
2.3 Arduino的优势 使用Arduino去开发硬件,技术门槛很低。几乎任何人,即使不懂电脑编程也能用Arduino做出很酷的东西,比如点灯,控制马达,对传感器进行回应。 简单来说,使用Arduino去开发优势非常明显,可以归纳为一下5点: 1、跨平台 Arduino IDE可以在Windows、Mac OS X和Linux三大主流操作系统上运行,而其他的大多数控制器只能在Windows上开发。 2、简单清晰的开发 Arduino IDE基于Processing IDE开发,这对于开发板来说极易掌握,同时又有足够的灵活性。Arduino语言是基于Wiring语言开发的,是对AVR-GCC库的二次封装,并不需要太多的单片机基础和编程基础,只要简单的学习后就可以快速地进行可开发。 3、开放性 Arduino的硬件原理图、电路图、IDE软件及核心库文件都是开源的,在开源协议范围内可以任意修改原始设计及相应代码。 4、社区和第三方支持 Arduino有着众多的开发者和用户,因此可以找到他们提供的众多开源的示例代码和硬件设计。例如,可以在Githun.com、Arduino.cc、Openjumper.com等网站上找到Arduino的第三方硬件、外设和类库等支持,以便更快、更简单地扩展自己的Arduino项目。 5、硬件开发趋势 Arduino不仅仅是全球最流行的开源硬件,也是一个优秀的硬件开发平台,更是硬件开发的趋势。Arduino简单的开发方式使得开发者更关注于创意和实现,可以更快地完成自己的项目开发,大大节约学习的成本,缩短开发周期。 鉴于Arduino的种种优势,越来越多的专业硬件开发者已经或开始使用Arduino来开发项目和产品;越来越多的软件开发者使用Arduino进入硬件、物联网等开发领域;在大学里,自动化、软件专业,甚至艺术专业,也纷纷开设了Arduino相关课程。
2.4 Arduino语言Arduino使用C/C++语言编写程序,虽然C++兼容C语言,但是这两种语言又有所区别。C语言跟C++语言最大的区别在于:C语言是一种面向过程的编程语言,而C++是一种面向对象的编程语言。早期的Arduino核心库使用C语言编写,后面引进了面向对象的思想,目前最新的Arduino核心库采用C与C++混合编程。 通常所说的Arduino语言,是指Arduino核心库文件提供的各种应用程序编程接口(Applocation Programming Interface,简称API)的集合。这些API是对更底层的单片机支持库进行二次封装所形成的。例如,使用ESP单片机的Arduino核心库是对ESP-IDF库的二次封装。 在使用ESP-IDF对ESP32进行开发中,将一个I/O口设置为输出高电平状态需要以下操作: gpio_set_direction(GPIO_NUM_1, GPIO_MODE_OUTPUT); gpio_set_level(GPIO_NUM_1, PIN_SET); 在ESP-IDF中,这个代码架构是可以减少对底层的理解要求,不需要明白寄存器的意义及其之间的关系,来达到配置多个寄存器来达到目的。但是在别的芯片中,比如传统的AVR芯片以及STM32芯片中,这是需要去理解寄存器的。 PinMode(1, OUTPUT); digitalWrite(1, HIGH); 这里的pinMode即是设置引脚的模式,这里设定了1脚为输出模式;而digitalWrite(1, HIGH)则是使1脚输出高电平数字信号。这些封装好的API使得程序中的语句更容易被理解,因此可以不用理会单片机中繁杂的寄存器配置就能直观地控制Arduino,在增强了程序可读性的同时,也提高了开发效率。 若在使用时存在arduino库无法实现对芯片的外设驱动时,也可以考虑包含esp-idf函数所在头文件对里面函数进行调用,来完成该驱动的实现。
2.5 Arduino程序结构在Arduino程序中,是没有main函数的,这跟传统的C/C++程序结构有所不同。 其实并不是Arduino程序中没有main函数,而是main函数的定义隐藏在了Arduino的核心库文件中,这个是需要我们去到核心库中才能找到main函数的踪影。在进行Arduino开发时一般不直接操作main函数,而使用setup()和loop()这两个函数。 接下来,看一下Arduino程序的基本结构,如下: void setup() { // 在这里填写setup函数代码,它只会运行一次 }
void loop() { // 在这里编写loop函数代码,它会不断重复运行 } Arduino程序的基本结构由setup()和loop()两个函数组成。 1、setup() Arduino控制器通电后或复位后,会开始执行setup()函数中的程序,该程序只会执行一次。 通常是在setup()函数中完成Arduino的初始化设置,如配置I/O口转台和初始化串口等操作。 2、loop() setup()函数中的程序执行完毕后,Arduino会接着执行loop()函数中的程序。而loop()函数是一个死循环,其中的程序会不断地重复运行。 通常在loop()函数中完成程序的主要功能,如驱动各种传感器获取数据等。
|