树莓派虽然是一款微型计算机,同时作为一块开发板,其身上的I/O口就是证明,那么就可以对其接口进行定义来实现我们想要的功能。首先来认识一下树莓派引脚:如下图放置树莓派,下面的一排的引脚号是1、3、5、7等奇数号引脚,上面的是偶数号引脚。
在使用python对树莓派进行编程的时候,其引脚声明方式有三种
1,基于引脚的物理位置进行编号;
2,C语言GPIO库wiringPi约定的编号方式;
3,Python语言GPIO库RPi.GPIO约定的编号方式。
或者可以这样理解:
控制GPIO口有很多方式,比如
》》shell直接控制
》》raspberry-gpio-python库(Python语言)
》》wiringPi库(C语言)
》》BCM2835 C Library(C语言)
而要用python语言来控制树莓派,得首先安装python支持环境sudo apt-get install python-dev
然后安装RPi.GPIO库,以引入RPi.GPIO模块sudo pip3 install RPi.GPIO
注意这里的pip3,是由于python有2.0版本和3.0版本区别,所以其中pip安装方式的命令也有所不同,这里我们选择python3.0版本的开发编程环境。
在 RPi.GPIO 中,同时支持树莓派上的两种 GPIO 引脚编号。
第一种编号是BOARD编号,这和树莓派电路板上的物理引脚编号相对应。使用这种编号的好处是,你的硬件将是一直可以使用的,不用担心树莓派的版本问题。因此,在电路板升级后,你不需要重写连接器或代码。第二种编号是BCM规则,是更底层的工作方式,它和Broadcom的片上系统中信道编号相对应。在使用一个引脚时,你需要查找信道号和物理引脚编号之间的对应规则。对于不同的树莓派版本,编写的脚本文件也可能是无法通用的。
你可以使用下列代码(强制的)指定一种编号规则:GPIO.setmode(GPIO.BOARD)
# or
#GPIO.setmode(GPIO.BCM)
首先用树莓派作为硬件开发板,来体验一下类似Arduino的功能效果--点亮一个LED灯。这里我们使用python语言。import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD)
led = 7
GPIO.setup(led,GPIO.OUT)
while True:
GPIO.output(led,True)
time.sleep(1)
GPIO.output(led,False)
time.sleep(1)
通过LED了解了python控制驱动硬件的基本方式。那么控制驱动电机也是类比着arduino来像这个样子进行程序设计的。在开始之前再复习一下电机驱动模块的一些知识。
L298N电机驱动模块
使用该模块,可以设计一个双轮差速驱动的车型。
该电机模块与树莓派的连接是通过4个IO口连接控制的,可以任意选着树莓派的GPIO引脚进行连接。
两路使能引脚如果保持跳帽一直短接在5v电压上保持高电平,那么只需要控制树莓派GPIO口输出高低电平就能够控制电机正反转。想要再控制电机转速的话,就是把两个使能端也连接到主控的GPIO引脚。即如上表,对于IN1和IN2的高低电压(在编程代码中用1和0表示)用于控制电机A;IN2和IN3用于控制电机B;而ENA和ENB称为调速端,由PWM信号空占比来设定电机转动速度。例如我们可以对ENA每隔1ms(1毫秒等于1000微秒)发送一个信号,而在这个信号中高电压持续时间与低电压持续时间的比例就是电机A当前速度与全速比:
这里我们选着树莓派11,12,13,15号引脚,并且先不考虑调速。那么程序如下:#引入gpio的模块
import RPi.GPIO as GPIO
import time
#设置GPIO模式
GPIO.setmode(GPIO.BOARD)
#设置in1到in4接口
IN1 = 11
IN2 = 12
IN3 = 13
IN4 = 15
#初始化接口
GPIO.setup(IN1,GPIO.OUT)
GPIO.setup(IN2,GPIO.OUT)
GPIO.setup(IN3,GPIO.OUT)
GPIO.setup(IN4,GPIO.OUT)
#电机正转
GPIO.output(IN1,GPIO.HIGH)
GPIO.output(IN2,GPIO.LOW)
GPIO.output(IN3,GPIO.HIGH)
GPIO.output(IN4,GPIO.LOW)
time.sleep(2)
GPIO.cleanup()
电机转动起来之后,那么反转也是类似的,两个电机配合实现前进、后退、左转、右转
进行一下函数封装之后:#引入gpio的模块
import RPi.GPIO as GPIO
import time
#设置GPIO模式
GPIO.setmode(GPIO.BOARD)
#设置in1到in4接口
IN1 = 11
IN2 = 12
IN3 = 13
IN4 = 15
#初始化接口
def init():
GPIO.setup(IN1,GPIO.OUT)
GPIO.setup(IN2,GPIO.OUT)
GPIO.setup(IN3,GPIO.OUT)
GPIO.setup(IN4,GPIO.OUT)
#前进的代码
def car_forward(sleep_time):
GPIO.output(IN1,GPIO.HIGH)
GPIO.output(IN2,GPIO.LOW)
GPIO.output(IN3,GPIO.HIGH)
GPIO.output(IN4,GPIO.LOW)
time.sleep(sleep_time)
GPIO.cleanup()
#后退
def car_backward(sleep_time):
GPIO.output(IN1,GPIO.LOW)
GPIO.output(IN2,GPIO.HIGH)
GPIO.output(IN3,GPIO.LOW)
GPIO.output(IN4,GPIO.HIGH)
time.sleep(sleep_time)
GPIO.cleanup()
#左转
def car_turnleft(sleep_time):
GPIO.output(IN1,False)
GPIO.output(IN2,False)
GPIO.output(IN3,GPIO.HIGH)
GPIO.output(IN4,GPIO.LOW)
time.sleep(sleep_time)
GPIO.cleanup()
#右转
def car_turnright(sleep_time):
GPIO.output(IN1,GPIO.HIGH)
GPIO.output(IN2,GPIO.LOW)
GPIO.output(IN3,False)
GPIO.output(IN4,False)
time.sleep(sleep_time)
GPIO.cleanup()
#以上封装好的函数,通过调用函数执行
init()#调用初始化方法初始化接口
car_forward(10)#前进10s
car_backward(10)后退10s
接下来试一下PWM调速:
。。。
车的选型:
后轮驱动舵机转向车型
双轮差速驱动车型