1.模块准备
1.1硬件
(1)烧录好的树莓派4B开发板
图1 树莓派4B及其GPIO
(2)树莓派智能机器人拓展板和7.4V供电电池各一块
图2 树莓派智能机器人拓展板、7.4V供电电池实物图
图3 树莓派智能机器人拓展板示意图(来源:创乐博)
(3)直流减速TT电机(带插头)两个,小车车轮两个
红线——电机线+
黑线——电机线-
图4 直流电机、车轮实物图
(4)智能小车底板一个
图5 智能小车底板实物图
用于固定电机和车轮,方便观察实验效果
1.2 软件与实验条件
(1)PC端
VNC软件(用于连接树莓派桌面环境)
(2)树莓派端
开启ssh远程连接服务
配置好的python运行环境
python控制GPIO高低电平的库RPi.GPIO(树莓派官方系统默认已经安装)
1.3 硬件的整体连接
图6 整体连接架构图
图7 整体连接实物图
2. 实验原理与设计
2.1 驱动直流电机基本原理
我们通过调节施加在电机上面的直流电压大小,实现直流电机调速,
改变施加电机上面直流电压的极性,即可实现电机换向。本实验通过代码改变PWM脉冲信号的占空比来改变电机转速,占空比越大速度就越快,占空比为100%时相当于输入1(高电平),占空比为0%时相当于输入0(低电平)。
电机驱动实质是一个功率放大器,把我们的输出信号进行功率放大之后输出给执行元件---电机,实现输出信号对电机的控制。如图8 拓展板电机连接区域实物图截图,红色方框里面的两个就是两个电机驱动模块,分别驱动A通道电机(AIN1,AIN2),B通道电机(BIN1,BIN2)。
图8 拓展板电机连接区域实物图截图
图9 拓展板电机驱动模块电路图
2.2 实验设计
(1)设置引脚编码模式为GPIO端口模式;
(2)参考图9的电路图的电机接口的引脚号,定义电机端口和PWM信号输入端口;
(3)初始化引脚状态(将相应的GPIO引脚设置为输出模式);
(4)设置输入的PWM脉冲信号频率,初始化其占空比;
(5)定义不同通道电机转动的控制方法(这里设置两个参数d和speed);
如A通道电机:参数d=1时,电机1正向旋转电机2反向旋转;参数d= 2时,电机2正向旋转电机1反向旋转。参数speed控制电机的转速。
(6)根据电机转动控制方法的参数含义,通过改变参数值、方法调用形式以及进行多种调用组合进行实际控制;
(7)连接设备,运行代码,观察效果。
2.3 实验源码(python)
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM) # 设置引脚编码模式,GPIO端口模式
# 定义GPIO端口
PWMA = 18 # A通道电机PWM信号输入端口
AIN1 = 22
AIN2 = 27
PWMB = 23 # B通道电机PWM信号输入端口
BIN1 = 25
BIN2 = 24
# 将相应的GPIO引脚设置为输出模式
GPIO.setup(AIN2,GPIO.OUT)
GPIO.setup(AIN1,GPIO.OUT)
GPIO.setup(PWMA,GPIO.OUT)
GPIO.setup(BIN1,GPIO.OUT)
GPIO.setup(BIN2,GPIO.OUT)
GPIO.setup(PWMB,GPIO.OUT)
# 输入PWM脉冲信号,设置频率,初始化占空比
freq = 100
Duty_cycle = 0
L_Motor= GPIO.PWM(PWMA,freq) #创建输入频率为freq的PWM信号输入对象
L_Motor.start(Duty_cycle) # 初始占空比为Duty_cycle,向PWMA输入PWM脉冲信号
R_Motor = GPIO.PWM(PWMB,freq)
R_Motor.start(Duty_cycle)
def stop(pwmObj,*IN):
'''通知指定通道pwmObj的电机的旋转'''
pwmObj.ChangeDutyCycle(0)
for i in IN:
GPIO.output(i, False)
def invlove_A(speed,d=1):
'''A通道电机旋转,默认1正向旋转'''
L_Motor.ChangeDutyCycle(speed) # 改变PWM占空比,值越大转速越快
# AIN1和AIN2不能同时设为0或1
if d == 1:
# A通道电机1正向旋转,电机2反向
GPIO.output(AIN1, True) # AIN1设置为高电平
GPIO.output(AIN2,False) # AIN2设置为低电平
else:
# A通道电机1反向旋转,电机2正向
GPIO.output(AIN1, False)
GPIO.output(AIN2, True)
def invlove_B(speed,d=1):
'''B通道电机旋转,默认1正向旋转'''
R_Motor.ChangeDutyCycle(speed) # 改变PWM占空比,值越大转速越快
if d == 1:
# B通道电机1正向旋转,电机2反向
GPIO.output(BIN1, True) # BN1设置为高电平
GPIO.output(BIN2, False) # BIN2设置为低电平
else:
# B通道电机1反向旋转,电机2正向
GPIO.output(BIN1, False)
GPIO.output(BIN2, True)
if __name__=='__main__':
invlove_A(20)
time.sleep(2)
stop(L_Motor,AIN1,AIN2)
GPIO.cleanup()
这里主要展示基本的控制方法代码。
3.实验小结
市场上许多以PWM信号驱动控制智能小车的基础运动(前进、后退、左转、右转),正是通过本实验的基础操作进行组合实现的;
电机的转速实际是由电枢电流(指电机中的电枢里的电流,电枢是电能和机械能转换的部件)决定,而电枢电流的大小主要取决于外接电压的大小,所以电机的转速和外接的电压可以看作是正相关的。
注:
本人的计算机专业是偏向软件学习的,对硬件知识并不熟悉,文中难免有些关于该方面的表述不是很严谨,另外实验还有其它方面的不足之处,尽请广大读者批评指正。