一、介绍
直流电机是一种将直流电能转换为机械能的电动机,因其良好的调速性能而在电力拖动中得到广泛应用,用于驱动各种设备,如电风扇、遥控小车、电动车窗等,也非常适合作为机器人的行走机构。
L298N是ST公司生产的一种高电压、大电流电机驱动芯片,内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端。该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。
二、组件
★Raspberry Pi 3主板*1
★树莓派电源*1
★L298N模块*1
★DC3V-6V直流减速电机TT马达*1
★微型数字直流电压表头*1(可选)
★18650可充电锂电池*2
★面包板*1(可选)
★40P软排线*1
★跳线若干
三、实验原理
(一)、L298N模块
L298N双H桥直流电机驱动模块的引脚可以归纳成电源、控制和输出等三大类,下面是各类引脚的功能说明。
1.电压类引脚
VCC输入:L298N芯片的电源正极,范围可以是5V ~ 35V,如果需从模块内取电给树莓派供电,则其范围为7V~35V。
GND:L298N芯片的电源地,使用的时候应该把树莓派的GND接到这里,即两者需要共地,否则电机不转。
+5V输出:L298N芯片输出的5V电源,可以给外部设备供电,但要求VCC输入要达到7V以上。
2.控制类引脚
ENA、ENB:A、B通道的使能端,高电平有效,可以用PWM来实现调速,向使能端输入不同占空比的PWM脉冲信号就可以控制电机的转速。使用时,可以接到树莓派的GPIO上,实现用程序进行控制。
INA、INB、INC、IND:INA、INB为A通道的控制输入,INC、IND为B通道的控制输入。
控制方式及直流电机状态表如下:
3.输出类引脚
OUTA、OUTB为A通道输出,为直流电机等设备提供电源。
OUTC、OUTD为B通道输出,为直流电机等设备提供电源。
控制直流电机的转向和转速实际是通过给控制类引脚设置不同的值来实现的
(二)、直流减速电机
在了解直流电机工作原理之前,先复习一下高中几个物理知识:
第一.左手定则
通电导线处于磁场中时,所受安培力 F (或运动)的方向、磁感应强度B的方向 以及通电导体棒的电流I三者方向之间的关系的定律。
简而言之,让磁感线穿过手掌正面,手指方向为电流方向,大拇指方向为产生磁力的方向
第二.右手定则
右手定则,是产生感生电动势,也是发电机的原理
让磁感线穿过掌心,大拇指方向为运动方向,手指方向为产生的电动势方向。
1.直流电机的原理
直流电机里边固定有环状永磁体,电流通过转子上的线圈产生安培力,当转子上的线圈与磁场平行时,再继续转受到的磁场方向将改变,因此此时转子末端的电刷跟转换片交替接触,从而线圈上的电流方向也改变,产生的洛伦兹力方向不变,所以电机能保持一个方向转动。
2.直流电机的种类
2.1有刷电机
顾名思义,就是有刷子,主要作用就是让中间的转子与电源有电气连接,还可以转动。
为了让两者之间既有接触,能导电;又有转动,实现电流的变相,一般的常见做法是在碳刷加一个弹簧。这样,换向器与碳刷便有了频繁的摩擦。所以碳刷很容易磨损,必须经常进行更换。并且磨损掉的碳渣渣在电机里面形成了积碳,需要经常清理。
早期电机都是有刷电机,后来为了解决磨损,有了无刷电机。
2.2无刷电机
无刷电机中,换相的工作交由控制器中的控制电路(一般为霍尔传感器+控制器,更先进的技术是磁编码器)来完成。
无刷电机采取电子换向,线圈不动,磁极旋转。无刷电机,是使用一套电子设备,通过霍尔元件,感知永磁体磁极的位置,根据这种感知,使用电子线路,适时切换线圈中电流的方向,保证产生正确方向的磁力,来驱动电机。消除了有刷电机的缺点。
2.3直流减速电机
一般直流电机的转速都是一分钟几千上万转的,所以一般需要安装减速器。减速器是一种相对精密的机械零件,使用它的目的是降低转速,增加转矩。减速后的直流电机力矩增大、可控性更强。按照传动级数不同可分为单级和多级减速器;按照传动类型可分为齿轮减速器、蜗杆减速器和行星齿轮减速器。
齿轮减速器:体积较小,传递扭矩大,但是有一定的回程间隙。
蜗轮蜗杆减速机:具有反向自锁功能,可以有较大的减速比,但是一般体积较大,传动效率不高,精度不高。
行星减速器:结构比较紧凑,回程间隙小、精度较高,使用寿命很长,额定输出扭矩可以做的很大,但价格略贵。
(三)、直流电压表头
用于监视18650电池组电压,及时掌握电池电压状态,便于及时充电。也可用于手机锂电池、镍氢电池组和其它电池组的电压,以及摩托车、汽车等电瓶的电压,也可用于其它电压测量用途。
1、本电压表接线简单,常规用两根线,红接正,黑接负,内有反接保护,接反不烧。
2、常规无需外接工作电源,可以用测量电压直接工作,测量电压范围二线2.4-30V。
3、宽电压工作,红色最低测量电压2.4V,最大安全承压可达40V ,超过40V可能损坏。
4、在测量10V以下电压时,小数点后显示两位;在测量10V以上电压时,小数点后显示一位。
(四)、18650电池组
由于电动机需要的电流远远大于树莓派GPIO的供电能力,所以必须使用外接电源,选用大容量的18650电池是个不错的选择,许多充电宝和电动车电池组都是使用的这个。
同时,使用电动机的场景总是移动的情况,所以电池组可能还要给树莓派供电。以前购买套装时赠送的18650电池,每次充满电,只坚挺了10分钟,而且电压掉得非常快。这里我选用的某宝SupFire/神火电池,负极加了保护芯片的AB5-S,39元1颗,充电器还另算钱。不过效果好多了,充满电后串联两颗电池初始8.23V,一天一个电动机的实验做下来,还有7.6V。
四、实验步骤
第1步: 连接电路。
树莓派(name) | T型转接板(BCM) | L298N模块 |
---|---|---|
GPIO4 | G23 | INA |
GPIO5 | G24 | INB |
GPIO1 | G18 | EMA |
GND | GND | GND |
L298N模块 | 电池组 | 电压表头 | 马达 |
---|---|---|---|
VCC | + | + | |
GND | - | - | |
OUTC | + | ||
OUTD | - |
这里必须说一下,上面的电路图是使用电子设计自动化软件Fritzing画的,易学好用,但是必须要学习哈,光看是半天搞不懂滴!
特别是元件库里找不到的电子元件,只能自己创建,就需要自己画SVG图(Scalable Vector Graphics,意思为可缩放的矢量图形),这里我用的是Inkscape,一款外国开发的开源矢量图形编辑软件。画图中的一个重要经验是:在Friting里找到并导出类似的元件SVG图,然后在Inkscape里修改,最后又导入Friting里合成。
学会第一次虽慢,但是以后就难不倒你了,而且画得很快!
Fritzing下载地址https://fritzing.org/download/
Inkscape下载地址https://inkscape.org/release/inkscape-1.0/
第2步: 基础实验里我只用L298N的B通道控制了一个电机,控制命令也很粗糙,后面我会做智能小车的综合实验,会实现图形界面控制和自动循迹。
当输入r0 ~ r9,速度由0到快;当输入f0 ~ f9,反方向速度由0到快;当输入b时,电机制动。
#!/usr/bin/env python
import RPi.GPIO as GPIO
import time
ENB = 18 #使能信号
INC = 23 #信号输入1
IND = 24 #信号输入2
GPIO.setwarnings(False) #关闭警告信息
def setup(enable_pin,in1_pin,in2_pin):
'''初始化引脚'''
GPIO.setmode(GPIO.BCM)
GPIO.setup(enable_pin, GPIO.OUT)
GPIO.setup(in1_pin, GPIO.OUT)
GPIO.setup(in2_pin, GPIO.OUT)
def pwm(enable_pin):
'''初始化PWM(脉宽调制)'''
pwm = GPIO.PWM(enable_pin, 500)
pwm.start(0)
return pwm
def changespeed(pwm,speed):
'''通过改变占空比改变马达转速'''
pwm.ChangeDutyCycle(speed)
def clockwise(in1_pin,in2_pin):
'''马达顺时针转的信号'''
GPIO.output(in1_pin, 1)
GPIO.output(in2_pin, 0)
def counter_clockwise(in1_pin,in2_pin):
'''马达逆时针转的信号'''
GPIO.output(in1_pin, 0)
GPIO.output(in2_pin, 1)
def brake(pwm,in1_pin,in2_pin):
'''马达制动的信号'''
GPIO.output(in1_pin, 0)
GPIO.output(in2_pin, 0)
changespeed(pwm,100)
#使能信号为高电平,IN1和IN2都为0或1时马达制动
def loop():
while True:
'''通过输入的命令改变马达转动'''
cmd = input("Command, f/r/b 0..9, E.g. f5 :")
direction = cmd[0]
if direction == "f":
clockwise(INC,IND)
if direction == "r":
counter_clockwise(INC,IND)
if direction == "b": #刹车制动,
brake(ENB_pwm,INC,IND)
continue
speed = int(cmd[1]) * 10 #通过输入0~9的数字更改占空比0~90%
changespeed(ENB_pwm,speed)
def destroy():
ENB_pwm.stop()
GPIO.cleanup() # Release resource
if __name__ == '__main__': # Program start from here
try:
setup(ENB,INC,IND) #初始化引脚
ENB_pwm=pwm(ENB) #初始化PWM
loop()
except KeyboardInterrupt: # When 'Ctrl+C' is pressed
destroy()
finally:
destroy()
实验结果示例: