构建物体检测直流电机控制器
Raspberry Pi(型号 A+、B、B+ 或 Pi 2)
(Q1)2N2222 NPN 晶体管或等效晶体管
(R1)220 欧姆电阻(红色、红色、棕色、金色),1/4W,5%
(D1)1N4001 整流二极管或等效元件
(M1)3-6VDC 电机或同等电机
(Pi 1)Raspberry Pi Cobbler或同等产品
(R2)光电管
DMM(数字万用表)或 VOM(伏特-欧姆-毫安表)
跳线(手工剥线 22 AWG [美国线规])实心线或 Adafruit 面包板线 产品 ID:153)
(VCC1)6VDC电池组
1.5VDC AAA 或 AA 电池 x 4
(S1)触觉按钮开关
光检测和光电管
光电管是一种光敏电阻。电气教科书或电子爱好者杂志中使用的另一个术语是光敏电阻或 LDR。如果您从未见过光电管,图 2 显示了 LDR 的电气符号和组件视图。
图 2.光电管的电气符号和组件视图光电管对光的电响应是电阻的变化。光电管敏感表面接收的光越多,其电阻越小,降至几百欧姆。在黑暗中,光电管电阻为兆欧姆。可以进行一个简单的实验来查看光电管的电阻如何根据光照水平而变化。首先,取一个 DMM(数字万用表)并将其设置为读取欧姆。将欧姆表刻度调整到 20 千欧姆设置。将 DMM 的正极和负极测试引线连接到光电管上,如图 3 所示。欧姆表上显示的读数将为几千欧姆。
图 3。作者的欧姆表读数为 3.11 千欧姆。注意:电阻值将根据光电管接收到的环境光而变化。接下来,将刻度调整到最高兆欧姆设置。将手放在光电管上,您将看到几百万欧姆的电阻值,如图 4 所示。
图4.作者的欧姆表读数为1.587兆欧。为了获得最佳效果,可以切割墨水笔的笔杆并将其内部涂成黑色,制作一个准直器(一种使光线变窄的装置)。干燥后,将准直器放在光电管上方。将准直器放在光电管上方可减少环境(外部)光对欧姆表电阻读数的干扰。我使用非工作墨水笔的“手指握把”制作了一个准直器,如图 5 所示。图 4 中获得的电阻测量值基于我自制的“手指握把”准直器。这些最小和最大光电管电阻值将使我们能够将一个简单的光传感器开关连接到无焊面包板上的 RPi。
图 5. 作者用墨水笔手指握把自制的准直仪。构建简单的光传感器开关
我们将使用光电管和上拉电阻制作一个简单的光传感器开关。图 6 显示了连接到 RPi GPIO 引脚的简单光传感器开关的基本电路原理图。电压降将与光电管电阻的大小成正比。例如,将物体或手放在光电管上将在 LDR 上产生约 +3,3VDC 的电压降。移开物体或手将降低光电管的电阻,从而在其上产生成比例的小电压降。电压降将由 RPi GPIO 引脚读取。Python 代码将读取光的消失和存在,即 +3.3VDC 或 0VDC。因此,将使用简单的光传感器电路模拟普通触觉按钮 - 数字开关的电气行为。 项目的下一阶段是构建和测试由晶体管操作的直流电机。
图 6.使用光电管和上拉电阻构建的简单光传感器开关。注意:上拉电阻是使用一行 Python 代码编程的电气元件。构建晶体管电机驱动电路
项目构建的下一阶段是连接一个电子电路,该电路将操作一个小型直流电机。具有适当放大系数(Beta)的单个双极结型晶体管(BJT)可用于操作或驱动小型直流电机。您可以通过在无焊面包板上构建电路(如图7所示)轻松构建晶体管直流电机驱动器。我还提供了电子电路原理图作为附加接线参考资料,如图8所示。在无焊面包板上构建电路后,按下触觉按钮开关将打开连接到晶体管集电极引线的小型直流电机。如果直流电机不旋转,请从电路中取出电池组,重新检查您的接线以及1N4001整流二极管和2N2222 NPN晶体管的正确组件方向。纠正接线错误后,重新连接电池组并再次测试电路,恭喜您构建了一个功能齐全的晶体管电机驱动器电路!现在,让我们通过回顾基本的晶体管理论来了解直流电机驱动器电路的工作原理。
图 7.晶体管电机驱动器无焊面包板接线图
图8.典型晶体管直流电机驱动器的电子电路原理图基本晶体管理论
晶体管能够操作直流电机是因为电源电流从 +6VDC 电池组通过集电极 - 发射极引线流到地。直流电机绕组串联在集电极引线和 +6VDC 电池组之间。来自 +6VDC 电池组的电流流过直流电机绕组,使其旋转。为了使电流流过集电极-发射极引线和直流电机绕组,必须打开晶体管。要打开晶体管,必须使用一种称为正向偏置的电子电路操作技术。正向偏置晶体管包括施加到基极-发射极结的输入电压,该电压大于 0.7V(700 mV)。此外,必须根据半导体元件类型正确连接晶体管。BJT 元件类型由 PNP 或 NPN 引脚配置组成。2N2222 晶体管是 NPN 元件。
集电极和发射极引线为负极(N 材料),基极为正极(P 材料)。图 9 显示了 2N2222 NPN 晶体管的引脚配置和封装类型。如图 8 所示,基极通过触觉按钮开关和 220 欧姆串联限流电阻连接到 +6VDC 电池组正极红线,发射极连接到地线(黑线)。220 欧姆电阻连接到晶体管的基极,以减少满电池电流和热量损坏晶体管。220 欧姆电阻的电阻值很合适,可以允许足够量的基极电流流动,从而使晶体管正常开启。此外,1N4001 二极管可防止直流电机绕组的反向峰值反向电流在晶体管关闭时损坏晶体管。如果您有兴趣了解有关此半导体器件的更多信息,请阅读 AAC 关于 双极结型晶体管的文章以获取更多电气理论信息。让我们继续进行项目的最终硬件构建。
图 9. 2N2222 NPN 晶体管的电子符号和元件封装类型在晶体管电机驱动电路正常工作后,我们现在可以完成项目的最终硬件构建。物体检测/直流电机控制器的最终电线是将驱动电路连接到 Raspberry Pi。在 LED 闪光灯项目中,Adafruit Pi cobbler用于将光隔离器和支持电路组件连接到适当的 RPi GPIO 引脚。Pi Cobbler 提供了便利,因为它可以在无焊面包板上访问所有 RPi GPIO 引脚,以便将电线连接到电子接口电路。因此,该项目也将使用相同的电路线组装技术。图 10 显示了物体检测直流电机控制器的无焊面包板接线。同样,图 11 中所示的电子电路原理图作为额外的接线资源提供。
图 10.组装在无焊面包板上的完整物体检测直流电机控制器接线图。请注意,触觉按钮开关、+6VDC 电池组的移除以及无焊面包板上电子元件的新放置位置。
图 11.物体检测直流电机控制器的电子电路原理图我通过下面显示的原型单元提供了一个对象检测直流电机控制器的示例。我使用一个旧的 Erector 套装金属底座和一个连接到其上的Meccano 直流电机来构建我的原型。此外,下面的链接中提供了一个展示控制器如何工作的视频剪辑。使我们的对象检测直流电机控制器运行的最后一步是添加 Python 代码。
图 12。作者最终构建的物体检测直流电机控制器。2N2222 晶体管具有足够的 Beta 值,可以正确驱动 Meccano 直立机电机,而不会使其过热。检测 Python 代码
下面显示的 Python 代码是从 LED 闪光灯项目中重复使用的程序。变量名称已更改为反映连接到 RPi 的物理组件。代码的工作原理是将一个物体放在光电管上以打开直流电机。将物体第二次放置在传感器上将关闭直流电机。如前所述,上拉电阻是一个使用以下 Python 代码行编程的组件:
GPIO.setup(光电管引脚,GPIO.IN,上拉下拉=GPIO.PUD_UP)
通过使用 Linux 命令 ~sudo nano object detection.py 打开 nano 编辑器,即可将整个 Python 程序输入到 LXTerminal 中。此外,还可以通过单击下面的代码按钮将 Python 程序保存到 RPi 的 SD 卡上。
# ***********Object Detection code******************
#
# inspired by Simon Monk, Raspberry Pi Cookbook, 2013
#
# modified by Don Wilcher Dec 18, 2015
#
# Placing a object over the photocell will turn on the dc motor.
# Placing an object over the photocell a 2nd time turns off the motor.
# Add libraries to python script
import RPi.GPIO as GPIO
import time
# Include BCM I/O pins into python script and define pin numbers
GPIO.setmode(GPIO.BCM)
photocell_pin = 4
motor_pin = 18
# Create photocell pin as an active low switch (use RPi internal pullup resistor)
# and define motor pin as an output.
GPIO.setup(photocell_pin, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(motor_pin, GPIO.OUT)
# Define and set (initialize) the motor output state as False and the old input event as True
motor_state = False
old_input_event = True
# pbswitch event monitoring loop: check pbswitch_pin and toggle dc motor output based on input events
# being True or False
while True:
new_input_event = GPIO.input(photocell_pin)
if new_input_event == False and old_input_event == True:
motor_state = not motor_state
old_input_event = new_input_event
GPIO.output(motor_pin, motor_state)
time.sleep(0.1)#provides a 100 msec motor actuation on/off time
相关文章
发表评论