树莓派3+L298N+wifi遥控小车

hxy    2019-05-14 08:54

前一段时间买了两个树莓派,看了看板子的性能,跑个CentOS Minimal版还行,运行Ubuntu Mate发热非常严重,索性拿出来一个板子做个Wifi遥控小车,在小野(Allen)的帮助下,买了小车的底盘、电源控制模块、电池、杜邦线等。先来show安装之后的样子:

Fig.1  树莓派+L298N做的遥控小车

在树莓派上搭建了 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系统开机后自动登录。

参考资料:

  1. https://wangheng.org/raspberry-wifi-car-1.html
Last Modified: 2020-09-30 22:18
Views: 3.4K

[[total]] comments

Post your comment
  1. [[item.time]]
    [[item.user.username]] [[item.floor]]Floor
  2. Click to load more...
  3. Post your comment