前一段时间买了两个树莓派,看了看板子的性能,跑个CentOS Minimal版还行,运行Ubuntu Mate发热非常严重,索性拿出来一个板子做个Wifi遥控小车,在小野(Allen)的帮助下,买了小车的底盘、电源控制模块、电池、杜邦线等。先来show安装之后的样子:
在树莓派上搭建了 Flask 框架的服务器端,然后通过树莓派自带的无线网卡创建热点,组件局域网络。客户端通过浏览器访问树莓派的IP,输入小车的控制信号,传给 L298N 控制电源的高低电位,决定四个发动机的正转或反转决定前进方向的。
搭建过程:
首先,在SD卡里刷入了Ubuntu Mate系统,然后配置了开机自动登录,连接了常用的Wifi。在Ubuntu系统中安装了Python 3, 以及pip 接下来安装了 flask 及PIO模块。
编写核心代码:
from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash
from contextlib import closing
from pi_car import app
import re
import RPi.GPIO as GPIO
@app.route('/')
def show_index():
return render_template('home.html')
@app.route("/login", methods=["GET", "POST"])
def login():
if request.method=="GET":
return "get"+request.form["user"]
elif request.method=="POST":
return "post"
@app.route('/ctl',methods=['GET','POST'])
def ctrl_id():
if request.method == 'POST':
id=request.form['id']
freq= float(request.form['freq'])
print('Freq:',freq)
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
GPIO.setup(11,GPIO.OUT)
GPIO.setup(12,GPIO.OUT)
GPIO.setup(15,GPIO.OUT)
GPIO.setup(16,GPIO.OUT)
p11=GPIO.PWM(11, 1)
p12=GPIO.PWM(12, 1)
p15=GPIO.PWM(15, 1)
p16=GPIO.PWM(16, 1)
if id == 't_left':
t_left(p11,p12,p15,p16, freq)
return "left"
elif id == 't_right':
t_right(p11,p12,p15,p16, freq)
return "right"
elif id == 't_up':
t_up(p11,p12,p15,p16, freq)
return "up"
elif id == 't_down':
t_down(p11,p12,p15,p16, freq)
return "down"
elif id == 't_stop':
t_stop(p11,p12,p15,p16, freq)
return "stop"
return redirect(url_for('show_index'))
def t_stop(p11,p12,p15,p16, freq):
print('Stop.')
GPIO.output(11, False)
GPIO.output(12, False)
GPIO.output(15, False)
GPIO.output(16, False)
p11.stop()
p12.stop()
p15.stop()
p16.stop()
def t_up(p11,p12,p15,p16, freq):
print('Turn up.')
GPIO.output(11, True)
GPIO.output(12, False)
GPIO.output(15, True)
GPIO.output(16, False)
# p11.start(freq)
# p12.stop()
# p15.start(freq)
# p16.stop()
def t_down(p11,p12,p15,p16, freq):
print('Turn down.')
GPIO.output(12, True)
GPIO.output(16, True)
GPIO.output(11, False)
GPIO.output(15, False)
# p11.stop()
# p12.start(freq)
# p15.stop()
# p16.start(freq)
def t_right(p11,p12,p15,p16, freq):
reset(p11, p12, p15, p16)
# t_up(p11,p12,p15,p16, freq)
print('Turn right.')
p11.stop()
p12.stop()
p15.ChangeDutyCycle(freq)
p15.start(freq)
p16.stop()
#GPIO.output(11, False)
#GPIO.output(12, True)
#GPIO.output(15, True)
#GPIO.output(16, False)
def t_left(p11,p12,p15,p16, freq):
reset(p11, p12, p15, p16)
# t_up(p11,p12,p15,p16, freq)
print('Turn left.')
p11.ChangeDutyCycle(freq)
p11.start(freq)
p12.stop()
p15.stop()
p16.stop()
#GPIO.output(11, True)
#GPIO.output(12, False)
#GPIO.output(15, False)
#GPIO.output(16, True)
def reset(p11,p12,p15,p16):
p11.stop()
p12.stop()
p15.stop()
p16.stop()
在调试过程中,遇到了一些问题,树莓派需要连接无线网络,如果系统需要使用Xshell登录才能联网,才能获取IP地址,这样每次都需要连接无线键鼠控制。解决办法:设置Ubuntu系统开机后自动登录。
参考资料: