树莓派小车主要用树莓派的GPIO口控制小车的驱动电机,因为GPIO的驱动电流有限,因此采用了L293N的驱动驱动模块。
整个技术架构分为两部分,一是小车的GPIO控制,二是第三方设备与控制命令的联通
小车的控制主要分为:前进、后退、左转、右转、左后转、右后转,结合GPIO模块使用,详见RPi.GPIO实例即可。
使用手机或电脑连接树莓派则需要使用tornado模块,tornado模块的安装方式有两种:
1、使用pip install tornado进行安装
2、到tornado官网上下载模块,解压缩后,使用下述命令安装,注意最后一行是用sudo权限
tar xvzf tornado-xx.tar.gz
cd tornado-xx
python setup.py build
sudo python setup.py install
将小车的控制代码放入cargo.py文件,将网页控制代码放入cargo.html,代码详情见文末。
在ssh中运行控制代码,注意使用sudo权限
sudo python /home/pi/Desktop/cargo.py
注意cargo.py中self.render("")关联的网页名称需改为cargo.html,如果文件名有更改,此处需一并更改,否则网页无法正常加载。
附cargo.py代码
#!/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("cargo.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()
cargo.html代码
car test