简介

https://www.arduino.cc/en/Guide/Introduction
Massimo Banzi之前是意大利Ivrea一家高科技设计学校的老师。他的学生们经常抱怨找不到便宜好用的微控制器。 2005年冬天, Massimo Banzi跟David Cuartielles讨论了这个问题。 David Cuartielles是一个西班牙籍晶片工程师,当时在这所学校做访问学者。两人决定设计自己的电路板,并引入了Banzi的学生David Mellis为电路板设计编程语言。两天以后,David Mellis就写出了程式码。又过了三天,电路板就完工了。Massimo Banzi喜欢去一家名叫di Re Arduino的酒吧,该酒吧是以1000年前意大利国王Arduin的名字命名的。为了纪念这个地方,他将这块电路板命名为Arduino。
https://www.bilibili.com/video/BV1d7411Z7ts?share_source=copy_web
Arduino的历史和创始人马西莫·班兹的故事,入门Arduino的朋友可以读一读 @02-44.59 1645585458668.png

随后Banzi、Cuartielles和Mellis把设计图放到了网上。为了保持开放理念,Arduino官方团队决定采用Creative Commons(CC)许可。在CC许可下,任何人都被允许生产和销售Arduino开发板的复制品,而不需要向Arduino官方支付版税,甚至不用取得Arduino官方的许可,只需要说明Arduino团队的贡献以及保留Arduino这个名字。因此在网上有两种开发板,一种是Arduino官方出品的官方板,另一种则是其它厂商使用Arduino团队的设计所制作和销售的克隆板。
image.pngimage.png

image.png

Arduino项目展示

点击查看【bilibili】
点击查看【bilibili】

Arduino在生物医学工程领域

点击查看【bilibili】
RYNES M L, GHANBARI L, SCHULMAN D S, et al. Assembly and operation of an open-source, computer numerical controlled (CNC) robot for performing cranial microsurgical procedures [J]. Nature Protocols, 2020, 15(6): 1992-2023.
image.png

Arduino 优缺点

  • 跨平台
    Arduino IDE可以在Windows、MacintoshOS X、Linux三大主流操作系统上运行,而其他的大多数控制器只能在Windows上开发。

  • 简单清晰
    Arduino IDE基于processing IDE开发。对于初学者来说,极易掌握,同时有着足够的灵活性。Arduino语言基于wiring语言开发,是对 avr-gcc库的二次封装,不需要太多的单片机基础、编程基础,简单学习后,你也可以快速的进行开发。

  • 开放性
    Arduino的硬件原理图、电路图、IDE软件及核心库文件都是开源的,在开源协议范围内里可以任意修改原始设计及相应代码。

  • 发展迅速
    Arduino不仅仅是全球最流行的开源硬件,也是一个优秀的硬件开发平台,更是硬件开发的趋势。Arduino简单的开发方式使得开发者更关注创意与实现,更快的完成自己的项目开发,大大节约了学习的成本,缩短了开发的周期。

我有一个想法或者方案要进行快速验证。这时候,我需要一个硬件统一,软件资源丰富,开发方便的硬件平台。这种情况下,成本、稳定性之类的需求都是次要的。

我需要开发一个产品。这时候,成本往往就成为了第一需要考虑的因素,然后还有体积、性能、功耗、稳定性、外围电路复杂度、布线难易度、供货稳定度等等等等多种因素都需要进行考虑。Arduino的成本高,体积大,性能弱等都是它的致命缺点。

Arduino硬件

Arduino开发板

Arduino开发板是一个大的家族,Arduino官网上一共列出有几十种不同的开发板:https://www.arduino.cc/en/Main/Products
image.png
几乎所有Arduino爱好者的第一块开发板都是Arduino Uno R3。这款开发板可以说是性价比最高的一款产品,也可以说是最适合初学者学习使用的开发板。Arduino Uno R3是基于ATmega328P(https://www.microchip.com/en-us/product/ATmega328)的开发板,它有14个数字输入/输出引脚(这些引脚中有6个引脚可以作为PWM输出引脚),6个模拟输入引脚。
image.png
Arduino Mega是为较为复杂的Arduino开发项目而设计的,基于ATmega2560芯片。Arduino Mega开发板有54个数字输入/输出引脚(其中有15个引脚可用于PWM输出),16个模拟输出引脚,4个USART硬件串行接口。如果所开发的项目需要比Uno更多的引脚来控制外部设备以及采集传感器数据,那么Mega可以满足需求,除此Mega还具有更多的硬件串行接口可以与更多的外部设备进行串行通讯等。当然更多的功能意味着Mega的价格也要高于Uno。
Arduino Mega常用于3D打印机以及机器人项目。
image.png

Arduino Nano“板”如其名,他的尺寸和重量都只有Uno的三分之一左右。Arduino Nano具有与Uno相同的核心微控制器(ATmega328P),它与Uno的区别是Nano没有直流电压供电接口同时Nano通过Mini-B USB 接口与电脑连接。假如项目对尺寸和重量有要求导致Uno不适合,那么Nano是一个很不错的选择。
image.png

Arduino Uno开发板

Arduino Uno 管脚如图所示:
image.png
在开发板上我们可以看到引脚共分为3组:

Arduino引脚默认为输入,因此当使用它们作为输入时,不需要使用pinMode()将它们声明为输入。以这种方式配置的引脚被称为处于高阻抗状态。输入引脚对取样电路的要求非常小,相当于引脚前面有一个100兆欧的串联电阻。这意味着它只需要很小的电流就可以将输入引脚从一种状态移动到另一种状态,并且可以使引脚用于执行电容式触摸传感器、作为光电二极管读取LED或使用RCTime方案读取模拟传感器等任务。
通常增加一个上拉电阻或者下拉电阻使得输入引脚处于一个确定的状态。一般选择10kΩ电阻。

  • OUTPUT

在Arduino上,当数字引脚配置为输出时,它们设置为0或5V。当数字引脚配置为输入时,电压由外部设备提供。该电压可以在0-5V之间变化,并转换成数字表示(0或1)。

PWM
PWM
TX/RX
所有Arduino控制器都有至少一个串行端口(也称为UART或者USART)。个人电脑可以通过USB端口与Arduino的引脚0(RX)和引脚1(TX) 进行通信。所以当Arduino的引脚0和引脚1用于串行通信功能时,Arduino的引脚0和引脚1是不能做其他用的。

TX和RX是串口通信的引脚,USB是通用串行总线的协议,现在电脑上多数只有usb口,一般不会有串口,而arduino使用的是avr芯片,单片机默认都会提供串口通信,所以arduino为了解决电脑没有串口的问题,使用usb转串口的适配器把usb数据转成串口,然后再接到arduino的tx和rx口上,usb和rx、tx上的数据是一样的,只是使用的协议不一样而已

模拟输入端口

Arduino Uno有6个模拟引脚,它们作为ADC(模数转换器)使用。这些引脚用作模拟输入,但也可用作数字输入或数字输出
image.png
ADC是用于将模拟信号转换为数字信号的电子电路。Arduino引脚A0-A5能够读取模拟电压。在Arduino上,ADC具有10位分辨率,这意味着它能将0 ~ 5 V的电压分成1024份(2^10),算出来即为4.882mV的测量精度,举个例子就是0V的时候测量结果为0,5V为1023,3V约为615。
AREF端口
模拟输入的参考电压。在AREF接入一个最大模拟输入量作为参考值(比如上面所说的3V3),这样不仅能直接读到1023,更为重要的是精度提高,用3V3作为AREF的时候,精度是 3.3/1023≈3.223mV,测量精度提高了

电源端口

Arduino Uno开发板可以使用三种方式供电:
image.png

  • 直流电源插孔:可以使用电源插孔为Arduino开发板供电。电源插孔通常连接到一个适配器。开发板的供电范围可以是5-20V,但制造商建议将其保持在7-12V之间。高于12V时,稳压芯片可能会过热,低于7V可能会供电不足。
  • VIN引脚:该引脚用于使用外部电源为Arduino Uno开发板供电。电压应控制在上述提到的范围内。
  • USB电缆:连接到计算机时,提供500mA/5V电压。

  • 5V和3V3:提供稳压的5V和3.3V,向外部组件供电

  • RESET:复位Arduino开发板
  • IOREF:该引脚是输入/输出参考,它提供了微控制器工作的逻辑电平。从Uno的电路图可以看到,IOREF直接与5V相连:

image.png

编程软件

Arduino IDE

Arduino IDE 下载链接:Software | Arduino,支持Win,Mac OS,Linux
image.png

使用VSCode开发Arduino

  • 下载官方Arduino IDE,VSCode只是编辑器,需要去调用Arduino IDE完成程序编译等。
  • 启动VSCode,搜索Arduino插件并安装。

image.png

  • 进入VSCode的设置界面,你可以使用快捷键「Ctrl+,」,搜索Arduino相关设置,在Path中添加Arduino IDE的安装路径。

image.png
设置完成

我们可以在窗口下方状态条处,点击设置开发板型号、COM口等,可以点击插头标志开启串口监视器:
image.png
点击窗口右上方图标或使用快捷键进行编译和上传操作:
Ctrl+Alt+U 编译并上传
Ctrl+Alt+R 进行编译验证
20200408102642770.gif

第一个程序

https://docs.arduino.cc/tutorials/uno-rev3/Blink
Arduino 提供了很多官方的例程供大家学习,按照如下路径打开 Blink 程序:
image.png
它的功能是控制开发板上与13脚相连的 LED 闪烁,等效电路图如图所示:
image.png

单击编译按钮,IDE 会检查代码中的错误,如果没有错误就会对程序进行编译。
image.png
编译完成后会显示如下信息:
image.png
在编译完后,程序仍然存在于计算机内存中而非单片机上。所以,还需要单击下载按钮以便将编译后的程序从 PC 内存上移动到单片机的闪存中。

程序解读

Arduino语言基于wiring语言开发,是对 avr-gcc库的二次封装,不需要太多的单片机基础、编程基础,简单学习后,即可快速的进行开发。
Arduino—定会包含两个函数:一个叫setup()另一个叫loop()setup()函数中所写的代码只会在程序开始时执行一次,而loop()函数中的代码会一遍一遍地重复执行。之所以这样是因为Arduino不像一般的计算机——它不会同时执行多个程序,也不会退出。当你给控制板供电之后,程序就开始运行, 如果你想停止运行,只能采取断电的方式。
**setup()**函数:当Arduino程序开始运行时会调用setup()函数。通常我们setup()函数其中初始化一些变量、引脚状态及一些调用的库等。当Arduino控制器通电或复位后,setup函数会运行一次。

  1. // the setup function runs once when you press reset or power the board
  2. void setup() {
  3. // initialize digital pin LED_BUILTIN as an output.
  4. pinMode(LED_BUILTIN, OUTPUT);
  5. }

pinMode()告诉Arduino如何设置当前的引脚。数字脚能够用作输入或输出,但是我们需要告诉Arduino我们打算如何应用这个引脚。此处我们需要设置为输出来控制我们的LED。
pinMode()函数需要两个参数,第一个参数告诉pinMode()要控制哪一个引脚,而第二个参数告诉pinMode()控制的这个引脚是输入还是输出。INPUTOUTPUT是Arduino语言中预先定义好的常量。

**loop()**函数:在setup()函数对程序完成了初始化后,loop()函数将会运行。loop函数是一个循环体,在Arduino启动后,loop()函数中的程序将会不断运行。通过loop()函数你可以利用你的程序来控制Arduino,并使Arduino根据你的程序进行相应的反应。

  1. // the loop function runs over and over again forever
  2. void loop() {
  3. digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
  4. delay(1000); // wait for a second
  5. digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
  6. delay(1000); // wait for a second
  7. } // wait for a second

digitalWrite()能够将任何设置为输出的数字引脚输出高电平或低电平。digitalWrite()需要两个参数,第一个参数依然是我们所要控制的引脚,第二个参数不同:这里第二个参数是告诉digitalWrite()函数设置低电压0V (LOW)还是高电压5V(HIGH)。

Arduino语法

https://www.arduino.cc/reference/en/
http://www.taichi-maker.com/homepage/reference-index/arduino-code-reference/

数字输入——按键开关

按键开关是一种功能性的电子开关,使用时轻轻点按开关按钮就可使开关接通,当松开手时开关断开。鼠标中就有类似的按键开关。
image.pngimage.png

image.png
digitalRead(pin):读取数字引脚的 HIGH(高电平)或 LOW(低电平)。
pin:被读取的引脚号码
当开关没有被按下时:
image.png
此时引脚2读取到的是高电平。

当开关被按下后:
image.png
此时引脚2读取到的是低电平。电阻的作用就是使得开关按下时引脚2确定处于低电平状态。

  1. /*
  2. DigitalReadSerial
  3. Reads a digital input on pin 2, prints the result to the serial monitor
  4. 读取引脚2的数字输入,将结果显示在串口监视器中
  5. This example code is in the public domain.
  6. */
  7. // digital pin 2 has a pushbutton attached to it. Give it a name:
  8. //引脚2连接有按键开关,给它一个名字:
  9. int pushButton = 2;
  10. // the setup routine runs once when you press reset:
  11. //当你按下复位按钮后,setup流程运行一次:
  12. void setup() {
  13. // initialize serial communication at 9600 bits per second:
  14. //串口通讯初始化,每秒9600位
  15. Serial.begin(9600);
  16. // make the pushbutton's pin an input:
  17. //设置按键引脚为输入
  18. pinMode(pushButton, INPUT);
  19. }
  20. // the loop routine runs over and over again forever:
  21. // loop 流程会永远的反复运行
  22. void loop() {
  23. // read the input pin:
  24. //读取输入引脚:
  25. int buttonState = digitalRead(pushButton);
  26. // print out the state of the button:
  27. // 显示按键状态
  28. Serial.println(buttonState);
  29. delay(1); // delay in between reads for stability 为确保程序稳定运行进行短暂停止
  30. }

模拟输出

电路连接:
image.png
函数说明:
analogWrite(pin, value)
pin:被读取的模拟引脚号码
value:0到255之间的PWM频率值。

  1. boolean pushButton1; // 创建布尔型变量用来存储按键开关1的电平状态
  2. boolean pushButton2; // 创建布尔型变量用来存储按键开关2的电平状态
  3. int ledPin = 9; //LED引脚号
  4. int brightness = 128; //LED亮度参数
  5. void setup() {
  6. // put your setup code here, to run once:
  7. pinMode(2, INPUT_PULLUP); //将引脚2设置为输入上拉模式
  8. pinMode(8, INPUT_PULLUP); //将引脚8设置为输入上拉模式
  9. pinMode(ledPin, OUTPUT); //将LED引脚设置为输出模式
  10. Serial.begin(9600); //启动串口通讯
  11. }
  12. void loop() {
  13. // put your main code here, to run repeatedly:
  14. pushButton1 = digitalRead(2); //读取引脚2电平状态并将其赋值给布尔变量
  15. pushButton2 = digitalRead(8); //读取引脚8电平状态并将其赋值给布尔变量
  16. if (!pushButton1 && brightness > 0){ // 当按下按键开关1并且LED亮度参数大于0
  17. brightness--; // 减低LED亮度参数
  18. //(brightness-- 相当于 brightness = brightness - 1;)
  19. } else if (!pushButton2 && brightness < 255) { //当按下按键开关2并且LED亮度参数小于255
  20. brightness++; //增加LED亮度参数
  21. //(brightness++ 相当于 brightness = brightness + 1;)
  22. }
  23. analogWrite(ledPin, brightness); //模拟输出控制LED亮度
  24. Serial.println(brightness); //将LED亮度参数显示在串口监视器上
  25. delay(10);
  26. }

模拟输入

电路连接:
image.png
函数说明:
analogRead(pin):本指令用于从Arduino的模拟输入引脚读取数值。Arduino控制器有多个10位数模转换通道。这意味着Arduino可以将0-5伏特的电压输入信号映射到数值0-1023。换句话说,我们可以将5伏特等分成1024份。0伏特的输入信号对应着数值0,而5伏特的输入信号对应着1023。
Arduino控制器读取一次模拟输入需要消耗100微秒的时间(0.0001秒)。控制器读取模拟输入的最大频率是每秒10000次。
pin:被读取的模拟引脚号码
返回值:0~1023

  1. void setup() {
  2. // 串口通讯初始化(9600 bps):
  3. Serial.begin(9600);
  4. }
  5. void loop() {
  6. // 读取模拟输入值:
  7. int analogInputVal = analogRead(A0);
  8. // 将结果通过串口监视器显示:
  9. Serial.println(analogInputVal);
  10. }