树莓派 wiringpi 读取引脚_树莓派驱动的无人驾驶开发记录--驱动电机

树莓派虽然是一款微型计算机,同时作为一块开发板,其身上的I/O口就是证明,那么就可以对其接口进行定义来实现我们想要的功能。首先来认识一下树莓派引脚:如下图放置树莓派,下面的一排的引脚号是1、3、5、7等奇数号引脚,上面的是偶数号引脚。

39b7fc959d1e2f8ad9fdfcb5d3529de8.png

在使用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来像这个样子进行程序设计的。在开始之前再复习一下电机驱动模块的一些知识。

45f0b2d7b43fe84b341dd942af71de70.png


L298N电机驱动模块

使用该模块,可以设计一个双轮差速驱动的车型。

该电机模块与树莓派的连接是通过4个IO口连接控制的,可以任意选着树莓派的GPIO引脚进行连接。

bb90137d10880fa7239b81d725450167.png

两路使能引脚如果保持跳帽一直短接在5v电压上保持高电平,那么只需要控制树莓派GPIO口输出高低电平就能够控制电机正反转。想要再控制电机转速的话,就是把两个使能端也连接到主控的GPIO引脚。即如上表,对于IN1和IN2的高低电压(在编程代码中用1和0表示)用于控制电机A;IN2和IN3用于控制电机B;而ENA和ENB称为调速端,由PWM信号空占比来设定电机转动速度。例如我们可以对ENA每隔1ms(1毫秒等于1000微秒)发送一个信号,而在这个信号中高电压持续时间与低电压持续时间的比例就是电机A当前速度与全速比:

c24da40897d7c71687e4e52e09b6c4bc.png

这里我们选着树莓派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调速:

。。。

车的选型:

b9ea93224fd0535722dd410d4fa8085f.png
后轮驱动舵机转向车型

8059df232304286127cea076ba2e5d17.png
双轮差速驱动车型
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值