事情始于一节工图课,和同学无聊胡扯,突发奇想,做个树梅派小车玩。用时四天,其中等快递两天半,这非常大西北 = =

使用树梅派总控,L298N作为电机驱动模块。不接各种使能的电路图如下:

![car_bb-1024×962.jpg][1]

(我知道我画得很难看,不要吐槽,谢谢😂)

GPIO.21 —— IN1
GPIO.22 —— IN2
GPIO.23 —— IN3
GPIO.24 —— IN4
GND(Pi) —— GND(L298N)

其中需注意紫色连线,这起到共地作用,不能遗漏。

图中的电池请脑补为12V(不足12V也能带动),这一情况下,5V的接口处将会有电压输出,可供给树梅派使用(连接树梅派5V引脚即可)。当然,我采用MicroUSB接口取电。

这时的小车已经可以跑了,只要有合适的程序。树梅派可以使用python方便地控制GPIO引脚:

#!/usr/bin/env python
#--coding:utf-8--
#一般raspbian已自带RPi.GPIO
import RPi.GPIO as GPIO
import time
#物理引脚BOARD编码
GPIO.setmode(GPIO.BOARD)

IN1 = 29
IN2 = 31
IN3 = 33
IN4 = 35

GPIO.setwarnings(False)
GPIO.setup(IN1,GPIO.OUT)
GPIO.setup(IN2,GPIO.OUT)
GPIO.setup(IN3,GPIO.OUT)
GPIO.setup(IN4,GPIO.OUT)
#控制轮子旋转
GPIO.output(IN1,GPIO.HIGH)
GPIO.output(IN2,GPIO.LOW)
GPIO.output(IN3,GPIO.LOW)
GPIO.output(IN4,GPIO.HIGH)
time.sleep(5) #转动5秒
#清理
GPIO.cleanup()

对IN1、IN2、IN3、IN4输入不同的信号可以控制轮子的转动状态。譬如:IN1高电平IN2低电平,正转;IN1低电平,IN2高电平,反转;同低电平不转,具体情况视电机接法而定。

此外,务必养成清理的习惯,否则引脚短路可能烧板子。

如果一切正常,下一步就可以设计控制车速了。我们可以通过更改占空比来控制速度,即更改一个脉冲循环内通电时间所占的比例。方案如下:

GPIO.12 —— EMA
GPIO.32 —— EMB

在程序中加入:

EMA = 12
EMB = 32
GPIO.setup(EMA, GPIO.OUT)
GPIO.setup(EMB, GPIO.OUT)
PWM_L = GPIO.PWM(EMA,50) #50Hz
PWM_R = GPIO.PWM(EMB,50) #50Hz
PWM_L.start(100) #占空比 100
PWM_R.start(100) #占空比 100

占空比的范围为0.0~100.0,100即为全速。若要在之后更改占空比可使用如下语句:

PWM_L.ChangeDutyCycle(dc) #左轮更改占空比为dc(0.0~100.0)

当然,PWM频率也是可以更改的:

PWM_L.ChangeFrequency(freq) # freq 为设置的新频率,单位为 Hz

完成以上基础后就可以想办法远程控制小车了。我选择的是局域网控制。树梅派3B本身带有wifi,只要在树梅派上用flask开web服务就可以在任何有浏览器的砖头上控制小车了。

在程序开头加入:

from flask import Flask, render_template

然后在程序所在根目录新建文件夹,取名templates,然后新建一个html文件,取名index.html,用于在控制端显示。简易程序如下:

<!Document html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>控制介面-锬</title>
</head>
<body>
<table border="0">
<tr>
<td><form action="/left_situ" method=post>
<input type=submit value="左旋" style="width:300px;height:300px;font-size:150px;">
</form></td>
<td><form action="/forward" method=post>
<input type=submit value="前进" style="width:300px;height:300px;font-size:150px;">
</form></td>
<td><form action="/right_situ" method=post>
<input type=submit value="右旋" style="width:300px;height:300px;font-size:150px;">
</form></td>
</tr>
<tr>
<td><form action="/left" method=post>
<input type=submit value="左转" style="width:300px;height:300px;font-size:150px;">
</form></td>
<td><form action="/stop" method=post>
<input type=submit value="停止" style="width:300px;height:300px;font-size:150px;">
</form></td>
<td><form action="/right" method=post>
<input type=submit value="右转" style="width:300px;height:300px;font-size:150px;">
</form></td>
</tr>
<tr>
<td><form action="/slide" method=post>
<input type=submit value="滑行" style="width:300px;height:300px;font-size:150px;">
</form></td>
<td><form action="/back" method=post>
<input type=submit value="后退" style="width:300px;height:300px;font-size:150px;">
</form></td>
<td><form action="/quit" method=post>
<input type=submit value="退出" style="width:300px;height:300px;font-size:150px;">
</form></td>
</tr>
<tr>
<td><form action="/speed1" method=post>
<input type=submit value="40%" style="width:300px;height:300px;font-size:150px;">
</form></td>
<td><form action="/speed2" method=post>
<input type=submit value="70%" style="width:300px;height:300px;font-size:150px;">
</form></td>
<td><form action="/speed3" method=post>
<input type=submit value="全速" style="width:300px;height:300px;font-size:150px;">
</form></td>
</tr>

</table>
</body>
</html>

 

可以看到,以下语句可以用来插入一个前进按钮:

<tr>
<td></td>
<td><form action="/forward" method=post>
<input type=submit value="前进" style="width:300px;height:300px;font-size:150px;">
</form></td>
<td></td>
</tr>

当按钮被点击时可返回执行相应语句。python中相应语句也需要完善:

#前进
@app.route('/forward',methods=['GET', 'POST'])
def forward():
GPIO.output(IN1,GPIO.HIGH)
GPIO.output(IN2,GPIO.LOW)
GPIO.output(IN3,GPIO.LOW)
GPIO.output(IN4,GPIO.HIGH)
#下达指令后转回主页
return render_template('index.html')

完善细节后,运行程序:

python app.py

然后打开浏览器,访问 树梅派IP:5000 就可以很欢乐地控制小车了😋。
![IMG_20170331_130114-1024×768.jpg][2]
锬 于2017年3月30日至31日

有错误请指出,谢谢

CC BY-NC-SA 4.0