在家里制作一个基于树莓派的智能小车

一、整体思路 

       组装一台智能小车可以说是男人的浪漫,对一台操控自如、金属底盘、指示灯交错的酷炫智能车,许多理工男都会像第一次去欢乐谷仰望太阳飞车时候的感受。那么如何组装一台这样机械朋克感十足地小车呢?且听我先阐述一下总体思路:

一台这样的小车首先需要几个重要系统组成,分别是底盘系统-包含车轮、底盘支架和固定螺丝,动力系统-包含电池组、控制板、发动机和串联线路,指令系统)、树莓派、指令控制程序、杜邦信号传导线,和传感系统-红外避障模块、避障程序、摄像头传感器(识别图像)、摄像头云台、舵机;这些系统构成了小车的支撑、行动、输入和输出能力;当然我们也可以根据自己需要,增加一些扩展套件,这里使用树莓派的主要原因就是便于扩展;

二、所需材料

      小车底盘金属架一套,形状自选;

  阻尼电机4个,轮子4个(看架子支持,有2个的,也有8个的,需要几个买几个);

    树莓派 4B 版本 一个;

  L298N 2路控制板2个(如果想要支持4驱,可以买8路控制器版本,价格20多大洋吧)

     子母杜邦线和连接线 N个(看接线复杂度);

     其他功能组件(例如红外线避障检测器,温感检测,雷达检测等等)

  18650锂电池组一套(这个不是必须,我买这个是为了给L298N单独供能已提高小车续航)

三、制作过程

动力架构图如下:

 

 L298N原理图:

 

 

 

 底盘实物(改良后)

 

 

这里需要注意一下

马达接线时候注意是有方向的,注意正极接入的方向要统一,不然会出现四个轮子分别转向不动方向的情况;

L298N的输出,最好是 1,2路输出用于一侧的正向和逆向行驶(也就是1负责右侧正向,2就负责右侧反向)。3,4路输出用于另一侧。这样在后面写驱动时候会方便控制一些。

  驱动编写,这里我选择的是python实现,主要是写起来简单高效;

 还是先上一个设计架构:

指令通讯系统

 

Python驱动代码程序地址:https://github.com/yzzhanga/car

 

复制代码
 1 #!/usr/bin/python3
 2 # -*- coding: UTF-8 -*-
 3 from time import sleep
 4 import RPi.GPIO as GPIO
 5 
 6 # POINT = [5,6,16,26]
 7 # GPIO接口结合
 8 LEFT_FRONT_PORT = [26,17] #左前轮 正负输出,这两个输出互斥,不能同时为正,但可以同时为负,不管同时为正或负,都视为刹车;
 9 LEFT_BACK_PORT = [27,22] #左后轮
10 RIGHT_FRONT_PORT = [18,23] #右前轮
11 RIGHT_BACK_PORT = [24,25] #右后轮
12 
13 #忽略重复setmode导致的报警,一般是在关闭程序时候没有调用destory方法导致
14 GPIO.setwarnings(False)
15 
16 class L298nOrder:
17     
18     def setup():
19         print("指令集初始化成功")
20         GPIO.setmode(GPIO.BCM)
21         GPIO.setup(LEFT_FRONT_PORT,GPIO.OUT)
22         GPIO.setup(LEFT_BACK_PORT,GPIO.OUT)
23         GPIO.setup(RIGHT_FRONT_PORT,GPIO.OUT)
24         GPIO.setup(RIGHT_BACK_PORT,GPIO.OUT)
25 
26     #关闭GPIO的输出设置(这里有个前提是GPIO全部服务本集合,右可能会误关闭其他GPIO组合程序)
27     def destory():
28         print("指令驱动销毁")
29         GPIO.cleanup()
30 
31     #转向程序 左中心线的顺时针和逆时针旋转
32     def turnLeftRound(leftBool):
33         if (leftBool):
34             GPIO.output(LEFT_FRONT_PORT[0],True)
35             GPIO.output(LEFT_FRONT_PORT[1],False)
36             GPIO.output(RIGHT_BACK_PORT[0],False)
37             GPIO.output(RIGHT_BACK_PORT[1],True)
38             print ("执行指令:左转向")
39         else:
40             GPIO.output(LEFT_FRONT_PORT[0],False)
41             GPIO.output(LEFT_FRONT_PORT[1],True)
42             GPIO.output(RIGHT_BACK_PORT[0],True)
43             GPIO.output(RIGHT_BACK_PORT[1],False)
44             print ("执行指令:左转倒车")
45     #转向程序 右中心线的顺时针和逆时针旋转
46     def turnRightRound(rightBool):
47         if (rightBool):
48             GPIO.output(RIGHT_FRONT_PORT[0],True)
49             GPIO.output(RIGHT_FRONT_PORT[1],False)
50             GPIO.output(LEFT_BACK_PORT[0],False)
51             GPIO.output(LEFT_BACK_PORT[1],True)
52             print ("执行指令:右转向")
53         else:
54             GPIO.output(RIGHT_FRONT_PORT[0],False)
55             GPIO.output(RIGHT_FRONT_PORT[1],True)
56             GPIO.output(LEFT_BACK_PORT[0],True)
57             GPIO.output(LEFT_BACK_PORT[1],False)
58             print ("执行指令:右转倒车")
59     #前进挡
60     def allMove():
61         GPIO.output(LEFT_FRONT_PORT[0],True)
62         GPIO.output(LEFT_FRONT_PORT[1],False)
63         GPIO.output(LEFT_BACK_PORT[0],True)
64         GPIO.output(LEFT_BACK_PORT[1],False)
65         GPIO.output(RIGHT_FRONT_PORT[0],True)
66         GPIO.output(RIGHT_FRONT_PORT[1],False)
67         GPIO.output(RIGHT_BACK_PORT[0],True)
68         GPIO.output(RIGHT_BACK_PORT[1],False)
69         print ("执行指令:前进")
70     #倒车挡
71     def allBack():
72         GPIO.output(LEFT_FRONT_PORT[0],False)
73         GPIO.output(LEFT_FRONT_PORT[1],True)
74         GPIO.output(LEFT_BACK_PORT[0],False)
75         GPIO.output(LEFT_BACK_PORT[1],True)
76         GPIO.output(RIGHT_FRONT_PORT[0],False)
77         GPIO.output(RIGHT_FRONT_PORT[1],True)
78         GPIO.output(RIGHT_BACK_PORT[0],False)
79         GPIO.output(RIGHT_BACK_PORT[1],True)
80         print ("执行指令:后退")
81     #刹车
82     def stop():
83         GPIO.output(LEFT_FRONT_PORT[0],False)
84         GPIO.output(LEFT_FRONT_PORT[1],False)
85         GPIO.output(LEFT_BACK_PORT[0],False)
86         GPIO.output(LEFT_BACK_PORT[1],False)
87         GPIO.output(RIGHT_FRONT_PORT[0],False)
88         GPIO.output(RIGHT_FRONT_PORT[1],False)
89         GPIO.output(RIGHT_BACK_PORT[0],False)
90         GPIO.output(RIGHT_BACK_PORT[1],False)
91         print ("执行指令:停止")
复制代码

 

注意事项:

树莓派我安装的是ubuntu 21.0版本,默认是python3, 没有pip也没有rpi包,需要手动安装一下;

1 sudo apt-get install -y python-pip
2 sudo pip install rpi-python 

1 sudo apt-get instail -y python-pip
2 sudo apt--get install -y rpi-python

 

 

四、参考资料

  • https://www.jianshu.com/p/f31b90cc756f   树莓派GPIO引脚和python gpio编程api介绍
  • https://zhuanlan.zhihu.com/p/106592873 GPIO说明
  • https://zhuanlan.zhihu.com/p/346930154 L298N电机驱动板说明 
posted @   鸿野  阅读(1708)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示