基于STM32设计的避障寻迹小车
一、前言
1.1 项目背景
根据美国玩具协会在一项研究中,过去几年全球玩具销售增长与GDP的世界平均水平大致相同。但全球玩具市场的内部结构已经占据了巨大的位置变化:传统玩具的市场份额正在下降,高科技电子玩具正在蓬勃发展。全球玩具市场的高科技电子游戏2010年的年销售额增长了67%,但传统玩具的年销售额仅增长了1%。
2001年,十大最受欢迎的圣诞玩具之一有电子玩具。智能系统之前在很多领域,如智能工程、IT、集成引擎及行业整合正在讨论,就必须变得更聪明。可见传统的控制概念不能满足用户的需求,并与这些传统的控制相关的智能控制提高了一般的优势和较好满足人的需求。人工智能和计算机的不断发展,智能控制领域取得了很大的创新。因此,找到并使用远程控制和智能技术非常重要。而且市场价值超群。
智能汽车是一种识别的多功能智能设备决策的自主水平的机械设计,信息技术和人工智能领域的主动管理的环境中。它可分为三个部分:一个驱动部件,所述检测传感器和所述控制器的一部分。分别在物流运输方面发挥军事,安全检查和破坏程度进行评估的应用的作用。
1.2 小车的现状
【1】国内:在上世纪80年代末,中国开始研究智能车,几十年的研究后,取得了一些阶段性成果。7B.8智能车辆系统。该系统是由南京理工大学、北京理工大学、浙江大学、国防科技大学、清华大学等多所院校联合硏制,属于军用室外智能车辆,于1995年底通过验收。
【2】国外:智能车辆的研发在国外的很多机构都得到了很大的创新,尤其是在科学和工业设计等领域,获得了更进一步的扩展,研发技术已经达到了很高的水平,其中具有代表性的智能车辆包括:
美国卡内基梅隆大学机器人研究所研制的Navlab系列智能车辆系统, 该系统的车体采用 Pontiac运动跑车,其传感器系统包括视觉、差分GPS系统。
德国 Vamos—P智能车辆系统该传感器系统包括两个有源双筒望远镜系统配置PZSA相机4种颜色,三个线性加速度计和角惯性传感器改变状态转速计和发动机的测量装置。驱动方向包括发动机转矩,液压制动器和电子节气门。
二、系统设计
2.1 主控系统设计
根据设计要求,控制器主要用在控制电机,并通过有关的传感器处理通道的轨道信息,将处理信号传送给控制器,然后通过控制器可以进行相应的处理,以此用来实现电机的前进和后退,确保在实验范围内能够进行躲避障碍和寻找痕迹还有加速减速等等动作。
供应链管理为核心的系统,在汽车的道路的控制,以达到他们的目标。 我们的系统进行完整的分析,关键要实现自动车辆控制,但此刻,微控制器已经显示出它的优势是简单,方便,快捷。
STM32具有低功耗,高时钟速度和短中断延迟的特点。 CORTEX-M3是一款32位ARM7系列处理器,包括处理器内核,内存单元,总线接口和跟踪调试单元。本设计中使用的STM32 F103ZET6微控制器直接用于最小的开发板,便于学习和使用。STM32F103功能及特点。
功能包含内核(ARM 32位的Cortex™-M3 CPU)、储存器、时钟、复位和电源管理、 低功耗、 2个12位模数转换器, 1μs转换时间(多达16个输入通道)、 DMA、多达80个快速I/O端口、 调试模式、多达7个定时器、多达9个通信接口、CRC计算单元, 96位的芯片唯一代码。
特点是集成了强大的硬件系统,使其在工作中消耗更少的电力。它是一个16/32位混合编码指令,可以与拇指指令兼容。NVIC是CORTEX-M3的紧密耦合部分,可配置240个中断并分为256个优先级,CORTEX-M3还使用尾链技术,使得背对背中断响应仅6个时钟周期,因此中断响应更迅速。
MPU是处理器中的存储模块,通过定义和检查存储区域的属性来实现存储功能。调试访问接口可以用作串口或串行JTAG调试端口。串口调试端口只能通过时钟和数据两个引脚进行调试,以保证低成本。
STM32处理器分为标准化、增强型和最新产品。STM32 F101为标准型,频率为36兆赫 ;STM32 F103是增强型,频率为72兆赫,STM32 F105和STM32 F107是最新的系列产品,增加了USB和以太网接口。
依据如上的分析,选择P89C51 RAM单片机为这个设计的主要控制装备,使用STM32芯片作为设计的开发芯片。由于其存储性能强,功耗小,能满足复杂编程功能的要求,且成本较低,对于这种设计来说是绰绰有余。
2.2 电机驱动模块
2.2.1 供电方式
方案一:采用单电源同时提供单片机和直流电机。该方案的优点是减小了机身的重量,操作简单。这会让单片机的波动变得很大,影响到单片机的性能,稳定性变得不高。
方案二:采用双电源供电,通过两个外界移动电源进行供电,该方案的优点是减小了波动,稳定性更好,可以更好地操作汽车。
方案三:多电池串联供电。由于单片机的工作电压在5V左右,直流电压也小,可以通过电池供电,使电池串联连接,保证了系统的正常运行。
综合考虑,使用第二方案。
2.2.2 驱动电机方式
功率晶体管用作功率放大器的输出信号以驱动DC电动机。 线性控制电路的结构比较简单,原理简单,加速度强。 方案H桥达林顿配置。 达林顿微处理器控制,可调孔隙率操作状态切换时,电机速度的更精确的控制。
从电路的管道饱和效率关模式是非常高的。H型桥式电路确保了速度和方向的简单控制。电子管的开关速度非常快,稳定性很强。它是一种广泛应用的PWM调速技术。现在市场上有很多芯片。我选择了L298N。该实施例具有优异的特性的头速度,平滑控制,一个宽的速度范围,大的过载可承受频繁的冲击载荷也可以实现无级地频繁很快开始,制动和扭转等。 因此,我们决定使用的功率晶体管作为发动机功率放大器DC的输出控制。
图2.1.1 H桥式电路
图2.2.2 L298N
2.2.3 电机驱动选择
方案一:DC电机的使用具有硬件电路设计简单的优点。当使用额定的直流电压时,速度变化不大,调速性能很好,性价比很高。对于小车,它可以很好地控制。
方案二:步进电机,步进电机可实现精确的转角输出,只要应用合适的脉冲序列,电机就可以按照人们预定的速度或方向连续旋转,控制速度很慢,但软件程序的编程是一个比直流电机更复杂。
所以我选择方案一,好控制且性价比高。
2.3 循迹模块
方案一:这个模块使用了两个红外对管(如图2.3),分别放在小车车前左右两边,由光电开关的检测情况可知,来控制小车的行驶和转向,通过测试表明,只要合理的安排两个光电开关的位置,就可以达到循迹的功能。
方案二:使用三对红外管,其中的两个红对外管可以检测到黑线。 在黑线轨道之后,汽车将立即调整到中心灯开关的方向,再次检测黑线,即返回轨道。那么它就会再次沿着黑线行驶。但是,现场的观察表明,小车在寻机的过程中会左右摇摆,虽然可以正确的寻迹,但是成本和稳定性都无法和第二方案相比较。
通过比较,我选取第二种方案来实现循迹
图2.3 红外对管
2.4 避障模块
2.4.1 红外线避障
方案一:在小车的中央使用红外线管。安装容易,可以检测障碍物的存在,但很难确定汽车是否会在水平方向上与障碍物碰撞,不容易使汽车做出准确的转向反应。最终没有采纳这个方案。
方案二:车辆的前部的两侧布置了两个红外线管,平行于机器方向。 它可以精确地确定车辆和障碍,和及时响应的相对距离和方向。缺点是对硬件要求较高,且成本比较大。
方案三:在小车的右侧使用红外线管。通过对该方案的测试,可以避免障碍物,充分利用资源而不浪费。但是在右侧会有部分死角,不利于小车完美避障。最终没有采纳这个方案。
方案四:把一个包括有舵机的红外线管装置在小车的头部。借助旋转的功能可以全方位的了解四周的情况并及时作出反应,缺点就是我们需要安装舵机,并编写多个程序使它运行,这就加大了工作负担。并且需要制作不宜过重的舵机,还要是其旋转角度为最佳,工作过程过于麻烦,故未选择该方案。
所以采用第二种。
2.4.2 超声波避障
方案一:串联电阻转速控制系统。
方案二:静态可控整流器。V-M系统简称。
方案三:脉宽调制系统。
旋转式交流转换系统由交流发电机驱动,交流发电机改变直流电动机,并由需要速度控制的直流电动机发电机供电。发电机的输出电压可以通过调整发电机励磁电流和通过调节电机的速度被改变。
如果激励变化的侧电流 输出电压的极性是从电机的极性不同。因此,G-M系的可逆操作可以是相对简单的。 该系统需要一个可变旋转速度旋转单元,其包括具有相同容量的电动机速度控制的至少两个旋转机械。它还需要一个激励发生器。但他的装备很笨重。成本高,效率低,维护不实用。而且由于技术落后,因此不需要搁置。
V-M系统是直流调速系统的主要形式。 有许多类型,例如:单相,三相或更多,相位,半波,交替,半控制,总控制等,它们可以实现平稳的速度控制。 V-M系统的缺点是晶闸管的单向导电性。它不允许反向电流引起系统的可逆操作。另一个缺点是高操作和维护条件。最后,如果系统以低速运行,其功率将非常低,此时产生的高谐波电流将损坏附近的电气设备。
晶闸管与相位无关。当晶闸管跳闸时,电源电压会施加到电机上。当晶闸管断开时,直流电源与电动机断开。电动机继续在二极管中流动,并且通过它的电压接近零。脉冲宽度调制(PWM)。脉冲具有恒定的周期,并且仅改变为晶闸管指定的时间,即通过改变脉冲的宽度来调节连续速度。
与V-M系统相比,PWM调速系统具有以下优点:
(1)由于PWM速度控制系统的高频开关,只能通过发动机电感滤波器获得小的DC纹波电流。由于上述现有的信号系统,V-M的系统,具有相同的平均电流相对小的热机。
(2)由于开关频率高,如果快速响应匹配到发动机,该系统能够是宽带,响应速度快,因此,良好的性能,动感较强的抗干扰能力。
根据上述的综合比较,和发动机控制能力,并在这种设计中的DC马达的速度调节的发展方向,该设计依赖于调节PWM输出的速度,以一个小的计算机芯片的单MEGA16,从而可以实现更好的控制EF。FECT与LM29芯片相结合。在避开障碍物的过程中,电机也可以通过直接控制LM29 8芯片来控制。操作方便,易于翻转和倒退功能。
所以我选择了方案三。
2.5 遥控变速系统
本课题要求智能小车可以遥控可变速,所以加上遥控系统。
在本课题中利用按键和LCD1602结合进而改变小车的速度问题。这样可以减轻负担且更加直接的改变小车的速度。
2.6 LCD1602液晶显示模块
在日常生活中,我们对液晶显示器并不陌生。我使用的液晶的显示部,许多电子产品,如计算器,万用表,数字时钟,和许多消费电子产品,数码屏幕基材以及特殊字符和图形的通道。 人与机器在单芯片微型计算机之间的通信接口, 一般输出模式如下:管发光管,LED数字显示,屏幕流体。
液晶显示器的好处如下:显示质量高,由于每个点都保持液晶彩色LCD,在接收到信号亮度后,产生耐用性,不像阴极射线管供电(CRT),需要不断更新新的亮点。因此,液晶显示器画质高且不会闪烁。而且其数字式接口体积小、重量轻功耗低 。
另一方面,LCD的功耗主要在其内部电极和驱动器的IC器件上消耗,因此比其他监视器消耗更少的能量。
2.6.1 液晶显示简介
- 液晶显示原理
液晶显示器的原理依赖于液晶的物理特性。通过控制其显示区域中的电压,存在电子显示器,即可以显示图像。其中,适用于LSI直接控制且易于操作的低厚度液晶显示器广泛用于移动通信设备的许多领域,例如笔记本电脑,数码相机和个人数字助理。
- 液晶显示器的分类
LCD的分类方法有很多种,根据显示的不同,可以分为段类型,字符类型,点阵类型等。除了黑白显示外,LCD还具有多级彩色显示屏。如果按行为方式划分,则可分为静态(静态),简单矩阵(简单矩阵)和有源矩阵(有源矩阵)。
字符的显示用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。
1602字符型LCD简介
液晶显示单元是专门用于显示字母,数字,符号等的点阵LCD显示器。目前常用161,162,202和402行等的模块。一般1602字符型液晶显示器实物如图2.6.1和2.6.2:
图2.6.1
图2.6.2 1602字符型液晶显示器实物图
2.6.2 1602LCD的基本参数及引脚功能
1602LCD主要技术参数:
显示容量:16×2个字符
芯片工作电压:4.5—5.5V
工作电流:2.0mA(5.0V)
模块最佳工作电压:5.0V
字符尺寸:2.95×4.35(W×H)mm
引脚功能说明:
各引脚接口说明如表1所示:
编号 | 符号 | 引脚说明 | 编号 | 符号 | 引脚说明 |
---|---|---|---|---|---|
1 | VSS | 电源地 | 9 | D2 | 数据 |
2 | VDD | 电源正极 | 10 | D3 | 数据 |
3 | VL | 液晶显示偏压 | 11 | D4 | 数据 |
4 | RS | 数据/命令选择 | 12 | D5 | 数据 |
5 | R/W | 读/写选择 | 13 | D6 | 数据 |
6 | E | 使能信号 | 14 | D7 | 数据 |
7 | D0 | 数据 | 15 | BLA | 背光源正极 |
8 | D1 | 数据 | 16 | BLK | 背光源负极 |
表2.6.1 引脚接口说明表
2.6.3 1602LCD的指令说明
1602液晶模块内部的控制器共有11条控制指令,如表2所示:
序号 | 指令 | RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 清显示 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
2 | 光标返回 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | * |
3 | 置输入模式 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | I/D | S |
4 | 显示开/关控制 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | D | C | B |
5 | 光标或字符移位 | 0 | 0 | 0 | 0 | 0 | 1 | S/C | R/L | * | * |
6 | 置功能 | 0 | 0 | 0 | 0 | 1 | DL | N | F | * | * |
7 | 置字符发生存贮器地址 | 0 | 0 | 0 | 1 | 字符发生存贮器地址 | |||||
8 | 置数据存贮器地址 | 0 | 0 | 1 | 显示数据存贮器地址 | ||||||
9 | 读忙标志或地址 | 0 | 1 | BF | 计数器地址 | ||||||
10 | 写数到CGRAM或DDRAM) | 1 | 0 | 要写的数据内容 | |||||||
11 | 从CGRAM或DDRAM读数 | 1 | 1 | 读出的数据内容 |
表2.6.2 控制命令表
1602液晶模块通过指令编程来实现读写操作、屏幕和光标的操作。(说明:1为高电平、0为低电平)
2.6.4 1602LCD的RAM地址映射及标准字库表
LCD模块运行缓慢,因此在执行每条命令前检查模块的忙标志,将其设置为低电平表示它不忙,否则命令无效。要显示其指示器模块,字符显示的第一个字符输入字符显示地址,图2.6.3是1602的内部显示地址。
图2.6.3 1602LCD内部显示地址
当初始化设置在液晶模块,其中所述第一显示模式时,光标自动地移动到右侧,如果液晶显示单元的符号,无需人工干预。 前每个命令输入被定义为液晶模块处于繁忙状态。
1602 LCD模块在字符生成存储器(CGROM)中存储了160个不同的点阵字符,如图2.6.4所示。这些字符是:日语假名等,每一个字符具有固定的代码,如英文大写字母“代码”是01000001b(41H)时,模块显示在41H的图矩阵字符。我们就能看到字母“A”。
图2.6.4 字符代码与图形对应图
2.6.5 1602LCD的一般复位过程
延时15mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
延时5mS
写指令38H(不检测忙信号)
以后每次写指令、读/写数据操作均需要检测忙信号
写指令38H:显示模式设置
写指令08H:显示关闭
写指令01H:显示清屏
写指令06H:显示光标移动设置
写指令0CH:显示开及光标设置
2.7 机械系统
本设计要求汽车的机械系统稳定、灵活、简单,三轮运动系统具有上述特点。
驱动部分:由于玩具车的直流电机功率小,车内装有电池、电机和电子设备,使电机负荷较重。为了使汽车平稳地起动和平稳地行驶,在直流电动机和轮轴之间安装了三个减速齿轮。
电源部分:利用两个外接电源。
电机驱动部分主要由单芯片L29 8N和ATMEGA16芯片连接,ATMGA16芯片直接与驱动电路相连。M轴承电压,7和805,电机电压,选择12V电源)电源电压输入端子。L29 8N可同时驱动两台电机,最大输出电流为2A,以其性能和价格好,选用L29 8N作为电机驱动芯片,L29 8N芯片如图2-3所示,为了达到控制停止电机的目的。ATMEGA16的两个PB4和PB5端口直接连接到L29 8N的两个启用的ENA和ENB端子。L29 8N的四个输出端子直接连接到两个电机以驱动电机。
三、硬件设计
3.1 总体设计
智能车由后轮驱动,后轮由两侧的电机驱动。前两个轮子的速度被制作和停止以控制转向。前轮是万象车轮,起支撑作用。跟踪光电管分别安装在车身的左右两侧。如果左传感器从黑线,主命令中心接收信息左侧晶圆控制轮上的电机停止工作,同时右侧电机继续运行这样使小车左向左行使。当右侧右侧的传感器感受到黑线时,主控制芯片控制和左侧相同原理,这使小车向右行驶就和向左相同。
避障原理与直线相同。小车按寻迹路线行走,3个超声波传感器检测,检测前方是否有障碍物,当有障碍物,停止,没有障碍物,前进;前方有障碍,左右两边检测,哪边检测距离大,往那边走,按键设置前方障碍的最小距离;在避障模式下,按键设置最小转弯半径,小于转弯半径视为不能转弯,小车原地后退,然后停车由此来避免障碍物做到避障功能。
3.2 驱动电路
H桥发动机电路集成在L298上面 ,因此我们可以借助该集成电路来 驱使发动机,该发动机引擎通常使用H桥发动机电路,因此L298N能够用于驱动发动机。
图3.2.1 L298N引脚图
图3.2.2原理图
3.3 主控制电路
这个模块主要针对采集到的信号进行了分析,并给出PWM波形来控制电机启动、旋转速度和停下。并重新检测障碍物报警等功能。
图3.5.1原理图
四、软件设计
4.1 电机驱动程序
#include "stm32f10x.h"
#include "SZ_STM32F103C8_LIB.h"
#include "LCD1602.h"
#include "sys.h"
#include "delay.h"
#include "adc.h"
#include "ultrasonic.h"
u16 count = 0; //定时器计数u32 juli_up = 200; //最小距离
u16 juli_Q = 0;
u16 juli_Z = 0;
u16 juli_Y = 0;
u16 juli = 0; //距离设定
u32 temp;u8 start = 0; //0手动 1自动//停止
void stop()
{GPIO_SetBits(GPIOA,GPIO_Pin_4); GPIO_SetBits(GPIOA,GPIO_Pin_5); GPIO_SetBits(GPIOA,GPIO_Pin_6);GPIO_SetBits(GPIOA,GPIO_Pin_7);
}//前进
void qianjin()
{GPIO_SetBits(GPIOA,GPIO_Pin_4); GPIO_ResetBits(GPIOA,GPIO_Pin_5); GPIO_SetBits(GPIOA,GPIO_Pin_6);GPIO_ResetBits(GPIOA,GPIO_Pin_7);
}//后退
void houtui()
{GPIO_ResetBits(GPIOA,GPIO_Pin_4); GPIO_SetBits(GPIOA,GPIO_Pin_5); GPIO_ResetBits(GPIOA,GPIO_Pin_6);GPIO_SetBits(GPIOA,GPIO_Pin_7);
}//左转
void zuozhuan()
{GPIO_ResetBits(GPIOA,GPIO_Pin_4); GPIO_SetBits(GPIOA,GPIO_Pin_5); GPIO_SetBits(GPIOA,GPIO_Pin_6);GPIO_ResetBits(GPIOA,GPIO_Pin_7);
}//右转
void youzhuan()
{GPIO_SetBits(GPIOA,GPIO_Pin_4); GPIO_ResetBits(GPIOA,GPIO_Pin_5); GPIO_ResetBits(GPIOA,GPIO_Pin_6);GPIO_SetBits(GPIOA,GPIO_Pin_7);
}
4.2 寻迹程序
void TIM3_IRQHandler(void) //TIM3
{if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {TIM_ClearITPendingBit(TIM3, TIM_IT_Update); if(start==1){count++;//超声波距离判断 低于最小距离if(juli<juli_up){stop(); //停止}else {if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15)==0)&&(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)==0)){if(count%2==0)qianjin();//前进elsestop(); //停止}else if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15)==1)&&(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)==0)){ if(count%2==0)zuozhuan(); //左转elsestop(); //停止}else if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15)==0)&&(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)==1)){ if(count%2==0)youzhuan(); //右转elsestop(); //停止}else{stop(); //停止}}}}
}int main(void)
{delay_init(); //初始化定时器NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);LCD_1602Init(); //初始化lcd1602 GPIO_Configuration(); //GPIO初始化Ultran_Init(); //超声波初始化delay_ms(500);TIM3_Int_Init(20,35999); //10mswhile (1){ if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==0){while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)==0);//等待按键抬起set_juli(); //设置距离}if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)==0){while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2)==0);//等待按键抬起start = 1; //循迹模式} if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==0){while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1)==0);//等待按键抬起start = 2; //行走} if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0){while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)==0);//等待按键抬起start = 0; } Ultra_Ranging1(&temp); //获取距离juli_Q = temp;if(start==2){Ultra_Ranging2(&temp); //获取距离juli_Z = temp;Ultra_Ranging3(&temp); //获取距离juli_Y = temp; }display(); //显示界面delay_ms(100);}
}
4.3 避障程序
void TIM3_IRQHandler(void) //TIM3
{if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {TIM_ClearITPendingBit(TIM3, TIM_IT_Update); if(start==1){count++;//超声波距离判断 低于最小距离if(juli<juli_up){stop(); //停止}else {if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15)==0)&&(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)==0)){if(count%2==0)qianjin();//前进elsestop(); //停止}else if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15)==1)&&(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)==0)){ if(count%2==0)zuozhuan(); //左转elsestop(); //停止}else if((GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_15)==0)&&(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_9)==1)){ if(count%2==0)youzhuan(); //右转elsestop(); //停止}else{stop(); //停止}}}}
}
相关文章:
基于STM32设计的避障寻迹小车
一、前言 1.1 项目背景 根据美国玩具协会在一项研究中,过去几年全球玩具销售增长与GDP的世界平均水平大致相同。但全球玩具市场的内部结构已经占据了巨大的位置变化:传统玩具的市场份额正在下降,高科技电子玩具正在蓬勃发展。全球玩具市场的…...
【视觉检测】使用opencv编写一个图片缺陷检测流程
1. 导入必要的库,如OpenCV,NumPy等。 2. 使用OpenCV读取图像,并将其转换为灰度图像。 3. 使用OpenCV的Canny边缘检测算法检测图像中的边缘。 4. 使用OpenCV的Hough变换算法检测图像中的线条。 5. 使用OpenCV的模板匹配算法检测图像中的缺…...
3.Dockerfile 定制镜像
3. Dockerfile 定制镜像 从上一节的docker commit的学习中,我们可以了解到,镜像的定制实际上就是定制每一层所添加的配置、文件等信息,但是命令毕竟只是命令,每次定制都得去重复执行这个命令,而且还不够直观ÿ…...
Web基础与HTTP协议
Web基础与HTTP协议一、Web基础与HTTP概述1、域名概念二、域名服务与域名注册1、域名定义2、域名服务三、网页访问(http、https)1、网页概述2、网页的基本标签四、Web1、Web概述2、Web1.0 Web2.0五、HTTP协议概述1、HTTP协议简介2、HTTP协议请求总结一、W…...
【化学试剂】endo-BCN-PEG4-Pomalidomide,(1R,8S,9S)-双环[6.1.0]壬-四聚乙二醇-泊马度胺纯度95%+
一、基础产品数据(Basic Product Data):CAS号:N/A中文名:(1R,8S,9S)-双环[6.1.0]壬-四聚乙二醇-泊马度胺英文名:endo-BCN-PEG4-Pomalidomide二、详细产品数据(Detailed Product Data)…...
全板电镀与图形电镀,到底有什么区别?
衔接上文,继续为朋友们分享普通单双面板的生产工艺流程。 如图,第四道主流程为电镀。 电镀的目的为: 适当地加厚孔内与板面的铜厚,使孔金属化,从而实现层间互连。 至于其子流程,可以说是非常简单&#x…...
Zabbix 构建监控告警平台(二)--
Apache监控示例(图形监控)模板TemplateZabbix Items 1.Apache监控示例(图形监控) 1.1创建主机组 在“配置”->“主机群组”->“创建主机群组” 填入组名“webserver_test” 创建完成之后可以在“配置”->"主机群组&…...
开学季,关于校园防诈骗宣传,如何组织一场微信线上答题考试
开学季,关于校园防诈骗宣传,如何组织一场微信线上答题考试如何组织一场微信线上答题考试在线考试是一种非常节约成本的考试方式,考生通过微信扫码即可参加培训考试,不受时间、空间的限制,近几年越来越受企事业单位以及…...
蓝牙单点技术实现路径介绍
本文主要介绍蓝牙设备与手机一对一相连的 蓝牙单点 技术。 准备工作 系统要求:蓝牙使用需要安卓 4.3 以及以上版本,智能生活 App SDK 从安卓 4.4 开始支持。Manifest 权限: <uses-permission android:name"android.permission.ACCE…...
Ubuntu22.04 用 `hwclock` 或 `timedatectl` 来设置RTC硬件时钟为本地时区
Ubuntu22.04用 hwclock 或 timedatectl 来设置硬件时区为本地时区 可以用hwclock命令 sudo hwclock --localtime --systohc👆效果等同👇 , --localtime的简写是-l ; --systohc的简写是-w sudo hwclock -l -w也可以用timedatectl命令 👆效果…...
Node=>Express路由 学习2
1.概念 Express路由指的是客户端的请求与服务器处理函数之间的映射关系 Express路由由三部分组成 请求类型 请求URL地址 处理函数 app.METHOD ( PATH , HANDLER )根据定义的先后顺序进行匹配 请求类型和请求的URl同时匹配成功才会调用相应的处理函数 简单用法 2.模块化路由 为了…...
Android 面试三部曲——你做到了几点?
今天的干货来点轻松一点的,这次的分享是《面试需要哪些准备?》,主要分为三个部分: 面试前。面试中。面试后。 面试前 1、『工作经验中的职位要层层递进:初、中、高、资深级』🍒 2.投简历 你的简历必须要…...
windeployqt实现一键打包
每次发布QT程序前,都必须要在命令行环境下运行windeployqt 工具进行打包,加载相关的lib文件,才能正常运行。但是在命令行模式下,每次都要手动输入windeployqt的目录,和应用程序的位置目录,效率非常低,见下图: 那QT有没有什么好用的工具可以避免这个问题呢,认真找了一下…...
ESP32S3系列--SPI主机驱动详解(二)
一、目的 在上一篇《ESP32S3系列--SPI主机驱动详解(一)》我们介绍了ESP32S3的SPI外设的基本情况以及主机驱动的一些知识点,包括主机驱动的特点、总线的初始化、从设备的加入、传输模式分类等等。 本篇我们将从代码角度帮助大家进一步理解传输接口的一些细节问题。 二、实战 …...
51单片机15单片机 时钟芯片DS1302【更新中】
前言 现在流行的串行时钟电路很多,如DS1302、 DS1307、PCF8485等。这些电路的接口简单、价格低廉、使用方便,被广泛地采用。 本文介绍的实时时钟电路DS1302是DALLAS公司的一种具有涓细电流充电能力的电路主要特点是采用串行数据传输,可为掉电…...
SaleSmartly(ss客服)带你了解:缩短B2B销售周期的秘诀
缩短B2B销售周期的秘诀:即时聊天 关键词:B2B 销售;即时沟通;SaleSmartly(ss客服) 在B2B销售中,时间就是一切。在某些情况下,买家正在积极寻找即时解决方案,潜在客户以多种…...
九龙证券|A股苏州板块迎来“200+”里程碑
2月10日,跟着裕太微登陆科创板,A股“姑苏板块”正式迎来第201位成员。姑苏也成为继京、沪、深、杭之后,第5个具有A股上市公司总数超越200家的城市。 现在,姑苏不仅生长为位居全国前列的“制作之都”,更成为资本市场高地…...
vcruntime140_1.dll无法继续执行代码,怎么解决这种问题?
经常使用电脑的人,可能对于这个弹出框应该不陌生,“vcruntime140_1.dll无法继续执行代码”,其实会出现这种情况,主要是因为缺少一个动态链接库 (DLL) 文件导致的。这个文件是 Visual C 2015 库的一部分,某些程序需要这…...
正大国际期货:外盘震荡行情的特征及突破信号的确立
投机市场上,趋势交易应该是交易操作理念的灵魂和核心;能够顺应大的趋势,交易将变得简单,也更容易赚到钱。下面正大IxxxuanI详细来给大家讲讲 投资市场是由千万个交易个体所组成的复杂系统,走势具有不确定性࿰…...
【ESP 保姆级教程】玩转emqx数据集成篇④ ——数据桥接之HTTP服务
忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-02-10 ❤️❤️ 本篇更新记录 2023-02-10 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请…...
蓝桥杯算法训练合集十三 1.P06022.P07033.逗志芃的危机4.唯一的小可爱5.JOE的矩阵
目录 1.P0602 2.P0703 3.逗志芃的危机 4.唯一的傻子 5.JOE的矩阵 1.P0602 问题描述 编写一个程序,输入一个4位的自然数,将组成该数的各位数字重新排列,形成一个最大数和一个最小数,之后用最大数减去最小数,得到一…...
切换分支报错:Untracked Files Prevent Checkout
切换分支报错:Untracked Files Prevent Checkoutgit分支切换 Untracked Files Prevent Checkout本人解决办法:git分支切换 Untracked Files Prevent Checkout 新起的项目在切换master分支到工作分支时,出现下图的问题: Untracked…...
endo-BCN-PEG4-Palmitic,环丙烷环辛炔四聚乙二醇-Palmitic包装灵活
endo-BCN-PEG4-Palmitic,endo环丙烷环辛炔四聚乙二醇-Palmitic反应特点:endo-BCN-PEG4-Palmitic 酯在其末端含有一个 Palmitic基和一个 BCN 基。对点击试剂来说同样会通过不同的小分子PEG进行连接,BCN-PEG-acid、BCN-PEG-NHS ester、BCN-PEG-…...
多传感器融合定位十一-基于滤波的融合方法Ⅱ
多传感器融合定位十一-基于滤波的融合方法Ⅱ1. 编码器运动模型及标定1.1 编码器基础知识1.2 编码器运动模型1.2.1 旋转半径求解1.2.2 角速度求解1.2.3 线速度求解1.2.4 位姿求解1.3 编码器的标定1.3.1 轮子半径标定1.3.2 轮子与底盘中心距离标定2. 融合编码器的滤波方法2.1 核心…...
JAVA使用poi解析execl解决数值被转为科学计数法(如:手机号、身份证号、电话、等)解决方法
1、原由 大家都知道数字在EXCEL表格中存储时有两种表现形式。1.数字作为数值存储。当数字作为数值存储时,单元格中的数字可以参与数学运算。2.数字作为文本存储。当数字作为文本存储时,单元格中的数值不能够参与数学运算。 数字作为文本存储时,如果没有更…...
hive中substring_index()的使用
substring_index(str,delim,count)str:要处理的字符串delim:分隔符count:计数例子:strwww.wikibt.comsubstring_index(str,.,1)结果是:wwwsubstring_index(str,.,2)结果是:www.wikibt如果count是正数,那么就是从左往右数ÿ…...
LocalDateTime设置时间的年、月、日、时、分、秒、纳秒
如何把String/Date转成LocalDateTime参考String、Date与LocalDate、LocalTime、LocalDateTime之间互转 String、Date、LocalDateTime、Calendar与时间戳之间互相转化参考String、Date、LocalDateTime、Calendar与时间戳之间互相转化 方法介绍 withYear(int year) 指定日期的…...
C语言rand和srand用法详解
在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌。在C语言中,我们一般使用 <stdlib.h> 头文件中的 rand() 函数来生成随机数,它的用法为ÿ…...
安装作业
1、安装方法 mysql安装常见的方法有四种 序号安装方式说明1yum\rpm简单、快速,不能定制参数2二进制解压,简单配置就可使用 免安装 mysql-a.b.c-linux2.x-x86_64.tar.gz3源码编译可以定制参数,安装时间长 mysql-a.b.c.tar.gz4源码制成rpm包把…...
电压放大器在非共线混频方法检测混凝土中的应用
实验名称:电压放大器在非共线混频方法检测混凝土中的应用研究方向:无损检测测试目的:无损检测是在不损伤或不干扰待测物体的结构材料的情况下,对其内部损伤进行探测的方法。传统无损检测法在仪器携带,操作程序…...
枣庄市庄里水库建设管理处网站/网络视频营销
CPrimer第五版 习题答案 【总目录】:https://blog.csdn.net/Dust_Evc/article/details/114334124 练习4.1 表达式 5 10 * 20 / 2 的求值结果是多少? 105。 练习4.2 根据4.12节中的表,在下述表达式的合理位置添加括号,使得添加括…...
蒙文网站开发/seo免费培训教程
我们每天都会听到越来越多关于征服IT行业的虚拟助手的消息。几乎每家大公司都在尝试做一些与众不同的事情。Apple的Siri,三星的Bixby,亚马逊的Alexa,微软的Cortana等。您可以通过说“Siri,我想要披萨”来订购披萨,或者…...
网站建设企业所得税/成都网站制作费用
服务器vps分销 内容精选换一换oVirt Engine是运行在基于JBoss的Java应用程序。该服务与主机上的VDSM进行通信,以部署、启动、停止、迁移和监控VM,并且还可以通过模板在存储上创建新的镜像。oVirt Engine以可扩展性、安全性、高性能为基础的架构技术&…...
专业网站建设专家/互联网营销模式
一、MyBatis 接口绑定方案及多参数传递 1、作用:实现创建一个接口后把mapper.xml由mybatis生成接口的实现类,通过调用接口对象就可以获取mapper.xml中编写的sql 2、后面:mybatis和spring整合时使用的是这个方案 3、实现步骤: 3.1 …...
网站改版后seo该怎么做/衡阳网站建设公司
1. 概述 在《Apollo 极简入门》中,我们已经学习了如何搭建一个 Apollo 服务。如果还没有的胖友,赶紧先去简单学习下,重点是跟着该文「2. 单机部署」小节,自己搭建一个 Apollo 服务。 本文,我们来学习下如何在 Spring…...
油气集输毕业设计代做网站/大数据分析营销平台
《专利法》第二条第三款规定,实用新型是指对商品形状、结构或者组合提出的实用新技术方案。从定义上来说,我们可以知道只保护形状和结构的实用新产品的技术方案。那么,你知道申请实用新型专利的要点吗?这里有一个详细的答案。 下面…...