树莓派wifi小车

第一步、所需硬件

树莓派(B型 512MB内存) 图一raspberry-b小车底盘            图二
小车底盘与电池盒

图二 图三 小车底盘与电池盒 (没有拍照直接借用一下)

L298N驱动板    图四

L298N驱动板

杜邦线若干        图五

图五 杜邦线

第二步  软件环境

1、树莓派系统软件版本

树莓派系统软件版本

树莓派系统软件版本(我的系统是Raspbian GNU/Linux 7)

2、python软件版本(Python 3.2.3 ),

python3_version

python3_version

这个是我用的版本,刚开始我用的是2.7,

3、raspberry-gpio-python 版本信息我刚开始的1.。。。。。,

引用import RPi.GPIO as GPIO

到  p = GPIO.PWM(12, 0.5)这里就出错提示( AttributeError: ‘module’ object has no attribute ‘PWM’)

GPIO.PWM是调速用的!切记切记一定要是python软件版本(Python 3.2.3 )RPi.GPIO-0.5.11,是0.5.1.1,否则调速不能用。

现在引用的是RPi.GPIO-0.5.11,

版本最开始是rpi.gpio.1.21根本就不行,

rpi.gpio的安装

Step 1 –下载

wget https://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.5.11.tar.gz

Step 2 – 解压缩到当前目录

tar -xvf RPi.GPIO-0.5.11.tar.gz

Step 3 –进入解压缩后的目录

cd RPi.GPIO-0.5.11

Step 4 –安装RPi.GPIO-模块

sudo python setup.py install

Step 5 – 删除下载文件和解压缩的文件

cd ~
sudo rm -rf RPi.GPIO-0.*

这步要是有个别的步骤不能安装就重复进行,我的就是缺少certifi模块,这个模块是需要在网络下载的,有时候会非常慢,需要多次sudo python setup.py install才能成功。

4、python的tornado框架的安装

手动安装: 下载 tornado-1.2.1.tar.gz

wget  http://github.com/downloads/facebook/tornado/tornado-1.2.1.tar.gz

tar xvzf tornado-1.2.1.tar.gz
cd tornado-1.2.1
python setup.py build
sudo python setup.py install

第四步硬件连接

树莓派与L289N电机的连接

树莓派与L289N电机的连接

图像画的比较乱看下图,下图与上图中我的+5v都没有接直接到树莓派上,空着呢

tu

小车的电机驱动需要外接电源,不可从树莓派的gpio口取电,gpio口只提供5v的电压,驱动电机够吃力的,轻者造成树莓派死机,重者直接把树莓派烧掉~~ 。    车轮的速度可以通过pmw控制,随便找两个gpio口,我接的是ce0、ce1,连接到驱动电板的ena、enb,控制,非常方便。

下面的是我是实际连接图,根据杜邦线的颜色可以看明白是怎么连接的,我还有接了一个超声波测距,但是现在我还没有加入到小车的功能里。

IMG_20151027_123354 IMG_20151027_123352 IMG_20151027_123338 IMG_20151027_123239

树莓派小车的接线

树莓派小车的接线

第五步是小车的软件

小车的控制,我走的是http,在树莓派上运行一个tornado进程,在手机上通过触控控制。如果左轮的速度>右轮,则右转,反之左转。web界 面很简单,如下图,点到哪里,得到一个相对于圆心的点,根据点到圆心的x,y轴距离,算出小车左右轮的速度,从而通过pwm控制小车。界面使用了 html5的canvas。本来在小车上装了个摄像头,通过mjpg-stream把图像实时显示在网页上,无奈摄像头太差,就不加了。

两个文件一个是mycar.html,一个是static文件夹下的jquery.min.js文件,请自行下载jquery.min.js

car_code

前台代码:

<!Doctype html>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />
<title>智能小车控制平台</title>
<script type=”text/javascript” src=”/static/jquery.min.js”></script>

</head>
<body  style=”text-align: center;”>
<canvas id=”cav_dir” width=”400″ height=”400″ style=”background-color: #eeeeee”>
您的浏览器不支持。
</canvas>
<span id=”spn”>hello</span>
<script type=”text/javascript”>
$(function() {
var c=document.getElementById(“cav_dir”);
var cxt=c.getContext(“2d”);

var r = 200

cxt.beginPath();
cxt.fillStyle=”rgba(0, 255, 0, 0.5)”;
cxt.arc(r, r, r, 0, Math.PI*2, false);
cxt.closePath();

cxt.lineWidth = 2
cxt.strokeStyle = “rgba(255,0,0,0.5)”;
cxt.moveTo(0, r – 1)
cxt.lineTo(2 * r, r – 1)
cxt.moveTo(r – 1, 0)
cxt.lineTo(r – 1, 2 * r)
cxt.stroke()

cxt.fill();

function run(event) {
event = event || window.event
event.preventDefault()
var x = event.touches[0].clientX – r
var y = event.touches[0].clientY – r
var oInp = document.getElementById(“spn”);
oInp.innerHTML = ‘坐标数据(‘ + x + ‘,’ + y + ‘)’
if (x * x + y * y < r * r) {
$.post(‘/?x=’ + x + ‘&y=’ + y + ‘&r=’ + r)
}
}

function stop(event) {
event = event || window.event
event.preventDefault()
$.post(‘?x=0&y=0&r=’ + r)
}

c.addEventListener(‘touchstart’,run, false);
c.addEventListener(‘touchmove’,run, false);
c.addEventListener(‘touchend’,stop, false);

})

$(window).resize(function(){
$(‘#spn’).css({
position:’absolute’,
left: ($(window).width() – $(‘.className’).outerWidth())/2-200,
top: 420,
});
});
//初始化函数
$(window).resize();

</script>
</body>
</html>

后台代码 car.py

# -*- coding: utf-8 -*-
#””Web控制树莓派小车
# @Author: darkbull

import tornado.web
import tornado.ioloop
import codecs
import RPi.GPIO as GPIO
import time
import atexit
import math
#from smbus import SMBus
atexit.register(GPIO.cleanup)

GPIO.setmode(GPIO.BCM)

IN1 = 17
IN2 = 22
IN3 = 23
IN4 = 24

# 左边轮速度控制
PWM_L = 8
PWM_R = 7

GPIO.setup(IN1, GPIO.OUT)
GPIO.output(IN1, GPIO.LOW)
GPIO.setup(IN2, GPIO.OUT)
GPIO.output(IN2, GPIO.LOW)
GPIO.setup(IN3, GPIO.OUT)
GPIO.output(IN3, GPIO.LOW)
GPIO.setup(IN4, GPIO.OUT)
GPIO.output(IN4, GPIO.LOW)

GPIO.setup(PWM_L, GPIO.OUT)
GPIO.output(PWM_L, GPIO.LOW)
GPIO.setup(PWM_R, GPIO.OUT)
GPIO.output(PWM_R, GPIO.LOW)
pwm_l = GPIO.PWM(PWM_L, 50)
pwm_l.start(0)
pwm_r = GPIO.PWM(PWM_R, 50)
pwm_r.start(0)

def front():
GPIO.output(IN1, True)
GPIO.output(IN2, False)
GPIO.output(IN3, True)
GPIO.output(IN4, False)

def back():
GPIO.output(IN1, False)
GPIO.output(IN2, True)
GPIO.output(IN3, False)
GPIO.output(IN4, True)

# def left():
#     # GPIO.output(IN1, False)
#     # GPIO.output(IN2, True)
#     GPIO.output(IN1, False)
#     GPIO.output(IN2, False)
#     GPIO.output(IN3, True)
#     GPIO.output(IN4, False)

# def right():
#     # GPIO.output(IN1, True)
#     # GPIO.output(IN2, False)
#     GPIO.output(IN1, False)
#     GPIO.output(IN2, False)
#     GPIO.output(IN3, False)
#     GPIO.output(IN4, True)

def stop():
GPIO.output(IN1, False)
GPIO.output(IN2, False)
GPIO.output(IN3, False)
GPIO.output(IN4, False)

def run(x, y, r):
#    “””小车运行
#    “””
print(“小车开始运行”)
if x * x + y * y > r * r:
return

speed_min = 15
speed_max = 100
speed_delta = speed_max – speed_min
# y轴为小车的运行方向,速度以y轴的值为基准
if y < 0:
back()
elif y > 0:
front()
else:
stop()
return

t = abs(y) * 100.0 / r
if t < 20:  # 电压太小,驱动不起来
t = 20
d = math.atan2(x, y) * 180 / math.pi

if x < 0: # 往左边偏, 右轮的速度比左轮快
t2 = t * (abs(90 + d) / 90)
pwm_r.ChangeDutyCycle(t)
pwm_l.ChangeDutyCycle(t2)
elif x > 0: # 往右边偏, 左边的速度比右轮快
t2 = t * (abs(90 – d) / 90)
pwm_l.ChangeDutyCycle(t)
pwm_r.ChangeDutyCycle(t2)
print ( x, y, t, t2 )

class CarController(tornado.web.RequestHandler):
def get(self):
with codecs.open(‘mycar.html’, ‘r’, encoding=’utf-8′) as fp:
self.write(fp.read())
def post(self):
r = int(self.get_argument(‘r’))
x = int(self.get_argument(‘x’))
y = int(self.get_argument(‘y’))
run(x, y, r)
self.write(‘ok’)
try:
if __name__ == ‘__main__’:
app = tornado.web.Application([(‘/’, CarController)], static_path=’static’, debug=True)
app.listen(8080)
tornado.ioloop.IOLoop.instance().start()
except:
print ( “THIS shell have close!” )

我这里用的是python的tornado框架

在命令行输入sudo python3 car.py

用手机打开网址192.168.1.3:8080

如下图

rpi_control_car在手机上通过触控控制

就可以看到你的小车开始运动了!

有时间录视频看看

本文参照的了darkbull的文章,原文地址是:http://ju.outofmemory.cn/entry/98399

 » 转载请注明来源:网络蛀虫小窝 » 《树莓派wifi小车》
 » 本站地址:http://www.gomoth.com

标签: