第8章 树莓派控制伺服电机(舵机)

   伺服电机主要适用于那些需要角度不断变化并可以保持的控制系统,我们常见的的机械臂、多足机器人、摄像头云台等都可以用伺服电机来实现,是机器人驱动系统常见的重要实现方式。本章将介绍伺服电机的有关基础知识,主要内容如下。

  • 伺服电机的基础知识。
  • 控制伺服电机的基本原理。
  • 使用树莓派控制伺服电机的实践。
0^。
180^。

   本章我们将继续使用第5章搭建的多功能实验平台。此外,还需要一个伺服电机( ~ )和一个1kΩ的电阻。知识储备方面,需要读者对脉冲宽度调制(PWM)有一定的了解,具体可以参考第6章

8.1 伺服电机(舵机)

8.1.1 结构及工作原理

   伺服电机也叫舵机,英文servo,是由直流电机、减速齿轮组、电位器和控制电路组成,并封装在一个便于安装的外壳里的伺服单位,能够根据输入信号比较准确的转动到给定的角度,典型的伺服电机及其组成如图8.1所示。

图 8.1 伺服电机及其结构

   如图8.2所示,伺服电机的基本工作原理:1、控制电路接收来自信号源的控制信号,并驱动直流电机转动;2、减速齿轮组按倍数降低直流电机转速,并将直流电机的输出扭矩放大到相应倍数,然后输出;3、电位器和减速齿轮组一起转动,测量伺服电机轴转动角度;4、控制电路检测并根据电位器判断伺服电机转动角度,然后控制伺服电机转动到目标角度或保持在目标角度。

图 8.2 伺服电机基本工作原理

8.1.2 规格和选型

   伺服电机的种类繁多,选择一款合适的型号不是一件容易的事,我们在选型的时候要对以下几方面综合考虑。

  • 角度
       伺服电机不像普通直流电机只能机械的转圈,它可以根据指令在旋转到一定的角度后停下来,常见的旋转范围有 ~  、 ~  、  ~ 等。
  • 转矩
       转矩也就是伺服电机的力量大小,能够带动多重的物体,单位为kg.cm,如9g.cm、15kg.cm、20kg.cm等。
  • 转速
       转速是指伺服电机在空载的情况下转过角所需的时间,常见伺服电机的速度一般在 ~ 。
  • 电压
       伺服电机的工作电压对性能有重大的影响,较高的电压可以提高伺服电机的转矩和转速,一般的推荐电压为4.8V和6V。
  • 尺寸、重量
       尺寸、重量也是伺服电机选型时需要考虑的一个重要指标。一般来说,伺服电机的功率与其尺寸、重量成正比,功率大的,尺寸、重量也相对较大。
  • 材质
       伺服电机的外壳一般是塑料的,也有金属的。金属外壳的散热性更好,伺服电机内的直流电机功率可以更高,以输出更高的扭矩。
       减速齿轮的材质有塑料、金属和混合等3种。塑料齿轮的成本低、噪音小,其强度也较低,在超出极限负载时塑料齿轮可能会崩齿。金属齿轮强度高、成本也高,在装配精度一般的情况下噪声会很大,金属齿轮可以长时间超负载而不会损坏,但会导致直流电机过热损坏或外壳变形,且无法修复。

   综上所述,选型时一般先计算伺服电机的转矩和转速,并确定电压,转矩应留有一定的富余,避免过载,然后确定旋转范围、尺寸、重量和材质等。

8.1.3 连接件

   使用伺服电机时,还需要一些连接配件,一是能把伺服电机固定到基座上的支架,二是能将驱动轴和物体连在一起的连接装置。伺服电机常见的连接件如图8.3所示。

图 8.3 伺服电机连接件

   伺服电机一般都带有可以上螺丝的安装孔,如果基座也带有合适的安装位置,就可以直接进行安装,但大多数情况下还是需要使用到各种支架才能固定到基座上。
   购买伺服电机的时候,一般会附带一些带有小孔的圆盘,这就是舵盘。舵盘可以套在伺服电机的驱动轴上,上面的小孔就可以用于安装各类物体,如摄像头、超声波传感器等。当然了,一般还是需要一些连接支架才能把物体连接到舵盘上。

8.2 伺服电机控制原理

0^。
180^。
0^。
90^。
180^。
0^。
90^。
0^。
270^。

   伺服电机有地线、电源线和控制线(信号线)3条连接线,中间的一条线通常为电源线。通过控制线发送一个脉冲宽度调制(PWM)信号可以控制伺服电机转动到一个角度,这个PWM信号必须周期性发送,否则伺服电机就会转到一个任意的角度。通常,控制伺服电机的PWM信号周期为20ms(50HZ),宽度在0.5ms-2.5ms之间(对应最小角度和最大角度)
   如图8.4所示,以 ~ 伺服电机为例,展示了伺服电机角度、脉冲宽度和占空比的关系。当角度为时,脉冲宽度为0.5ms(占空比为2.5%);当角度为时,脉冲宽度为1.5ms(占空比为7.5%);当角度为时,脉冲宽度为2.5ms(占空比为12.5%)。对于  ~ 、 ~ 等的伺服电机可以依此类推。

图 8.4 伺服电机角度、脉冲宽度和占空比的关系

duty=k*direction+b(k,b是常数,k≠0)
0^。
180^。
duty=1/18*direction+2.5

   树莓派没有提供专门控制伺服电机角度的功能,我们只能使用RPi.GPIO库的PWM功能来控制伺服电机,然而RPi.GPIO库也只是提供了控制PWM信号占空比的功能,想要控制伺服电机的角度还需进行一定的转换。
   假设direction为角度,duty为占空比,很明显角度和占空比之间存在一次函数关系。如图8.5所示,当伺服电机的旋转角度为 ~ 时,可计算出k=1/18,b=2.5,即。

图 8.5 伺服电机角度与PWM信号占空比关系

   对于其它旋转角度的伺服电机的角度-占空比转换可以依次类推。从本质上讲,树莓派控制树莓派实际上是对PWM信号占空比的控制。

8.3 伺服电机控制实践

   下面我们进行树莓派控制伺服电机的实验。这个实验您允许输入一个大于等于0且小于等于180的数字,控制伺服电机旋转到这个数字指定的角度。

8.3.1 实验电路

   实验的电路原理图如图8.6所示。控制线与GPIO26引脚串联了一个1kΩ的电阻,可以防止伺服电机发生故障时,控制信号的瞬间高强电流对GPIO引脚造成损害,但这不是必不可少的。这里使用的伺服电机的电压仅4.8V,因此可以直接从树莓派上取电,如果使用伺服电机的电压较高,那就需要采用外置电源为其供电。

图 8.6 伺服电机控制电路图

   实验的电路实物连接图如图8.7所示。该款伺服电机的控制线为橘色,电源线为红色,地线为棕色。

图 8.7 伺服电机控制电路实物连接图

8.3.2 程序思路

   前面我们说过树莓派控制伺服电机实际上是对PWM信号占空比的控制,因此程序的思路与第6章类似,具体如下。

BEGIN  
    引入GPIO库  
    将GPIO26设置为输出模式,用于输出伺服电机控制信号  
    
    创建PWM对象,并设置初始频率为50Hz(周期为20ms)  
    启动PWM,并设置初始占空比为0  

    DO FOREVER  
        等待输入伺服电机要旋转的角度  
        将角度转换为占空比
        更改PWM信号占空比,将伺服电机旋转到指定角度
    ENDO  
    停止PWM  
    清理释放GPIO资源  
END  

8.3.3 程序代码

   以下为本实验的程序代码,详细说明见注释。

import RPi.GPIO as GPIO                 # 引入GPIO模块

if __name__ == '__main__':
    ServoPin = 26
    PWMFreq = 50                        # PWM信号频率

    GPIO.setmode(GPIO.BCM)              # 使用BCM编号方式
    GPIO.setup(ServoPin, GPIO.OUT)      # 将GPIO19设置为输出模式
    pwm = GPIO.PWM(ServoPin, PWMFreq)   # 创建PWM对象,并设置频率为50
    pwm.start(0)                        # 启动PWM,并设置初始占空比0

    try:
        while True:
            # 等待输入一个0到180的角度
            direction = float(input("Pleas input the direction: "))
            if direction < 0 or direction > 180:
                print("Please input a direction between 0 an 180.")
                continue

            duty = (1/18) * direction + 2.5   # 将角度转换为占空比
            pwm.ChangeDutyCycle(duty)         # 改变PWM占空比
    finally:
        pwm.stop()                      # 停止PWM
        GPIO.cleanup()                  # 清理释放GPIO资源,将GPIO复位

8.4 本章小结

   本章首先介绍了伺服电机的的结构及工作原理、规格和选型、连接件等基础知识。其次,介绍伺服电机控制原理,重点讲解了伺服电机角度和PWM信号占空比的转换。最后,通过一个实验让读者了解如何使用树莓派控制伺服电机。读者在学完这章后,应该对伺服电机有一定的了解,并能使用伺服电机。

后记

  1. 在败家中又完成了一篇,不到半小时烧坏了3个伺服电机,大几十块就没了,为了能把东西讲清楚还把初中数学一次函数知识给复习了一遍,画图画到手抽筋。
  2. 感觉这篇写得要比上一篇好,希望能用最简洁的语言把要表达的东西说清楚。
  3. 2019年6月24日树莓派出第四代。

第7章 用树莓派控制直流电机(L298N)

   直流电机是机器人行走机构的理想选择之一,我们通常使用直流电机来驱动机器人行走。在第5章第6章您已经了解到如何用树莓派控制一个LED灯,本章我们将进一步介绍如何用树莓派控制直流电机,主要内容如下。

  • 直流电机的基本知识。
  • L298N双H桥直流电机驱动模块相关知识。
  • 如何控制直流电机的转向和转速。

   本章我们将继续使用第5章搭建的多功能实验平台。此外,还需要以下材料:

  • 一个小型直流电机。
  • 一个可以为小型直流电机供电的电源,为便于后续的实验,我们这里使用一个3V-24V的直流可调电源。
  • 一个L298N直流电机驱动模块。

7.1 直流电机

   直流电机是一种将直流电能转换为机械能的装置,被广泛的用于驱动各种设备,如电风扇、遥控小车、电动车窗等,非常适合作为机器人的行走机构,您可以很容易的在网上购买到,价格也不是很贵。
   小型直流电机的的电压范围通常是1.5V~30V,使用两根导线连接到直流电源上就能让电机转动起来,电压越高转得就越快。每个直流电机都有一个推荐电压,超出推荐电压太多容易导致电机被烧毁,而供电电压太低则转不起来。通过交换两根连接在电机上的导线顺序(实际上是改变电源的正负极),可以改变电机的转向。前面章节我们说过,直流电机属于高功耗元件,不可以直接使用树莓派进行驱动,因此我们需要使用一个外部电源。
   小型直流电机通常输出很高的转速和较低的扭矩,在作为机器人的驱动装置时,一般需要连接一个变速器,将其转换为低转速、高扭矩,使之有足够的力量驱动机器人。图7.1是典型的带变速器的小型直流电机,建议变速器和电机一起购买。

图 7.1 带变速器的小型直流电机

7.2 双H桥直流电机驱动模块(L298N)

   H桥(H-Bridge)是控制直流电机的常用电路,因其电路形状酷似字母H而得名,可以控制直流电机的转速和方向,典型的H桥芯片有L293D、L298N等,以下我们以L298N为例进行介绍。实际使用的时候,为提高芯片的安全性、可靠性和方便性,我们一般会给芯片外接一些保护电路,并把输入输出引脚引接到排针上,从而形成一个功能模块。图7.2是一款典型的L298N双H桥直流电机驱动模块,可以很容易从网上购买到,价格也便宜。该模块的主要特点如下:

图 7.2 L298N双H桥直流电机驱动模块

  • 采用L298N双桥直流电机驱动芯片
  • 工作电压范围5V35V,如果需要从模块内取电,则供电范围为7V35V
  • 峰值输出电流2A
  • 每个通道有一个使能输入端
  • 可以驱动两个直流电机或者一个四线步进电机

   L298N双H桥直流电机驱动模块的引脚可以归纳成电源、控制和输出等三大类,下面是各类引脚的功能说明。

  • 电压类引脚

   +12V输入:L298N芯片的电源正极,模块上标称+12V,但实际范围可以是5V35V,如果需从模块内取电,则其范围为7V35V。
   GND:L298N芯片的电源地,使用的时候应该把树莓派的GND接到这里,即两者需要共地。
   +5V输出:L298N芯片输出的5V电源,可以给外部设备供电,使用的时候需要用跳线把5V输出使能端短接起来。

  • 控制类引脚

   ENA、ENB:A、B通道的使能端,高电平有效,可以用PWM来实现调速。使用时,可以接到树莓派的GPIO上,实现用程序进行控制。
   IN1、IN2、IN3、IN4:IN1、IN2为A通道的控制输入,IN3、IN4为B通道的控制输入。

  • 输出类引脚

   OUT1、OUT2、OUT3、OUT4:OUT1、OUT2由A通道输出,OUT3、OUT4由B通道输出,可以用于连接直流电机等设备。

   控制直流电机的转向和转速实际是通过给控制类引脚设置不同的值来实现的,表7.1是使用通道A的控制直流电机的真值表,通道B与此类似。

表 7.1 通道A的控制直流电机的真值表

提示:

您购买到的L298N双H桥直流电机驱动模块可能与本章介绍的存在一定的差异,但这一类功能模块大同小异,请跟商家索要相应的技术资料了解更多的使用细节。

7.3 让直流电机动起来

   下面进入实战环节,我们将用树莓派通过L298N双H桥直流电机驱动模块控制一个电机的转向和转速。为了能让读者更好的理解,我们首先演示如何控制电机的转向,然后再进一步介绍如何控制电机转速。

7.3.1 实验电路

   图7.3所示的是树莓派、L298N双H桥直流电机驱动模块和电机间连接的电路图,最终实物连线图如图7.4所示。我们使用树莓派的GPIO13、GPIO19和GPIO26等3个引脚,分别连接到L298N双H桥直流电机驱动模块的ENA、IN1和IN2,通过输入表7.1所示的不同电平组合就可以实现对电机的操纵。控制电机的转向和转速都是使用该电路,向ENA输入不同占空比的PWM脉冲信号就可以控制电机的转速。

图 7.3 小型直流电机控制电路图

图 7.4 小型直流电机控制实物连接

   尽管L298N双H桥直流电机驱动模块能驱动两个直流电机,但我们只演示如何驱动一个。驱动两个电机使用的是相同的技术,如果在您的项目中需要用到两个,也可以很容易地扩展它。

7.3.2 程序思路

   控制电机转向和转速可以使用同一个电路,但程序思路上我们分两个程序来演示,具体思路如下:

  • 控制电机转向思路
BEGIN  
    引入GPIO库  
    将连接ENA的GPIO引脚设置为输出模式
    将连接IN1的GPIO引脚设置为输出模式
    将连接IN2的GPIO引脚设置为输出模式
    
    DO FOREVER  
        将IN1设置为0,IN2设置为1,将电机设置为正向转动  
        将ENA设置为1,驱动A通道电机转动  
        等待5秒  

        将ENA设置为0,停止电机转动  
        等待2秒  

        将IN1设置为1,IN2设置为0,将电机设置为反向转动  
        将ENA设置为1,驱动A通道电机转动  
        等待5秒  

        将ENA设置为0,停止电机转动  
        等待2秒
    ENDO  
    停止PWM  
    清理释放GPIO资源  
END  

提示:

除了采用将ENA置0的方法来让电机停止转动,将IN1和IN2同时设置为0或1也可以让电机停止下来。

  • 控制电机转速思路
BEGIN  
    引入GPIO库  
    将连接ENA的GPIO引脚设置为输出模式
    将连接IN1的GPIO引脚设置为输出模式
    将连接IN2的GPIO引脚设置为输出模式

    设置ENA输入一定频率的PWM脉冲信号,创建PWM对象  
    开始向ENA输入占空比为0的PWM脉冲信号  
    
    DO FOREVER  
        将IN1设置为0,IN2设置为1,将电机设置为正向转动  
        将ENA设置为1,驱动A通道电机转动  
        
        speed = 0
        DOWHILE speed < 100  
            将输入ENA的PWM脉冲信号的占空比修改为speed
            speed += 5
            等待1秒
        ENDDO

        将IN1设置为1,IN2设置为0,将电机设置为反向转动  
        将ENA设置为1,驱动A通道电机转动  
        
        speed = 0
        DOWHILE speed < 100  
            将输入ENA的PWM脉冲信号的占空比修改为speed
            speed += 5
            等待1秒
        ENDDO
    ENDO  
    
    停止PWM  
    清理释放GPIO资源  
END  

   电机的转向控制和转速控制的程序思路的最大区别在于ENA输入信号的不同。控制电机转向的程序思路只是简单的通过将ENA设置为1或0来启动和停止电机。对于电机转速控制,ENA输入的PWM脉冲信号,通过改变PWM脉冲信号的占空比来改变电机转速,占空比越大速度就越快,占空比为100%时相当于输入1(高电平),占空比为0%时相当于输入0(低电平)。

7.3.3 程序代码

   以下是直流电机转向和转速控制程序,程序的详细说明见注释。

  • 控制电机转向程序
import RPi.GPIO as GPIO         # 引入GPIO模块
import time                     # 引入time模块

ENA = 13                        # 设置GPIO13连接ENA
IN1 = 19                        # 设置GPIO19连接IN1
IN2 = 26                        # 设置GPIO26连接IN2

if __name__ == '__main__':
    try:
        # 初始化
        GPIO.setmode(GPIO.BCM)          # 使用BCM编号方式
        GPIO.setup(ENA, GPIO.OUT)       # 将连接ENA的GPIO引脚设置为输出模式
        GPIO.setup(IN1, GPIO.OUT)       # 将连接IN1的GPIO引脚设置为输出模式
        GPIO.setup(IN2, GPIO.OUT)       # 将连接IN2的GPIO引脚设置为输出模式

        while True:
            # 驱动电机正向旋转5秒
            GPIO.output(IN1, False)     # 将IN1设置为0
            GPIO.output(IN2, True)      # 将IN2设置为1
            GPIO.output(ENA, True)      # 将ENA设置为1,启动A通道电机
            time.sleep(5)               # 等待电机转动5秒

            # 电机停止2秒
            GPIO.output(ENA, False)     # 将ENA设置为0
            time.sleep(2)               # 等待电机停止2秒

            # 驱动电机反向旋转5秒
            GPIO.output(IN1, True)      # 将IN1设置为1
            GPIO.output(IN2, False)     # 将IN2设置为0
            GPIO.output(ENA, True)      # 将ENA设置为1,启动A通道电机
            time.sleep(5)               # 等待电机转动5秒

            # 电机停止2秒
            GPIO.output(ENA, False)     # 将ENA设置为0
            time.sleep(2)               # 等待电机停止2秒

    finally:
        pwm.stop()                      # 停止PWM
        GPIO.cleanup()                  # 清理释放GPIO资源,将GPIO复位

   运行这个程序后,您将看到直流电机反复的正向转动5秒后,停止两秒,再反向转动5秒后,停止2秒。

  • 控制电机转速程序
import RPi.GPIO as GPIO         # 引入GPIO模块
import time                     # 引入time模块

ENA = 13                        # 设置GPIO13连接ENA
IN1 = 19                        # 设置GPIO19连接IN1
IN2 = 26                        # 设置GPIO26连接IN2

if __name__ == '__main__':
    try:
        # 初始化
        GPIO.setmode(GPIO.BCM)              # 使用BCM编号方式
        GPIO.setup(ENA, GPIO.OUT)           # 将ENA对应的GPIO引脚设置为输出模式
        GPIO.setup(IN1, GPIO.OUT)           # 将IN1对应的GPIO引脚设置为输出模式
        GPIO.setup(IN2, GPIO.OUT)           # 将IN2对应的GPIO引脚设置为输出模式

        freq = 500
        speed = 0
        pwm = GPIO.PWM(ENA, freq)           # 设置向ENA输入PWM脉冲信号,频率为freq并创建PWM对象
        pwm.start(speed)                    # 以speed的初始占空比开始向ENA输入PWM脉冲信号

        while True:
            # 将电机设置为正向转动
            GPIO.output(IN1, False)         # 将IN1设置为0
            GPIO.output(IN2, True)          # 将IN2设置为1

            # 通过改变PWM占空比,让电机转速不断加快
            for speed in range(0, 100, 5):
                pwm.ChangeDutyCycle(speed)  # 改变PWM占空比
                time.sleep(1)

            # 将电机设置为反向转动
            GPIO.output(IN1, True)          # 将IN1设置为1
            GPIO.output(IN2, False)         # 将IN2设置为0

            # 通过改变PWM占空比,让电机转速不断加快
            for speed in range(0, 100, 5):
                pwm.ChangeDutyCycle(speed)  # 改变PWM占空比
                time.sleep(1)
    finally:
        pwm.stop()                          # 停止PWM
        GPIO.cleanup()                      # 清理释放GPIO资源,将GPIO复位

   运行这个程序后,您将看到直流电机首先正向转动,转动速度不断增加,在达到最大转速后,直流电机短暂停止转动,然后反向转动,转动速度不断增加,如此反复运动。

7.4 本章小结

   本章首先介绍了直流电机的基本知识,然后介绍了L298N双H桥直流电机驱动模块的相关基础知识,最后介绍了使用树莓派和L298N双H桥直流电机驱动模块来控制一个直流电机的转向和转速的电路、思路和程序等知识。

后记

   最近工作太忙,项目在赶进度,几乎每周都有几天要跑现场,这两周又增加网络安全的事情,断断续续写了一个多月,乘着端午小长假陪完家人还有点时间,好不容易才把这篇给完成了。写这篇文章的成本算是较低,就烧坏了两个一块多钱的小直流电机。另外,把十几年没用过的烙铁又整了出来,居然还能焊得上,且没烧东西,算是对得起当年的老师哈!

第6章 树莓派与脉冲宽度调制(PWM)

   上一章我們介紹瞭如何用樹莓派點亮和熄滅一個LED,但如何控制LED燈的亮度呢?脈衝寬度調製(Pulse Width Modulation, PWM)能很好的解決這個問題。脈衝寬度調製是一種簡單、高效、應用廣泛的控制方式,還可以用於控制直流電機的轉速、舵機的轉角角度等,本章將介紹樹莓派與脈衝寬度調製(PWM)的相關知識,主要內容如下。

  • 脈衝寬度調製(PWM)的基本概念和基本原理。
  • 樹莓派RPi.GPIO庫產生和控制PWM的方法。
  • 在樹莓派上使用LED演示和驗證使用PWM。

6.1 脈衝寬度調製(PWM)

   脈衝寬度調製(PWM)是一種高效的數字電壓控制技術,它利用微處理器的數字輸出來對模擬電路進行控制,通過控制固定電壓的直流電源開關頻率,改變負載兩端的電壓,進而達到控制要求的一種電壓調整方法。爲更好的理解和使用PWM,我們首先需要了解以下兩個概念。

  • 頻率,以Hz爲單位,一個脈衝信號時間週期的倒數。如果PWM的輸出頻率比較低,例如只有5Hz,那麼在控制一個LED時候,LED就會一閃一閃的,較高的頻率可以讓運行更爲平滑,但PWM的輸出頻率並不能無限的高,而且在高頻情況下,測定的PWM頻率會與作爲樹莓派參數提供的頻率略有出入。因此,在使用PWM時,應該選擇一個合適的頻率,對於控制一個LED亮度來說,一般100Hz就足夠了。
  • 佔空比,就是輸出的PWM脈衝信號中,高電平保持的時間與該PWM的時鐘週期的時間之比。如圖6.1所示,假設PWM脈衝的頻率爲1000Hz,那麼它的時鐘週期T就是1ms(即1000us),如果高電平持續時間t1爲200us,低電平的時間t2爲800us,那麼佔空比就是200:1000(即1:5)。

   從應用的角度,我們可以簡單的將PWM理解爲通過改變脈衝信號的頻率和高電平的持續時間(或佔空比)來實現電壓控控制的一種方法。圖6.2顯示了三個由GPIO輸出的PWM信號(電壓爲3.3V),第一個信號是一個佔空比爲20%的PWM輸出,即在信號週期中,20%的時間爲高電平(邏輯1),其餘80%的時間爲低電平(邏輯0),對應的電壓爲滿幅值的20%(0.66V)。第二、三個信號分別是佔空比爲50%和80%的PWM輸出,對應的電壓分別爲1.65V和2.64V。

6.2 樹莓派操控PWM

   在樹莓派上,可以通過對GPIO的編程來實現PWM,RPi.GPIO庫就提供了一個PWM功能,以下是使用RPi.GPIO庫的PWM功能的方法。

  • 創建一個PWM實例
pwm = GPIO.PWM(channel, frequency)  

channel:指定要輸出PWM信號的GPIO引腳;
frequency:指定PWM信號的初始頻率,單位爲Hz,其值應大於0.0。

  • 啓用PWM
pwm.start(dc)  

dc:指定PWM信號的初始佔空比,取值範圍爲0.0 ≤ dc ≤ 100.0。

  • 更改PWM頻率
pwm.ChangeFrequency(freq)  

freq:指定PWM的新頻率,單位爲Hz,其值應大於0.0。

  • 更改PWM佔空比
pwm.ChangeDutyCycle(dc)  

dc:指定PWM的新佔空比,取值範圍爲0.0 ≤ dc ≤ 100.0。

  • 停止PWM
pwm.stop()  

6.3 PWM驗證實驗

   接下來,我們將用一個具體的例子來演示樹莓派是如何使用PWM的。在這個實驗裏,您將可以手動改變LED的亮度,一方面我們將儘可能用上RPi.GPIO庫中PWM的相關函數,讓您更好了解這些函數的使用,另一方面讓您更爲直觀的理解PWM的基本原理。

6.3.1 實驗電路

   本實驗的電路及所用到的材料與第五章“點亮LED燈”實驗完全一樣,我們不需要做任何變動。

6.3.2 程序思路

   與第五章“點亮LED燈”實驗相比,本實驗最大的不同在於程序代碼,以下是本實驗的基本思路。

BEGIN  
    引入GPIO庫  
    將GPIO19設置爲輸出模式  
    
    創建PWM對象,並指定初始頻率  
    啓動PWM,並指定初始佔空比  

    等待輸入新PWM頻率  
    將PWM的頻率修改爲新頻率  
    
    DO FOREVER  
        等待輸入新LED亮度(PWM佔空比)  
        改變LED亮度(PWM佔空比)  
    ENDO  
    停止PWM  
    清理釋放GPIO資源  
END  

6.3.2 程序代碼

   按照第4章介紹的方法新建一個項目,然後按照第五章的方法輸入運行以下代碼,程序的詳細說明見註釋。

import RPi.GPIO as GPIO                 # 引入GPIO模塊

if __name__ == '__main__':
    LedPin = 19
    freq = 100                          # 存放PWM頻率變量,這裏初始值爲100,可以根據實際需要修改
    dc = 0                              # 存放PWM佔空比變量,這裏初始值爲0,可以根據實際需要修改

    GPIO.setmode(GPIO.BCM)              # 使用BCM編號方式
    GPIO.setup(LedPin, GPIO.OUT)        # 將GPIO19設置爲輸出模式

    pwm = GPIO.PWM(LedPin, freq)        # 創建PWM對象,並指定初始頻率
    pwm.start(dc)                       # 啓動PWM,並指定初始佔空比

    try:
        freq = int(input("Please input the frequency of PWM(1-2000Hz): "))  # 等待輸入新PWM頻率
        pwm.ChangeFrequency(freq)       # 改變PWM頻率
        while True:
            dc = int(input("Please input the duty cycle(0-100): "))         # 等待輸入新PWM佔空比
            pwm.ChangeDutyCycle(dc)     # 改變PWM佔空比
    finally:
        pwm.stop()                      # 停止PWM
        GPIO.cleanup()                  # 清理釋放GPIO資源,將GPIO復位

   程序運行後,首先會要求您輸入PWM頻率(建議輸入的值在1到2000之間),然後您可以通過不斷的輸入新的PWM佔空比來改變LED的狀態。例如,當您輸入的PWM頻率爲100時,然後分別輸入10、30、50、80、100的PWM佔空比,您將看到LED會一次比一次亮;當您輸入的PWM頻率爲5時,LED會不斷的閃爍,輸入不同的佔空比只會改變LED點亮的時間長度,而亮度基本不變,當佔空比爲100時,LED長亮。

6.4 本章小結

   本章首先介紹了脈衝寬度調製(PWM)的基本概念和基本原理,其次介紹樹莓派產生和控制PWM的方法,最後通過一個PWM實驗演示如何使用樹莓派操作PWM,以更爲直觀的方式體驗PWM。

第5章 用树莓派点亮LED灯

   用树莓派点亮一个LED灯是非常简单的事情,但却非常重要,是利用GPIO控制外部硬件设备的基础,机器人的大部分功能都可以通过操纵GPIO来实现的。换句话说,能控制一个LED灯,就能让机器人动起来。本章将的主要内容如下。

  • 搭建一个树莓派多功能实验平台的材料及其功能用途。
  • 树莓派的GPIO引脚功能和基本用法。
  • 点亮一个LED灯的电路、程序设计思路和代码。

5.1 搭建实验平台

   为便于后续的实验,我们首先需要搭建一个多功能实验平台(见图5.1,含本章所需材料),各部件的功能用途如下。

图 5.1 多功能实验平台

  • 1:树莓派3B+型主板(含电源)
       一块树莓派3B+型主板(含电源),该主板应配备有一张已经安装好Raspbian系统的MicroSD卡。
  • 2:面包板
       实验过程中,面包板非常适用于电子电路的组装和调试,各种电子元器件可以根据需要随意插入或拔出,而无需焊接,节省了电路的组装时间,而且元件可以重复使用。
  • 3:T型GPIO扩展版
       GPIO扩展版上标有GPIO引脚的功能,与面包板配合使用非常便于对GPIO进行外接。
  • 4:40P排线
       用于连接树莓派与T型GPIO扩展版,长度适中即可。
  • 5:实验平台底座
       使用一块亚克力板作为实验平台的底座,用于固定树莓派主板和面包板,以便于实验操作,同时对树莓派主板形成一定的保护。
  • 6:万用表
       在进行GPIO硬件控制调试的时候,如果实验结果不是事先所预计的,那么我们可以使用万用表对电路进行简单的测试,排查问题。
  • 7:LED灯
       发光二极管LED是一种廉价和高效的光源,常在电路及仪器中作为指示灯,或者组成文字或数字显示。LED灯非常便于显示GPIO引脚的输出状态,在开发树莓派外部硬件控制程序时,可以先使用LED灯确定GPIO引脚输出正确后再连接要控制的硬件,避免由于GPIO输出错误而导致外部硬件损坏。本章我们需要用到到一个红色的LED灯,需要注意的是LED较长的引脚为正极,较短的引脚为负极。
  • 8:电阻
       实验过程中,请根据实际选择必要的电阻,本章需要用到一个470Ω或1kΩ的电阻。
  • 9:杜邦线
       用于连接各电子元件,无需焊接,本章仅需要用到两根公对公的杜邦线。为便于识别,建议遵循有关规范,连接电源(GPIO引脚)的线采用红色线连接,接地端使用黑色线连接。

5.2 GPIO引脚

   前面我们讲过,树莓派与普通计算机最大的区别就在于它拥有若干个可编程的GPIO,可以用来控制外部设备、从外部设备获取信息或是和硬件进行数据交互等,因此了解各个GPIO引脚的功能和使用方法是非常重要的。树莓派GPIO接口已发布了3个版本,原始的两个版本仅有26个引脚,“+”型树莓派版本有40个引脚,本章及后续章节我们将主要介绍“+”型树莓派版本的GPIO。
   树莓派GPIO接口有BOARD、BCM和wiringPi三种编号方式,三种编码方式的对应关系如表5.1所示。

表 5.1 树莓派40Pin引脚对照表

  • BOARD
       BOARD编号方式是树莓派主板上P1接头上的的引脚号,从左到右,从上到下进行编号,左边为奇数,右边为偶数,支持BOARD编号方式的库主要有RPi.GPIO、WiringPi-Go。
  • BCM
       BCM编号侧重于CPU寄存器,是根据Broadcom SOC的GPIO寄存器编号的,支持的库比较多,用的也比较多,是后续章节主要使用的编号方式。为便于使用BCM编号方式,建议采用类似“T型GPIO扩展版”或“GPIO参考卡片”等配件,让引脚功能一目了然。
  • wiringPi
       wiringPi编号侧重于实现逻辑,GPIO端口从0开始编号,WiringPi库是支持wiringPi编号方式的最主要GPIO库。

   B+型树莓派主板的40个引脚提供了17个GPIO专用接口,1个UART总线接口、1个SPI总线接口、1个I2C总线接口、2个5V电源接口、2个3.3V电源接口、8个地接口,使用的时候一定先要清楚选择了那套编号方式,相应的库是否支持。

提示:

  • 通电后不要使用金属物体(如螺丝刀等)接触GPIO接口,或短接GPIO引脚。
  • 外接输入输出设备时,要先仔细了解设备的额定功率(含电压和电流),不要直接连接高功耗元件(如直流电机等),或输出电压超3.3V的设备。当使用低功率LED时,最好在LED的正极串联一个限流电阻。
  • GPIO工作在3.3V逻辑电平上,0V表示逻辑0,3.3V则表示逻辑1。调试GPIO程序时,可以使用万用表测试GPIO引脚电压,判断输出是否正确。
  • GPIO接口仅提供数字的输入和输出,当需要用到模拟输入时,可以使用ADC芯片或采用电阻式传感器来实现。

5.3 点亮LED灯

   在前面的章节中,我们已经介绍了大量的基础理论,接下来我们将进入实战,开始有趣的实验。本节将介绍如何使用树莓派控制一个LED灯,您将看到一个LED灯在树莓派的控制下不停的闪烁。

5.3.1 实验电路

   本实验的电路原理图如图5.2所示,一个红色发光二极管正极通过一个限流电阻串连到树莓派的GPIO19上,负极则连接到树莓派的GND上,从而形成一个完整的回路。

图 5.2 树莓派点亮LED电路图

   GPIO引脚的输出电压约为3.3V,高于LED上约1.7V的压降,如果直接串联,会有一个非常大的电流通过LED,这个电流通常大到可以损坏LED,甚至供电设备。因此,需要在LED和电源(GPIO引脚)间串联一个电阻限制电流,从而对LED和为其供电的GPIO引脚提供保护。不同厂家,不同颜色压降略有区别,我们假设所用LED的压降为1.8V,GPIO引脚的电流为3mA,限流电阻大小的计算方法如下:

R = ( 3.3V - 1.8V ) / 3mA = 500Ω  

   因此,我们选择使用一个1kΩ的电阻。该电路的最终实物连线图如图5.3所示。

图 5.3 电路实物连接图

提示:

  • 除了使用以上的方法计算限流电阻的值,您还可以访问类似实用工具大全http://tool.520101.com/网站,使用网站提供的LED限流电阻计算器进行计算。实际上,这个网站还提供了不少实用的电子电路计算工具,非常有助于我们后续章节的学习。
  • 限流电阻的阻值不应太小,也不能太大。太小,则起不到限流的作用;太大,则LED的亮度会比较暗。
  • 为保障树莓派主板和电子元件的安全,连线工作应在为断电的情况下进行,并在确定线路连接无误后再通电。

5.3.2 程序思路

   程序的基本设计思路如下:

BEGIN  
    引入GPIO库  
    引入time库  
    将GPIO19设置为输出模式  
    DO FOREVER  
        点亮LED
        等待1秒钟
        熄灭LED
        等待1秒钟
    ENDO
    清理释放GPIO资源
END

5.3.3 程序代码

   Python操作GPIO需要用到RPi.GPIO库,Raspbian系统默认未安装这个库,所以请先使用XShell远程登录树莓派运行以下命令安装RPi.GPIO库。

sudo apt install python3-rpi.gpio  

   RPi.GPIO库安装完毕后,按照第4章介绍的方法新建一个项目,然后输入以下代码并运行,运行效果如图5.4所示。程序的详细说明见注释,这里我们使用了try: Finally: 结构捕捉异常,确保当我们中断程序时(如使用Ctrl+C或者操作系统提供的方法),GPIO.cleanup()函数能被执行,以清理释放GPIO资源。在Pycharm下运行程序时,点击工具栏上的Stop按钮也可以中断程序。

import RPi.GPIO as GPIO                 # 引入GPIO模块  
import time                             # 引入time模块  

GPIO.setmode(GPIO.BCM)                  # 使用BCM编号方式  

GPIO.setup(19, GPIO.OUT)                # 将GPIO19设置为输出模式  

if __name__ == '__main__':
    try:
        while True:                     # 无限循环  
            GPIO.output(19, True)       # 将GPIO19设置为高电平,点亮LED  
            time.sleep(1)               # 等待1秒钟  
            GPIO.output(19, False)      # 将GPIO19设置为低电平,熄灭LED  
            time.sleep(1)               # 等待1秒钟  
    finally:
        GPIO.cleanup()                  # 清理释放GPIO资源,将GPIO复位  

图 5.4 实验运行效果

5.4 本章小结

   本章首先介绍搭建一个树莓派多功能实验平台所需的材料及其功能用途,然后详细介绍了树莓派GPIO引脚的三种编号方式、功能和使用注意事项,最后介绍用树莓派点亮一个LED灯的电路、程序设计思路和代码。

第4章 树莓派远程开发(Pycharm)

  开发软件一般需要一个程序运行环境和一个集成开发环境(Integrated Development Environment,IDE)。Raspbian系统默认已经提供了Python 2和Python 3的运行环境,选择一款优秀的IDE,并采用合适的开发方法将有助于提高开发效率。本章将介绍一种Windows下远程开发树莓派程序的方法,主要内容如下:

  • 介绍在本地和远程开发树莓派程序的两种思路。
  • 介绍在Windows上使用Pycharm远程开发树莓派程序的方法。

4.1 两种开发思路

  • 本地开发
       本地开发是指在树莓派上安装和使用IDE(或文本编辑器)进行程序编写、调试和运行。如果树莓派已经连接上显示器、鼠标、键盘等I/O设备,那么就可以和使用普通PC一样进行程序开发。如果没有连接显示器等I/O设备,可以使用SSH或VNC远程登录到树莓派编写程序。对于第二种方法,虽然是远程登录到树莓派,但由于开发环境和代码等都保存在树莓派上,所以我们仍然可以认为是在树莓派本地进行开发。
       本地开发的优势是简单,不需要太多的配置就可以进行程序开发。其劣势也是非常明显的,最主要的问题是树莓派本身的性能相对有限,而现代IDE对性能的要求较高,直接在树莓派上进行程序开发的用户体验不是很好。
  • 远程开发
       远程开发是指在个人计算机上编写代码,然后将代码上传到树莓派进行调试和运行,整个调试和运行的操作都是在个人计算机上完成的,基本无需在树莓派上进行操作。很明显,远程开发方式发挥了普通个人计算的优势,减轻了树莓派的负担,为我们提供了更好的开发体验。
       远程开发是我们推荐的开发方式,以下将介绍一种远程开发树莓派程序的方法。

4.2 PyCharm远程开发树莓派程序

4.2.1 PyCharm简介

   PyCharm是JetBrains开发的一款功能强大的Python IDE,提供了调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制等功能。PyCharm有专业版和社区版两个版本,但只有专业版才具备远程Python解释器和调试器功能,要实现远程开发树莓派程序需使用专业版的PyCharm

4.2.2 配置远程开发环境

   步骤 1: 将树莓派接入网络(需要和个人计算机在同一个局域网),并配置好SSH,具体参考第3章

   步骤 2: 在个人计算机上安装Python3。从Python官网https://www.python.org/downloads/下载合适的Python版本并安装,我们这里安装的是Pyhton 3.7.2(64-bit),对应的安装文件为python-3.7.2-amd64.exe。运行安装程序,按图 4.1所示选择,把Python加到Windows的环境变量PATH上去。如果采用默认安装,则点击“Install Now”,如果需要自定义安装(如修改安装路径等),则点击“Customize installation”,然后一路“Next”即可。

图 4.1 安装Python

   安装完成后,在“命令提示符”输入以下命令,如果安装成功,则显示“Python 3.7.2”。

python --version  

   步骤 3: 在个人计算机上安装Pycharm。由于需要使用到Pycharm的远程Python解释器和调试器功能,因此我们需要安装专业版的Pycharm,官网下载地址:http://www.jetbrains.com/pycharm/download/。Pycharm的安装比较简单,运行安装程序后,采用默认安装一路“Next”即可,安装过程大概需要几分钟,请耐心等待。
   Pycharm专业版是收费的,安装完成后需要激活,具体的解决的办法,可以私信我,或上网查找。

   步骤 4: 运行Pycharm新建一个“Pure Python”项目,并按图4.2设置。其中,“Location”为新建项目在个人计算机上的存放位置。

图 4.2 创建项目

   步骤 5: 新建基于SSH连接的远程Python解释器。如图4.2所示,点击“…”,然后选择“SSH Inetrpreter”,并按图4.3一步一步设置。其中,“Host”为树莓派的IP地址;“UserName”为登录树莓派的用户名;“InterPreter”为树莓派上的Python解释器路径,这里使用的是Python 3的解释器,如果想使用Python 2,则把路径改为“/usr/bin/python”。由于Raspbain系统是大小写敏感的,在填写配置信息的时候应注意大小写。
   成功新建远程Python解释器后,如图4.4所示,PyCharm会向树莓派上传一些文件,一般需要几分钟的时间,请耐心等待。

图 4.3 新建基于SSH连接的远程Python解释器

图 4.4 完成远程Python解释器创建

   步骤 6: 修改项目在树莓派上的存放目录(可选)并完成项目创建。新建远程Python解释器后,PyCharm会自动设置项目在树莓派上的存放目录,但为了管理方便,建议修改一下。如图4.5所示,按照您的习惯对“Remote project location”进行修改,然后点击“Create”完成项目创建,进入PyCharm的开发界面,如图4.6所示。

图 4.5 修改项目在树莓派上的存放目录

图 4.6 项目开发界面

   步骤 7: 进一步配置项目远程Python解释器。进入“File->Settings->Project: myApp(项目名称)->Project Interpreter”,如图4.7所示,点击“Project Interpreter”选项后面的小齿轮,选择“Show All…”,进入“Project Interpreters”。

图 4.7 进入项目解析器配置管理

   如图4.8所示,找到刚刚新建的远程Python解释器配置,然后点击小铅笔图标进入“Configure Remote Python Interpreter”界面。

图 4.8 进入远程解析器配置

   按照图4.9设置SSH Credentials,“Host”、“User Name”、“Authentication type”、“Password”、“Python Interpreter path”等配置项的值与之前步骤的值一样,而“PyCharm helper path”采用默认值即可。

图 4.9 配置远程解析器

   如果设置成功,如图4.10所示,在“Project Interpter”对话框的列表中将显示出树莓派上已安装的Python包的信息,点击列表右边的眼睛图标可以进行刷新。如果在列表下面出来图4.10中的提示,则点击“Install packaging tools”安装packaging tools即可。

图 4.10 完成远程解析器配置

   步骤 8(可选): 配置文件上传机制。PyCharm能够自动的把代码文件等上传到树莓派,默认是当文件文件发生改变时自动上传。这种默认机制上传文件的次数较多,效率不高且会影响MicroSD卡的寿命,因此建议修改为保存文件后上传文件,以减少文件上传次数。如图4.11所示,在“File->Settings”中找到相应的配置项并修改。

图 4.11 配置文件上传机制

   到此为止,我们就完成了PyCharm远程Python开发环境的搭建,这样就可以在个人计算机上使用PyCharm编写代码,然后通过SSH调用树莓派上Python解释器进行调试和运行程序。

4.2.3 编写第一个程序

   步骤 1: 新建一个Python文件,输入以下代码并保存,最终结果如图4.12所示,在下方的“File Transfer”窗口中可以看到文件已经被自动的上传到树莓派。

#!/usr/bin/python3

if __name__ == '__main__':
    print("Hello, World!")

图 4.12 编写程序

   步骤 2: 运行程序。如图4.13所示,第一次运行程序可以点击绿色三角形选择“Run ‘main’”或“Debug ‘main’”,运行的结果可以在下面的“Run”窗口中看到。之后,也可以通过点击右上角工具栏按钮运行或调试程序。

图 4.13 运行程序

4.2.4 root权限问题

   很多的树莓派Python程序(例如:GPIO、蓝牙等)需要root权限才能运行,而前面配置用于远程开发树莓派程序的用户pi是不具备root权限,远程运行程序的时候会发生错误,以下提供一种解决这个问题的方法。

   步骤 1: 新建脚本文件。在树莓派上新建一个脚本文件,命名为py_sudo.sh,文件的内容如下:

#!/bin/bash
sudo /usr/bin/python3 "$@"

提示:

  • 这里我们把脚本文件py_sudo.sh存放在“/home/pi/”目录下面。
  • 可以使用XShell登录树莓派后,运行“nano”或“vi/vim”等文本编辑器创建该脚本文件,也可以在个人计算机上创建该脚本文件后上传到树莓派上。

   其中,python3表示使用Python 3,如果想使用Python 2,修改为python即可。

   步骤 2: 让脚本文件具有可执行权限。使用XShell登录树莓派,进入脚本文件所在目录,输入以下命令:

chmod +x py_sudo.sh

   步骤 3: 修改远程Python解释器。参考4.2.2节的步骤7,进入“Configure Remote Python Interpreter”,按图4.14所示修改远程Python解释器路径。

图 4.14 修改远程解释器路径

   完成配置后就可以远程调试运行需要root权限的Python程序,而编写程序的方法不变。

4.3 本章小结

   本章首先介绍了本地开发和远程开发树莓派程序的两种思路,然后详细介绍在Windows上使用PyCharm专业版远程开发运行树莓派程序的方法。

第3章 让树莓派运行起来

   前面章节我们已经对树莓派进行了简单的介绍,使用树莓派作为机器人的控制系统是一个非常不错的选择,本章我们将进一步介绍如何安装、配置和使用树莓派,主要内容如下。

  • 所需材料,介绍运行树莓派所需的软、硬件材料及其注意事项和建议。
  • 安装操作系统,介绍一种安装树莓派官方操作系统Raspbian的方法。
  • 登录树莓派,介绍在无显示器条件下使用SSH方式远程登陆树莓派的方法和技巧,包含启用SSH、WiFi配置、XShell使用等内容。
  • 配置操作系统,介绍Raspbian系统的配置工具raspi-config,以及系统的语言和区域、默认语言环境等基本配置的配置方法。
  • 升级软件包,介绍使用Raspbian系统的软件包管理工具apt进行系统升级的相关知识和技巧。
  • 关机和重启,介绍几个关闭和重启树莓派的基本命令。

3.1 所需材料

3.1.1 硬件

  • 树莓派3B+型主板
       树莓派3B+型主板是当前的最新版本,提供了最为丰富的功能,可以很方便的作为机器人的控制系统。
  • 电源
       树莓派3B+型主板的额定电压为5V稳压直流电,额定电流为2.5A,可采用micro USB、GPIO和PoE三种方式供电,本章使用micro USB方式供电。在低负载运行的情况下,2A的电流也可以让树莓派正常运行,目前许多安卓智能手机的充电器(2A电流)都是可以使用的。当高负载运行时,我们应该使用能提供更大电流的电源,否则可能导致充电器过热甚至报废,也可能引起树莓派重启。另外,由于树莓派本身没有电源开关,为方便开关机,同时避免拔插电源线对树莓派造成损伤,建议使用带有开关的micro USB电源。
  • MicroSD卡
       树莓派使用MicroSD卡安装系统和存储数据,对性能要求较高,因此建议选择大容量(16GB以上)的高速(Class10以上)的MicroSD卡。您还可以准备多一张MicroSD卡用于安装不同的操作系统。
  • 读卡器(可选)
       如果您的计算机没有自带MicroSD卡读卡器,那么您需要准备一个,安装系统的时候需要用到。
  • 网线(可选)
       用于将树莓派接入网络,由于树莓派3B+提供了千兆的以太网口,使用千兆超6类网线可能获得更快的网速。当然了,使用百兆的超5类网线也是可以的。
  • 树莓派外壳(可选)
       树莓派本主板身是不带外壳的,主板外面裸露许多连接部件,当把接触到金属的时候非常容易发生短路,甚至造成损坏。所以,为树莓派配备一个合适的外壳进行保护是很有必要的。目前,市面上有很多类型的树莓派外壳,树莓派官方也出品有相应的外壳,您可以根据需要进行选择。

3.1.2 软件

  • Raspbian Stretch Lite
       树莓派官网提供了NOOBS和Raspbian两个官方的操作系统镜像。NOOBS的全称为New Out Of Box System(全新开箱即用系统),实际上是一个图形化的操作系统安装工具,其中NOOBS自带完整版的Raspbian,而NOOBS Lite则仅仅是NOOBS本身,您只要在NOOBS中选择想要安装的系统,它就会自动下载安装。Raspbian才是树莓派官方真正的操作系统,基于Debian系统定制,官方提供了Raspbian Stretch with desktop and recommended software、Raspbian Stretch with desktop和Raspbian Stretch Lite三个版本的镜像,“Stretch”是Debian系统的版本代号,其中“Raspbian Stretch with desktop and recommended software”带有图形界面和一些推荐的应用软件,“Raspbian Stretch with desktop”仅提供图形界面,“Raspbian Stretch Lite”则仅提供命令行界面。由于NOOBS和系统安装包会占用一定的存储空间,且安装操作系统的时候需要外接显示器,因此NOOBS并不是最好的选择。另外,按照“简单”的原则,我们选择使用最为精简的Raspbian Stretch Lite版本,使用过程中再按需手工安装相应软件。
       下载地址:https://www.raspberrypi.org/downloads/
  • Etcher
       Etcher是一款免费的U盘镜像制作工具,可以将镜像刻录到U盘,我们将用它将Raspbian系统安装到MicroSD卡上。类似的软件还有Win32 Disk Imager等,您可以根据习惯选择。
       下载地址:https://www.balena.io/etcher/
  • SDFormatter(可选)
       SDFormatter是一个简单的SD卡修复工具,也是树莓派官网推荐的SD格式化工具。在安装树莓派后,您会发现MicroSD卡的容量与实际容量不符(只剩下很少的存储空间),如果你想恢复MicroSD卡的容量,就可以使用SDFormatter进行格式化。
       下载地址:https://www.sdcard.org/downloads/formatter_4/
  • XShell
       XShell是一个强大的安全终端模拟软件,支持SSH1、SSH2、TELNET、Serial等多种协议,我们将用它远程登录树莓派。官方提供有免费版供个人和教育使用,相比专业版,免费版仅是限制最多只能打开四个标签页,但这并不影响我们的使用。与XShell类似的软件还有SecureCRT、Putty等,您可以根据习惯选择。
       下载地址:https://www.netsarang.com/en/
  • Advanced IP Scanner(可选)
       Advanced IP Scanner是一个免费的网络扫描器,可以分析LAN,我们将用它来确定树莓派的IP地址。类似的网络扫描工具有很多,您也可以选择其他类似的工具。
       下载地址:http://www.advanced-ip-scanner.com/cn/

3.1 安装操作系统

   Raspbian系统的安装步骤如下:
   步骤 1: 将MicroSD卡插入到电脑上。
   步骤 2: 运行Etcher,点击“Select image”按钮选择要安装的系统镜像,选择要安装系统的驱动器,然后点击“Flash!”按钮开始安装系统,如图 3.1所示。整个过程大约需要几分钟的时间,请耐心等待。

图 3.1 安装操作系统

提示:

  • Etcher通常能自动识别出要安装系统的驱动器,我们一般不需要进行额外设置。
  • raspbian的镜像是一个zip格式的压缩文件,文件名一般为“发布时间-raspbian-stretch-lite.zip”,例如:2018-11-13-raspbian-stretch-lite.zip,Etcher支持直接使用zip格式压缩文件进行安装,所以我们不需要把镜像文件解压出来。
  • 开始安装系统后,MicroSD卡原有的数据都会给格式化掉,因此我们应该非常谨慎。

   安装成功后,把MicroSD卡插入树莓派,同时给树莓派接上鼠标、键盘、显示器和电源,就可以和普通个人计算机一样使用。

3.2 登录树莓派(SSH方式)

   在使用树莓派时,尤其是作为机器人控制系统,很少会使用到显示器,更多是采用网络远程登录的方式。事实上,网络远程登录方式更为便捷,且几乎可以完成所有的工作。常见的远程登录树莓派的方法有SSH和VNC。其中,SSH是命令行界面的远程管理工具,也就是登录后只提供命令行界面,而VNC则是图形化的远程管理工具,提供图形化界面,前提是你的系统上安装了图形界面。以下是SSH方式登录树莓派的步骤和技巧:
   步骤 1: 开启SSH服务。将MicroSD卡插回计算机,在MicroSD卡的根目录下(也就是树莓派的/boot目录)新建一个空白的文件,并命名为ssh,注意文件名不要带有后缀。
   步骤 2: 接入网络。有线方式接入网络,仅需要用网线将树莓派和交换机(路由器)连接起来即可。若想在没有显示器的情况下通过WiFi接入网络,则可以通过在MicroSD卡的根目录下新建一个名为wpa_supplicant.conf的配置文件来实现,配置文件内容参考以下格式填写。

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev  
update_config=1  
  
network={  
ssid="WiFi名称"  
psk="WiFi密码"  
key_mgmt=WPA-PSK  
priority=1  
scan_ssid=1  
}

   配置文件的前两行为固定写法,不需要改动。network字段的内容应根据WiFi的实际设置修改,配置文件中可以有多个network配置表示连接不同的WiFi。其中,ssid为WiFi名称;psk为WiFi密码;key_mgmt为WiFi加密方式;priority为WiFi连接优先级,为非负数,数字越大优先级越高;scan_ssid用于设置是否连接到隐藏ssid的WiFi,其值为1时表示连接。以下是几个常见的network配置:

  • 连接没有密码的WiFi:
network={  
ssid="WiFi名称"  
key_mgmt=NONE  
}  
  • 连接使用WEP加密的WiFi:
network={  
ssid="WiFi名称"  
key_mgmt=NONE  
wep_key0="wifi密码"  
}  
  • 连接使用WPA/WPA2加密的WiFi
network={  
ssid="WiFi名称"  
key_mgmt=WPA-PSK  
psk="wifi密码"  
}  

   完成以上步骤后,就可以将MicroSD卡插回树莓派,接上电源启动树莓派。

提示:

  • 建议尽量采用WiFi方式接入网络,这样可以减少树莓派的接线数量,增加灵活性,便于今后的使用。
  • 不要同时使用有线和WIFi方式连接网络,很可能会造成你的树莓派无法访问。

   步骤 3: 确定IP地址。在没有显示器的情况下,我们很可能不知道树莓派的IP地址,而远程登陆到树莓派首先需要知道树莓派的IP地址,以下是两个解决这个问题的技巧。

  • 网络扫描法
       如图3.2所示,运行Advanced IP Scanner设置要扫描的地址范围,软件会自动识别出您的电脑所在的网段,您也可以根据实际修改,然后点击扫描(Scan)开始扫描,根据网络的规模和速率的不同,扫描的时间也会有所不同。扫描结束后,我们从结果中要到制造商(Manufacturer)为“Raspberry Pi Foundation”就是您的树莓派的网络信息,从中可以找到树莓派的IP地址。
    图 3.2 获取树莓派网络信息
  • 路由器查询法(DHCP)
       在局域网中,IP地址一般由DHCP服务器负责管理,对于家庭或中小型企业的局域网,DHCP服务器的功能通常由路由器承担。如果您拥有路由器的管理权限,那么可以登陆路由器管理界面查找树莓派的IP地址。树莓派Raspbian系统的默认主机名是raspberrypi,您只要在路由器里面找到该主机名对应IP地址即可,不同路由器的管理界面大同小异,请根据您的路由器说明书操作。

提示:
   路由器为树莓派动态分配的地址是有租期的,租期一到,树莓派的IP地址很可能会改变,因此不便于我们以后的使用。如果路由器具备管理功能,建议在路由器上把树莓派的MAC地址和IP地址绑定在一起,确保同一台树莓派的IP地址永远不会改变(即使更换了操作系统),让我们既能享受自动分配IP地址的方便,又能保证IP地址是固定的,方便今后的各种网络连接操作。

   步骤 4: 登录树莓派。如图3.3所示,运行XShell,新建一个会话(Sessions),并按图3.4填写连接(Connection)和用户身份验证(Authentication)。其中,名称(Name)字段为会话名称,可任意填写;主机(Host)字段为树莓派的IP地址,请根据实际填写;用户名(User Name)字段为树莓派的用户名,第一次登录树莓派使用pi用户即可,今后您可以根据实际新建其它的用户登录;密码(Password)为pi用户的密码,默认为raspberry。

图 3.3 XShell 新建会话(Session)

图 3.4 SSH登录配置信息

   XShell登录树莓派后的界面如图3.5所示,这是一个典型的Linux命令行界面,我们可以在这里使用各种命令来控制树莓派。

图 3.5 XShell登录树莓派

3.3 配置操作系统

   为了更好的使用树莓派,建议在第一次登录树莓派后进行一些基本的配置。Raspbian系统自带一个叫raspi-config的系统配置工具,可以对树莓派的CPU频率、内存分配、网络、接口等众多项目进行配置。
   运行raspi-config需要root权限,可以在终端输入以下命令运行。

sudo raspi-config  

   raspi-config的界面如图3.6所示。这个界面操作比较简单,用键盘上的上、下键进行菜单项目的选择,左右键进行确定和取消等按钮的选择,回车键进入,Esc键取消返回,空格键选定选项,改完后选择Finish退出(可能会重启)。

图 3.6 raspi-config

提示:

  • 其他Linux系统一样,在Raspbian系统的命令行下仅需要输入命令、目录或文件的前几个字符,然后按Tab键就能自动补全,如有相重的,再按一下Tab键,系统会列出当前目录下所有以这几个字符开头的名字。例如:输入“raspi-”,再按Tab键,就能自动补全为“raspi-config”,而输入“raspi”,再按两下Tab键,则会列出以raspi为开头的命令。这种命令行自动补全的功能非常方便,极大的提升了输入命令的效率。
  • sudo命令表示以系统管理员身份执行指令。例如:运行raspi-config需要管理员权限,而登录树莓派的pi用户是一个普通的用户,所以我们需要输入“sudo raspi-config”。这是Linux系统下一个非常常用的方法,后继章节中我们还会不断用到。

   Raspbian系统的语言、时区等国际化选项(Internationalisation Options)的默认值均为英国,为了适应本地化的需要,我们在这里重点介绍如何使用raspi-config设置语言和时区,让树莓派更好的支持中文,其余配置将在今后使用到的时候再进行介绍。

  • 语言和区域设置
       运行raspi-config,进入Localisation Options->I1 Change Locale添加支持语言,如图3.7所示,用上下键和空格去掉“en_GB.UTF-8 UTF-8”,添加以下5项:

en_US.UTF-8 UTF-8
zh_CN GB2312
zh_CN.GB18030 GB18030
zh_CN.GBK GBK
zh_CN.UTF-8 UTF-8

图 3.7 添加支持语言

   添加完成后回车确认,在出现的菜单选择en_US.UTF-8为默认值并回车确认,如图3.8所示。

图 3.8 设置默认语言环境

   最后,退出raspi-config并运行以下命令重启系统,让设置生效。

sudo reboot  

提示:
在Raspbian系统中,并非所有的软件都能很好的支持中文,所以我们还是把系统的默认语言环境设置为en_US.UTF-8。

  • 设置时区
       Raspbian系统的默认时区为格林威治时间 (GMT),要比北京时间慢8小时。进入Localisation Options->I2 Change Timezone,选择Asia(亚洲)再选择shanghai(上海)即可更正时间问题。

3.4 升级软件包

   Raspbian系统默认安装的软件比较旧,安装完系统后,建议首先进行升级。Raspbian系统使用apt(Advanced Packaging Tool)管理软件包,可以使用apt命令升级软件,升级的速度受apt源的影响比较大,默认使用的apt源由树莓派基金会提供,服务器在国外,速度比较慢,因此建议先修改apt的配置文件,将apt源更换为国内的镜像以提高升级速度。
   Raspbian系统有两个apt源的配置文件,分别是 /etc/apt/sources.list 和 /etc/apt/sources.d/raspi.list。其中,/etc/apt/sources.list是Raspbian系统apt源的配置文件,包含了大部分的软件。/etc/apt/sources.list.d/raspi.list是树莓派基apt源的配置文件,由树莓派基金会单独提供维护,仅包含raspi-config、minecraftpi、树莓派桌面环境、内核固件驱动等少量软件,国内目前只有清华大学和中国科技大学提供有该apt源的镜像,且不是很稳定。因此,这里我们仅对/etc/apt/sources.list进行修改。
   已更换Raspbian系统apt源为例,首先使用管理员权限编辑/etc/apt/sources.list文件,参考命令行为:

sudo nano /etc/apt/sources.list  

   其次,如图3.9所示,使用#注释掉原来的内容,并更换相应的配置。

图 3.9 更换Raspbian系统apt源

   最后,使用 Ctrl+O 回车保存文件后,Ctrl+X 退出编辑器。

提示:

   修改完后,依次执行以下命令就可以完成升级,升级过程一般需要几十分钟甚至几个小时才能完成,请耐心等待。

sudo apt update # 更新apt源  
sudo apt upgrade # 更新已安装的软件包  
sudo apt dist-upgrade # 升级系统  

3.5 关机和重启

   树莓派本身没有开关机按钮,但我们不建议直接拔插电源来关机或重启,而是使用以下方法。

  • 关机可以使用以下任一条命令:
sudo shutdown -P now  
sudo halt  
sudo poweroff  
  • 重启可以使用以下任一条命令:
sudo reboot  
sudo shutdown -r now  

3.6 本章小结

   本章首先介绍了运行树莓派所需的硬件和软件,其次介绍了安装Raspbian系统的方法,然后介绍了在没有显示器的条件下采用ssh方式登录树莓派的方法和技巧,简单介绍了配置Raspbian系统的基本知识,讨论了升级Raspbian系统的方法,最后介绍了关机和重新系统的几个基本命令。

第2章 认识树莓派

   树莓派(Raspberry Pi,RasPi/RPi)是由英国的慈善组织“Raspberry Pi 基金会”开发,基于ARM的微型电脑主板,只有信用卡大小,但却具备一部个人计算机的基本功能。基金会开发树莓派的最初目的是为了提升学校计算机科学及相关学科的教学水平,培养青少年的计算机程序设计兴趣和能力,同时期望能有更多的应用被不断开发出来,并应用到更多领域。然而,树莓派自问世以来就受到众多计算机发烧友和创客的追捧,曾经一“派”难求。目前,具有树莓派生产许可的制造商主要有:

   这几家制造商都有在网上出售树莓派,不同厂家销售的树莓派仅在外观上有细微的区别,配置、性能和使用是完全一样,大家可以随便选择购买。在国内,我们可以很容易的从各大购物网站上购买到。

2.1 树莓派硬件

   图2.1 展示的是树莓派3B+型主板,树莓派3B+型是当前最新的版本,在所有已发行的版本中性能最好,功能和接口最多,但功耗也相对较大。接下来的章节中,我们将主要采用该版本的树莓派进行介绍,下面首先对树莓派的主要部件及接口的功能进行介绍:

图 2.1 树莓派3B+

   1:SOC芯片
   树莓派采用博通(Broadcom)BCM283X系列芯片作为SOC芯片,芯片上集成了CPU、GPU、DSP及SDRAM内存等,其中CPU和GPU共享内存,可以在系统中手工修改内存占比。不同版本的树莓派所采用的SOC芯片在结构和性能上存在一定的差异。
   2:以太网接口
   以太网接口让树莓派能以有线的方式接入计算机网络,这让我们能轻松的访问互联网,或远程登录到树莓派。树莓派的以太网接口是利用USB总线实现的,数据通过USB总线进行传输,大部分型号的树莓派都提供有以太网接口。
   3:USB接口
   通用串行总线(Universal Serial Bus, USB)接口是计算机上最常见的接口,您可以用它来连接键盘、鼠标、U盘、无线网卡等设备。当USB接口的数量不够用时,我们还可以通过USB集线器增加USB接口数量。
   4:HDMI接口
   高清多媒体接口(High Definition Multimedia Interface,HDMI)是一种全数字化视频和声音发送接口,用于传输未压缩的音频及视频信号。通过它连接到配备有HDMI接口的显示器(或电视机)上,就能显示树莓派的内容。HDMI接口能够同时传输视频和音频信号,因此我们使用的时候不需要在树莓派的音频接口连接扬声器,确实需要通过音频接口播放声音的,则需对操作系统的配置做相应的修改。
   5:音频及复合视频接口
   音频接口(3.5mm耳机插孔)在没有用到HDMI连接的时候,可以使用标准3.5mm耳机插孔的扬声器或耳机播放音频。同时,该接口还集成了复合视频接口,具有复合音视频输出功能,一般用于连接旧型号的电视机,当前已经很少使用。
   6:DSI显示器接口
   可以将LCD显示器连接到树莓派上,一般用于嵌入式产品开发。通常情况下,HDMI接口已经能满足需求。
   7:CSI摄像头接口
   利用CSI接口可以通过一条排线将CSI摄像头连接到树莓派上,轻松的进行视频录制和图像拍摄。与USB摄像头相比,这种摄像头模块的性能更为出色。
   8:通用输入输出接口(General Purpose Input Output,GPIO)
   通用输入输出接口(General Purpose Input Output,GPIO)在树莓派主板上被设计成具有两排引脚的插槽。GPIO可以用于连接各种外围电子设备和传感器,通过输入/输出电平信号,以控制或监控这些设备。例如,可以使用GPIO控制直流电机的转速,或是读取超声波传感器的测量距离等。GPIO的这些功能特性使得树莓派有别于普通计算机主板,因为它给予开发人员手工操作的自由。我们将在后续章节中对GPIO做进一步介绍,并大量的使用它们。
   9:SD卡插槽
   SD卡插槽位于树莓派主板背面。SD/MicroSD卡是树莓派必备的存储部件,用于安装操作系统和存储数据,SD卡的容量应在2GB以上。为了能有更好的使用体验,建议为您的树莓派配备大容量(16G以上)的高速(Class10以上)的SD卡。
   10:Micro USB供电接口
    Micro USB供电接口是树莓派主要的供电方式之一,额定电压5V,不同版本的树莓派的标准电流要求略有区别,例如:1B型只要700mA,而3B+型则需要2.5A,很多安卓(Android)手机的充电器都能为树莓派提供必要的电压和电流。树莓派的电流需求还与其连接的外部设备有关,建议在使用的时候应事先计算好,为树莓派选择合适电流(功率)的电源,当外接设备功率较大时,应该采用独立的电源为外部设备供电。
   11:WiFi及蓝牙模块
    WiFi功能让树莓派能够以无线的方式接入计算机无线网络实现互联互通,蓝牙功能则让树莓派能与具备蓝牙功能的设备(如鼠标、键盘、手柄等)进行连接使用。目前,仅3B型、3B+型和Zero W型树莓派自带WiFi和蓝牙功能(两者集成在一个芯片上),对于其他型号的树莓派,您可以通过外接USB WiFi(蓝牙)适配器实现。我们将在后续章节对WiFi和蓝牙的使用作进一步介绍。
   12:以太网供电(PoE)接口
    有源以太网(Power Over Ethernet, PoE)是指利用以太网进行电力传输的一种技术。树莓派3B+型在原有的Micro USB和GPIO供电的基础上,新增了以太网供电方式,用户可以使用网线为树莓派供电,而不需要配置额外的电源,这为某些应用场景提供了极大的便利。

    自2011年12月第一款树莓派问世以来,树莓派基金会已经发布了多个版本的树莓派主板,各版本的差异如表2.1所示。通常,功能较多、性能较高的版本,其体积和功耗也相对较大,我们应该根据实际需求选择合适的版本,而不是盲目的使用功能多、性能高的版本。根据实际需要,在后续的章节中我们将主要使用树莓派3B+型进行介绍。

表 2.1 树莓派版本对照表

2.2 树莓派软件

2.2.1 操作系统

    树莓派支持多种操作系统,主要基于Liunx和Windows,大多可以在树莓派基金会的官网(www.raspberrypi.org)找到,以下简单介绍两款具有代表性的操作系统。

  • Raspbian
        Raspbian是树莓派基金会的官方操作系统,基于Debian GNU/Linux定制,能运行在所有版本的树莓派主板上。根据使用经验,Raspbian与树莓派结合得最好,运行稳定、功能强大、使用方便,基本能满足各种应用需求,因此强烈建议将Raspbian作为树莓派的首选操作系统。在后续的章节中我们将进一步对Raspbian的使用作详细的介绍,并在上面进行各类应用开发。
  • Windows 10 IoT Core
        Windows 10 IoT Core是微软公司专门为物联网生态打造的操作系统,Windows 10 IoT Core则是Windows 10 IoT操作系统的核心版本,功能相对精简,可以在2B型以上的树莓派运行。Windows 10 IoT Core的安装和使用在此就不作详细介绍,有兴趣可访问微软公司的网站获取更多的资料。

    除以上介绍的两款操作系统,还有多款支持树莓派的操作系统,如Ubuntu MATE、OSMC、LibreELEC、PiNet、RISC OS等,至于选择那一种,则取决于您想要用树莓派做什么。如果想将树莓派作为普通的计算机使用,或用于电子项目开发的话,那么Raspbian是个非常好的选择。如果您打算将树莓派作为媒体中心使用,那么可以考虑使用OSMC或LibreELEC。

2.2.2 编程语言

    对于树莓派来说,有许多编程语言可用,事实上任何可以为ARM架构编译的语言(如C语言等)都可用于树莓派,其中最流行的语言应该算Python。事实上,树莓派名字中的Pi就是受单词Python的启发而取的。Python是一种解释型、面向对象、动态数据类型的高级程序设计语言,功能强大、兼容性好、可靠性高,Python程序易于编写和阅读。当前,Python有两个主要版本:Python 2和Python 3,两个版本一直保持有更新维护,但人们对到底该使用哪个版本至今仍存在争议,您可以访问Python的官网(www.python.org)了解更多的相关内容,今后我们将主要使用Python 3进行开发介绍。另外,由于树莓派的兼容性非常好,我们在3B+型上写的程序几乎不需要要修改就能在Zero W型上运行。

2.3 本章小结

    本章介绍了树莓派主板的主要部件和功能,并对各版本的树莓派进行了比较,同时介绍了树莓派的操作系统和编程语言,让读者对树莓派有个基本的了解,为接下来的课程打基础。

第1章 机器人

1.1 什么是机器人

   机器人(robot)一词最早出现在1920年捷克斯洛伐克作家Karel apek的科幻小说《罗萨姆万能机器人公司》中,是根据捷克语Robota(苦役、苦工)和波兰语Robotnik(工人)两个词创造出来的,即代表进行苦力劳动,完成繁重的工作。早在机器人一词出现前,人们就一直幻想和追求制造一种像人一样的机器,以替代人类完成各种工作,现今有记载的如:中国三国时期蜀国丞相诸葛亮制作的木牛流马、十八世纪法国天才技师发明制作的机器鸭。
   在过去的一百年里,现代机器人技术蓬勃发展,机器人已经被应用到我们生产、生活的多个领域中,甚至扮演着重要的角色。然而,至今还没有机器人的统一定义,要给机器人下一个合适的并为人们普遍接受的定义是困难的,以下是比较有代表性的定义。

  • 任何能够代替人类劳动的自动操控机器,虽然这种机器看上去有可能与人类并不相似,或者并不按照人类的方式来实现某些功能。(《大英百科全书》)
  • 机器人(Robot)是自动执行工作的机器装置。它既可以接受人类指挥,又可以运行预先编排的程序,也可以根据以人工智能技术制定的原则纲领行动。它的任务是协助或取代人类工作的工作,例如生产业、建筑业,或是危险的工作。(《百度百科》)
  • 机器人是真实存在于物理世界中的自主系统,能够感知周围环境,依靠自身判断采取行动并完成特定的目标。([美]Maja J.Mataric,《机器人学基础》)

   根据对现代机器人典型定义的理解,以及后继内容的需要,我们认为机器人至少应该具备以下特征:
   第一,机器人应该是真实存在于物理世界中的一个看得见、摸得着的实体。虽然有些计算机程序自称是机器人,也具备机器人的一些特征,但它不是一个看得见、摸得着的实体,所以我们不能称其为机器人,例如运行在我们电子邮件服务器上的反垃圾邮件机器人。
   第二,机器人能完成人类的一些工作,但不一定长得跟人类一样。一个长得和人类一样的机器人不一定适合或擅长去完成我们指定的工作,而且其设计制作的难度相当大。例如:您可以设计制作一个用双脚走路的机器人,但这个机器人的行动效率可能远不如用一个用轮子行动的机器人,而且设计制作一个用轮子走路的机器人远比设计制作一个用双脚走路的机器人要简单。
   第三,机器人应该具备环境感知能力。机器人是一个存在于真实世界的实体,运行在真实世界中,而真实世界的环境是复杂和未知的,机器人需要能根据不同的环境做出合适的行动,那么它必须具备感知周围环境的能力。上述各类古代的自动化机器显然不具备环境感知能力,因此不能算是一个机器人。
   第四,机器人能够依靠自身判断采取行动并完成特定的目标。在接收(感知)到周围的环境情况信号后,机器人应该能够根据这些信号做出判断并采取相应的行动以完成特定的任务。例如,扫地机器人在遇到障碍物的时候能够自行修改行进路线,避开障碍物继续完成工作。
   第五,机器人应该可以接受人类的指挥和操纵。对于一个感知能力有限、智能水平较低的机器,在行动的时候很可能出现偏差,这个时候就需要人类进行干预。而对于一个具备全面感知能力和高度智能的机器人,若脱离了人类的控制,那将是件多么恐怖的事情,科幻小说里机器人奴役人类的情节非常可能出现。因此,机器人接受人类的指挥和操纵是非常必要的。

1.2 机器人组成

   机器人一般由机械本体、控制系统、驱动系统和感知系统等四大部分组成。

  • 机械系统
       机械系统是机器人赖以完成作业任务的执行机构,可以在确定的环境中执行控制系统指定的操作,一般包括机身、臂部、手腕、末端操作器和行走机构等部分,每个部分都有若干的自由度,是一个多自由度的机械系统。
  • 控制系统
       控制系统的作用是根据机器人的的作业指令程序以及传感器反馈回来的信号控制机器人的执行机构,使其能完成规定的运动和功能。控制系统是机器人的指挥中枢,相当人类的大脑,可以由一台或多台微型计算机完成。后续的章节我们将采用一款叫树莓派(Raspberry Pi,RasPi/RPi)的微型计算机作为机器人的控制系统进行介绍。
  • 驱动系统
       驱动系统是驱使机械系统运动的机构,能够按照控制系统的指令信号,借助于动力元件使机器人进行动作。它输入的是电信号,输出的是线、角位移量。机器人驱动系统主要有液压、气动和电气三种。其中,电气驱动方式使用较为普遍,主要采用步进电机、伺服电机和直流电机等实现。
  • 感知系统
       感知系统是用于获取机器人的内部和外部环境信息,并把这些信息反馈给控制系统,由内部传感器和外部传感器组成。内部传感器用于感知机器人的内部情况,如速度、电压等信息,外部传感器则用于获取机器人所处环境信息,如声音、视觉等信息。光敏电阻、超声波传感器、雷达、摄像头等都是典型的传感器。

   机器人是一个典型的机电一体化系统,其基本工作原理如图1.1所示:控制系统发出动作指令,控制驱动系统动作,驱动系统带动机械系统运动以完成一定的作业任务。在运行过程中,感知系统不断的收集内外部环境信息并反馈给控制系统,控制系统根据这些信息进行运算后,发出下一个动作指令。人机交互界面则为人们提供了一个观察机器人运行状态和人工干预机器人运行的接口,属于控制系统的一部分。

图 1.1 机器人基本工作原理

1.3 机器人制作

   设计制作一个机器人涉及到机械、电子、计算机、仿生学等多个学科的知识,以下先简单介绍一下机器人设计和制作的一些基本知识,以便初学者更为快速的入门。

1.3.1 基本原则

  • 简单
        在设计和制作机器人的任何阶段,秉承简单明确的理念是非常睿智的。尤其是在设计制作第一个机器人的时候,我们对机器人的功能要求应尽可能简单,并采用较为简单的方式和技术去实现,不要因为过度钻研某一领域的知识而忘记你正在做一个机器人。
  • 分解
        设计制作机器人是一个复杂的工程,通过工作任务分解,可以简化我们的工作。可以把机器人分解为机械系统、控制系统、驱动系统和感知系统四个部分,然后再对各个部分设计制作工作进行必要的分解直至满足我们的需求并实现。
  • 迭代
        一次性就设计制作出一个功能完善的机器人显然是不现实的。在设计制作机器人的过程中,我们借鉴软件工程的迭代理念,首先实现最简单、最基本的功能,然后再逐步完善和优化。
  • 协作
        前面我们说过,机器人设计和制作涉及到众多学科的知识,而我们大多数人不可能熟知所有相关领域的知识,因此各种形式进行协作是必要的。在互联网高度发达的今天,利用网络社交手段向某些领域的大牛求助是个不错的选择。另外,对于组成机器人的一些基本功能模块,我们可以考虑直接从网上购买,而不是自己从头设计制作,这样可以大大的降低设计制作机器人的难度。

1.3.2 制作步骤

    设计制作一个机器人大致可以分为以下五个步骤:

  • 确定需求
        制作机器人的第一步应该是明确你要做一个什么样的机器人,具备什么功能。按照“简单”的原则,我们不应该一开始就对机器人有太多甚至过份的功能需求,明智的做法是从简单的功能需求出发,把需求一一列出来,并做分类整理,可以考虑把复杂的功能需求归到一类,以便后续迭代实现。
  • 系统设计
        需求确定后,我们应按照“分解”原则,分别对机器人的机械系统、控制系统、驱动系统、感知系统等四大组成部分进行逐步细化设计,确定诸如移动方式、控制方式、、感知形式、动力源等,把机器人的雏形规划出来。这里同样建议采取由简到难,迭代实现的方式进行设计。
  • 材料选择
        完成系统设计后,接下来就是根据设计挑选所需的材料,例如:驱动器、动力源、控制板、感知器等。选择材料的时候建议:①按照前面所述的机器人四大组成部分分别挑选材料,有利于理清思路;②挑选市面上普及和通用的零件,能更容易找到相关的技术文档;③注意电子电气元件的技术参数,如电压、电流、功率等,确保和设计相匹配,避免元件损坏。
  • 程序编写
        为了让机器人动起来,我们还需编写相应的控制程序并上传(烧入)到控制部件。编写程序的时候,建议:①尽可能选择简单易学的编程语言,例如后续章节所使用Python;②根据“协作”的原则,借助各类通用的开发框架和程序库进行开发;③先分别对各部件进行编程,调试通过后再进行联调,通过不断的迭代完成开发。
  • 组装运行
        最后,我们需要将各个部件组装起来,使其成为一个真正的机器人。在这个过程中,我们同样应该遵循“分解”和“迭代”的原则,逐步进行组装和调试,而不是整体组装完成再调试。同时,我们应该尤为注意电子电气元件的连线,避免由于短路而造成元器件损坏。

1.4 本章小结

    在这一章中,我们介绍了机器人的概念,以及我们对这个概念的理解,让您了解什么是机器人。其次,介绍机器人的基本组成,即机械系统、控制系统、驱动系统、感知系统四大部分。最后,我们讲述了设计制作机器人的四个原则和五个步骤,让您对机器人设计制作有个基本的了解。