实现的功能有:
1.实现小车的前进,后退,左转,右转。
2.实时视频的传回,查看小车周围的情况。
3.摄像头的上下左右转动,使用舵机云台来实现。

需要的材料:
1.树莓派一个(带有python环境,现在的好像都有自带python环境)。
2.安卓手机一部,用于安装写的APP。
3.杜邦线若干。
4.L298N电机驱动模块(某宝9块钱一个)。
5.舵机云台一个(某宝有卖散件,买来自己装,20几块钱)。
6.车架一个(同样某宝…).
7.充电宝一个,用于树莓派供电,和L298N电机驱动模块供电,虽然L298N标的是12V的电源,但是5V也能使用。
8.电脑一台。


   首先要实现手机app与树莓派的通信,这样才能实现对树莓派小车的控制。首先想到的就是socket通信,简单易懂,但是写的时候还是遇见了很多的问题,下面会说到。这篇文章只介绍实现app控制小车的前进后退左转右转。整体的思路就是:手机app向树莓派发送不同的指令,树莓派根据不同的指令进行指定的相应,来控制车体的运动。

一、车体的组装以及连线这里就不仔细介绍了,这种东西还是比较简单的。要注意的是将从树莓派引出的GPIO引脚要记好,编程的时候还要用。其中L298N驱动的作用就是来为带动小车运动的电机提供足够的电源。

二、下面就是app进行编程了,这里使用的是Android studio,如何安装,与配置环境百度一下都有,这里就不介绍了。下面拿控制小车前进作为一个例子进行解释一下:

@Overridepublic void onClick(View v){if (v.getId() == R.id.forward){forward.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent motionEvent){//抬起操作if (motionEvent.getAction() == MotionEvent.ACTION_UP) {sendRequestWithHttpURLConnection1();}//按下操作if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {sendRequestWithHttpURLConnection();}//移动操作if (motionEvent.getAction() == MotionEvent.ACTION_MOVE) {}return false;}});}}
 上面的代码是来监控你在app中按下了那个按键,如果是前进键,按下时调用sendRequestWithHttpURLConnection()函数向树莓派发送指令,抬起按键时向树莓派在此发送指令。其中sendRequestWithHttpURLConnection()这个函数很重要,在写时遇到了很多的问题,主要就是在UI线程和通信socket线程的处理上,UI线程中不能使用socket通信必须要重新创建一个线程来进行通信。

重点内容

  private void sendRequestWithHttpURLConnection(){new Thread(new Runnable(){@Overridepublic void run() {int PORT = 1;InetAddress addr = null;try{addr = InetAddress.getByName("192.168.31.6");//此处是树莓派的IP地址。}catch (UnknownHostException e){e.printStackTrace();}Socket socket = new Socket();try{socket.connect(new InetSocketAddress(addr, PORT), 30000);socket.setSendBufferSize(100);BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));out.write("forward");out.flush();}catch (SocketException e){e.printStackTrace();}catch (IOException e){e.printStackTrace();StringBuilder response = new StringBuilder();String line="Iot";response.append(line);showResponse(response.toString());}finally{try{socket.close();}catch (IOException e){e.printStackTrace();}}}}).start();}
   上面的代码就是socket编程的关键所在,这只是前进指令的发送代码,还有其他的指令的发送代码,几乎都是相同的,只是把write()括号中的内容改一下就行了。每次按下一个按键,就发送一个指令,使得树莓派的GPIO改变状态。每次抬起按键都发送停止的指令,使得小车停下来。

三、树莓派部分的代码
树莓派的代码使用python写的,它的作用是来对手机发送来的指令进行处理。
分为两部分,一部分是用来封装小车的控制代码,一部分是用来识别接收到的指令,调用第一部分的代码。
第一部分代码:
重点内容

import threading
import RPi.GPIO as GPIO
import timeclass Info:@staticmethoddef p(message):print 'Info: '+message class Wheel:pins ={'a':[13,15],'b':[16,18]}def __init__(self,name):self.name = nameself.pin = Wheel.pins[self.name]GPIO.setmode(GPIO.BOARD)GPIO.setup(self.pin[0],GPIO.OUT)GPIO.setup(self.pin[1],GPIO.OUT)self.stop()def st(self):print 'ss'def forward(self):Info.p('wheel ' + self.name + ' is forwarding')GPIO.output(self.pin[0],GPIO.HIGH)GPIO.output(self.pin[1],GPIO.LOW)def stop(self):GPIO.output(self.pin[0],False)GPIO.output(self.pin[1],False)def back(self):Info.p('wheel ' +self.name + ' is backing')GPIO.output(self.pin[0],False)GPIO.output(self.pin[1],True)class Car:wheel=[Wheel('a'),Wheel('b'),Wheel('c'),Wheel('d')] @staticmethoddef init():GPIO.setmode(GPIO.BOARD)Info.p('initialize the smart car ....')     Info.p('Smart car is ready to fly!')@staticmethoddef forward():Info.p('go straight forward')for wheel in Car.wheel:wheel.forward()@staticmethoddef left():Info.p('turn left ')Car.wheel[0].forward()  Car.wheel[1].back()@staticmethoddef right():Info.p('turn left ')Car.wheel[0].back()Car.wheel[1].forward()@staticmethoddef bleft():Info.p('turn left ')Car.wheel[2].back() @staticmethoddef stop():Info.p('turn left ')Car.wheel[0].stop() Car.wheel[1].stop() @staticmethoddef back():Info.p('go straight back')for wheel in Car.wheel:wheel.back()@staticmethoddef lforward():Info.p('go forward and turn left')@staticmethoddef rforward():Info.p('go forward and turn right')@staticmethoddef lback():Info.p('go back and turn left')@staticmethoddef rback():Info.p('go back and turn right')@staticmethoddef stop():Info.p('try to stop the car ...')for wheel in Car.wheel:wheel.stop()    @staticmethoddef bark():Info.p('try to slow down the car ...')@staticmethoddef speedup():Info.p('try to speed up the car ...')if __name__ =='__main__':print '....'

第二部分代码:

```python
from socket import *
import sys
import time
from car import *
def run_raspberry():commands ={'forward':Car.forward,'back': Car.back, 'stop': Car.stop,'left':      Car.left,'right': Car.right}PORT = 1s= socket(AF_INET, SOCK_STREAM)s.bind(("", PORT)) #对所有的ip都能接收。s.listen(1)print ('raspberry pi is listening on port 8888')while 1:conn, addr = s.accept()print ('Connected by:', addr)while 1:command= conn.recv(1024).replace('\n','')if not command or command not in commands:breakcommands[command]()conn.close()if __name__ == '__main__':run_raspberry()```只需运行run_raspberry.py这个代码就可以了。后续功能的实现,将在后面的博客中更新。

参考了一下这个博客:
http://blog.csdn.net/AMDS123/article/details/70595127?locationNum=2&fps=1

自写app与树莓派制作智能小车相关推荐

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

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

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

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

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

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

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

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

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

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

  6. WIFI小车APP远程控制,无线智能小车之ESP8266例程

    WIFI小车无线远程控制,智能小车之ESP8266例程 第一.原理讲解 第二.小车改装 第三. ESP8266 例程代码 第四.WIFI配网 程序测试 第五.安卓app制作 第一.原理讲解 原理简述: ...

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

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

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

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

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

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

最新文章

  1. spring remoting源码分析--Hessian分析
  2. C语言编译:CMakeLists.txt语句【01】
  3. 调用第三方接口的几种请求方式
  4. 美国城市_泡泡图如何揭示美国最适合居住的城市
  5. go java nodejs 速度对比_除了node.js,Java、Python、Go 哪个适合web前端工程师
  6. 震惊!腾讯要建AI鹅厂,百度让狗刷脸购物,锤子R-1真机披露
  7. 【.Net】win10 uwp unix timestamp 时间戳 转 DateTime
  8. 云输入法linux版,ubuntu云输入法ibus cloud pinyin
  9. 桌面上的图标不见了怎么办?小技能分享
  10. 机器学习笔试题精选(六)
  11. iOS 史上最全App上架流程分享
  12. graylog+kafka+zookeeper(单机测试及源码),kafka+zookeeper组件部署(二)
  13. 怎样用JS实现关闭当前窗口
  14. Python爬取马蜂窝各城市游记总数
  15. Codeforces 31d 题解
  16. 关于C#操作Word时的版本问题
  17. Python实现进制转换器
  18. 戴尔Precision 7540 Compal EDA50 LA-H271P Rev1.0(A00)笔记本图纸
  19. 云原生服务网格Istio:原理、实践、架构与源码解析
  20. 大律法(OTSU) ——图像数据二值化

热门文章

  1. 深度学习在医学图像配准中的应用
  2. 西湖大学开学:新生每月5000元补助,AI博士研究永生课题
  3. CPCI-5565PIORC-110000反射内存板卡
  4. idea全局查找快捷键与win10 的快捷键冲突,导致idea不能被使用
  5. inkscape安装(ubuntu 16.04)
  6. 西雅图本土独角兽盘点(二)
  7. 威动服务器如何添加文件,超级简单搭建自己的私人影视库
  8. 如何判断素数(C++版)
  9. Kafka pixy
  10. Drupal实战(think in Drupal 2,3合集)正式出版了