上一篇介绍了树莓派控制直流电机,现在就可以做一个小车,通过远程来控制。

一、硬件连接

找有个小车底盘,将上一篇中用到的所有东西固定到小车底盘上,搭建一个小车,并将所有线路连接好。

python 树莓派 42步进电机控制代码 树莓派如何控制电机_初始化

二、L298控制

小车需要实现基本的前进、后退、左转、右转以及停止的动作,主要通过两个电机来实现的。

电机

前进

后退

左转

右转

停止

左电机

正转

反转

反转

正转


右电机

正转

反转

正转

反转


电机是通过L298电机驱动模块上的 IN1-4 接口来控制的,信号控制图如下

python 树莓派 42步进电机控制代码 树莓派如何控制电机_初始化_02

三、小车程序

1、硬件按照上述连接好后,将树莓派上电,使用SSH远程连接树莓派

python 树莓派 42步进电机控制代码 树莓派如何控制电机_初始化_03


2、输入nano xiaoche.py,创建一个名为xiaoche的python文件

nano xiaoche.py

python 树莓派 42步进电机控制代码 树莓派如何控制电机_树莓派_04


3、文件编辑界面输入以下内容(现在程序叫复杂,后期会优化)

# -*- coding: utf-8 -*-                         #通过声明可以在程序中书写中文
import RPi.GPIO as GPIO                         #引入RPi.GPIO库函数命名为GPIO
import time                                     #引入计时time函数
#接口定义
INT1 = 11                                       #将L298 INT1口连接到树莓派Pin11
INT2 = 12                                       #将L298 INT2口连接到树莓派Pin12
INT3 = 13                                       #将L298 INT3口连接到树莓派Pin13
INT4 = 15                                       #将L298 INT4口连接到树莓派Pin15
ENA = 16                                        #将L298 ENA口连接到树莓派Pin16
ENB = 18                                        #将L298 ENB口连接到树莓派Pin18

def init():                                     #定义一个初始化函数
        GPIO.setmode(GPIO.BOARD)                #将GPIO编程方式设置为BOARD模式
        GPIO.setup(INT1,GPIO.OUT)               #将相应接口设置为输出模式
        GPIO.setup(INT2,GPIO.OUT)
        GPIO.setup(INT3,GPIO.OUT)
        GPIO.setup(INT4,GPIO.OUT)
        GPIO.setup(ENA,GPIO.OUT)
        GPIO.setup(ENB,GPIO.OUT)
def forward():                                  #定义前进函数
        GPIO.output(INT1,GPIO.HIGH)             #将INT1接口设置为高电压
        GPIO.output(INT2,GPIO.LOW)             #将INT2接口设置为低电压
        GPIO.output(INT3,GPIO.HIGH)             #将INT3接口设置为高电压
        GPIO.output(INT4,GPIO.LOW)              #将INT4接口设置为低电压
        GPIO.cleanup()                          #释放配置过的gpio

def back():                                     #定义后退函数
        GPIO.output(INT1,GPIO.LOW)
        GPIO.output(INT2,GPIO.HIGH)
        GPIO.output(INT3,GPIO.LOW)
        GPIO.output(INT4,GPIO.HIGH)
        GPIO.cleanup()

def left():                                     #定义左转函数
        GPIO.output(INT1,GPIO.HIGH)
        GPIO.output(INT2,GPIO.LOW)
        GPIO.output(INT3,GPIO.LOW)
        GPIO.output(INT4,GPIO.HIGH)
        GPIO.cleanup()

def right():                                    #定义右转函数
        GPIO.output(INT1,GPIO.LOW)
        GPIO.output(INT2,GPIO.HIGH)
        GPIO.output(INT3,GPIO.HIGH)
        GPIO.output(INT4,GPIO.LOW)
        GPIO.cleanup()

def stop():                                     #定义停止函数
        GPIO.output(INT1,GPIO.LOW)
        GPIO.output(INT2,GPIO.LOW)
        GPIO.output(INT3,GPIO.LOW)
        GPIO.output(INT4,GPIO.LOW)
        GPIO.cleanup()

init()                                          #调用初始化程序,进行初始化
pwma = GPIO.PWM(ENA,80)                         #创建一个pwma实例,控制左电机转速。两个参数:1、GPIO引脚(ENA即为引脚16);2、频率(设置为80)
pwmb = GPIO.PWM(ENB,80)                         #创建一个pwmb实例,控制右电机转速。
pwma.start(0)                                   #以输出0%占空比开始
pwmb.start(0)


while 1:                                        #1为真,永远成立,程序一直执行
        res = raw_input()                       #将键盘输入字符赋值给res
        if res == "w" or res =="W":             #如果输入字符为W
                forward()                       #调用前进函数,使小车前进
                init()
                pwma = GPIO.PWM(ENA,80)
                pwmb = GPIO.PWM(ENB,80)
                pwma.start(70)
                pwmb.start(70)
        elif res == "x" or res =="X":
                back()
                init()
                pwma = GPIO.PWM(ENA,80)
                pwmb = GPIO.PWM(ENB,80)
                pwma.start(70)
                pwmb.start(70)
        if res == "a" or res =="A":
                left()
                init()
                pwma = GPIO.PWM(ENA,80)
                pwmb = GPIO.PWM(ENB,80)
                pwma.start(35)
                pwmb.start(35)
        elif res == "d" or res =="d":
                right()
                init()
                pwma = GPIO.PWM(ENA,80)
                pwmb = GPIO.PWM(ENB,80)
                pwma.start(35)
                pwmb.start(35)
        elif res == "s" or res =="S":
                stop()
                init()
                pwma = GPIO.PWM(ENA,80)
                pwmb = GPIO.PWM(ENB,80)
                pwma.start(0)
                pwmb.start(0)

4、保存退出文件并且执行程序

sudo python xiaoche.py

python 树莓派 42步进电机控制代码 树莓派如何控制电机_引脚_05


5、输入w/a/d/x/s,按回车便可控制下车运动。

python 树莓派 42步进电机控制代码 树莓派如何控制电机_遥控_06


6、现在控制小车,输入相应字符需要按回车键,小车才能运动,后面会加上键盘输入检测,不需要每个指令都按回车。