万事开头难,这一节我们将写一个最简单的程序,让它在Arduino UNO(或者MEGA)开发板上运行起来。
为此,我们需要准备,
- Arduino UNO(或者MEGA)开发板;
- 一台开发用的电脑,Window、Linux、MacOS操作系统都可以;
- 一根连接Arduino MEGA开发板和电脑的USB数据线;
注意,这根USB连接线的一端是方头的,它将和Arduino开发板提供的USB接口相连。这种方头的USB数据线接口叫做USB type-B,常用在打印机的接口上;而我们最常使用的那种USB数据线接口叫做USB type-A。

2.1 搭建开发环境
在官网下载相应操作系统的Arduino集成开发环境(简称Arduino IDE)。有了这个IDE工具,就能方便的编辑、编译代码,并把编译的结果通过USB连接线,部署到Arduino开发板上。

IDE下载完成后,就像任何普通程序一样,直接安装就行了。
双击Arduino的图标,IDE程序就运行起来了,

2.2 新建工程
启动Arduino IDE,点击菜单栏的文件->新建(或者使用快捷键Ctrl+N),生成新的工程文件,

点击菜单栏的文件->保存(或者使用快捷键Ctrl+S),保存生成的工程文件。
文件名填写HelloWorld。保存后,Arduino IDE会自动生成一个名称叫HelloWorld的文件夹,并在这个文件夹下生成一个同名的HelloWorld.ino文件。

.ino文件是Arduino工程的主文件,这里面实际上是C/C++语言编写的代码。
Arduino IDE要求工程项目的主文件必须置于同名文件夹之内。
2.3 Hello World
接下来,我们来实现一个简单的功能:Arduino开发板通过串口,不断的向电脑端输出Hello World;同时,我们通过串口工具,在电脑端看到Arduino开发板的输出信息。
2.3.1 原理介绍
Arduino开发板都会提供一个串口(如果你不知道什么是串口的话,可以把它想象成一条连接着开发板和其他外围设备的管道)供电脑调试Arduino开发板上运行的程序使用。
Arduino程序通过Serial.print()或者Serial.println()这样的函数,就能把数据从开发板写入到串口中,如果电脑端有对应的接收程序,那么就能看到这些传递过来的数据。

Arduino通过串口和PC(或其他设备)通讯。在Arduino IDE的代码中Serial就是串口的化身,可以直接使用Serial.print()或者Serial.println()这种方法进行数据的传送。
详细内容可以参看官网的描述。
UNO的串口硬件位置如下图,
USB接口和0、1引脚都对应串口-SerialMEGA的串口硬件位置如下图,
MEGA有多个串口,
USB接口和0、1引脚对应串口-Serial
18、19引脚对应串口1-Serial1
16、17引脚对应串口2-Serial2
14、15引脚对应串口3-Serial3
2.3.2 代码设计
新生成的HelloWorld.ino文件中,自动生成了setup()和loop()两个函数。
void setup() {// put your setup code here, to run once:}void loop() {// put your main code here, to run repeatedly:}
开发板的程序启动时,首先会调用setup(),进行初始化工作;
然后会循环的调用loop()函数,让开发板不停的运转起来。它的流程图,大概就是如下这样:

从这里可以看出,
setup()只执行一次,用来完成初始化的功能;loop()不断的被循环执行,是实现开发板逻辑控制的地方;
程序的整个逻辑就像下面的C/C++语言代码,
void setup(void);void loop(void);int main(void) {setup();while(1) {loop();}return 0;}
这里面的main()函数代码去哪了呢?它们被Arduino的开发环境隐藏了起来,只是将setup()和loop()开放给了开发者。
开发者只需要实现这两个函数就行了。这样设计的目的是让程序的结构更清晰。
在本例中,setup()函数里只需要设置串口波特率。波特率指的是数据发送的速度,只有接收方和发送方都在同一个波特率上,才能正确的接收数据。这就好比调频的电台和收音机,两者的频率必须一致才能接收到声音。
void setup() {Serial.begin(9600);}
在loop()中,用串口输出”Hello world!”,每循环一次,就会输出一次这个字符串,
void loop() {Serial.println("Hello world!");}
2.3.3 程序部署
程序写好以后,需要将电脑上编译好的程序,部署到开发板上,让程序运行起来,
用USB数据线,将开发板和电脑连接起来;现在的新版操作系统(Window, MacOS X等等),不需要安装驱动,就能识别Arduino开发板;
选择菜单栏的
工具->开发板,选择正在使用的开发板Arduino UNO(如果你使用的是MEGA就选择Arduino MEGA or MEGA 2560);
选择菜单栏的
工具->端口,选择正在使用的设备端口(如果设备被操作系统成功识别,会在此处显示出来);
点击工具栏上的
部署按钮,程序就会被编译,并部署到设备上运行了;
编译和部署这个过程。实际上执行了下面几个动作:
- 将Arduino IDE中的我们可以读懂的文字,通过编译器,转化成了机器码,其中的原理在《编译原理》这门课中会详细的介绍,如果现在不能理解,也没有关系,只要知道,这个过程是把人能读懂的逻辑,转化成了机器CPU能读懂的0101指令,并且这些指令被打包成了一个文件;
- 编译出的结果通过串口线,从电脑端,传给了Arduino主板。电脑和主板要能传递数据,必须将两者的硬件用数据线连接,而且还需要将波特率一致设置为9600;
- 机器指令传递给Arduino之后,会存储在存储器当中,然后开发板会自动重启,CPU从存储器当中读取指令开始执行。这就是一个系统加电启动的过程。
可以看出上面的过程和我们在电脑端运行程序的方法有点不同:并不是通过双击应用图标来启动程序,而是类似于电脑安装操作系统后,重新开机运行系统。这样理解就对了,其实我们使用的很多微型系统都是这样的,可以说是将自己的程序和系统程序做了深度的融合捆绑到了一起。假如以后你进行系统层级的开发(比如安卓系统、鸿蒙系统底层的开发),就会发现也是类似这样的模式(这个说法不够准确,但目前可以这样理解)。
2.3.4 数据观察
当系统运行起来以后,串口可以充当调试工具,Arduino将代码运行的信息,通过串口发送到电脑端,我们在电脑端观察当前程序运行的逻辑。
点右上角的按钮打开串口监视器(或者使用快捷键Ctrl+Shift+m)

右下角的波特率必须和setup()中设置的数值相同,本例是9600.
可以看到不断输出“Hello world!”

这种串口调试的方式是硬件调试时经常采用的方法。因为微型系统上可能没有显示屏幕,内存资源也不丰富,如果把调试信息输入到电脑端显示就方便多了,开发人员也能把这些信息保存下来,进一步分析。
串口的这个用法一定要掌握,这是我们后面进行Arduino开发的基本技能,也是以后接触其他硬件设备的必须调试方式。
至此,一个简单的Arduino程序,就在设备上运行起来了,整个系统的运行过程也就大致如此。
