0. 写在前面:
一两个月前偶然得到一个树莓派一代,发现还是挺强大的,然后就考虑着自己实现一个四驱小车。因为本身是学软件的,所以利用软件来控制实实在在可见的硬件一直是自己的一个梦想。所以当时也是花了很多时间来琢磨、实验小车控制方面的东西。因为时间过去比较久了,这里也就只是记录一下当时踩过的坑、实现的一些思路以及绝大部分源代码。截止当前,我的树莓派小车实现的主要功能是:
- 控制小车前进、后退、左转、右转、后退左转、后退右转
- 摄像头两路舵机控制(实现摄像头上下左右旋转)
- 网页版小车控制程序(小车控制程序、实时监控、摄像头旋转控制)
- 微信小程序版小车控制程序(功能基本同上)
(本文只是介绍上述的第一个功能,其他功能的实现在后续的博文中介绍)
1. 准备:
- 给树莓派安装系统(这个网上资料太多,一搜一大把,我装的是raspbian)
- 安装python3
- 准备四个步进电机,电机驱动,并组装连接好(我都是在某宝上买的,电机及其组件是在“亚博智能科技”买的,驱动是在“深圳市艾尔赛科技”上买的L298N四路电机驱动)
一些可能遇到的坑:
- 首先要注意电机驱动的输入电压,电压过低很可能无法带动电机(当然也不可过高)
- 电机驱动输入有一个GND,这个一定要连接树莓派的一个GND输出,否则可能出现电机驱动异常(我当时遇到的情况是:手接触驱动电路中的金属电机就可以正常转动,手一松开电机就不能正常运转了)
2. 基本思路:
- 将连接端口作为一个配置文件,该配置文件定义小车需要使用的端口
- 控制程序读取配置文件,并实现小车的方向控制
- 小车控制程序定义了私有的向各个方向移动的方法,然后定义一个方法接受方向参数,该方法内部再调用具体的移动方法
需要说明的是:由于使用引脚的不同,以及电机安装位置的差异,所以不能保证以下程序能够直接使用。
3. 配置文件内容如下(文件名为:config.ini):
[car] # This is the parmaters that will control the car's wheels # The number is the interface number of GPIO (GPIO.BOARD) LEFT_FRONT_1 = 7 LEFT_FRONT_2 = 11 RIGHT_FRONT_1 = 13 RIGHT_FRONT_2 = 15 LEFT_BEHIND_1 = 31 LEFT_BEHIND_2 = 33 RIGHT_BEHIND_1 = 35 RIGHT_BEHIND_2 = 37
4. 小车控制程序(文件名为:car_controler.py):
# coding=utf-8
import RPi.GPIO as GPIO
import time
import configparser
class FourWheelDriveCar():
# Define the number of all the GPIO that will used for the 4wd car
def __init__(self):
'''
1. Read pin number from configure file
2. Init all GPIO configureation
'''
config = configparser.ConfigParser()
config.read("config.ini")
self.LEFT_FRONT_1 = config.getint("car", "LEFT_FRONT_1")
self.LEFT_FRONT_2 = config.getint("car", "LEFT_FRONT_2")
self.RIGHT_FRONT_1 = config.getint("car", "RIGHT_FRONT_1")
self.RIGHT_FRONT_2 = config.getint("car", "RIGHT_FRONT_2")
self.LEFT_BEHIND_1 = config.getint("car", "LEFT_BEHIND_1")
self.LEFT_BEHIND_2 = config.getint("car", "LEFT_BEHIND_2")
self.RIGHT_BEHIND_1 = config.getint("car", "RIGHT_BEHIND_1")
self.RIGHT_BEHIND_2 = config.getint("car", "RIGHT_BEHIND_2")
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(self.LEFT_FRONT_1, GPIO.OUT)
GPIO.setup(self.LEFT_FRONT_2, GPIO.OUT)
GPIO.setup(self.RIGHT_FRONT_1, GPIO.OUT)
GPIO.setup(self.RIGHT_FRONT_2, GPIO.OUT)
GPIO.setup(self.LEFT_BEHIND_1, GPIO.OUT)
GPIO.setup(self.LEFT_BEHIND_2, GPIO.OUT)
GPIO.setup(self.RIGHT_BEHIND_1, GPIO.OUT)
GPIO.setup(self.RIGHT_BEHIND_2, GPIO.OUT)
def reset(self):
# Rest all the GPIO as LOW
GPIO.output(self.LEFT_FRONT_1, GPIO.LOW)
GPIO.output(self.LEFT_FRONT_2, GPIO.LOW)
GPIO.output(self.RIGHT_FRONT_1, GPIO.LOW)
GPIO.output(self.RIGHT_FRONT_2, GPIO.LOW)
GPIO.output(self.LEFT_BEHIND_1, GPIO.LOW)
GPIO.output(self.LEFT_BEHIND_2, GPIO.LOW)
GPIO.output(self.RIGHT_BEHIND_1, GPIO.LOW)
GPIO.output(self.RIGHT_BEHIND_2, GPIO.LOW)
def __forword(self):
self.reset()
GPIO.output(self.LEFT_FRONT_1, GPIO.HIGH)
GPIO.output(self.LEFT_FRONT_2, GPIO.LOW)
GPIO.output(self.RIGHT_FRONT_1, GPIO.HIGH)
GPIO.output(self.RIGHT_FRONT_2, GPIO.LOW)
GPIO.output(self.LEFT_BEHIND_1, GPIO.HIGH)
GPIO.output(self.LEFT_BEHIND_2, GPIO.LOW)
GPIO.output(self.RIGHT_BEHIND_1, GPIO.HIGH)
GPIO.output(self.RIGHT_BEHIND_2, GPIO.LOW)
def __backword(self):
self.reset()
GPIO.output(self.LEFT_FRONT_2, GPIO.HIGH)
GPIO.output(self.LEFT_FRONT_1, GPIO.LOW)
GPIO.output(self.RIGHT_FRONT_2, GPIO.HIGH)
GPIO.output(self.RIGHT_FRONT_1, GPIO.LOW)
GPIO.output(self.LEFT_BEHIND_2, GPIO.HIGH)
GPIO.output(self.LEFT_BEHIND_1, GPIO.LOW)
GPIO.output(self.RIGHT_BEHIND_2, GPIO.HIGH)
GPIO.output(self.RIGHT_BEHIND_1, GPIO.LOW)
def __turnLeft(self):
'''
To turn left, the LEFT_FRONT wheel will move backword
All other wheels move forword
'''
self.reset()
GPIO.output(self.LEFT_FRONT_2, GPIO.HIGH)
GPIO.output(self.LEFT_FRONT_1, GPIO.LOW)
GPIO.output(self.RIGHT_FRONT_1, GPIO.HIGH)
GPIO.output(self.RIGHT_FRONT_2, GPIO.LOW)
GPIO.output(self.LEFT_BEHIND_1, GPIO.HIGH)
GPIO.output(self.LEFT_BEHIND_2, GPIO.LOW)
GPIO.output(self.RIGHT_BEHIND_1, GPIO.HIGH)
GPIO.output(self.RIGHT_BEHIND_2, GPIO.LOW)
def __turnRight(self):
'''
To turn right, the RIGHT_FRONT wheel move backword
All other wheels move forword
'''
self.reset()
GPIO.output(self.LEFT_FRONT_1, GPIO.HIGH)
GPIO.output(self.LEFT_FRONT_2, GPIO.LOW)
GPIO.output(self.RIGHT_FRONT_2, GPIO.HIGH)
GPIO.output(self.RIGHT_FRONT_1, GPIO.LOW)
GPIO.output(self.LEFT_BEHIND_1, GPIO.HIGH)
GPIO.output(self.LEFT_BEHIND_2, GPIO.LOW)
GPIO.output(self.RIGHT_BEHIND_1, GPIO.HIGH)
GPIO.output(self.RIGHT_BEHIND_2, GPIO.LOW)
def __backLeft(self):
'''
To go backword and turn left, the LEFT_BEHIND wheel move forword
All other wheels move backword
'''
self.reset()
GPIO.output(self.LEFT_FRONT_2, GPIO.HIGH)
GPIO.output(self.LEFT_FRONT_1, GPIO.LOW)
GPIO.output(self.RIGHT_FRONT_2, GPIO.HIGH)
GPIO.output(self.RIGHT_FRONT_1, GPIO.LOW)
GPIO.output(self.LEFT_BEHIND_1, GPIO.HIGH)
GPIO.output(self.LEFT_BEHIND_2, GPIO.LOW)
GPIO.output(self.RIGHT_BEHIND_2, GPIO.HIGH)
GPIO.output(self.RIGHT_BEHIND_1, GPIO.LOW)
def __backRight(self):
'''
To go backword and turn right, the RIGHT_BEHIND wheel move forword
All other wheels move backword
'''
self.reset()
GPIO.output(self.LEFT_FRONT_2, GPIO.HIGH)
GPIO.output(self.LEFT_FRONT_1, GPIO.LOW)
GPIO.output(self.RIGHT_FRONT_2, GPIO.HIGH)
GPIO.output(self.RIGHT_FRONT_1, GPIO.LOW)
GPIO.output(self.LEFT_BEHIND_2, GPIO.HIGH)
GPIO.output(self.LEFT_BEHIND_1, GPIO.LOW)
GPIO.output(self.RIGHT_BEHIND_1, GPIO.HIGH)
GPIO.output(self.RIGHT_BEHIND_2, GPIO.LOW)
def __stop(self):
self.reset()
def carMove(self, direction):
'''
Car move according to the input paramter - direction
'''
if direction == 'F':
self.__forword()
elif direction == 'B':
self.__backword()
elif direction == 'L':
self.__turnLeft()
elif direction == 'R':
self.__turnRight()
elif direction == 'BL':
self.__backLeft()
elif direction == 'BR':
self.__backRight()
elif direction == 'S':
self.__stop()
else:
print("The input direction is wrong! You can just input: F, B, L, R, BL,BR or S")
if __name__ == "__main__":
raspCar = FourWheelDriveCar()
while(True):
direction = input("Please input direction: ")
raspCar.carMove(direction)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
标签:
python3,树莓派,小车控制
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
暂无“python3实现raspberry pi(树莓派)4驱小车控制程序”评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新动态
2025年10月25日
2025年10月25日
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]