查看: 5360|回复: 5

[项目] 基于树莓派制作手机遥控小车, Python实现程序代码

[复制链接]

该用户从未签到

发表于 2018-2-8 15:23:14 | 显示全部楼层 |阅读模式
分享到:
今天跟大家分享一个利用树莓派和L298N模块制作手机遥控小车的程序。具体小车的硬件链接我将不再这里赘述,网上会搜索到很多教程。在这只和大家交流分享利用Python实现的程序代码。先上一张效果图。

5542297-5520738067fbe77d.jpg

1.程序思路:
(1)在树莓派上编写一个控制小车运行的文件index.py。
(2)在树莓派上利用Python的bottle库建立web应用服务,运行main.py。
(3)在手机浏览器访问树莓派上的遥控器网页index.html,实现与index.py程序交互,进而控制小车运行。
2.程序文件:
(1)控制小车运行的Python文件:index.py
  1. #!/usr/bin/env python3
  2. from bottle import get,post,run,request,template
  3. import RPi.GPIO as GPIO
  4. import time
  5. IN1 = 11
  6. IN2 = 12
  7. IN3 = 13
  8. IN4 = 15
  9. def init():
  10.     GPIO.setmode(GPIO.BOARD)
  11.     GPIO.setup(IN1,GPIO.OUT)
  12.     GPIO.setup(IN2,GPIO.OUT)
  13.     GPIO.setup(IN3,GPIO.OUT)
  14.     GPIO.setup(IN4,GPIO.OUT)
  15. # 前进
  16. def forward(tf):
  17.     GPIO.output(IN1,GPIO.HIGH)
  18.     GPIO.output(IN2,GPIO.LOW)
  19.     GPIO.output(IN3,GPIO.HIGH)
  20.     GPIO.output(IN4,GPIO.LOW)
  21.     time.sleep(tf)
  22.     GPIO.cleanup()
  23. # 后退
  24. def down(tf):
  25.     GPIO.output(IN1,GPIO.LOW)
  26.     GPIO.output(IN2,GPIO.HIGH)
  27.     GPIO.output(IN3,GPIO.LOW)
  28.     GPIO.output(IN4,GPIO.HIGH)
  29.     time.sleep(tf)
  30.     GPIO.cleanup()
  31. # 左转弯
  32. def left(tf):
  33.     GPIO.output(IN1,GPIO.LOW)
  34.     GPIO.output(IN2,GPIO.LOW)
  35.     GPIO.output(IN3,GPIO.HIGH)
  36.     GPIO.output(IN4,GPIO.LOW)
  37.     time.sleep(tf)
  38.     GPIO.cleanup()
  39. # 右转弯
  40. def right(tf):
  41.     GPIO.output(IN1,GPIO.HIGH)
  42.     GPIO.output(IN2,GPIO.LOW)
  43.     GPIO.output(IN3,GPIO.LOW)
  44.     GPIO.output(IN4,GPIO.LOW)
  45.     time.sleep(tf)
  46.     GPIO.cleanup()
  47. # 停止
  48. def stop():
  49.     GPIO.output(IN1,False)
  50.     GPIO.output(IN2,False)
  51.     GPIO.output(IN3,False)
  52.     GPIO.output(IN4,False)
  53.     GPIO.cleanup()
  54. @get("/")
  55. def index():
  56.     return template("index")
  57. @post("/cmd")
  58. def cmd():
  59.     print("按下了按钮: "+request.body.read().decode())
  60.     init()
  61.     sleep_time = 1
  62.     arg = request.body.read().decode()
  63.     if(arg=='up'):
  64.         forward(sleep_time)
  65.     elif(arg=='down'):
  66.         down(sleep_time)
  67.     elif(arg=='left'):
  68.         left(sleep_time)
  69.     elif(arg=='right'):
  70.         right(sleep_time)
  71.     elif(arg=='stop'):
  72.         stop()   
  73.     else:
  74.         return False
  75.     #return "OK"
  76. run(host="0.0.0.0",port="8080")
复制代码
(2)建立Web服务的Python文件:main.py
  1. #!/usr/bin/env python3
  2. from bottle import get,post,run,request,template
  3. @get("/")
  4. def index():
  5.     return template("index")
  6. @post("/cmd")
  7. def cmd():
  8.     print("按下了按钮: "+request.body.read().decode())
  9.     #return "OK"
  10. run(host="0.0.0.0",port="8080")
复制代码
5542297-fe86c09709a33e35.png

(3)控制小车的网页html文件:index.html
  1. <html lang="en">
  2. <head>
  3.     <meta charset="UTF-8">
  4.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5.     <title>树莓派遥控小车</title>
  6.     <link  rel="stylesheet" media="screen">
  7.     <script src="http://code.jquery.com/jquery.js"></script>
  8.     <style type="text/css">
  9.         #up {
  10.             margin-left: 55px;
  11.             margin-bottom: 3px;
  12.         }
  13.         #down {
  14.             margin-top: 3px;
  15.             margin-left: 55px;
  16.         }
  17.     </style>
  18.     <script>
  19.         $(function(){
  20.             $("button").click(function(){
  21.                 $.post("/cmd",this.id,function(data,status){});
  22.             });
  23.         });
  24.     </script>
  25. </head>
  26. <body>
  27. <div id="container" class="container">
  28.     <div>
  29.         <button id="up" class="btn btn-lg btn-primary glyphicon glyphicon-circle-arrow-up"></button>
  30.     </div>
  31.     <div>
  32.         <button id='left' class="btn btn-lg btn-primary glyphicon glyphicon-circle-arrow-left"></button>
  33.         <button id='stop' class="btn btn-lg btn-primary glyphicon glyphicon-stop"></button>
  34.         <button id='right' class="btn btn-lg btn-primary glyphicon glyphicon-circle-arrow-right"></button>
  35.     </div>
  36.     <div>
  37.         <button id='down' class="btn btn-lg btn-primary glyphicon glyphicon-circle-arrow-down"></button>
  38.     </div>
  39. </div>
  40. <script src="http://cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
  41. </body>
  42. </html>
复制代码
5542297-1988d6b13bef36eb.png

3.程序原理及代码解析
(1)main.py 文件中通过使用Python最轻量级的web框架bottle在树莓派上建立web应用服务,并设置服务开放的端口号为8080,进而实现通过手机等客户端访问树莓派上的html网页文件。
(2)index.py 文件中通过引用Python的GPIO库,实现通过树莓派的11、12、13、14号GPIO接口链接控制L298N模块,进而控制小车的马达实现小车的运动。
(3)index.html通过使用js的click事件,检测网页中的button点击情况并反馈给index.py文件,从而实现通过点击按钮实现对小车的控制。
(4)以上三个文件需放置到同一文件路径下。


回复

使用道具 举报

  • TA的每日心情

    2021-12-7 12:35
  • 签到天数: 1354 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2018-2-8 17:49:20 | 显示全部楼层
    上上原理图,学习和参考一下,好产品。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2019-2-19 20:51
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2018-3-22 09:17:59 来自手机 | 显示全部楼层
    大神在吗,我代码见好文件,说,标识符中的字符无效,请教
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2019-2-19 20:51
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2018-3-22 11:20:14 来自手机 | 显示全部楼层
    两个py代码文件好好啦,就html打开网页不是箭头就几个方块,编码用的UTF-8呀
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    郁闷
    2019-2-19 20:51
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2018-3-22 16:14:44 来自手机 | 显示全部楼层
    大神有能加你qq吗
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-3-27 11:15
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2018-3-27 11:00:13 | 显示全部楼层
    用的几代树莓板?
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-4-24 12:06 , Processed in 0.159290 second(s), 26 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.