python3实现raspberry pi(树莓派)4驱小车控制程序


Posted in Python onFebruary 12, 2020

 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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中os和shutil模块实用方法集锦
May 13 Python
Python import自定义模块方法
Feb 12 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
Jun 09 Python
详解python Todo清单实战
Nov 01 Python
Python时间和字符串转换操作实例分析
Mar 16 Python
分析运行中的 Python 进程详细解析
Jun 22 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
Aug 15 Python
在vscode中配置python环境过程解析
Sep 28 Python
Python 列表的清空方式
Jan 13 Python
Python 实现日志同时输出到屏幕和文件
Feb 19 Python
Python实现播放和录制声音的功能
Aug 12 Python
在Ubuntu中安装并配置Pycharm教程的实现方法
Jan 06 Python
python3实现网页版raspberry pi(树莓派)小车控制
Feb 12 #Python
解决Pycharm 导入其他文件夹源码的2种方法
Feb 12 #Python
Tensorflow 模型转换 .pb convert to .lite实例
Feb 12 #Python
tensorflow的ckpt及pb模型持久化方式及转化详解
Feb 12 #Python
关于Tensorflow 模型持久化详解
Feb 12 #Python
Python qrcode 生成一个二维码的实例详解
Feb 12 #Python
python标准库sys和OS的函数使用方法与实例详解
Feb 12 #Python
You might like
检查url链接是否已经有参数的php代码 添加 ? 或 &
2010/02/09 PHP
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
2011/02/08 PHP
PHP CLI模式下的多进程应用分析
2013/06/03 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
javascript 自定义事件初探
2009/08/21 Javascript
jQuery学习笔记之jQuery的DOM操作
2010/12/22 Javascript
用js实现in_array的方法
2013/11/05 Javascript
jQuery中的val()示例应用
2014/02/26 Javascript
关于jQuery中的each方法(jQuery到底干了什么)
2014/03/05 Javascript
基于jQuery实现的图片切换焦点图整理
2014/12/07 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
2016/08/30 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
JavaScript实现计数器基础方法
2017/10/10 Javascript
vue-resource拦截器设置头信息的实例
2017/10/27 Javascript
Angular模版驱动表单的使用总结
2018/05/05 Javascript
react实现点击选中的li高亮的示例代码
2018/05/24 Javascript
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
2018/06/10 Javascript
node版本管理工具n包使用教程详解
2018/11/09 Javascript
nuxt 页面路由配置,主页轮播组件开发操作
2020/11/05 Javascript
python连接mysql调用存储过程示例
2014/03/05 Python
python实现查询IP地址所在地
2015/03/29 Python
Python实现生成随机数据插入mysql数据库的方法
2017/12/25 Python
Pyinstaller将py打包成exe的实例
2018/03/31 Python
利用python numpy+matplotlib绘制股票k线图的方法
2019/06/26 Python
简单了解Python3里的一些新特性
2019/07/13 Python
详解使用CSS3的@media来编写响应式的页面
2017/11/01 HTML / CSS
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
使用HTML5做的导航条详细步骤
2020/10/19 HTML / CSS
Old Navy加拿大官网:美式休闲服饰品牌
2017/09/26 全球购物
波兰最大的儿童服装连锁店之一:5.10.15.
2018/02/11 全球购物
英国打印机墨盒销售网站:Ink Factory
2019/10/07 全球购物
Trench London官方网站:高级风衣和意大利皮夹克
2020/07/11 全球购物
植树造林的宣传标语
2014/06/23 职场文书
怎样写观后感
2015/06/19 职场文书
2016年“世界气象日”广播稿
2015/12/17 职场文书
CSS Transition通过改变Height实现展开收起元素
2021/08/07 HTML / CSS