1. Arduino简史

Arduino是一家制作开源计算机硬件和软件的公司,同时兼有项目和用户社区,他负责设计和制造单板微控制器和微控制器包,用于构建数字设备和交互式对象,以便在物理和数字世界中感知和控制对象。

该项目的产品是按照GNU宽通用公共许可证(LGPL)或GNU通用公共许可证(GPL)许可的开源硬件和软件分发的,Arduino允许任何人制造Arduino板和软件分发。 Arduino板可以以预装的形式商业销售,也可以作为自己动手(DIY)包购买。

Arduino电路板设计使用各种微处理器和控制器。这些电路板配有一组数字和模拟输入/输出(I/O)引脚,可以连接各种扩展板或面包板(屏蔽板)和其他电路。这些电路板具有串行通信接口,包括某些型号上的通用串行总线(USB),也用于从个人计算机加载程序。

微控制器通常使用C/C++编程语言。除了使用传统的编译工具链之外,Arduino项目还提供了一个基于Processing语言项目的集成开发环境(IDE),集成开发环境界面如图 1.1。


Arduino项目始于2003年,作为意大利伊夫雷亚地区交互设计研究所Ivrea的学生项目,目的是为新手和专业人员提供一种低成本且简单的方法,以创建使用传感器与环境相互作用的设备执行器。适用于初学者爱好者的此类设备的常见示例包括简单机器人,恒温器和运动检测器。

Arduino这个名字来自意大利伊夫雷亚的一家酒吧,该项目的一些创始人过去常常会去这家酒吧。 酒吧以伊夫雷亚的Arduin命名,他是1002年至1014年期间伊夫雷亚三国和意大利国王的统治者。

它使用 Atmel AVR 单片机,采用开放源代码的软硬件平台,构建于开放源代码 simple I/O 接口板,并具有使用类似 Java,C 语言的 Processing/Wiring 开发环境。

2. Arduino特点

基于知识共享开放源代码的电路图设计。

免费下载,也可依需求自己修改,但需遵照姓名标示。您必须按照作者或授权人所指定的方式,表彰其姓名。
依相同方式分享,若您改变或转变著作,当散布该派生著作时,您需采用与本著作相同或类似的授权条款。
Arduino可使用ICSP在线烧入器,将Bootloader烧入新的IC芯片。
可依据Arduino官方网站,获取硬件的设计档,加以调整电路板及组件,以匹配自己实际设计的需求。
可简单地与感测器,各式各样的电子组件连接,如红外线、超音波、热敏电阻、光敏电阻、伺服马达…等。
支持多样的交互程序,如Adobe Flash, Max/MSP, VVVV, Pure Data, C, Processing…等。
使用低价格的微处理控制器(Atmel AVR)(ATMEGA 8,168,328等)。
USB接口,不需外接电源。另外有提供直流(DC)电源输入。

2.1 Arduino参数:

Digital I/O 数字输入/输出端口0—13。
Analog I/O 模拟输入/输出端口0-5。
支持ICSP下载,支持TX/RX。
输入电压:USB接口供电或者5V-12V外部电源供电。
输出电压:支持3.3V级5V DC输出。
处理器:使用Atmel Atmega168 328处理器,因其支持者众多,
已有公司开发出来32位的MCU平台支持arduino。
VIN端口:VIN是input voltage的缩写,表示有外部电源时的输入端口。

AREF:Reference voltage for the analog inputs(模拟输入的基准电压)。使用analogReference()命令调用。

ICSP:也有称为ISP(In System Programmer),就是一种线上即时烧录,目前比较新的芯片都支持这种烧录模式。

我们都知道传统的烧录方式,都是将被烧录的芯片,从线路板上拔起,有的焊死在线路板上的芯片,还得先把芯片焊接下来才能烧录。只需要准备一条R232线(连接烧录器),以及一条连接烧录器与烧录芯片针脚的连接线就可以。电源的+5V,GND,两条负责传输烧录信息的针脚,再加上一个烧录电压针脚,这样就可以烧录了。

2.2 Arduino 板的说明

在本章中,我们将了解Arduino板上的不同组件。将学习Arduino UNO板,因为它是Arduino板系列中最受欢迎的。此外,它是开始使用电子和编码的最佳板。有些板看起来与下面给出的有些不同,但多数Arduino中的这些组件大部分是共同的.

Arduino UNO板

    
   电源USB

Arduino板可以通过使用计算机上的USB线供电。你需要做的是将USB线连接到USB接口。

    电源(桶插座)

Arduino板可以通过将其连接到电影插口直接从交流电源供电。

    稳压器

稳压器的功能是控制提供给Arduino板的电压,并稳定处理器和其他元件使用的直流电压。

    晶体振荡器

晶振帮助Arduino处理时间问题。Arduino如何计算时间?答案是,通过使用晶体振荡器。在Arduino晶体顶部打印的数字是16.000H9H。它告诉我们,频率是16,000,000赫兹或16MHz。

    Arduino重置

你可以重置你的Arduino板,例如从一开始就启动你的程序。可以通过两种方式重置UNO板。首先,通过使用板上的复位按钮(17)。其次,你可以将外部复位按钮连接到标有RESET(5)的Arduino引脚。

    引脚(3.3,5,GND,Vin)

    3.3V(6) - 提供3.3输出电压

    5V(7) - 提供5输出电压

使用3.3伏和5伏电压,与Arduino板一起使用的大多数组件可以正常工作。

   GND(8)(接地) - Arduino上有几个GND引脚,其中任何一个都可用于将电路接地。

   VVin(9) - 此引脚也可用于从外部电源(如交流主电源)为Arduino板供电。

    
   模拟引脚

Arduino UNO板有六个模拟输入引脚,A0到A5。这些引脚可以从模拟传感器(如湿度传感器或温度传感器)读取信号,并将其转换为可由微处理器读取的数字值。

    
    微控制器

每个Arduino板都有自己的微控制器(11)。你可以假设它作为板的大脑。Arduino上的主IC(集成电路)与板对板略有不同。微控制器通常是ATMEL公司的。在从Arduino IDE加载新程序之前,你必须知道你的板上有什么IC。此信息位于IC顶部。有关IC结构和功能的更多详细信息,请参阅数据表。

     ICSP引脚

大多数情况下,ICSP(12)是一个AVR,一个由MOSI,MISO,SCK,RESET,VCC和GND组成的Arduino的微型编程头。它通常被称为SPI(串行外设接口),可以被认为是输出的“扩展”。实际上,你是将输出设备从属到SPI总线的主机。

    电源LED指示灯

当你将Arduino插入电源时,此LED指示灯应亮起,表明你的电路板已正确通电。如果这个指示灯不亮,那么连接就出现了问题。

    TX和RX LED

在你的板上,你会发现两个标签:TX(发送)和RX(接收)。它们出现在Arduino UNO板的两个地方。首先,在数字引脚0和1处,指示引脚负责串行通信。其次,TX和RX LED(13)。发送串行数据时,TX LED以不同的速度闪烁。闪烁速度取决于板所使用的波特率。RX在接收过程中闪烁。

      数字I/O

Arduino UNO板有14个数字I/O引脚(15)(其中6个提供PWM(脉宽调制)输出),这些引脚可配置为数字输入引脚,用于读取逻辑值(0或1) ;或作为数字输出引脚来驱动不同的模块,如LED,继电器等。标有“〜”的引脚可用于产生PWM。

       AREF

AREF代表模拟参考。它有时用于设置外部参考电压(0至5伏之间)作为模拟输入引脚的上限。

3. 软件支持

3.1 IDE:

Arduino提供了Arduino Software IDE,一套以Java编写的跨平台应用软件。Arduino Software IDE源自于Processing编程语言以及Wiring计划的集成开发环境。它是被设计于介绍程序编写给艺术家和不熟悉程序设计的人们,且包含了一个拥有语法高亮、括号匹配、自动缩进和一键编译并将可执行文件烧写入Arduino硬件中的编辑器。

Arduino Software IDE使用与C语言和C++相仿的编程语言,并且提供了包含常见的输入/输出函数的Wiring软件库。在使用GNU toolchain编译和链接后,Arduino Software IDE提供了一个程序“avrdude”用来转换可执行档成为能够烧写入Arduino硬件的固件。

3.2 Sketch:

使用Arduino Software IDE编写的程序被称为“sketch”。一个典型的Arduino C/C++ sketch程序会包含两个函数,它们会在编译后合成为main()函数:

setup():在程序运行开始时会运行一次,用于初始化设置。
loop():直到Arduino硬件关闭前会重复运行函数放的代码。

4. Arduino编程语言

int LED_PIN=13;
 
void setup () {                    // 初始化副程式,程式起始時僅執行一次
    pinMode (LED_PIN, OUTPUT);     // 以數位輸出方式啟用Pin13
}
 
void loop () {                     // loop副程式,重複不斷執
    digitalWrite (LED_PIN, HIGH);  // 打開LED(發光二極管)
    delay (1000);                  // 等待一秒,delay內含數值1000,代表延遲1000毫秒,即一秒。
    digitalWrite (LED_PIN, LOW);   // 關閉LED
    delay (1000);                  // 等待一秒
}                                  // loop副程式結束

(Arduino的Blink示例程序)

Arduino 程序可由五个部分组成 :

//1. 导入库与定义 (可有可无)
#include <SoftEasyTranfer.h>

#define LEDPIN 13;

//2. 声明常量与全域变量 (可有可无)
const float PI=3.14159;

int r=0 ;

//3. 初始化函数setup() (必要)
void setup() {}

//4. 循环函数loop()  (必要)
void loop() {}

//5. 自定义函数 (可有可无)
float area(float r) {
  float a=PI*r*r;

  return a;

  }

其中 setup() 与 loop() 是一定要有的函数 (均无参数无传回值), 其他则视需要而定. Arduino 语言采用 C/C++ 语法,加上以 Wiring 为基础的电子设计核心库组合而成, 包括 Digital I/O, Analog I/O 等库. 内置的库可直接调用, 但若有使用第三方库(例如驱动感测器模块所需的库), 则必须使用 include 前置指令引入. 此外, 也可以用前置指令 define 定义一个常量或宏 (表达式).

前置指令乃 C 编译器指令, 不属于 C 语言本身, 其用途有三 :

引入头文件 : 例如 #include <myLibrary.h> 或 "myLibrary.h"
  定义常量 : 例如 #define PI 3.14159
  定义宏 : 例如 #define AREA(r) PI*r*r
所以前置指令的功能一言以蔽之就是替换, include 就是在标头处以指定之文件内容替换; 而 #define 就是在程序中用到所定义之常量与宏名称时, 以其内容替换.

宏的功能事实上与函数类似, 不同之处是函数调用使用堆栈, 而宏则是直接放在源代码中,由编译器自动进行替换,运行效率较快 (但若很多地方都要用到时, 编译后就会比较大).

注意:

头文件可用角括号 < > 或双引号 "", 差别是:

a. 用双引号时, 前置处理器会先从源文件所在位置开始去搜索头文件;

b. 而用角括号则会先从 libraries 目录开始找.

5. Arduino 数据类型
 

C中的数据类型是指用于声明不同类型的变量或函数的扩展系统。变量的类型确定它在存储器中占用多少空间以及如何解释存储的位模式。下表提供了你将在Arduino编程期间使用的所有数据类型。

void

void关键字仅用于函数声明。它表示该函数预计不会向调用它的函数返回任何信息。

例子

Void Loop ( ) {
   // rest of the code
}

Boolean

布尔值保存两个值之一,true或false。每个布尔变量占用一个字节的内存。

例子

boolean val = false ; // declaration of variable with type boolean and initialize it with false
boolean state = true ; // declaration of variable with type boolean and initialize it with false

Char
一种数据类型,占用一个字节的内存,存储一个字符值。字符文字用单引号写成:'A',对于多个字符,字符串使用双引号:"ABC"。

但是,字符是存储为数字。你可以在ASCII图表中查看特定编码。这意味着可以对使用ASCII值的字符进行算术运算。例如,'A'+1的值为66,因为大写字母A的ASCII值为65。

例子

Char chr_a = ‘a’ ;//declaration of variable with type char and initialize it with character a
Char chr_c = 97 ;//declaration of variable with type char and initialize it with character 97

unsigned char

unsigned char是一种无符号数据类型,占用一个字节的内存。unsigned char数据类型编码数字为0到255。

例子

Unsigned Char chr_y = 121 ; // declaration of variable with type Unsigned char and initialize it with character y

byte

一个字节存储一个8位无符号数,从0到255。

例子

byte m = 25 ;//declaration of variable with type byte and initialize it with 25

int
整数(int)是数字存储的主要数据类型。int存储16位(2字节)值。

这产生-32768至32767的范围(最小值为-2^15,最大值为(2^15)-1)。

int的大小因板而异。例如,在Arduino Due中,int存储32位(4字节)值。这产生-2147483648至2147483647的范围(最小值-2^31和最大值(2^31)-1)。

例子

int counter = 32 ;// declaration of variable with type int and initialize it with 32

Unsigned int

unsigned int(无符号整数)与int相同,存储2字节。然而,它们只存储正值,产生0到65535(2^16)-1的有效范围。Due存储4字节(32位)值,范围从0到4294967295(2^32-1)。

例子

Unsigned int counter = 60 ; // declaration of variable with 
   type unsigned int and initialize it with 60

Word

在Uno和其他基于ATMEGA的板上,一个word存储一个16位无符号数。在Due和Zero上,它存储一个32位无符号数。

例子

word w = 1000 ;//declaration of variable with type word and initialize it with 1000

Long

Long变量是用于数字存储的扩展大小变量,存储32位(4字节),从-2147483648到2147483647。

例子

Long velocity = 102346 ;//declaration of variable with type Long and initialize it with 102346

unsigned long

unsigned long变量是用于数字存储的扩展大小变量,并存储32位(4字节)。与标准的long不同,unsigned long不会存储负数,它们的范围为0到4294967295(2^32-1)。

例子

Unsigned Long velocity = 101006 ;// declaration of variable with 
   type Unsigned Long and initialize it with 101006

short

short是16位数据类型。在所有Arduinos(基于ATMega和ARM)上,一个short存储一个16位(2字节)值。这产生-32768至32767的范围(最小值为-2^15,最大值为(2^15)-1)。

例子

short val = 13 ;//declaration of variable with type short and initialize it with 13

float

浮点数的数据类型是具有小数点的数字。浮点数通常用于近似模拟值和连续值,因为它们的分辨率高于整数。

浮点数可以大到3.4028235E+38,也可以低到-3.4028235E+38。它们被存储为32位(4字节)信息。

例子

float num = 1.352;//declaration of variable with type float and initialize it with 1.352

double

在Uno和其他基于ATMEGA的板上,双精度浮点数占用四个字节。也就是说,double实现与float完全相同,精度没有增益。在Arduino Due上,double具有8字节(64位)精度。

例子

double num = 45.352 ;// declaration of variable with type double and initialize it with 45.352

6. Arduino 变量和常量

在我们开始解释变量类型之前,我们需要确定一个非常重要的主题,称为变量范围即作用域问题。

什么是变量范围?
Arduino使用的C语言中的变量具有名为scope(范围)的属性。scope是程序的一个区域,有三个地方可以声明变量。它们是:

在函数或代码块内部,称为局部变量。
在函数参数的定义中,称为形式参数。
在所有函数之外,称为全局变量。

局部变量
在函数或代码块中声明的变量是局部变量。它们只能由该函数或代码块中的语句使用。局部变量不能在它们自己之外运行。以下是使用局部变量的示例:

Void setup () {
 
}
 
Void loop () {
   int x , y ;
   int z ; Local variable declaration
   x = 0;
   y = 0; actual initialization
   z = 10;
}

全局变量
全局变量在所有函数之外定义,通常位于程序的顶部。全局变量将在程序的整个生命周期中保持其真知。

全局变量可以被任何函数访问。也就是说,一个全局变量可以在整个程序中声明后使用。

以下示例使用全局变量和局部变量:

注意:全局变量、静态变量、常量应使用大写字母来命名name,防止混淆且有警示作用。

Int T , S ; //全局变量大写
float c = 0 ; Global variable declaration
Void setup () {
 
}
 
Void loop () {
   int x , y ; // 局部变量小写
   int z ; Local variable declaration
   x = 0;
   y = 0; actual initialization
   z = 10;
}

【Questions】

1.什么是单片机?它与个人计算机有什么不同?

Ans:一台能够工作的计算机要有这样几个部份构成:中央处理单元CPU(进行运算、控制)、随机存储器RAM(数据存储)、存储器ROM(程序存储)、输入/输出设备I/O(串行口、并行输出口等)。在个人计算机(PC)上这些部份被分成若干块芯片,安装在一个被称之为主板的印刷线路板上。而在单片机中,这些部份全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如模拟量/数字量转换(A/D)和数字量/模拟量转换(D/A)等。

2. 为什么用单片机,如Arduino、STm32,etc.

实际工作中并不是任何涉及计算和控制的场合都要求处理器或计算机有很高的性能,其应用的关键在于使用性能(是否够用)和经济性(是否有很好的性能价格比)。