树莓派小车————基本运动篇

在完成小车每一个小功能时,第一步要了解原理和电路连接方式。之后才能开始编码控制。这一篇就来讲解小车的基本运动功能,即前进、后退、左转、右转、停止。(当然你也可以自己添加,左后转和右后转)

  • 该部分用到的硬件模块:步进电机、橡胶轮、L298N电机驱动板、树莓派、12V的锂电池组、杜邦线若干。
  • 电路连接
  1. 焊接电机上的线
    这部分焊接比较简单,如果你买的步进电机上的线已经连接好,就不需要焊接。如果没有焊接线,找两根颜色不一样的线焊接上就行,最好是红色和黑色,因为两根线代表正负极。
    往电机的两个铜片孔中焊接正负极线时,可能有人会讲正极哪个孔,负极哪个孔,我发现其实没关系,因为在接L298N端口时,正负极接反了也没关系,不会烧坏电机或者L298N。可能就是你写的代码让轮子正转,它却反转。所以你可以通过自己尝试,如果不对,修改代码或者接线都可以。
  2. L298N和电机、树莓派的连接
    这部分连接可以用一个L298N控制四个电机,也可以用两个控制四个,为了方便和节约硬件,选择一个控制四个。
    通过下面的电路连接示意图你就可以明白怎么连接了。
    树莓派小车————基本运动篇_第1张图片
    先观察你手中的L298N,可以看到有四个OUT端口和四个IN端口,顾名思义,IN就是接受外面传来的信号,OUT就是将接受到的信号传送出去。即:接受树莓派的信号,传达给了电机。
    (1)像上图中的电路连接一样,你只需要将四个电机的正负极连接到OUT端口。每一边接两个电机(上图中的连接方式应该一眼就懂,不做多余解释)。
    (2)在连接L298N和树莓派时,你需要先了解树莓派的编码方式,每个引脚都代表什么,当然不用背,下面给你一张图。
    树莓派小车————基本运动篇_第2张图片
    通过上图你可以看到三种编码格式,我建议用BOARD模式,因为这就是物理模式,从1开始往下数就行。
    (3)L298N四个IN口和树莓派连接时,必须连接树莓派的GPIO口,在图中我选择的是BOARD模式中的11、12、13、15。这几个都是GPIO口。当然你在设计时可以选择其他的GPIO口,这并不是固定的,在代码中定义时,保证正确就行。
    (4)L298N的+5V和树莓派的+5V连接,2号或者4号引脚。
  3. 电源和L298N的连接
    这部分也很简单,就是将锂电池的正极和L298N的+12V口连接,负极和GND连接。
  4. PWM调速功能的连接
    树莓派小车————基本运动篇_第3张图片
    (1)图中圈出来的部分就是调速端,新的L298N这部分是有跳线帽连接着的,你需要拔掉上面的跳线帽,不然就默认是最快的速度。
    (2)每个调速端是有两个引脚的,靠外的引脚是连接GPIO口的,所以你只需要用两根线将靠外的两个引脚和树莓派的两个GPIO口连接(同理你可以选择任何两个没被占用的GPIO口)。
  • L298N控制步进电机的原理:
    树莓派小车————基本运动篇_第4张图片
    从上图中可以看出,通过改变IN1,IN2,IN3,IN4四个输入口的电平信号就可以控制电机的正反转,IN1,IN2两个输入口用来控制左边的电机,IN3,IN4用来控制右边的电机。所以我们可以改变电平的高低控制小车前进,后退,左转,右转以及停止。
  • 代码
#coding=utf-8
import RPi.GPIO as GPIO
import time
#定义电机模块的GPIO口
PWMA=18 #调速端A(左)
IN1=11 
IN2=12 
PWMB=16 #调速端B(右)
IN3=13 
IN4=15 
def init():
    #设置解除警告
    GPIO.setwarnings(False)
    #设置引脚模式为物理模式
    GPIO.setmode(GPIO.BOARD)
    #对四个电机进行初始化,将引脚设置为输出
    GPIO.setup(IN1,GPIO.OUT)
    GPIO.setup(IN2,GPIO.OUT)
    GPIO.setup(IN3,GPIO.OUT)
    GPIO.setup(IN4,GPIO.OUT)
    #调速端的初始化
    GPIO.setup(PWMA,GPIO.OUT)
    GPIO.setup(PWMB,GPIO.OUT)
 
#根据上面的控制原理,我们通过控制每个引脚的电平信号,来控制小车的转向
#让小车前进
def turn_up(speed,t_time):   #定义两个参数,一个是速度,一个是时间
    L_Motor.ChangeDutyCycle(speed) #设置占空比,控制速度,speed的取值范围0-100,原理是控制电源通断的时间占比
    GPIO.output(IN1,GPIO.HIGH)
    GPIO.output(IN2,GPIO.LOW)

    R_Motor.ChangeDutyCycle(speed)
    GPIO.output(IN3,GPIO.HIGH)
    GPIO.output(IN4,GPIO.LOW)
    time.sleep(t_time)
    
 #让小车后退
def turn_back(speed,t_time):
    L_Motor.ChangeDutyCycle(speed)
    GPIO.output(IN1,GPIO.LOW)
    GPIO.output(IN2,GPIO.HIGH)

    R_Motor.ChangeDutyCycle(speed)
    GPIO.output(IN3,GPIO.LOW)
    GPIO.output(IN4,GPIO.HIGH)
    time.sleep(t_time)

#让小车向左转
def turn_left(speed,t_time):
    L_Motor.ChangeDutyCycle(speed)
    GPIO.output(IN1,False)
    GPIO.output(IN2,False)

    R_Motor.ChangeDutyCycle(speed)
    GPIO.output(IN3,GPIO.HIGH)
    GPIO.output(IN4,GPIO.LOW)
    time.sleep(t_time)

#让小车向右转
def turn_right(speed,t_time):
    L_Motor.ChangeDutyCycle(speed)
    GPIO.output(IN1,GPIO.HIGH)
    GPIO.output(IN2,GPIO.LOW)

    R_Motor.ChangeDutyCycle(speed)
    GPIO.output(IN3,False)
    GPIO.output(IN4,False)
    time.sleep(t_time)

#让小车停止
def car_stop():
    L_Motor.ChangeDutyCycle(0)
    GPIO.output(IN1,False)
    GPIO.output(IN2,False)

    L_Motor.ChangeDutyCycle(0)
    GPIO.output(IN3,False)
    GPIO.output(IN4,False)
#主函数
if __name__=="__main__":
    init()
    L_Motor=GPIO.PWM(PWMA,100)
    L_Motor.start(0)
    R_Motor=GPIO.PWM(PWMB,100)
    R_Motor.start(0)
    try:
        turn_up(20,2) #测试前进
    except KeyboardInterrupt:
        GPIO.cleanup()      #清除GPIO占用

你可能感兴趣的:(python,树莓派小车,基本运动功能,python)