前言:项目驱动的学习方法使我们能够快速的掌握新知识,开发出新产品。该学习笔记是基于《略》机器人项目的底层开发,学习、整理和总结而来,其涵盖了Arduino的基础知识和实际开发例程。后续会继续整理《OpenCV+TensorFlow 》、《Raspberry Pi Linux》、《ROS Fundamental》等内容。
《Arduino学习笔记》由四篇文章来完成,各部分内容安排如下:
第一部分:介绍Arduino开源历史以及硬件基础
第二部分:总结Arduino的I/O接口
第三部分:总结Arduino常用函数和功能(C/C++)
第四部分:上电实战
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 开发环境。
VIN端口:VIN是input voltage的缩写,表示有外部电源时的输入端口。
AREF:Reference voltage for the analog inputs(模拟输入的基准电压)。使用analogReference()命令调用。
ICSP:也有称为ISP(In System Programmer),就是一种线上即时烧录,目前比较新的芯片都支持这种烧录模式。我们都知
道传统的烧录方式,都是将被烧录的芯片,从线路板上拔起,有的焊死在线路板上的芯片,还得先把芯片焊接下来才能烧录。
只需要准备一条R232线(连接烧录器),以及一条连接烧录器与烧录芯片针脚的连接线就可以。电源的+5V,GND,两条负责传输烧录信息的针脚,再加上一个烧录电压针脚,这样就可以烧录了。
Arduino提供了Arduino Software IDE,一套以Java编写的跨平台应用软件。Arduino Software IDE源自于Processing编程语言以及Wiring计划的集成开发环境。它是被设计于介绍程序编写给艺术家和不熟悉程序设计的人们,且包含了一个拥有语法高亮、括号匹配、自动缩进和一键编译并将可执行文件烧写入Arduino硬件中的编辑器。
Arduino Software IDE使用与C语言和C++相仿的编程语言,并且提供了包含常见的输入/输出函数的Wiring软件库。在使用GNU toolchain编译和链接后,Arduino Software IDE提供了一个程序“avrdude”用来转换可执行档成为能够烧写入Arduino硬件的固件。
使用Arduino Software IDE编写的程序被称为“sketch”。一个典型的Arduino C/C++ sketch程序会包含两个函数,它们会在编译后合成为main()函数:
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 程序可由五个部分组成 :
#include
#define LEDPIN 13;
const float PI=3.14159;
int r=0 ;
void setup() {}
void loop() {}
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 就是在标头处以指定之文件内容替换; 而 #define 就是在程序中用到所定义之常量与宏名称时, 以其内容替换.
宏的功能事实上与函数类似, 不同之处是函数调用使用堆栈, 而宏则是直接放在源代码中,由编译器自动进行替换,运行效率较快 (但若很多地方都要用到时, 编译后就会比较大).
头文件可用角括号 < > 或双引号 "", 差别是用双引号时, 前置处理器会先从源文件所在位置开始去搜索头文件; 而用角括号则会先从 libraries 目录开始找.
1.什么是单片机?它与个人计算机有什么不同?
Ans:一台能够工作的计算机要有这样几个部份构成:中央处理单元CPU(进行运算、控制)、随机存储器RAM(数据存储)、存储器ROM(程序存储)、输入/输出设备I/O(串行口、并行输出口等)。在个人计算机(PC)上这些部份被分成若干块芯片,安装在一个被称之为主板的印刷线路板上。而在单片机中,这些部份全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如模拟量/数字量转换(A/D)和数字量/模拟量转换(D/A)等。
2. 为什么用单片机,如Arduino、STm32,etc.
实际工作中并不是任何涉及计算和控制的场合都要求处理器或计算机有很高的性能,其应用的关键在于使用性能(是否够用)和经济性(是否有很好的性能价格比)。