电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
从零开始的树莓派人脸识别教程
分 享
扫描二维码分享
从零开始的树莓派人脸识别教程
树莓派
硬件编程
python
考研狗不再电赛
关注
发布时间: 2021-01-28
丨
阅读: 1670
## 开始的话: 光阴似箭,日月如梭,时间像是把锋利的刀,把我这只考研狗杀的狼狈不堪。很想继续在实验室学习自己喜欢的东西,奈何这些年来为电赛付出太多时间,文化课差的一踏糊涂。要考的学校现在高山仰之,我不得不像高三一样暂时停下我的爱好,专心考研。临走前把我学的东西做个整理。希望有机会把我学到的,方便开源的代码全部写在这里,供大家一起学习。 ## 项目背景: 这次教大家做的东西是一个二自由度的视频监测器,它可以实现对特定区域进行监测,判断监测区域人的数量,提取人脸信息,以及监测区域是否通过快速移动物体。 在监测到陌生人脸时,可以将人脸信息保存的上位机的安放系统。 本文主要讲述如何利用树莓派如何点亮小灯,以及如何利用树莓派产生pwm来控制舵机旋转角度。 # 点亮你的LED灯 ## 所需材料 硬件:树莓派3B+;LED小灯;1千欧电阻 系统:raspbian 开发语言:python(选用RPi.GPIO) ## LED小灯、电阻、树莓派之间的连线 ![](https://cf01.ickimg.com/bbsimages/202101/c7fab4b8baf69373568bb300f0c819dd.jpg) ##点亮小灯代码 ```python # -*- coding: utf-8 -*- import RPi.GPIO as GPIO import time # BOARD编号方式,基于插座引脚编号 GPIO.setmode(GPIO.BCM) # 输出模式 GPIO.setup(26, GPIO.OUT) while True: GPIO.output(26, GPIO.HIGH) time.sl
eep(1) GPIO.output(26, GPIO.LOW) time.sl
eep(1) ``` 我们连接好硬件后,在树莓派上运行这段代码。会发现小灯不断闪烁,且闪烁的时间间隔为1s。 ## 代码解析 *import RPi.GPIO as GPIO#导入RPI.GPIO *RPI.GPIO是一个小型的python库,可以帮助用户完成raspberry相关IO口操作。 *import time *我们引用了python中的时间模块,目的是精确控制小灯闪烁的时间 *GPIO.setmode(GPIO.BCM) GPIO.setup(26, GPIO.OUT) 选择树莓派io口的编码方式,这里选择bcm的编码方式。引用RPI.GPIO可以设置树莓派gpio口为bcm格式,或board格式。两者之间只有编码名称的不同。下表为树莓派的gpio口的引脚图。 ![](https://cf01.ickimg.com/bbsimages/202101/786dc8ade3a6381ffc3afb80746d389d.png) 根据下表我们可以看出,树莓派bcm对应的26引脚,与board对应的37一致。因此这里的程序也可以写为: *GPIO.setmode(GPIO.BOARD) GPIO.setup(37, GPIO.OUT) 最后一段 *GPIO.output(26, GPIO.HIGH) time.sl
eep(1) GPIO.output(26, GPIO.LOW) time.sl
eep(1)* 程序先让以bcm规格的第26号引脚输出高电平,在持续一秒后变为低电平。由此来控制led灯的闪烁时间。当我们更改time.sleep函数中的值时,可以观察到小灯的闪烁时间随值的改变而改变。 在掌握了点亮小灯这个程序后,我们紧接着来学习让如何利用树莓派来控制舵机。 # 树莓派控制舵机 ## 所需材料 硬件:树莓派3B+;舵机MG996R 系统:raspbian 开发语言:python(选用RPi.GPIO) ## 舵机与树莓派之间的连线 ![](https://cf01.ickimg.com/bbsimages/202101/f196f82e85be80f09e7b5181af374e77.png) 注意到舵机有三根引脚,我们将VCC接到树莓派的5V上,GND接在GND上,最后将PWM信号线接在树莓派BCM编码的25号引脚上。 ## 树莓派控制舵机代码 ```python import RPi.GPIO as GPIO import time import signal import atexit import numpy as np atexit.register(GPIO.cleanup) servopin1 = 25 GPIO.setmode(GPIO.BCM) GPIO.setup(servopin1, GPIO.OUT, initial=False) p1 = GPIO.PWM(servopin1,50) #50HZ p1.start(0) time.sl
eep(2) while(True): p1.ChangeDutyCycle(7.5+10*np.int32(x)/180) time.sl
eep(1) p1.ChangeDutyCycle(0) ``` ## 控制舵机原理 控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。 舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关系是这样的: 0.5ms-------------0度; 1.0ms------------45度; 1.5ms------------90度; 2.0ms-----------135度; 2.5ms-----------180度; 要精确的控制舵机,其实没有那么容易,很多舵机的位置等级有1024个,那么,如果舵机的有效角度范围为180度的话,其控制的角度精度是可以达到180/1024度约0.18度了,从时间上看其实要求的脉宽控制精度为2000/1024us约2us。所以我们这里设置p1 = GPIO.PWM(servopin1,50) 为50HZ。 ## 简单理解 我们可以看到舵机连接到了树莓派的VCC和GND,这为舵机提供了5V的电压。舵机的信号线与树莓派BCM编码的25号引脚连接,我们利用PWM在这个端口产生需要的电压。舵机通过比较PWM端口的电压与5V电压的差值来选择它的旋转角度。 在硬件编程这条路上,我一直觉得有些东西不一定要先搞懂才去用,你先学会用,可能才会有更多想要学下去的欲望。所以我的贴子一开始都是教你如何应用的,倘若日后有机会的话,我再给咱分析这其中奥秘。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
考研狗不再电赛
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交