用树莓派制作智能小车

DarkBull's Blog 2014-06-02 4164 阅读

难得周末有空,折腾了一下智能不车。

道具:树莓派,usb无线网卡,L298N电机驱动板,usb移动电源一个,两块手机电板(串联组成7.2v的电源供小车驱动),智能小车底盘,杜邦线若干,橡皮筋若干,电脑一台

原理:通过树莓派的gpio接口,控制电机驱动及速度,实现小车的前进后退,变向。

电机通过L298N驱动,其中电路图为:

小车的电机驱动需要外接电源,不可从树莓派的gpio口取电,gpio口只提供5v的电压,驱动电机够吃力的,轻者造成树莓派死机,重者直接把树莓派烧掉~~ 手头上刚好有几前买过的一只山寨机的两块电板,刚好拿来,串联成一个7.2v的电源。

车轮的速度可以通过pmw控制,随便找两个gpio口,连接到驱动电板的ena、enb,控制,非常方便。

小车的控制,我走的是http,在树莓派上运行一个tornado进程,在手机上通过触控控制。如果左轮的速度>右轮,则右转,反之左转。web界面很简单,如下图,点到哪里,得到一个相对于圆心的点,根据点到圆心的x,y轴距离,算出小车左右轮的速度,从而通过pwm控制小车。界面使用了html5的canvas。本来在小车上装了个摄像头,通过mjpg-stream把图像实时显示在网页上,无奈摄像头太差,就不加了。下次要买个nb点的摄像头。

越来越赖了,直接贴源码,作个标记,下次继续完善:加个机械臂,装一大堆传感器。

前台代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>智能小车控制平台</title><script type="text/javascript" src=""/static/jquery.min.js"></script></head><body><canvas id="cav_dir" width="400" height="400" style="background-color: #eeeeee">您的浏览器不支持。</canvas><span id="spn">hello</span><img src="http://192.168.1.20:8090/?action=stream" /><script type="text/javascript">$(function() {var c=document.getElementById("cav_dir");var cxt=c.getContext("2d");var r = 200cxt.beginPath();cxt.fillStyle="rgba(0, 255, 0, 0.5)";cxt.arc(r, r, r, 0, Math.PI*2, false);cxt.closePath();cxt.lineWidth = 2cxt.strokeStyle = "'rgba(255,0,0,0.5)';cxt.moveTo(0, r - 1)cxt.lineTo(2 * r, r - 1)cxt.moveTo(r - 1, 0)cxt.lineTo(r - 1, 2 * r)cxt.stroke()cxt.fill();function run(event) {event = event || window.eventevent.preventDefault()var x = event.touches[0].clientX - rvar y = event.touches[0].clientY - rvar oInp = document.getElementById("spn");oInp.innerHTML = '(' + x + ',' + y + ')'if (x * x + y * y < r * r) {$.post('/?x=' + x + '&y=' + y + '&r=' + r)}}function stop(event) {event = event || window.eventevent.preventDefault()$.post('?x=0&y=0&r=' + r)}c.addEventListener('touchstart',run, false);c.addEventListener('touchmove',run, false);c.addEventListener('touchend',stop, false);})</script></body>
</html>

后台代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author: darkbull
# @Date:   2014-05-31 10:02:21
# @Last Modified by:   darkbull
# @Last Modified time: 2014-06-02 15:29:20"""Web控制树莓派小车
"""import tornado.web
import tornado.ioloop
import codecs
import RPi.GPIO as GPIO
import time
import atexit
import math
atexit.register(GPIO.cleanup)GPIO.setmode(GPIO.BCM)IN1 = 17
IN2 = 22
IN3 = 23
IN4 = 24# 左边轮速度控制
PWM_L = 8
PWM_R = 7GPIO.setup(IN1, GPIO.OUT, initial=False)
GPIO.setup(IN2, GPIO.OUT, initial=False)
GPIO.setup(IN3, GPIO.OUT, initial=False)
GPIO.setup(IN4, GPIO.OUT, initial=False)GPIO.setup(PWM_L, GPIO.OUT, initial=False)
GPIO.setup(PWM_R, GPIO.OUT, initial=False)
pwm_l = GPIO.PWM(PWM_L, 50)
pwm_l.start(0)
pwm_r = GPIO.PWM(PWM_R, 50)
pwm_r.start(0)def front():GPIO.output(IN1, True)GPIO.output(IN2, False)GPIO.output(IN3, True)GPIO.output(IN4, False)def back():GPIO.output(IN1, False)GPIO.output(IN2, True)GPIO.output(IN3, False)GPIO.output(IN4, True)# def left():
#     # GPIO.output(IN1, False)
#     # GPIO.output(IN2, True)
#     GPIO.output(IN1, False)
#     GPIO.output(IN2, False)
#     GPIO.output(IN3, True)
#     GPIO.output(IN4, False)# def right():
#     # GPIO.output(IN1, True)
#     # GPIO.output(IN2, False)
#     GPIO.output(IN1, False)
#     GPIO.output(IN2, False)
#     GPIO.output(IN3, False)
#     GPIO.output(IN4, True)def stop():GPIO.output(IN1, False)GPIO.output(IN2, False)GPIO.output(IN3, False)GPIO.output(IN4, False)def run(x, y, r):"""小车运行"""if x * x + y * y > r * r:returnspeed_min = 15speed_max = 100speed_delta = speed_max - speed_min# y轴为小车的运行方向,速度以y轴的值为基准if y < 0:back()elif y > 0:front()else:stop()returnt = abs(y) * 100.0 / rif t < 20:  # 电压太小,驱动不起来t = 20 d = math.atan2(x, y) * 180 / math.piif x < 0: # 往左边偏, 右轮的速度比左轮快t2 = t * (abs(90 + d) / 90)pwm_r.ChangeDutyCycle(t)pwm_l.ChangeDutyCycle(t2)elif x > 0: # 往右边偏, 左边的速度比右轮快t2 = t * (abs(90 - d) / 90)pwm_l.ChangeDutyCycle(t)pwm_r.ChangeDutyCycle(t2)print x, y, t, t2class CarController(tornado.web.RequestHandler):def get(self):with codecs.open('webcar.html', 'r', encoding='utf-8') as fp:self.write(fp.read())def post(self):r = int(self.get_argument('r'))x = int(self.get_argument('x'))y = int(self.get_argument('y'))run(x, y, r)self.write('ok')if __name__ == '__main__':app = tornado.web.Application([('/', CarController)], static_path='static', debug=True)app.listen(18080)tornado.ioloop.IOLoop.instance().start()

用树莓派制作智能小车相关推荐

  1. 使用树莓派制作智能小车

    电影里,时不时地可以看到一些这样的场景,一辆小车,上面装有摄像头,这辆小车可以通过电脑或都是手机进行远程遥控,车上摄像头拍到的画面,可以实时地显示在电脑或手机上,就像下图这样. 没有接触过这方面的朋友 ...

  2. 自写app与树莓派制作智能小车

    实现的功能有: 1.实现小车的前进,后退,左转,右转. 2.实时视频的传回,查看小车周围的情况. 3.摄像头的上下左右转动,使用舵机云台来实现. 需要的材料: 1.树莓派一个(带有python环境,现 ...

  3. 【毕业设计之树莓派系列】基于树莓派的智能小车设计

    基于树莓派的智能小车设计 摘要 随着人们对智能化生活的需求不断增长,智能小车的发展逐渐受到关注.然而,现有的智能小车硬件和软件设计有一定的局限性,需要进一步改进和完善.本文旨在基于树莓派PICO开发板 ...

  4. 树莓派制作遥控小车教程

    树莓派制作遥控小车教程 一.成品图 二.准备材料: 三.开始制作 1.接线 2.写程序 一.成品图 二.准备材料: 1.树莓派 2.充电宝 3.小车套件(底盘,车轮,电机,电池座) 4.导线,杜邦线 ...

  5. 基于树莓派的智能小车

    基于树莓派的智能小车 代码位置:Github地址 文章目录 基于树莓派的智能小车 一.简介 二.实验设备 三.前期准备 四.实验原理 4.1硬件调试 4.2 代码框架 4.3 代码实现 4.3.1 避 ...

  6. 【毕业设计】基于树莓派的智能小车设计 - 物联网 单片机 嵌入式 stm32

    文章目录 1 简介 2 实现功能 主控开发板:树莓派 电机和控制器 避障功能 3 实现效果 5 部分实现代码 6 最后 1 简介 Hi,大家好,这里是丹成学长,今天向大家介绍一个单片机项目 ** 基于 ...

  7. OpenCV + 树莓派制作智能车【1】

    前言 以前制作智能车都是在STM32上制作的,学习了一点OpenCV想要实践一下,一下就想到了买来一直在吃灰的树莓派,做一个智能小车吧! 黑线识别 我们先在Windows上写出基本能跑的检测代码: 首 ...

  8. 【记录】本科毕设:基于树莓派的智能小车设计(使用Tensorflow + Keras 搭建CNN卷积神经网络 使用端到端的学习方法训练CNN)

    0 申明 这是本人2020年的本科毕业设计,内容多为毕设论文和答辩内容中挑选.最初的灵感来自于早前看过的一些项目(抱歉时间久远,只记录了这一个,见下),才让我萌生了做个机电(小车动力与驱动)和控制(树 ...

  9. 【DIY】树莓派ROS智能小车

    最近手里有一辆 clb 的树莓派ROS履带小车,不过放了好久,功能有点问题,最近打算把小车重新拆装.清洗,软件也重新刷写,然后顺便记录以下功能调试的过程. 文章目录 一.简介 二.机械部分 三.电气部 ...

  10. 利用树莓派制作智能音箱

    制作智能音箱需要解决的问题,如下: 需要准备的器件(例如音箱.麦克风等) 代码实现问题(语音交互) 语音识别 语音唤醒功能 能够实现播放.暂停音乐(预先设好的音乐/链接网址播放在线) 讲故事.讲笑话( ...

最新文章

  1. 2019-03-20 Python爬取需要登录的有验证码的网站
  2. 2017可以兼容那些jdk_2019从头跃——核心基础:何为JDK?Java开发工具包须知总览...
  3. IPM: Product 270015453 not scheduled in sales organization
  4. html 01前沿-web介绍
  5. linux线程基础篇----线程同步与互斥
  6. 利用 dbghelp.dll 生成 dump 文件
  7. Linux 环境 zookeeper集群安装、配置、测试
  8. 【Mybatis-Plus】(四)分页、乐观锁插件 通用枚举 多数据源
  9. myeclipse 怎么安装与激活
  10. 基于CSE的微服务工程实践-多微服务框架演进
  11. pid和linux的关系,linux – bash pid和$$之间的区别
  12. vue list数组合并和插入数据
  13. 11.CSS border边框
  14. 当前五大浏览器内核及简史
  15. Linux编译Ralink无线网卡驱动
  16. 如何把map的value转为list_Java 8 将Map转换为List
  17. VS(Visual Studio)间接引用
  18. 项目管理PMP:项目绩效考核管理制度(全岗位流程图66页)
  19. Spring Cloud Alibaba Sentinel(七)受权规则 黑白名单
  20. js判断手机,邮箱格式是否正确

热门文章

  1. 加密狗破解加密狗复制
  2. 完美解决鼠标单击变双击问题^_^
  3. redhat linux iso下载
  4. Machine Learning: A Probabilistic Perspective——Chapter 1
  5. 已解决-电脑端HP Scan扫描无反应无法扫描
  6. 高通平台fastboot下载
  7. 使用Setup Factory把java应用打包成安装软件并更改默认安装路径
  8. B2B跨境电子商务平台综合服务解决方案 1
  9. 李开复给大学生的第7封信:21世纪最需要的7种人才
  10. 互联网晚报 | 7月6日 星期三 |​ 微信内测一个手机可注册俩号;度小满回应村镇银行储户存款变理财;市监局回应钟薛高雪糕烧不化...