高大上的无人机玩过吗?智能的家庭空气检测仪见过吗?手机控制的电子体重秤、血压仪用过吗?这些“高科技”都属于智能硬件。

作为软件开发者的你,有没有想过自己开发一个智能硬件呢?

除此之外,假如你正在学习C/C编程语言,有没有觉得学习的内容很枯燥,不知道学习以后能做什么用呢?假如在学习的同时,将智能硬件的实践结合起来,你一定会发现学以致用的乐趣,并且一定会帮助你对整个C/C编程体系有非常深刻的、直观的认识和理解。

也许你会觉得硬件开发的门槛很高,作为小白或者软件开发者难以企及,那么这你就想错了。其实,现在已经有了很多专门为软件开发者设计的智能硬件开发平台。例如现在火爆的树莓派-raspberry pi、英特尔推出的爱迪生-Edison,以及本系列将重点介绍的Arduino

第1节 我选Arduino - 图1

有了它们,即使你对硬件并不了解,也能开发出软硬件完美结合的智能小硬件。

这些硬件都有个共同的特点,采用主控制板(开发板)+扩展板+外接硬件的方式工作。

  1. 主控制板(开发板):我们讲的平台(树莓派、爱迪生、Arduino),指的就是主控制板,它通常就是一个开发板。你可以把它想象成台式电脑上的主板,只不过这个主板已经焊接上了CPU和内存等最最主要的部件;

  2. 扩展板:主控制板上的针脚是有限的,扩展板可以把一个针脚扩展成多个针脚,让更多的设备与这个针脚连接。它们就好像是电脑主板上延伸出来的一根根USB数据线,把主板上的一个USB接口,转接成了多组不同的USB接口,放在电脑主机的前面和后面;扩展板也不一定必须使用到,它是主板的一个辅助工具,能方便的帮助使用者链接线路而已;

  3. 外接硬件:按钮开关、传感器等器件通过扩展板与主控制板的针脚相连。它们就好像是台式电脑上的USB接口可以连接的U盘、移动硬盘、USB Wifi等等外接设备;

第1节 我选Arduino - 图2

可以想象的到,只要使用对应平台的扩展板,外接硬件可以连接在不同的平台上,正常的使用。所以那些外接的硬件有很高的通用性。

1.1 WHY Arduino

在前面提到的智能硬件开发平台中,我们选择了Arduino。先来看看关于它的来历的吧。

这个一个非常著名的开源硬件项目,诞生于意大利的一所学校。据说学校的学生们找不到好用的开发板。2005 年冬天, Massimo Banzi 跟朋友 David Cuartielles 讨论了这个问题,David Cuartielles 是一个西班牙芯片工程师,当时在这所学校做访问学者。两人决定设计自己的电路板,并请 Banzi 的学生 David Mellis 为电路板设计编程语言。两天以后,David Mellis 就写出了程序。又过了三天,电路板就完工了。

在学校附近的街上有家叫「di Re Arduino」的酒吧。Massimo Banzi经常光临这家酒吧,于是他将这个电子产品命名为 Aruino,以纪念这个地方。

任何人即使不懂电脑编程,也能用 Arduino 做出很酷的东西。

Arduino有什么优势呢?

  1. Arduino足够的便宜,一个Arduino开发板也就几十块人民币(即使是意大利原装板也只要100多人民币),投入的硬件成本很低,可以花很低的代价学习开发;

  2. 作为智能硬件的初学者,总希望从最简单的开始,能学到原理,但是又不要有太高的学习门槛,有了基础以后再循序渐进。Arduino开发只需要开发者会基本的C/C++语言就可以了,几乎不需要任何其他的编程或硬件基础;

  3. Arduino的运算能力足够制作一些简单的智能硬件了,而它又更接近一个单片机,很多其他的智能硬件都可以用它进行功能的验证;

  4. Arduino是软硬件开源的,有很多的技术资料可以参考,有庞大的社区支持,可以找到很多志同道合的人交流、快速进步;

所以,我们选择这个性价比最高的的平台来开始智能硬件开发之旅。

除此以外,在使用Arduino的过程中,你会感性的认识:

  1. 软件代码转变为机器指令执行的过程;
  2. 机器指令下载到硬件设备的存储模块进行保存;
  3. 硬件设备加电之后如何从你写的第一行代码开始执行;

虽然以上过程和一台真正的计算机从启动到运行的过程有很大不同,但是基本的原理都是一样的,会让你将C/C++语言和硬件打交道的整个逻辑关联起来,帮助你理解。假如你是位系统学习过软件开发的大学生,那么你会对编译原理、计算机原理、编程语言、应用程序的整个运行体系有一个整体的认识。

不过,即使你没有上述的基础知识也没有关系,通过Arduino,你会在不知不觉中掌握其中的概念,为以后的相关学习做好铺垫。

1.2 Arduino开发板

Arduino开发板根据尺寸、性能,分为了多个子系列。

第1节 我选Arduino - 图3

其中最常见、用来做入门学习的有两种,UNO和MEGA。

第1节 我选Arduino - 图4

这两个开发板的功能几乎一样,MEGA使用的主控制芯片性能要高一些,针脚多一些,可以同时连接的外接硬件就要多一些。

相比之下,UNO接口太少,配置低一些,价格也便宜一些。MEGA配置高一些,价格比UNO贵一点。

另外,UNO的串口控制器只有一个,假如你还要使用其他串口设备的时候,调试起来就比较吃力了。例如做蓝牙小车,因为Uno只有一个串口,蓝牙和USB都想要使用,你就得先拔下蓝牙模块的连接线才能部署程序到开发板;部署完成后,再插上蓝牙连接线才能开始测试。

如果出于批量生产成本考虑要使用UNO开发板也没有问题,可以先在MEGA上完成开发,最后在UNO上做测试,只要占用的硬件接口不大于UNO开发板提供的接口就行了。

我们使用Arduino开发板主要是用来学习,可能会同时要加装各种外接设备,在不太在意成本的情况下,MEGA开发板可能更有优势。

在选购Arduino开发版时,还需要注意的是,很多网上再售的开发板并不是意大利原厂的开发板,而是国产。

因为Arduino是开源项目,它的设计图纸任何人都可以使用,所以国内厂商都可以根据图纸自行设计和使用,唯一的区别就是不能在开发板上打上官方的logo,单它们的功能实际上完全一样,而且还要便宜的多。

第1节 我选Arduino - 图5

另外,国内的开发板,也分为原版和改进版。所谓改进版,就是在厂家在原来图纸上进行了改造,增加了一些连线接口,并将数据连接的接口修改成了我们使用更多的micro USB接口,整体使用更加符合我们国人的习惯。所以在网络上进行选购的时候,选择原厂的、国产的或者国产改进的都是可以的。不过假如你还是有些许担心,那就买国产原版的吧,至少和原厂版的完全一致。

第1节 我选Arduino - 图6

学习硬件开发的一个很大门槛就是要记住许多复杂的寄存器地址。Arduino的之所以被认为是给软件开发者设计的硬件,就在于它简化了硬件上的多种接口,把它们抽象成一个个可以直接控制的引脚位置。软件开发者编程时只需要对这几类引脚做操作就可以了。

Arduino开发板上的引脚数量,根据开发板的类型是不同的。例如,UNO有20多根引脚,MEGA有70多根引脚。这些引脚都有自己的名字。

这些引脚可以被分成3类,

  1. 电源引脚。利用电源引脚,可以为外界的扩展板或者硬件提供3.3V(引脚3V3) 5V(引脚5V)的电压,以及接地(引脚GND)的功能;也能通过引脚VIN接受外部提供的其他电压;
    在UNO开发板中,电源引脚的位置大致如下,
    第1节 我选Arduino - 图7
    在MEGA开发板中,电源引脚的位置大致如下,
    第1节 我选Arduino - 图8

  2. 模拟引脚。区别于数字引脚只能输出0,1两种状态,模拟引脚可以输出包括0与1之外的很多数值。开发板有若干个模拟引脚,它们接收或输出模拟量:0~1023
    它们被编成了0~N的数字号码,用A0~AN来表示。
    例如UNO开发板上的模拟引脚有6个,就是A0~A5
    第1节 我选Arduino - 图9
    例如MEGA开发板上的模拟引脚有16个,就是A0~A15
    第1节 我选Arduino - 图10

  3. 数字引脚。只能输出0和1两种状态的引脚。开发板有若干个数字引脚,它们只接收或输出高低电平两个值:HIGH或者LOW。
    它们被编成了0~N的数字号码,用D0~DN来表示。在UNO开发板上的数字引脚有14个,就是D0~D13。其中D0 D1 D3 D5 D6 D9 D10 D11还具有其他的功能。
    第1节 我选Arduino - 图11
    在MEGA开发板上的数字引脚有54个,就是D0~D53
    第1节 我选Arduino - 图12
    以MEGA开发板来说,这些数字引脚还可以提供别的复用功能,

    1. PWM(Plus Width Module)。通过控制脉冲信号周期的方式,来调节数字引脚输出的电压大小;
      第1节 我选Arduino - 图13

    2. 通信引脚。作为串口输入和输出的接口;

第1节 我选Arduino - 图14 不同的Arduino开发板,它们的引脚位置是不相同的,这里只是用UNO和MEGA开发板来做一个示例。目前我们只要知道有这些引脚的存在就可以了。今后要使用到这些引脚的时候,我们再来做详细的介绍。

*关于Arduino UNO开发板的详细介绍请参考官网

*关于Arduino MEGA开发板的详细介绍请参考官网

1.3 Arduino扩展板

1.3.1 官方扩展板

Arduino官方目前总共推出了5款扩展板。这些扩展板会插在主板上,方便引伸出更多的引脚,进而实现扩展。下图是扩展板和主板相连的实际展示图。扩展板不同,连接后的图也是不同的。

第1节 我选Arduino - 图15

这些官方设计的扩展板分别是,
Arduino Motor Shield

第1节 我选Arduino - 图16

Arduino Proto Shield

第1节 我选Arduino - 图17

Arduino Ethernet Shield

第1节 我选Arduino - 图18

Arduino GSM Shield

第1节 我选Arduino - 图19
Arduino WiFi Shield 101

第1节 我选Arduino - 图20

1.3.2 第三方扩展板

Arduino是开放平台,有不少的第三方扩展板,它们根据开发者的需要,扩展出提供不同功能的接口。对于有能力的硬件开发者来说,可以随心所欲的设计和制作适合自己的扩展板。

例如,下面这款双L293D芯片的马达扩展板,

第1节 我选Arduino - 图21

1.4 外接传感器硬件

Arduino可以外接多种传感器硬件。这些硬件可以,

  1. 直接接到开发板上;
    第1节 我选Arduino - 图22

  2. 接到扩展板上,然后通过扩展板连接到主控制板上;

第1节 我选Arduino - 图23

1.4.1 感知型传感器硬件

感知型传感器是用来感知、测量某种环境数据的硬件。例如光线传感器、温湿度传感器、超声波探测器、粉尘传感器等等。

第1节 我选Arduino - 图24

1.4.2 控制型传感器硬件

控制型传感器用来发出指令、改变硬件某个特性的硬件。例如直流马达、步进马达、舵机、LED灯等等。

第1节 我选Arduino - 图25


关于这些传感器详细的原理和用法,我们将在以后的章节详细的介绍。