用树莓派来制作简单的遥控小车

原创
2015/03/30 10:57
阅读数 2.4W

简述

本文主要描述使用树莓派和L298N制作一个简单的遥控小车,遥控器使用简单的WEB来实现。

准备工作

  1. 树莓派,(本文使用的是Raspberry PI 2 B型,即2B)
  2. 8G以上TF卡 树莓派上可用和不可用的SD卡列表
  3. 四驱小车底(含电机,注:本文中的小车底盘佩戴的是高扭矩直流电机)
  4. 母对母、公对母、公对公(可不用)杜邦线
  5. L298N双HD桥电机驱动板
  6. 无线网卡(最好支持AP的)
  7. 充电电池组(7V以上的,镍氢或者18650充电电池皆可)

系统安装没什么说的,系统烧到SD就可以了,我使用的Raspbian,这货是基于Debian的,配置命令习惯几乎和ubuntu/debian一样,接上网线开机进入系统配置。

  • 换上中科大的源,再apt-get update一次;
  • 为root用户设置密码;
  • 配置无线网卡有两中方案,编辑/etc/network/interface,网上教程蛮多的:
    1. 自动连接到路由器,家里有无线路由器,小车在WIFI覆盖的地方;
    2. 树莓派上搭建WIFI热点,信号更好,可以在小区里面开,顺便勾搭妹子,哦哦哦,不对,应该是淘气小孩。唯一需要注意的是网卡芯片。

底盘组装

  • 拼装没啥难度,亚克力板上的牛皮纸沾得简直是丧心病狂,马蛋,废了好一会儿功夫才撕干净(⊙﹏⊙)b;
  • 马达那货就比较坑了,没有带线是裸机的,手中也恰巧没有电烙铁,当时我就懵逼啦。好吧,手中还有多余的公对公杜邦线,拔掉其中一头的接头,打火机烧一下(小时候学会的神技),拔掉一部分把铜线拧紧。最后铜线穿过马达接口的小洞里面,再拧紧。哎丫,没有胶带,最后用透明胶凑合凑合,绑紧。repeat 4次。

线路连接

之前一直没玩过硬件,毕竟我只是一个网工出身的程序猿,第一次拿到L298N研究了好久才明白,还是上图上图。 L298N

  1. +12V接口 +5V~+35V, 如需要板内取电,则供电范围Vs:+7V~+35V
  2. 电机 OUT1、OUT2 为电机A输出;OUT3、OUT4为电机B输出
  3. IO接口 ENA和ENA分别为A、B电机的使能端,一开始ENA和ENB各自的上下两个针脚是用跳线帽连接起来的,拔掉就可以接线了。 IN1-IN4 为IO控制输入。

弄明白L298N之后,连接就方便多了,

  • OUT1 OUT2 连接小车左侧前后两个电机(并联),之前电机接出来的杜邦线公头直接往接口里面塞(好羞羞),拧紧螺丝;同理,OUT3 OUT4 连接小车右侧前后两个电机;
  • 便宜的镍氢电池组电源正负极分别连接12V、GND,电池组的接头是JST母头,比较好连接;
  • 5V和GND连接到树莓派上的5V和GND用于供电。
  • ENA、ENB、IN1-IN4连接到树莓派I/O端口上。

接好之后是这样子:

car

摄像头模块

摄像头是好几年前台式机用的摄像头,分辨率是奇葩的470x640,而不是480x640,mjpg-streamer下,画面是花的,等到画面调正常之后,画面却如放幻灯片一样。我勒个去!摄像头连接到装了openwrt的wndr3800路由器上流畅的没朋友,在树莓派上调来调去却怎么也不行,认命了,放弃放弃,没有摄像头也能当遥控车开。

小车遥控器

终于到了编程部分,为了简单,使用python的RPI.GPIO模块来操作I/O,不过我发现功能蛮少的,没找到调速的API,文档在这里,代码如下,轮子的参数视接的I/O口而定。

<!-- lang: python -->
import RPi.GPIO as gpio


class Wheel(object):
	def __init__(self, in_pin1, in_pin2, enable_pin1, enable_pin2):
		'''
		:param in_pin1 in_pin2: IN1 IN2 or IN3 IN4
		:param enable_pin1 enable_pin2: ENA or ENB
		'''
		self.pin1 = in_pin1
		self.pin2 = in_pin2

		# setup I/O OUT
		gpio.setup(in_pin1, gpio.OUT)
		gpio.setup(in_pin2, gpio.OUT)
		gpio.setup(enable_pin1, gpio.OUT)
		gpio.setup(enable_pin2, gpio.OUT)

		# enable
		gpio.output(enable_pin1, True)
		gpio.output(enable_pin2, True)

	def forward(self):
		gpio.output(self.pin1, True)
		gpio.output(self.pin2, False)

	def backward(self):
		gpio.output(self.pin1, False)
		gpio.output(self.pin2, True)

	def stop(self):
		gpio.output(self.pin1, False)
		gpio.output(self.pin2, False)


class Car(object):
	def __init__(self):
		gpio.setmode(gpio.BOARD)

		self.left_wheel = Wheel(13, 15, 7, 11)
		self.right_wheel = Wheel(16, 18, 22, 29)

	def forward(self):
		self.left_wheel.forward()
		self.right_wheel.forward()

	def backward(self):
		self.left_wheel.backward()
		self.right_wheel.backward()

	def left(self):
		self.left_wheel.stop()
		self.right_wheel.forward()

	def right(self):
		self.left_wheel.forward()
		self.right_wheel.stop()

	def stop(self):
		self.left_wheel.stop()
		self.right_wheel.stop()

	def shutdown(self):
		self.stop()
		gpio.cleanup()

最后用Flask模块实现Web(android真的好久都没摸了,偷笑),这需要在树莓派装Flask模块,在安装的时候发现树莓派的python环境是不完整的。这个代码就不贴了,直接上仓库地址。

小车遥控器部分代码:https://github.com/fordoo/rpi-car

小车演示GIF: http://ww2.sinaimg.cn/bmiddle/a3b0dabfgw1eqed43g2ivg20b20coqv5.gif

展开阅读全文
打赏
7
98 收藏
分享
加载中
我也实现过一个类似的小车,但是没有码盘的情况下,小车如果长距离走直线非常困难,不知道博主是否解决了这个问题?另外调速是用PWM控制L298N版的有个A、B引线,默认是用跳线帽短接了。
2019/02/11 10:10
回复
举报
toil博主

引用来自“MarkSong”的评论

楼主,一开始按照你的步骤,我的小车可以正常跑起来,但我的树莓派是另外供电的。
后来我再把L298N的V5接到树莓派的V5口,然后共地,一启动树莓派,小车的一边轮子不停地转。
这时候我就运行了一下之前的程序,轮子就不转了,用万用表测了一下输出电压,发现是0 。
我再次把树莓派另外供电,轮子还是不转,但L298N的灯还是亮,这是什么原因?我哪个步骤做的不对?
不知道你的外部供电是多大电压的,+12V接口:+5V~+35V, 如需要板内取电,则供电范围Vs:+7V~+35V。 外部电压和电流不稳定的时候,也可能给树莓派的供电也不足。 另外,L298N 正负输入接反了的话 是会烧坏芯片的。
2016/04/06 11:30
回复
举报
楼主,一开始按照你的步骤,我的小车可以正常跑起来,但我的树莓派是另外供电的。
后来我再把L298N的V5接到树莓派的V5口,然后共地,一启动树莓派,小车的一边轮子不停地转。
这时候我就运行了一下之前的程序,轮子就不转了,用万用表测了一下输出电压,发现是0 。
我再次把树莓派另外供电,轮子还是不转,但L298N的灯还是亮,这是什么原因?我哪个步骤做的不对?
2016/04/06 11:04
回复
举报
楼主能提供下你得配件购买地址码?
2015/04/14 16:14
回复
举报
楼主能否给你你的线路图,我一直没有配好83
2015/04/06 21:21
回复
举报

引用来自“fordoo”的评论

引用来自“dimdim”的评论

配件贵不贵哟哟

上上下下500左右 你可以自己搜配件价格

想搞个飞行器4
2015/04/02 17:36
回复
举报
toil博主

引用来自“dimdim”的评论

配件贵不贵哟哟

上上下下500左右 你可以自己搜配件价格
2015/04/02 17:25
回复
举报
配件贵不贵哟哟
2015/04/02 17:17
回复
举报

引用来自“LeeTioN”的评论

真巧,我最近也用了一下webiopi做出了一个小车,可l298n能用那么多电池接吗?话说楼主能不能给个电池组的宝贝链接?

引用来自“fordoo”的评论

一开始我用5V的移动电源,结果电机速度不理想,无奈换成10节 共12V,速度上去了,但是芯片滚烫,容量也相对小了。 搜 “镍氢 电池组" 就可以了,不过我现在还是推荐18650的,3到4节就可以了。
博主你的电池组的线头是什么样子的?是不是和杜邦线的头形状一样的?
2015/04/01 20:19
回复
举报
toil博主

引用来自“LeeTioN”的评论

真巧,我最近也用了一下webiopi做出了一个小车,可l298n能用那么多电池接吗?话说楼主能不能给个电池组的宝贝链接?
一开始我用5V的移动电源,结果电机速度不理想,无奈换成10节 共12V,速度上去了,但是芯片滚烫,容量也相对小了。 搜 “镍氢 电池组" 就可以了,不过我现在还是推荐18650的,3到4节就可以了。
2015/04/01 20:09
回复
举报
更多评论
打赏
24 评论
98 收藏
7
分享
返回顶部
顶部