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

写在前面的废话

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

1、L298N与树莓派的连线

将L298N上的各个线接到如图所示的树莓派接口
图[1.1]
接完后的实物图如下:



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编码

# 设置编码规范
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)


根据上图,我们将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()

发布了14 篇原创文章 · 获赞 50 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_43519779/article/details/103203292