一、介绍
??直流电机是一种将直流电能转化为机械能的电机。由于其良好的调速性能,广泛应用于电动拖动,用于驱动电风扇、遥控车、电动车窗等各种设备,也非常适合机器人行走机构。
??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直流减速电机 一般来说,直流电机的转速是每分钟数千转,因此通常需要安装减速器。减速器是一种相对精密的机械部件。使用它的目的是降低速度和增加扭矩。减速后,直流电机的扭矩增大,可控性更强。根据不同的传动等级,可分为单级和多级减速器;根据传动类型可分为、和。
齿轮减速器:体积小,传动扭矩大,但有一定的回程间隙。 蜗杆减速器:具有反向自锁功能,减速比大,但一般体积大,传动效率低,精度低。 行星减速器:结构紧凑,回程间隙小,精度高,使用寿命长,额定输出扭矩大,但价格略贵。
(3)直流电压表头
用于监测18650电池组电压,及时掌握电池电压状态,便于及时充电。也可用于手机锂电池、镍氢电池组等电池组的电压,以及摩托车、汽车等电池的电压。
1、本电压表接线简单,常用两条线,红接正,黑接负,内有反接保护,接反不烧。
2.常规无外部工作电源,可直接用测量电压工作,测量二线电压范围.4-30V。
3.宽电压工作,红色最低测量电压2.4V,最大安全承压可达400V ,超过40V可能损坏。
4、在测量10V在测量以下电压时,小数点后显示两位;测量10V在上述电压下,小数点后显示一个。
(4)18650电池组
由于电动机需要的电流远远大于树莓派GPIO由于供电能力,必须使用外部电源。选择大容量18650电池是个不错的选择。这是许多充电宝和电动汽车电池组使用的。
同时,使用电机的场景总是移动,因此电池组可能不得不向树莓派供电。以前买套装的时候赠送的18650电池,每次都充满电,只强了10分钟,电压下降很快。这是我选择的一个宝藏SupFire/神火电池,负极添加保护芯片AB5-S,一个39元,充电器还算另一笔钱。然而,效果要好得多。充满电后,串联两个电池的初始8.23V,每天做一个电机实验,还有7个.6V。
四、实验步骤
?? 连接电路。
树莓派(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/
基础实验里我只用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()
实验结果示例: