#coding=utf-8
import RPi.GPIO as GPIO
import time
from Tkinter import *
from PIL import Image,ImageTk
import tkFileDialog as filedialog
import cv2
import threading#定义电机模块的GPIO口
PWMA=18 #调速端A(左)
IN1=11 #左前
IN2=12 #左后
PWMB=16 #调速端B(右)
IN3=13 #右前
IN4=15 #右后
#定义超声波模块的GPIO口
Trig=35 #发射端
Echo=37 #接收端
#定义红外循迹传感器GPIO口
LSenso=29
RSenso=31
#定义红外避障传感器GPIO口
L_Senso=40
R_Senso=36def init():#设置接触警告GPIO.setwarnings(False)#设置引脚模式为物理模式GPIO.setmode(GPIO.BOARD)#对四个电机进行初始化,将引脚设置为输出GPIO.setup(IN1,GPIO.OUT)GPIO.setup(IN2,GPIO.OUT)GPIO.setup(IN3,GPIO.OUT)GPIO.setup(IN4,GPIO.OUT)#调速端的初始化GPIO.setup(PWMA,GPIO.OUT)GPIO.setup(PWMB,GPIO.OUT)#超声波传感器引脚初始化GPIO.setup(Trig,GPIO.OUT) #将发射端引脚设置为输出GPIO.setup(Echo,GPIO.IN) #将接收端引脚设置为输入#红外循迹传感器引脚初始化,设置为输入,接受红外信号GPIO.setup(LSenso,GPIO.IN)GPIO.setup(RSenso,GPIO.IN)#红外避障传感器引脚初始化,设置为输入,接受红外信号GPIO.setup(L_Senso,GPIO.IN)GPIO.setup(R_Senso,GPIO.IN)#让小车前进
def turn_up(speed,t_time):L_Motor.ChangeDutyCycle(speed)GPIO.output(IN1,GPIO.HIGH)GPIO.output(IN2,GPIO.LOW)R_Motor.ChangeDutyCycle(speed)GPIO.output(IN3,GPIO.HIGH)GPIO.output(IN4,GPIO.LOW)time.sleep(t_time)#让小车后退
def turn_back(speed,t_time):L_Motor.ChangeDutyCycle(speed)GPIO.output(IN1,GPIO.LOW)GPIO.output(IN2,GPIO.HIGH)R_Motor.ChangeDutyCycle(speed)GPIO.output(IN3,GPIO.LOW)GPIO.output(IN4,GPIO.HIGH)time.sleep(t_time)#让小车向左转
def turn_left(speed,t_time):L_Motor.ChangeDutyCycle(speed)GPIO.output(IN1,False)GPIO.output(IN2,False)R_Motor.ChangeDutyCycle(speed)GPIO.output(IN3,GPIO.HIGH)GPIO.output(IN4,GPIO.LOW)time.sleep(t_time)#让小车向右转
def turn_right(speed,t_time):L_Motor.ChangeDutyCycle(speed)GPIO.output(IN1,GPIO.HIGH)GPIO.output(IN2,GPIO.LOW)R_Motor.ChangeDutyCycle(speed)GPIO.output(IN3,False)GPIO.output(IN4,False)time.sleep(t_time)#让小车停止
def car_stop():L_Motor.ChangeDutyCycle(0)GPIO.output(IN1,False)GPIO.output(IN2,False)L_Motor.ChangeDutyCycle(0)GPIO.output(IN3,False)GPIO.output(IN4,False)#超声波测距函数
def get_distance():GPIO.output(Trig,GPIO.HIGH) #给Trig发送高电平,发出触发信号time.sleep(0.00015) #需要至少10us的高电平信号,触发Trig测距GPIO.output(Trig,GPIO.LOW)while GPIO.input(Echo)!=GPIO.HIGH: #等待接收高电平passt1=time.time() #记录信号发出的时间while GPIO.input(Echo)==GPIO.HIGH: #接收端还没接收到信号变成低电平就循环等待(等高电平结束)passt2=time.time() #记录接收到反馈信号的时间distance=(t2-t1)*340*100/2 #计算距离,单位换成cmreturn distance#避障功能函数(超声波避障结合红外避障)
def bizhang():safe_dis=40 #设置一个安全距离while True:barrier_dis=get_distance() #获取当前障碍物的距离#当测得前方障碍物距离小于安全距离时,先让小车停止if (barrier_dis < safe_dis) == True:while (barrier_dis < safe_dis) == True:L_S=GPIO.input(L_Senso)R_S=GPIO.input(R_Senso) #接受红外避障传感器的信号#如果红外传感器检测到左边有障碍物,右边没有,小车向右转if L_S == False and R_S == True:print "左有障碍物先后退再右转"turn_back(18,0.5)turn_right(18,0.2)#如果红外传感器检测到右边有障碍物,左边没有,小车向左转if L_S == True and R_S == False:print "右有障碍物先后退再左转"turn_back(18,0.5)turn_left(18,0.2)#如果红外传感器检测到左右两边都有障碍物,小车后退if L_S ==False and R_S == False:print "两边都有障碍物后退"turn_back(18,0.5)#再次接收红外信号(说明刚才的路线已经不能再走,退到一定程度,小车就得左转或者右转,提前寻找新的路线)L_S=GPIO.input(L_Senso)R_S=GPIO.input(R_Senso)#退到左前和右前都没有障碍物的位置if L_S == True and R_S == True:print "右转"turn_right(18,0.2)#退到了右前没有障碍物的位置if L_S == False and R_S == True:print "右转"turn_right(18,0.2)#退到了左前没有障碍物的位置if L_S == True and R_S == False:print "左转"turn_left(18,0.2)#还没有退出刚才的死路,继续后退if L_S == False and R_S == False:print "后退"turn_back(18,0.5)#如果红外传感器检测到两边都没有障碍物,此时让小车后退一点,然后向右转if L_S == True and R_S == True:print "两边都没有障碍物,后退再右转"turn_back(18,0.5)turn_right(18,0.2)print barrier_dis,'cm'print ''barrier_dis=get_distance()else:#小车在安全区里内,但是由于超声波传感器无法检测到除了正前方其他方向的障碍物,所以在此接收红外信号,通过左前和右前有没有障碍物,来判断小车该怎样运行L_S=GPIO.input(L_Senso)R_S=GPIO.input(R_Senso) #接受红外避障传感器的信号#在安全距离内同时红外传感器检测到左前和有前方没有障碍物,小车前进if L_S == True and R_S == True:print "前方40cm内没有障碍物,且左前和右前方没有障碍物,前进"turn_up(18,0)#在安全距离内,但左前有障碍物,让小车后退,再右转if L_S == False and R_S == True:print "前方40cm内没有障碍物,左前有障碍物,右前方没有障碍物,后退右转"turn_back(18,0.5)turn_right(18,0.2)#在安全距离内,但右前有障碍物,让小车后退,再左转if L_S == True and R_S == False:print "前方40cm内没有障碍物,右前有障碍物,左前方没有障碍物,后退右转"turn_back(18,0.5)turn_left(18,0.2)#在安全距离内,但左前,右前都有障碍物,让小车后退if L_S == False and R_S == False:print "前方40cm内没有障碍物,左前,右前方都有障碍物,后退"turn_back(18,0.5)#再次接收红外信号(说明刚才的路线已经不能再走,退到一定程度,小车就得左转或者右转,提前寻找新的路线)L_S=GPIO.input(L_Senso)R_S=GPIO.input(R_Senso)#退到左前和右前都没有障碍物的位置if L_S == True and R_S == True:print "右转"turn_right(18,0.2)#退到了右前没有障碍物的位置if L_S == False and R_S == True:print "右转"turn_right(18,0.2)#退到了左前没有障碍物的位置if L_S == True and R_S == False:print "左转"turn_left(18,0.2)#还没有退出刚才的死路,继续后退if L_S == False and R_S == False:print "后退"turn_back(18,0.5)print barrier_dis,'cm'print ''#红外循迹函数
def track():while True:#接收两个红外传感器的信号LS=GPIO.input(LSenso)RS=GPIO.input(RSenso)#左右两个传感器都检测到黑色,小车在赛道上,前进if LS==True and RS==True:print "前进"turn_up(16,0.1)#左边的传感器没检测到黑色,说明小车车身偏离赛道靠左,右转将小车车身向右调整elif LS==False and RS==True:print "右转"turn_right(18,0.1)#右边的传感器没检测到黑色,说明小车车身偏离赛道靠右,左转将小车车身向左调整elif LS==True and RS==False:print "左转"turn_left(18,0.1)#两个传感器都没有检测到黑色,说明小车完全偏离赛道,停止else:print "停止"car_stop()#清除GPIO占用
def gpio_clean():print "清除GPIO占用"GPIO.cleanup()#创建线程执行避障函数
def Thread_bizhang():thread_bizhang=threading.Thread(target=bizhang)thread_bizhang.start()#创建线程执行循迹函数
def Thread_track():thread_track=threading.Thread(target=track)thread_track.start()#创建线程执行清理GPIO函数
def Thread_gpio_clean():Thread_gpio_clean=threading.Thread(target=gpio_clean)Thread_gpio_clean.start()#控制界面函数
def ConInterface():#播放本地视频的函数def playLocalVideo():moviePath=filedialog.askopenfilename() #文件对话框,用来打开文件夹,选择文件print(moviePath)playBtn.place_forget() #隐藏播放按钮movie=cv2.VideoCapture(moviePath)waitTime= 1000/movie.get(5) #获取每帧需要的时间print(waitTime)movieTime = (movie.get(7) / movie.get(5))/60 #用视频文件的总帧数除以视频文件的帧速率得到视频的总时长,并换算成分钟print(movieTime)playSc.config(to=movieTime)while movie.isOpened():ret,readyFrame=movie.read() #read()返回两个值,ret 表示帧是否为空,readyFrame表示当前帧if ret==True:movieFrame=cv2.cvtColor(readyFrame,cv2.COLOR_BGR2RGBA) #校正颜色newImage=Image.fromarray(movieFrame).resize((675,360)) #调整大小newCover=ImageTk.PhotoImage(image=newImage)video.configure(image=newCover)  #将图像加入到video标签中video.image=newCovervideo.update()cv2.waitKey(int(waitTime)) #播放完每帧等待的时间else:break#使用opencv调用树莓派摄像头def playVideo():playBtn.place_forget()  #点击播放按钮之后开始播放视频,隐藏按钮movie=cv2.VideoCapture(0)  #打开摄像头movie_fps=movie.get(5)  #得到画面的帧速率print(movie_fps)waitTime=int(1000/movie_fps)print(waitTime)while movie.isOpened():#读取帧,返回布尔值和当前帧,ret 表示帧是否为空,readyFrame表示当前帧ret,readyFrame=movie.read()if ret==True:#校正图像颜色movieFrame=cv2.cvtColor(readyFrame,cv2.COLOR_BGR2RGBA)#设置图像大小newImage=Image.fromarray(movieFrame).resize((675,360))#将照片设置成和tkinter兼容的图像newCover=ImageTk.PhotoImage(image=newImage)#将图像放入Label中video.configure(image=newCover)video.image=newCovervideo.update()cv2.waitKey(20)else:breakmovie.release()   #释放资源#设置线程执行播放视频程序def Thread_playVideo():thread_playVideo=threading.Thread(target=playVideo)thread_playVideo.start()root=Tk() #初始化tkroot.title("控制界面")     #设置标题root.geometry("1080x720")  #设置窗口大小root['bg']="#333333"       #设置窗口背景颜色#root.iconbitmap('/home/pi/ZRcode/go.ico')root.resizable(width=False,height=False)    #设置窗口长和宽是否可以变化#分别设置三个Frame 模块用于存放Label,Buttonvideof=Frame(root,height=360,width=675,cursor="cross")videof.place(x=199,y=0)f1=Frame(root,height=270,width=540,cursor="circle",bg="#333333")f1.place(x=269,y=359)f2=Frame(root,height=180,width=540,cursor="plus",bg="#333333")f2.place(x=269,y=629)#视频窗口movieImage=Image.open('/home/pi/ZRcode/raspberry.jpg').resize((675,360))cover=ImageTk.PhotoImage(image=movieImage)video=Label(videof,width=675,height=360,bd=0,bg="pink",image=cover)video.place(x=0,y=0)#播放按钮的布局iconImag=Image.open('/home/pi/ZRcode/play.ico').resize((32,32))icoBtn=ImageTk.PhotoImage(image=iconImag)playBtn=Button(videof,image=icoBtn,cursor="hand2",command=Thread_playVideo,relief="groove")playBtn.place(x=319,y=159)#playSc=Scale(videof,from_=0,to=90,length=675,orient=HORIZONTAL,resolution=0.2,showvalue=0,bd=0,cursor="hand2",troughcolor="white")#playSc.place(x=0,y=310)#控制按钮up=Button(f1,text="前进",command=lambda:turn_up(20,1),activeforeground="green",activebackground="yellow",height=1,width=4)up.place(x=267,y=39)left=Button(f1,text="左转",command=lambda:turn_left(20,1),activeforeground="green",activebackground="yellow",height=1,width=4)left.place(x=132,y=134)right=Button(f1,text="右转",command=lambda:turn_right(20,1),activeforeground="green",activebackground="yellow",height=1,width=4)right.place(x=412,y=134)back=Button(f1,text="后退",command=lambda:turn_back(20,1),activeforeground="green",activebackground="yellow",height=1,width=4)back.place(x=267,y=230)stop=Button(f1,text="停止",command=car_stop,activeforeground="green",activebackground="yellow",height=1,width=4)stop.place(x=267,y=134)xunji=Button(f2,text="循迹",command=Thread_track,activeforeground="green",activebackground="yellow",height=1,width=4)xunji.place(x=68,y=44)bz=Button(f2,text="避障",command=Thread_bizhang,activeforeground="green",activebackground="yellow",height=1,width=4)bz.place(x=461,y=44)over=Button(f2,text="OVER",command=Thread_gpio_clean,activeforeground="green",activebackground="yellow",height=1,width=6)over.place(x=263,y=44)root.mainloop()#主函数
if __name__=="__main__":init()L_Motor=GPIO.PWM(PWMA,100)L_Motor.start(0)R_Motor=GPIO.PWM(PWMB,100)R_Motor.start(0)try:ConInterface()except KeyboardInterrupt:GPIO.cleanup()      #清除GPIO占用

树莓派小车————全部代码相关推荐

  1. 用玩游戏的方式操控树莓派小车之[代码部分].2

    目录: 目录 目录: 前言: 心路历程: 编程部分: 第一部分: 第二部分: 前言: 书接上回啊,上回不是说到,我想通过用操作游戏的方式来操作这个小车.那么这个编程部分呢,就分为两部分,第1部分就是怎 ...

  2. 树莓派小车python代码_【树莓派】树莓派小车(二)树莓派、小车和红外线模块连接...

    上一篇文章介绍了小车底盘以及驱动板的安装,这一次来讲一讲树莓派与驱动板以及红外线模块的安装. 树莓派的GPIO引脚定义: 树莓派的GPIO引脚共分为两种类型,一种是PHYSICAL NUMBERING ...

  3. 树莓派python编程小车_树莓派小车教程(三)——软件代码

    原标题:树莓派小车教程(三)--软件代码 树莓派小车教程(三)--软件代码 2017-07-07 琳小豆 HelloWorld少儿编程 树莓派小车教程 (三) 在上一次教程中,我们已经完成了硬件连接. ...

  4. 树莓派小车python操作流程--龙邱科技

    ▌第一部分 环境解决 1.1 软件版本 发货前已经配置好软件环境: Linux raspberrypi 5.4.51 Python 3.7 OpenCV-python 3.4.6.27 1.2 TF卡 ...

  5. 树莓派小车————远程控制

    这里所说的远程控制,是指一台PC通过一个界面可以达到控制并监视小车的目的.当然你也可以设计红外遥控,蓝牙等方式. 在设计界面时我选择了python自带的GUI工具----Tkinter. 选择Tkin ...

  6. DIY树莓派小车(一)树莓派4B+TB6612FNG驱动直流电机

    趁着暑假时间充裕,准备制作一辆简易的树莓派小车,让树莓派不再吃灰,写此文记录折腾的过程. DIY树莓派小车(一)树莓派4B+TB6612FNG驱动直流电机 小车需求简要介绍 采用双轮差速方式移动 双轮 ...

  7. 树莓派 小车java_树莓派小车之前进和后退(创乐博套件)

    树莓派小车之前进 买了一个树莓派小车的配件,当然,有二次开发板板,不过原理相同. 买的板子是创乐博的智能小车套件. 以下代码来自其指导文件,但是文件都是英文,没有代码讲解,导致很难看得懂.本人重新写了 ...

  8. 以前不懂事现在只想搞钱,从0-1搭建一个树莓派小车

    项目来源背景 自从上了大学,感触很多,身为一个计算机系的小白,见识到了大佬们的学识渊博,就此下定决心,要向他们不断的靠近(身为一个什么也不懂的小白,难免都不太愿意跟我交流).起初真正意义上认识树莓派是 ...

  9. 树莓派小车,从基础上手到完整工程(二)——麦克纳姆轮

    搭一个树莓派小车 树莓派小车 麦克纳姆轮 树莓派小车 麦克纳姆轮 po一张原理图,安装的时候注意轮子方向. 我把电机控制部分的代码大致封装了一下,后续可以自行添加其他功能. motor.py impo ...

最新文章

  1. 脑智前沿科普|虚拟现实如何欺骗你的大脑
  2. webpack4 高手之路 第四天
  3. api zabbix 拓扑图 获取_Zabbix报表系统
  4. python 提取前五行_Pandas 1:如何在Python中载入数据集
  5. 计算机专业比重点线高40多分,这3所211大学,超过一本线40分就可报考,性价比高,值得报考...
  6. [java设计模式简记] 观察者模式(Observer-Pattern)
  7. hdu 1161 Eddy's mistakes
  8. php多个表中查找数据_Excel实战技巧74: 在工作表中创建搜索框来查找数据
  9. 由比特币想到的货币那些事儿
  10. 新浪微博***事件分析
  11. xshell 自动断开解决方法
  12. 发的楷体怎么写_公布婚期朋友圈怎么发 发结婚通知朋友圈注意哪些
  13. oracle如何做定时任务,oracle实现定时任务
  14. 微分几何中映射的二度理解
  15. 计算机系统维护课程设计报告,计算机系统维护工程(第2版)
  16. python实现指数增长
  17. 3.2 向量的线性关系、线性相关线性无关
  18. ubuntu 16.04 和 18.04 替换apt源为阿里源
  19. Wine零知识学习1 —— 介绍
  20. UCAS - AI学院 - 自然语言处理专项课 - 第7讲 - 课程笔记

热门文章

  1. Balanced Multimodal Learning via On-the-fly Gradient Modulation论文笔记
  2. c语言蚂蚁搬,关于蚂蚁搬食的作文
  3. 直到输到-1停止 c语言,python新人求助raw_input()问题,不断提示输入字元或数字直到输入空值停止提示。...
  4. 利用百度身份证识别服务和python语言实现身份证信息的提取和保存
  5. 深入浅出Oracle Spatial
  6. c语言中begin用法,C++ deque cbegin()用法及代码示例
  7. AlignedReID
  8. linux开机启动界面异常,Linux 界面不能启动的解决
  9. 如何设置Sketch快捷键,Sketch提升效率的常用技巧
  10. 摔手机问题--第九届蓝桥杯