论文在线分享-基于树莓派及Python的智能车设计-CNKI知网查重网站

论文在线分享-基于树莓派及Python的智能车设计

2021-06-10 11:53:49
作者:杭州千明

  随着智能车领域发展和进步,传统单片机在人工智能、深度识别和AI算法等方面略显不足。由此树莓派作为一种微型电脑主板被设计问世。其内置的诸多功能搭配上Python语言能在智能小车领域起到更好的应用和探索。本文将应用树莓派3b+以及Python语言作为主体在智能车系统的应用上做深入的探索和研究。硬件上,利用树莓派主板上的40个GPIO引脚搭配Makerobo树莓派驱动扩展版作为模块的主要输出。对智能车系统的电源模块、通讯模块、循迹避障模块、舵机超声波测距模块、舵机摄像头云台和电机驱动模块进行了研究。在软件上,将树莓派上的蓝牙通讯模块以及扩展版上红外信号接收器作为主要的信号输入。在软件程序编译上以树莓派自带的wifi信号和FileZilla软件对与pc端的无线传输功能进行了研究应用。以树莓派系统镜像工具VNC viewer和Notepad++软件作为程序编写和控制软件。同时,对不同模块的Python程序编写和所有模块的程序和原理次序上的整合进行了调查研究。

  随着人工智能领域的不断地发展和成熟,在现今这样一个人们生活生产需求水准不断提升的时代。要求人工智能对社会反哺和结合生产实际应用的呼声越来越高。并且,人工智能在智能制造领域的应用发展已经初具端倪,其给企业生产带来的巨大优势和效益也正在不断地反向推动智能制造领域的探索和前进,技术研发和企业应用也逐步的形成了人工智能的市场化,推进了智能制造领域的长期发展。与此同时,人工智能在社会服务业上的发展和应用略显不足,让高新技术平民化与人们的实际生活结合在一起在当下掀起了一股新的热潮。智能点餐、智能送餐和智能家居等理念也被正式被大众关心和认可。由此智能机器人和智能小车以其小巧实用的优势正在餐饮服务行业和家庭应用上凸显出来。

  一直以来智能小车都是以1980年intel公司发布的8位MCS-51单片机及32位单片机作为主要的研发设计主板。该类型主板的优势在于数据处理技术能力和运算能力较强,而低电压,抗干扰能力强等优点在应用也比较实用。主要缺点也比较明显,编译语言单一、单片机内集成资源较少和运行速度较慢等问题。而树莓派作为一种微型电脑问世于2012年。拥有键盘、网线和鼠标,以及通过视频进行模拟输出和HDMI高清视频内容输出数据接口等功能。并且自带有双频Wi-Fi和蓝牙5.0等功能。最为主要的是,树莓派可支持现今大多数主流的编程语言和环境。如Java、BBC BASIC、C、perl和Python等语言。

  而在餐饮行业通过智能送餐车来实现对顾客的送餐服务,是一项来源于生活生产实际并且处于新兴产业状态的新的构想。该智能车设计可分为三大部分:红外控制及通讯控制部分、传感器模块检测部分、树莓派执行运算部分。本设计主要利用树莓派系统为基础以及当下热门的Python语言建立程序。并辅以手机与树莓派的信息通讯技术以及红外遥控功能来实现送餐车的主要功能。加之自动循迹、自动避障与图像采集识别等功能构成一个完善的结构。来实现一个与顾客建立联系并获取位置、自主循迹送餐并返回的智能小车。

  2.设计思路及语言器件介绍

  这款树莓派智能小车使用TCRT5000红外传感器作为跟踪模块,3c-go红外对管传感器和HC-SR04超声波传感器为避障模块。辅以Makerobo树莓派驱动扩展版提供电源供电模块,舵机和直流减速电机驱动模块并根据树莓派的40个GPIO引脚给出相对应的模块和电路解决方案。信息通讯拟采用树莓派自带的蓝牙模块为基础与用户手机App建立通讯关系或直接拟用红外遥控技术提供目标点的信息。同时,本设计也拟采用摄像头云台通过对不同目标点的二维码的采集进行静态识别,通过二维码内置的信息来校验并反馈目标点位置是否正确。

  2.1 Raspberry Pi 3代+主板

  Raspberry Pi 3b+中国版本e14型号由Raspberry Pi基金会行于2017年的一个版本。在2012年发行之初树莓派是一个基于Linux开源系统只有一张 周片大小的微型电脑。现如今,在微软公司的努力下,树莓派运行Windows桌面系统已经有了解决方案。树莓派与传统的嵌入式微型控制器主板的差别在于,其不仅可以完成管脚的输入输出操作,还能运行除官方通用系统之外的针对Linux、物联网、Ubuntu MATE等系统。并且,其程序编译通过C语言,Python、Java和Perl等均可在其环境中编写和运行。通过树莓派配备的Web服务器及WiFi等应用程序,我们也可以外接键盘鼠标、屏幕和(有线或无线)网络为辅建立一个类似于PC平台的Linux桌面系统。

  Raspberry Pi 3b+主要包含的模块功能数据如下:

  (1)CPU:采用Broadcom BCM2837BOSOC芯片,集成四核ARM Cortex 64位1.4GHz处理器;

  (2)WiFi网络:802.11AC无线。2.4GHz/5GHz双频wifi。支持802.11b/g/n/ac;

  (3)以太网Poe:通过额外的HAT以太网poe供电。可实现千兆以太网;

  (4)蓝牙通讯模块:蓝牙4.2标准,设备可以直接通过IPv6和6LOWPAN接入互联网;

  (5)内存:1 GB Lpddr2 Sdram;

  (6)电源管理IC:Microchip lan7515;

  (7)主要接口:HDMI,3.5mm模拟音频视频插口,4×USB2.0,以太网,Micro SD插槽;

  (8)其他接口:40个GPIO引脚,扩展双排针插针(PoE)接口,CSI相机接口,DSI显示屏;

  树莓派实物图21所示。

  图21树莓派实物图

  2.2 Python编译语言

  Python是一门简便易懂、面向操作对象,带有一个动态语义的解释型高级管理程序设计语言。其本身便有简单易学、免费开源、可移植性强和具有丰富的库等优点。并且,树莓派本身含有Python编译开发环境、JAVA和C语言等编译环境等。在树莓派的桌面版镜像文件VNC viewer远程控制软件当中便自带有一个Python2.7软件。可在线支持程序的编写运行。也可以利用Notepad++软件编译Python程序,同时搭配File Zilla免费开源FTP软件起到文件无线传输下载的作用。

  在搭建编译操作环境初期,需要PC端与树莓派的自己产生的WiFi信号相连接,树莓派热点 周称为:CLB-P14。找到树莓派的IP地址,即树莓派的服务器地址,这个设计中的raspberry pi ip地址是:10.3.141.1。对应树莓派账号密码为:raspberry。

  VNC viewer镜像桌面操作软件与File Zilla文件传输软件在PC端的登录均需要电脑提前与树莓派的热点相连接。并且输入IP地址以寻找树莓派服务器起到无线连接传输编程控制功能。由此WiFi信号的稳定便直接影响着PC端软件运行的稳定性,可以采用增加一个WiFi信号增强接收器稳定WiFi连接;每次树莓派智能小车运行时由于电机等运行时导致电压变化也可能影响树莓派WiFi信号的稳定,可以在每次编译控制之前让树莓派供电模块满电源运行。

  2.3 Makerobo树莓派驱动扩展版

  本次采用的Makerobo树莓派驱动扩展版3A电流芯片独立供电,并且相应的支持C、Python操作库,专用芯片独立完成。极大的分担了树莓派CPU的资源和运算。同时双电机芯片供电,能够在智能小车运行时保持电流的平稳输出。其扩展版不仅将树莓派自带的40个GPIO引脚单独扩展出40个IO接口外,还将其扩充出若干个模块。包括红外接收模块、循迹模块、避障模块和四路电机驱动接口等等。为防止小车运行时电压的不平稳导致树莓派WiFi连接断开。本扩展版也给出了电压表检测模块方便随时监控智能车的电压。

  其他模块及接口如图22所示:两路供电模块接口、IO复用接口、16路PWM控制接口以及树莓派40个GPIO引脚的引申扩展IO接口等等。

  图22Makerobo树莓派驱动扩展版模块分布图

  2.4循迹避障及测距模块

  (1)TCRT5000跟踪模块使用红外反射传感器。其有效的反射检测距离约为:0.1cm至2.5cm之间。输出原理依靠数字开关变量比较器,使用宽电压LM393比较器。红外二极管连续地发射的红外线操作时,当发出信号的没被反射或反射后接收的信号比较弱时,红外接收器处于关断状态,模块的管脚输出为高电平,传感器指示灯未亮起;当检测到的物体在有效范围内,红外线被反射接收且信号较强时,红外线接收管饱和,则模块管脚输出为低电平,点亮传感器指示灯。

  (2)避障模块使用3c-go的模块,LM393型比较器。有效可调范围在2cm-30cm左右。该传感器对外界光线适应能力较好,35度的检测角,其具有一个红外线发射管与一个接收管。运行时发射出红外线,当模块探测出前方障碍物时,模块上绿色指示灯点亮,同时OUT端口持续输出低电平。此传感器的探测范围可以通过电位器调节,电位器顺时针转动时探测距离更加广泛;电位器逆时针转动时,探测范围变小。该避障模块输出OUT管脚直接与树莓派GPIO口连接或者驱动一个5V继电器;其VCC与GND接口分别与树莓派的电压或接地GPIO口相连。

  (3)超声波测距模块采用的为HC-SR04型号,该传感器探测距离约为:2cm—450cm左右,感应角度在15度以内。其使用IO触发测距原理,即当给出10us以上的高电平信号时,模块会立即发出8个40 kHz的方波,自动检测是否有返回信号被接收;当接收到信号返回时,通过ECHO口输出一高电平,高电平持续的时间就是超声波从发射到返回的时间。

  2.5直流减速电机及舵机摄像头云台

  (1)驱动方案设计采用DC3V-6V直流减速电机。驱动方案采用双TB6612FNG直流电机驱动模块,其芯片中内置有MOSFET-H桥结构,其工作温度在-20摄氏度~85摄氏度左右可通过双通路电路输出同时驱动2个电机。TB6612FNG每个通道输出的连续驱动电流最高可达到1.2 A,并且能实现电机的正反转/制动/停止等行驶模式;PWM支持频率高达100 kHz,芯片内含有低压检测电路与热停机保护电路;其引脚主要功能为控制信号输入输出、电机驱动电压输入和逻辑电平输入端等。

  (2):双舵机自由度摄像头云台利用高清摄像头为信息采集输入,辅以TS90A舵机:该舵机使用6V/3A电流供电,舵机最大角度为180°。舵机系统运行时:需给出20毫秒的时基脉冲,给出的脉冲高电平部分时间大概在0.5毫秒至2.5毫秒范围内来构成控制角度的脉冲组成部分,总时间间隔为2毫秒。对应控制关系为:0.5毫秒时为0度;1.0毫秒时为45度;1.5毫秒时为90度;2.0毫秒时为135度;2.5毫秒时为180度。

  3.智能车总体硬件设计

  3.1硬件系统结构图

  该智能车系统利用Raspberry Pi 3b+e14中国版本为主要控制主板,外接Makerobo树莓派驱动扩展版、二维码信息采集摄像头以及自带WiFi与PC端建立无线控制桌面用以实现实时Python语言程序的编译和运行。同时,用其自带的蓝牙模块与手机串口通信APP建立联系实现信息输入。Makerobo树莓派驱动扩展版主要用于实现红外遥控模块、直流电机与伺服舵机驱动模块、两路避障模块、三路循迹模块以及超声波测距输入模块等的控制和编译调试功能。

  该系统硬件构成如图31所示。

  图31系统硬件构成图

  3.2硬件控制系统结构框图

  本设计采用4000mAH容量的7.4V大功率锂电池为整个智能车系统供电,同时扩展版上的供电模块会以3A电流稳定输出为直流减速电机和树莓派主板系统供电。当红外遥控模块或者蓝牙传输模块接收到来自外界的输入信号时,中央处理单元会立即将信号转化为已经内置好的位置信息并调出相应的程序;此时循迹模块按照预先设定好的黑色路线从出发点向目标点进行循迹。扩展版当中的电机和舵机驱动模块会相应工作。当超声波模块远处有障碍物时会立即反馈输入给中央处理单元,同时左右两个近点避障模块也会将检测到的左右障碍物情况反馈给系统,智能车系统会相应的调出程序控制电机驱动模块做出左转或者右转的反应。当到达目标点时,摄像头采集模块会对不同目标点出预先设置的二维码做出相应的扫描并识别出位置信息,中央处理单元会根据摄像头采集的位置信息与之前红外或蓝牙给出的位置信息做出比对与校验。当位置信息无误时,智能车系统会停在目标点一定时间后自动返回。

  图32系统硬件结构框图

  3.3树莓派主板GPIO引脚图

  树莓派总共提供了40个GPIO引脚。意为通用输出输入端口。如下图所示,树莓派对每一个GPIO引脚都做了PIN#和NAME得两种命 周。其中PIN#代表的是该引脚得编号,也成为物理引脚;由于树莓派采用BCM系列处理芯片,所以NAME则代表得是该引脚得BCM 周称以及默认的功能,它与博通芯片上的信道编号是对应的,使得我们在编写程序时能更加的直观便捷。其中Pin01引脚提供了3.3V电压的电源输出,Pin02与Pin04引脚则提供了5V的电压输出。此外GPIO端口还有7个通用管脚:Pin11、Pin12、Pin13、Pin15、Pin16、Pin18、Pin22以及一个默认时钟信号引脚(也可做一般用途)的引脚Pin7。这八个引脚可以在正电压3.3V以及0V或接地状态间设置,可用于程序或组件的编写和操作。UART串行总线接口Pin8与Pin10。SPI总线引脚19、21和23以及引脚24与26芯片选择引脚。还包括接地引脚Ground:第6、9、14、25、30、34、39等六个引脚。I2C总线接口Pin3与Pin5引脚等总共40个引脚。

  图33树莓派GPIO引脚图

  3.4树莓派扩展版模块电路引脚图

  (1)电源模块:

  包括两个电源接口、一个电压表接口以及充电适配器接口等四个输入端。总共有LM1085和LM2596两个控制芯片。LM1085是一种集成单电子芯片工作电压信号转换器。可以稳定输出3A电流;同时具有过流保护和过温保护功能。主要为舵机提供9V转至5V/3A的电流保障。LM2596主要为一块稳压开关集成电路。其具有较完善的保护电路和热关断电路,主要为树莓派整个系统以及四路直流减速电机供电,稳定输出3A电流。

  图34电源模块电路引脚图

  (2)红外接收模块:

  主要原理是通过晶体管对IC编码进行放大和调制,然后通过红外发射器(940nm波长)将电信号(脉冲波)转化为光信号发送到外界。而本设计使用的红外接收模块主要由光电二极管+红外接收IC组成,内置在树莓派专用扩展版当中,其使用的树莓派引脚为GPIO4。所述光电二极管接收发射的转换成电信号(微安级电流)的红外光信号,接收后输入到IC被放大的电信号后-增益-过滤器-解调-还原后成形,将遥控器原始编码通过在接收头输出信号到输入引脚GPIO4树莓派代码识别程序之中。在未接收到红外信号时,接收管处于关断状态,扩展版接收到持续的高电平;当接收管接收到红外信号时,扩展板接收到低电平。当按键被按下时,按键对应的编码脉冲就会被树莓派所接收到,通过解析该脉冲,就能知道是哪个按键被按下,从而实现某些程序的运行。红外接收器引脚图。

  图35红外接收模块引脚图

  (3)避障及循迹模块:

  本设计在智能车的左右前方各设置了一个避障模块,其本身共有VCC、GND和输出三个管脚,在扩展版驱动电路中分别接下图J5或J6中的1脚5.0V电源、2脚接地和3脚输出。且两个避障输出连接在树莓派的GPIO-12和GPIO-16引脚。红外避障模块主要为红外三角测距原理:即发射信号与反射信号的几何三角关系测算与物体的距离。而避障模块的电路工作原理简述为下:当传感器发出的信号未遇到障碍物时,自然接收不到反射信号,这时,LM393比较器的Vin+端比Vin-端的电压高,比较器输出高电平,开关指示灯熄灭;当检测到前方有障碍物时,LM393比较器的vin-端的电压高,比较器输出低电平,开关指示灯点亮。

  避障模块详细电路图如图36所示。

  图36避障模块电路图

  图37避障模块引脚图

  在介绍循迹模块之前,首先介绍GPIO-19引脚,在扩展版中,按键输出引脚与循迹模块中的一个驱动电路同时复用GPIO-19。不同的是在扩展版的P8两个输出引脚出多出一个跳线帽。当脱下跳线帽时,按键起到引脚控制和刷新系统程序的作用,循迹驱动处不工作;相反,在运行循迹驱动时应当带上跳线帽。

  图38GPIO-19按键复用引脚图

  循迹模块电路工作原理为:红外发射管负责发射红外线。由于红外接收管与电阻R2相连对5v起到分担电压作用后输入给比较器同相输入端1N1+。当接收器收到红外线增加时,其分担电压减少,当1N1+电压小于1N1-后,此时OUT1脚输出低电平,指示灯点亮;相反当接收器收到的红外线数下降时,当1N1+电压大于1N1-后,OUT1脚输出高电平,指示灯熄灭。

  图39循迹模块电路图

  图310循迹模块引脚图

  (4)超声波模块:

  该模块实物共有四个引脚,其中VCC电源引脚接扩展版5.0V电源,和一个接地引脚;同时TRIG出发测距引脚接树莓派的GPIO-20引脚,ECHO高电平输出引脚接树莓派GPIO-21引脚。当GPIO20引脚发出一个10us以上的高电平后,触发模块发送40Khz方波并检测信号的返回情况,GPIO21引脚通过高电平记录声波发射返回的时间,并根据声速原理测出与障碍物的距离。

  图311超声波模块引脚图

  (5)电机驱动电路:

  为控制智能车的系统的四个直流减速电机,树莓派扩展版提供了两个双路东芝TB6612电机驱动芯片。如下两图所示,AO1/AO2,BO1/BO2,CO1/CO2,D01/DO2分别代表四个电机两个输入控制引脚或两个芯片的输出引脚。下面以其中一个芯片为例介绍其工作和接口原理。TB6612的AN2和AN1引脚为一组控制一路电机正传反转的引脚,分别接入树莓派的GPIO27与GPIO22引脚;同理,BN2和BN1引脚接树莓派GPIO24与GPIO25引脚控制一路电机正反转;而PWMA和PWMB引脚接树莓派GPIO18与GPIO23引脚,负责电机的PWM调速信号输入输出。当给出的脉冲宽度(占空比)越大,电机所接受的平均电压便越强,电机转速就升高;反之给出的脉冲宽度越(占空比)小,电机所接受的平均电压便越弱,电机转速就降低,并且PWM不管是给出一个高电平还是低电平电机都正常进行转动的,所以电机的转速只取决于平均工作电压。

  表31电机正反转逻辑控制表

  AIN1 AIN2 BIN1 BIN2 PWMA PWMB AO1/A02

  1 0 1 0 1 1正传

  0 1 0 1 1 1反转

  1 1 1 1 1 1刹车

  0 0 0 0 1 1自由停车

  X X X X 0 0刹车

  X:任意电平

  图3-12 TB6612电机控制芯片电路引脚图

  4.智能车软件设计过程

  4.1总程序结构框图

  (1)智能车总体程序功能:

  红外线遥控器或移动电话的蓝牙通讯给出目标点的位置信息。树莓派接收信息调出相应程序并自动沿着黑色轨迹进行向目标点寻迹,中途能进行避障,到达目标点后。二维码识别照相机的对象点附近(包含在二维码的位置信息),通过识别二维码里位置信息起到与起始时遥控器或者手机给出的目标点位置信息,两者进行一个检验比对。确认无误后停止一段时间并原路返回。

  目标点信息代表着走到该目标点的程序。当树莓派接收到目标点信息会立即调出相应循迹程序向目标点行驶。每个目标点的程序,初步构想是通过车速与时间的控制,让到达每个目标点的程序设死,即以固定车速在循迹线上行走T时间后到达目标点。

  图41总程序流程图

  (2)避障程序工作框图:

  当智能车向目标点行走T1秒时间后遇到障碍阻挡在黑色寻迹线上时,循迹程序立即停止工作。并进行左转或右转避障行走T2秒时间;再右转或左转调正方向并行走T3秒;之后再次转向T2秒回归轨迹线;回归循迹线后,循迹程序开始工作并利用T4秒到达目标点。(注:令到达目标的总时间为T,速度恒定,那么T应该等于T1加T3加T4。)在第三次转向结束后,循迹模块开始工作,左转或右转回归轨迹。

  图42避障程序流程图

  4.2模块子程序

  (1)红外接收程序:

  通过对树莓派pylirc红外控制库的安装和调用来对红外遥控程序提供查询和运行;另外也需要根据相应的红外遥控来配置相应的按键码值表文件。来对按下的按键的功能起到查询作用。

  import pylirc,time#//pylirc红外驱动库

  import RPi.GPIO as GPIO#//引入RPI.GPIO模块并用GPIO命 周替代

  def IR(config):

  if config=='KEY_CHANNEL':#//调出用到的按键的码值,并在外界按键按下识别按键信号

  [循迹避障程序]

  def loop():#//引入配置好的遥控器键值表文件库。

  while True:#//为以上程序查询按键码值提供支持。

  s=pylirc.nextcode(1)

  while(s):

  for(code)in s:

  print'Command:',code["config"]

  IR(code["config"])

  if(not blocking):

  s=pylirc.nextcode(1)

  else:

  s=[]

  (2)循迹程序:

  树莓派的sys库包含了与Python解释器和它的环境有关的函数。首先定义循迹传感器树莓派输入引脚,通过其输入的高低电平输入通过IF语句判断具体实际情况。当GPIO26与GPIO13输入的均为低电平时,表示轨迹线为直线则继续前进;当两者有一侧引脚输入的为高电平时,表示轨迹线已经弯曲,则相应跟随轨迹线做出转向循迹运行操作。程序中提前引入RPi.GPIO模块程序库并用GPIO命 周代替及引入时间函数库

  import sys#//初始化调用sys模块,sys即system.

  T_SensorRight=26#//定义循迹模块的引脚输入为GPIO26与GPIO13引脚

  T_SensorLeft=13

  while True:

  SR=GPIO.input(T_SensorRight)#//将定义的引脚置输入状态

  SL=GPIO.input(T_SensorLeft)if SL==False and SR==False:

  #IF语句,对探测到的引脚电平判断

  print"t_up"t_up(50,0)elif SL==True and SR==False:

  print"Left"#//此时判断为循迹线向左延申,小车向左转向

  t_left(50,0)向左转向继续以100HZPWM信号50占空比的速度循迹

  elif SL==False and SR==True:print"Right"t_right(30,0)else:t_stop(0)

  (3)红外避障程序

  将放置在智能车前方左右两路的避障模块的信号输入引脚连接在树莓派的GPIO接口上。通过IF语句实现对路况的判断并作出反应。以左避障为例:当左边传感器输入为高电平时表示右侧无障碍物,而右侧传感器输入低电平表示右测有障碍物。此时智能车识别路况做出向左转避障的反应。程序开始前如上文一样引入RPi.GPIO模块程序库并用GPIO命 周代替并引入时间函数库

  import sys#//初始化调用sys模块,sys即system.

  SensorRight=16#//定义左右避障传感器的输入引脚为树莓派GPIO16与GPIO12

  SensorLeft=12:

  while True:

  SR_2=GPIO.input(SensorRight)#//定义两路引脚为输入状态

  SL_2=GPIO.input(SensorLeft)

  if SL_2==True and SR_2==True:#//通过IF语句对具体路况判断并作出相应反应。

  print"T1_up"

  T1_up(45,0)

  elif SL_2==True and SR_2==False:

  print"Left"

  T2_left(45,T2)

  #//向左以100HZPWM信号50占空比的速度避障。同理,利用Eeif语句当负侧传感器为正信号,右侧为正信号时向右进行避障。

  print"Right"

  T2_left(45,T3)

  print"Right"

  T2_left(45,T2)

  #//避障之后回归循迹线路

  (4)超声波避障程序:

  超声波测距避障模块。将超声波传感器的TRIG声波发射引脚接树莓派GPIO20引脚;将ECHO高电平输出引脚接树莓派GPIO20引脚。首先TRIG通过GPIO20引脚输出一个10us的高电平做为启动信号,传感器内部会发射一个40HZ的声波;ECHO即GPIO21引脚检测到声波发出后置低电平输入并在此时开始计时;当GPIO20检测到信号的返回后,GPIO21引脚置高电平输入,结束计时。由声音在空气中传播速度原理结合计时时间测算出距离。

  并且当在前方检测到离障碍物在40cm以内时,进行后退右转避障的操作。若前方没有障碍物则继续前进。

  #//(提前引入RPi.GPIO模块程序库并用GPIO命 周代替与时间函数库。)

  import sys#//初始化调用sys模块,sys即system.

  TRIG=20#//将声波发射引脚定义至树莓派GPIO20

  ECHO=21#//ECHO定义至树莓派GPIO21引脚

  def distance():#//测距离程序起始点

  GPIO.output(TRIG,0)#//TRIG即GPIO20引脚置低电平,不发射声波

  time.sleep(0.000002);GPIO.output(TRIG,1);time.sleep(0.00001);GPIO.output(TRIG,0);while GPIO.input(ECHO)==0:a=0;time1=time.time()

  #//延时0.000002秒后,TRIG开始发射声波;延时0.00001秒后TRIG停止发射声波。并且当检测到ECHO引脚输出低电平时,开始计时。

  while GPIO.input(ECHO)==1:#//检测ECHO是否为高电平

  a=1#//结束计时

  time2=time.time()

  during=time2-time1#//声波发射并回返的时间

  return during*340/2*100#//通过公式测出距离

  def loop():#//当测出的距离小于40cm时

  while True:

  dis=distance()

  if(dis<40)==True:

  while(dis<40)==True:

  t_down(50,0.5)#//后退0.5秒,并向右转0.1秒避障

  t_right(50,0.1)

  dis=distance()

  else:#//没有检测到障碍物,继续前进

  t_up(50,0)

  print dis,'cm'

  print'

  (5)电机驱动子程序:

  使用树莓派的RPI.GPIO库与定时器函数库,实现对电机引脚的定义,其中AN1与AN2控制左侧两个电机输出,BN1与BN2控制右侧两个电机。的通过对电机逻辑表的查询,设置前进模式。并定义PWM电机调速接口。前进时:AN2置0,AN1置1;BN2置0,BN1置1;PWMA与B置1;后退时:AN2置1,AN1置0;BN2置1,BN1置0;PWMA与B置1;左转时:AN2置1,AN1置0;BN2置0,BN1置1;PWMA与B置1;右转时:AN2置0,AN1置1;BN2置1,BN1置0;PWMA与B置1;刹车时:AN2置1,AN1置1;BN2置1,BN1置1;PWMA与B置1;自由停车:AN2置0,AN1置0;BN2置0,BN1置0;PWMA与B置1。并经过ChangeDutyCycle函数调节占空比控制速度。

  程序如下:(提前引入RPi.GPIO模块程序库并用GPIO命 周代替与时间函数库。)

  PWMA=18#//定义树莓派GPIO18为左路电机PWM调速引脚

  AIN1=22#//定义树莓派GPIO22和GPIO27为右路正反转引脚

  AIN2=27

  PWMB=23#//定义GPIO23为右路电机PWM调速引脚

  BIN1=25#//定义GPIO24和GPIO25右路为正反转引脚

  BIN2=24;def t_up(speed,t_time):L_Motor.ChangeDutyCycle(speed)#//定义PWM调速与时间控制函数,引入ChangeDutyCycle函数调节占空比,即实现调速

  GPIO.output(AIN2,False)#AIN2#//定义引脚ATN2置0;引脚ATN1置1;

  GPIO.output(AIN1,True)#AIN1

  R_Motor.ChangeDutyCycle(speed)#//利用ChangeDutyCycle函数调节占空比,即实现调速

  GPIO.output(BIN2,False)#BIN2#//定义引脚BTN2置0;引脚BTN1置1;

  GPIO.output(BIN1,True)#BIN1#//此引脚定义为系统前进,详见上面电机逻辑表

  time.sleep(t_time);GPIO.setwarnings(False)

  GPIO.setmode(GPIO.BCM)#//使用树莓派的博通芯片引脚命 周方式

  GPIO.setup(AIN2,GPIO.OUT)#//设定AN2、AN1、PWMA为输出状态

  GPIO.setup(AIN1,GPIO.OUT)

  GPIO.setup(PWMA,GPIO.OUT)

  GPIO.setup(BIN1,GPIO.OUT)#//设定BN2、BN1、PWMB为输出状态

  GPIO.setup(BIN2,GPIO.OUT)

  GPIO.setup(PWMB,GPIO.OUT)

  L_Motor=GPIO.PWM(PWMA,100)#//设定PWMA端口产生100HZ的PWM信号

  L_Motor.start(0)#//占空比从0开始

  R_Motor=GPIO.PWM(PWMB,100)#//设定PWMB端口产生100HZ的PWM信号

  R_Motor.start(0)#//占空比从0开始

  try:

  while True:#//设置前进后退与左右转的速度和持续时间

  t_up(50,3)

  t_down(50,3)

  t_left(50,3)

  t_right(50,3)

  t_stop(3)

  except KeyboardInterrupt:

  GPIO.cleanup()

  (6)舵机子程序:

  4.3二维码识别算法过程介绍

  利用简单的二维码生成器,将“1”、“2”、“3”三个文本生成简单二维码,其中1、2、3分别代表目标点1、目标点2、目标点3。

  图41二维码“1”

  图42二维码“2”

  图43二维码“3”

  利用树莓派镜像文件预先安装OpenCV和Zbar来制作二维码扫描模块。经过OpenCV可以加紧读取二维码、在硬盘中加载图像以及在视频中抓取新的帧并进行处理等功能和特点。将其获取到的图像或视频帧传入Python中专用的条形码解码库Zbar库中。通过Zbar对二维码进行解码。OpenCV能够接着执行进一步的图像处理任务以及展示结果。

  (1)在树莓派镜像文件下打开一个新文件,命 周为barcode_scanner_video.py,写入如下代码:

  #//导入所需工具包和函数数据库

  from imutils.video import VideoStream

  from pyzbar import pyzbar

  import argparse

  import datetime

  import imutils

  import time

  import cv2

  #//创建参数解析器,解析参数

  ap=argparse.ArgumentParser()

  ap.add_argument("-o","--output",type=str,default="barcodes.csv",

  help="path to output CSV file containing barcodes")

  args=vars(ap.parse_args())

  #//解析一个可选的命令行参数--output,其包含了指向输出结果CSV文件的路径。该文件会包含从视频流中检测到和解析出的条形码的时间戳及载荷。如果该参数没有指定,那么CSV文件就会被我们当前 周为“barcodes.csv”的工作目录所替换

  (2)初始化视频,打开CSV文件: