6、树莓派小车系列之按键控制

时间: 2015-11-15 18:47 栏目: 树莓派 浏览: 12588 赞: 3 踩: 0 字体:

以下为本篇文章全部内容:

        大家好,我是Sunny。距离上次教程发布已经有一周的时间, 这一周时间里面大家如果跟着我前面的教程在做这个小车的话,我相信大家都已经做出来,并且能让小车跑起来了。但是上次讲到的控制小车呢,只是简单的让小车跑起来,那么我们怎么通过按键来控制小车呢?这就是我们今天的重点了,下面大家跟着我一起去实现如何通过按键来操作小车吧。如果是跟着我前面教程一直写过来的朋友可以直接拷贝我的代码过去就ok了。

高清下载地址:http://yunpan.cn/cL6FIb8AaAKMz (提取码:72d6)

                        链接: http://pan.baidu.com/s/1qWCHnTM 密码: c38p

        这次教程的代码需要用到python的一个异步io框架tornado,关于这个框架更多的资料大家可以去官网查看http://www.tornadoweb.org/

tornado安装方法:

通过pip安装:

sudo pip install tornado

源代码安装:

wget https://pypi.python.org/packages/source/t/tornado/tornado-4.3.tar.gz
tar xvzf tornado-4.3.tar.gz
cd tornado-4.3
python setup.py build
sudo python setup.py install

python代码:

#!/usr/bin/python
#coding: utf8
import sys
import RPi.GPIO as GPIO
import time
import sys
import tornado.ioloop
import tornado.web
import tornado.httpserver
import tornado.options
from tornado.options import define,options
define("port",default=80,type=int)
IN1 = 11
IN2 = 12
IN3 = 13
IN4 = 15
def init():
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(IN1,GPIO.OUT)
        GPIO.setup(IN2,GPIO.OUT)
        GPIO.setup(IN3,GPIO.OUT)
        GPIO.setup(IN4,GPIO.OUT)

# 前进
def forward(tf):
        GPIO.output(IN1,GPIO.HIGH)
        GPIO.output(IN2,GPIO.LOW)
        GPIO.output(IN3,GPIO.HIGH)
        GPIO.output(IN4,GPIO.LOW)
        time.sleep(tf)
        GPIO.cleanup()

# 后退
def reverse(tf):
        GPIO.output(IN1,GPIO.LOW)
        GPIO.output(IN2,GPIO.HIGH)
        GPIO.output(IN3,GPIO.LOW)
        GPIO.output(IN4,GPIO.HIGH)
        time.sleep(tf)
        GPIO.cleanup()

# 左转弯
def left(tf):
        GPIO.output(IN1,GPIO.LOW)
        GPIO.output(IN2,GPIO.LOW)
        GPIO.output(IN3,GPIO.HIGH)
        GPIO.output(IN4,GPIO.LOW)
        time.sleep(tf)
        GPIO.cleanup()

# 右转弯
def right(tf):
        GPIO.output(IN1,GPIO.HIGH)
        GPIO.output(IN2,GPIO.LOW)
        GPIO.output(IN3,GPIO.LOW)
        GPIO.output(IN4,GPIO.LOW)
        time.sleep(tf)
        GPIO.cleanup()

# 后左转弯
def pivot_left(tf):
        GPIO.output(IN1,GPIO.LOW)
        GPIO.output(IN2,GPIO.HIGH)
        GPIO.output(IN3,GPIO.LOW)
        GPIO.output(IN4,GPIO.LOW)
        time.sleep(tf)
        GPIO.cleanup()

# 后右转弯
def pivot_right(tf):
        GPIO.output(IN1,GPIO.LOW)
        GPIO.output(IN2,GPIO.LOW)
        GPIO.output(IN3,GPIO.LOW)
        GPIO.output(IN4,GPIO.HIGH)
        time.sleep(tf)
        GPIO.cleanup()

# 原地左转
def p_left(tf):
        GPIO.output(IN1,GPIO.LOW)
        GPIO.output(IN2,GPIO.HIGH)
        GPIO.output(IN3,GPIO.HIGH)
        GPIO.output(IN4,GPIO.LOW)
        time.sleep(tf)
        GPIO.cleanup()

# 原地右转
def p_right(tf):
        GPIO.output(IN1,GPIO.HIGH)
        GPIO.output(IN2,GPIO.LOW)
        GPIO.output(IN3,GPIO.LOW)
        GPIO.output(IN4,GPIO.HIGH)
        time.sleep(tf)
        GPIO.cleanup()
class IndexHandler(tornado.web.RequestHandler):
        def get(self):
                self.render("index.html")
        def post(self):
                init()
                sleep_time = 0.1
                arg = self.get_argument('k')
                if(arg=='w'):
                        forward(sleep_time)
                elif(arg=='s'):
                        reverse(sleep_time)
                elif(arg=='a'):
                        left(sleep_time)
                elif(arg=='d'):
                        right(sleep_time)
                elif(arg=='q'):
                        pivot_left(sleep_time)
                elif(arg=='e'):
                        pivot_right(sleep_time)
                elif(arg=='z'):
                        p_left(sleep_time)
                elif(arg=='x'):
                        p_right(sleep_time)
                else:
                        return False
                self.write(arg)
if __name__ == '__main__':
        tornado.options.parse_command_line()
        app = tornado.web.Application(handlers=[(r"/",IndexHandler)])
        http_server = tornado.httpserver.HTTPServer(app)
        http_server.listen(options.port)
        tornado.ioloop.IOLoop.instance().start()

html的代码:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<title>Sunny的小车</title>
	<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>
</head>
<body>
<script type="text/javascript">
	function go(k){
		$.post('/',{k:k},function(){});
	}
	$(function(){
		window.document.onkeydown = abc;
		function abc(env){
			env = (env) ? env : window.event;
			if(env.keyCode=='87'){
				go('w');
			}
			if(env.keyCode=='83'){
				go('s');
			}
			if(env.keyCode=='65'){
				go('a');
			}
			if(env.keyCode=='68'){
				go('d');
			}
			if(env.keyCode=='81'){
				go('q');
			}
			if(env.keyCode=='69'){
				go('e');
			}
			if(env.keyCode=='90'){
				go('z');
			}
			if(env.keyCode=='88'){
				go('x');
			}
		}
		var i = null;
		$('.before').mousedown(function(){
			i = setInterval(function(){
				go('w');
			},100);
		});
		$('.left').mousedown(function(){
			i = setInterval(function(){
				go('a');
			},100);
		});
		$('.right').mousedown(function(){
			i = setInterval(function(){
				go('d');
			},100);
		});
		$('.cabk').mousedown(function(){
			i = setInterval(function(){
				go('s');
			},100);
		});
		$('#main span').mouseup(function(){
			clearInterval(i);
		});
	});
</script>
<style type="text/css">
	#main{width: 150px;height: 150px;background: #ccc;}
	#main span{width: 50px;height: 50px;float: left;z-index: 999;}
	#main span.on2{background: #ff00ff;}
</style>
<div id="main">
	<span></span>
	<span class="on2 before"></span>
	<span></span>
	<span class="on2 left"></span>
	<span></span>
	<span class="on2 right"></span>
	<span></span>
	<span class="on2 cabk"></span>
	<span></span>
</div>
</body>
</html>

        树莓派小车系列教程一:《1、树莓派小车系列教程之配件介绍

        树莓派小车系列教程二:《2、树莓派小车系列之模块接线

        树莓派小车系列教程三:《3、树莓派小车系列之python控制马达转动

        树莓派小车系列教程四:《4、树莓派小车系列之底盘安装

        树莓派小车系列教程五:《5、树莓派小车系列之Python小车跑起来

        树莓派小车系列教程六:《6、树莓派小车系列之按键控制

        谢谢大家对本博客的支持,本站专注原创技术文章,请尊重原创,杜绝百度上面出现的各种一模一样的帖子,让我们一起努力做更优质的文章。且看且珍惜博主的心得。请转载带上本文链接注明出处。

如果大家有什么疑问可以加我QQ327388905进行解答,也可以加入交流群

群二维码

Sunny博客技术交流群:

Sunny博客技术交流群:57914191 Sunny博客技术交流群