如何手把手打造智能小车并点亮LED灯?

如何手把手打造智能小车并点亮LED灯?_58汽车

通过树莓派的GPIO接口,使用Python的RPi.GPIO库控制LED灯,包括基本点亮、闪烁以及通过PWM控制亮度变化。掌握GPIO操作是硬件交互的基础,点亮LED灯是学习智能小车制作的第一步,为后续小车运行、传感器使用及摄像头云台控制打下坚实基础。

1树莓派引脚及GPIO

上文提到了树莓派(如无特别说明,树莓派型号均以3b为准)有40个引脚,控制这些引脚,需要使用GPIO。

GPIO(GeneralPurposeI/OPorts)意思为通用输入/输出端口,通俗地说,就是可以通过它们给引脚输出高低电平或者通过它们读入引脚的高低电平状态。GPIO是一个重要的概念,用户可以通过GPIO接口和硬件进行数据交互(如UART),控制硬件工作(如LED、蜂鸣器等),读取硬件的工作状态信号(如中断信号)等。掌握了GPIO,差不多相当于掌握了操作硬件的能力。

现在,我们先来看看树莓派上的GPIO是怎么样的。下图是引脚编号对照表。可以看出,引脚有多种不同的编号方式。

通过上图可以看到,每一个针脚都有对应的物理引脚BOARD编码,BCM编码和wiringPi编码。BOARD编码按照引脚的物理位置依次进行编号;如果我们要基于wiringPi库用C语言对树莓派的GPIO进行操作,我们就要选用wiringPi约定的编号方式;如果我们要基于BCM模式用Python语言对树莓派的GPIO进行操作,我们就要选用BCM约定的编号方式。可以看到,wiringPi中的GPIO0对应的是按物理位置编号的11,也就是BCM模式的GPIO17。

和C语言相比,Python语言有着更加强大的功能,而且学习起来更加简单。下面介绍如何使用Python语言的RPi.GPIO库来控制GPIO。

可以用下面的代码导入RPi.GPIO模块。

引入之后,就可以使用GPIO模块的函数了。如果你想检查模块是否引入成功,也可以这样写:

在RPi.GPIO中,使用BOARD编号时,引脚编号与电路板上的物理引脚编号相对应。使用这种编号的好处是,你的硬件将是一直可以使用的,不用担心树莓派的版本问题。因此,在电路板升级后,你不需要重写连接器或代码。

如果选择BCM规则,是更底层的工作方式,它和Broadcom的片上系统中信道编号相对应。在使用一个引脚时,你需要查找信道号和物理引脚编号之间的对应规则。对于不同的树莓派版本,编写的脚本文件也可能是无法通用的。

使用下列代码指定一种编号规则,编号规则在使用引脚前必须强制指定:

下面代码将返回被设置的编号规则

警告:如果RPi.GRIO检测到一个引脚已经被设置成了非默认值,那么你将看到一个警告信息。你可以通过下列代码禁用警告:

一般来说,程序到达最后都需要释放资源,这个好习惯可以避免偶然损坏树莓派。注意,GPIO.cleanup()只会释放掉脚本中使用的GPIO引脚,并会清除设置的引脚编号规则。

要想点亮一个LED灯,只需要给相应的引脚输出一个高电平。这个步骤很简单,设置引脚的输出状态就可以了,代码如下:

state可以设置为0/GPIO.LOW/False或者1/GPIO.HIGH/True。如果编码规则为GPIO.BOARD,那么channel就是对应引脚的数字。

下面来实际操作一下。

先按照下面这个图连线,正极插在GPIO25引脚(物理位置为22),负极插在GND引脚。LED中有较大铁片的那一极为负。

远程连接树莓派之后,我们新建一个名为myPiCar的工作目录,在目录下新建文件LED.py。

将下面的代码手动输入到LED.py里面:

保存文件之后,打开命令行工具,使用cd命令切换到myPiCar文件目录

运行LED.py

可以看到LED灯已经亮了。

在LED.py的文件最后加上如下代码

使用python命令运行,可以发现LED灯在闪烁。

PWM是一种对模拟信号电平进行数字编码的方法。树莓派不能直接输出模拟电信号,但我们可以使用PWM(脉宽调制)方法来模拟这一点。我们制作一个固定频率的数字信号,之后我们将改变脉冲宽度,此时,“平均”输出电压的电平也会随之改变,如下图所示:

我们可以使用这个“平均”电压水平来控制LED亮度,如下图所示:

请注意频率本身不是重点,而是“占空比”,即“高”脉冲的时间所占的波周期的比例,这个比例以百分制表示,其值为0到100之间。假设我们在树莓派的GPIO上产生一个50Hz的脉冲频率。周期(p)将是频率的倒数即20ms(1/f)。如果我们想要LED达到“半”亮度,就把占空比设为50%,即“高”脉冲在一个周期内的时间是10ms。使用方法如下。

创建一个PWM实例:

启用PWM:

更改频率:

更改占空比:

停止PWM:

注意,假设实例中的变量“p”超出范围,也会导致PWM停止。

下面为使LED每两秒钟闪烁一次的演示样例:

这种闪烁的实现方式和上面的通过time.sleep()函数的实现原理是完全不同的。

下面为2个LED灯在亮/暗之间切换的演示样例,注意把LED灯接到相应的引脚。

读者可以自己试一下,看看效果。

应各位网友要求,放上完整代码地址GitHub

PWM的概念非常重要,后期我们在制作小车,控制小车行驶速度的时候将用到。

系列目录:

《手把手教你打造智能小车(0)-写在前面的话》

《手把手教你打造智能小车(1)-树莓派及其使用配置》

《手把手教你打造智能小车(2)-点亮LED灯》

《手把手教你打造智能小车(3)-小车跑起来》

《手把手教你打造智能小车(4)-使用传感器自动避障》

《手把手教你打造智能小车(5)-使用舵机打造摄像机云台》

以上内容由58汽车提供。如有任何买车、用车、养车、玩车相关问题,欢迎在下方表单填写您的信息,我们将第一时间与您联系,为您提供快捷、实用、全面的解决方案。

原创文章,作者:58汽车,如若转载,请注明出处:https://car.58.com/7013647/