无人驾驶 python 树莓派_树莓派驱动的无人驾驶开发记录--驱动电机

本文记录了使用树莓派进行无人驾驶开发的过程,重点在于如何使用Python通过RPi.GPIO库控制GPIO口驱动电机。介绍了GPIO的三种编号方式,并通过实例展示了如何设置GPIO模式、控制LED灯及电机的正反转,最后封装了电机控制函数,实现了前进、后退、左转和右转功能。
摘要由CSDN通过智能技术生成

树莓派虽然是一款微型计算机,同时作为一块开发板,其身上的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调速:

。。。

车的选型:

后轮驱动舵机转向车型

双轮差速驱动车型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值