欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

#小车记4--树莓派 GPIO PWM 实现初步控制

程序员文章站 2022-06-08 20:39:20
...

写在前面的废话

有兴趣的读者,可以去看看本人主页里的小车记系列博客,或许能够解答你的疑惑,引领你做出一个属于自己的树莓派小车

1、L298N与树莓派的连线

将L298N上的各个线接到如图所示的树莓派接口
#小车记4--树莓派 GPIO PWM 实现初步控制
接完后的实物图如下:
#小车记4--树莓派 GPIO PWM 实现初步控制
#小车记4--树莓派 GPIO PWM 实现初步控制
#小车记4--树莓派 GPIO PWM 实现初步控制
L298N与马达、电源的连接网上资料很多,这里不在赘述。
注意:L298N的ENA、ENB只需要连外侧的接口,内侧接口不用管。

2、Python 编程控制

(1)、GPIO

树莓派系统会自带有GPIO库。
让我们先熟悉一下GPIO的基本用法

导库

import RPi.GPIO as gpio
import time

定义引脚常量

# 定义输出引脚
IN1 = 35
IN2 = 36
IN3 = 37
IN4 = 38

# 定义使能引脚
ENA = 31
ENB = 32

仔细看本文第一张引脚图,上面有各种编码名称,在这里我们用BOARD编码
#小车记4--树莓派 GPIO PWM 实现初步控制

# 设置编码规范
gpio.setmode(gpio.BOARD)

这里我们必须设置忽略GPIO警告,不然无法进行下面操作
(读者们可以自行尝试不输入这句代码,看看会怎么样)

# 无视警告,开启引脚
gpio.setwarnings(False)

引脚有两种模式:
1、输出模式:向引脚发送高低电平信号
2、输入模式:读取引脚状态(高低电平)

因为要控制小车,所以在这里我们把所有引脚设置为输出

# 设置引脚为输出
gpio.setup([IN1, IN2, IN3, IN4, ENA, ENB], gpio.OUT)

(2)、PWM

我们为了能够控制小车的速度,所以要采用PWM控制方法
PWM可以简单理解为,通过快速的高低电平的切换,达到控制电机的有效电压的效果,进而控制小车的速度

# 对使能引脚开启pwm控制,频率为50Hz
pwm1 = gpio.PWM(ENA, 50)
pwm2 = gpio.PWM(ENB, 50)

启动PWM

# 启动pwm
pwm1.start(0)
pwm2.start(0)

#小车记4--树莓派 GPIO PWM 实现初步控制
根据上图,我们将IN2和IN4置高电平,IN1和IN3置低电平,让电机逆转,小车前进

# 让小车前进
gpio.output([IN1, IN3], gpio.LOW)
gpio.output([IN2, IN4], gpio.HIGH)

使用PWM控制,让小车速度在10S内逐渐加快

print("GO!")

# 让小车每秒钟逐渐增加速度
for i in range(11):
    pwm1.ChangeDutyCycle(10 * i)
    pwm2.ChangeDutyCycle(10 * i)
    time.sleep(1)
    print(i,"'s speed up!")

print("Over")

结束的工作

# 让小车停止
gpio.output([IN1, IN2, IN3, IN4], gpio.LOW)

# 释放资源
gpio.cleanup()
pwm1.stop()
pwm2.stop()

祝各位读者都能顺利完成小车的控制,如有其他疑惑,可以看看鄙人的小车记系列的其他文章,或许有所帮助。

最后附上完整源码:

import RPi.GPIO as gpio
import time

# 定义输出引脚
IN1 = 35
IN2 = 36
IN3 = 37
IN4 = 38

# 定义使能引脚
ENA = 31
ENB = 32

# 设置编码规范
gpio.setmode(gpio.BOARD)

# 无视警告,开启引脚
gpio.setwarnings(False)

# 设置引脚为输出
gpio.setup([IN1,IN2,IN3,IN4, ENA, ENB], gpio.OUT)

# 对使能引脚开启pwm控制
pwm1 = gpio.PWM(ENA, 50)
pwm2 = gpio.PWM(ENB, 50)

# 启动pwm
pwm1.start(0)
pwm2.start(0)

# 让小车前进
gpio.output([IN1, IN3], gpio.LOW)
gpio.output([IN2, IN4], gpio.HIGH)

print("GO!")

# 让小车每秒钟逐渐增加速度
for i in range(11):
    pwm1.ChangeDutyCycle(10 * i)
    pwm2.ChangeDutyCycle(10 * i)
    time.sleep(1)
    print(i,"'s speed up!")

print("Over")

# 让小车停止
gpio.output([IN1, IN2, IN3, IN4], gpio.LOW)

# 释放资源
gpio.cleanup()
pwm1.stop()
pwm2.stop()