这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【更新至自制模块化平衡小车第二版】hlwhlw的两轮自平衡小车DIY进程帖​​

共45条 2/5 1 2 3 4 5 跳转至
助工
2015-08-15 22:20:25     打赏
11楼

实验5.传感器驱动实验(读取mpu6050原始数据)

一.实验目的:通过传感器驱动实验,学习stm32对mpu6050的驱动,通过stm32的IO口利用软件模拟IIC驱动mpu6050,从而读取mpu6050的加速度、陀螺仪的原始数据和mpu6050内部温度传感器的值。

二.实验过程及分析:本实验主要是修改野火的模拟I2C-STM32-MPU6050程序,使之适用于小车主板,同时学习利用软件模拟IIC驱动mpu6050的知识,并将读取的数据通过串口发送到串口调试助手上面。

学习要点:stm32的软件模拟IIC知识,利用软件模拟IIC驱动mpu6050读取mpu6050mpu6050的加速度、陀螺仪的原始数据和mpu6050内部温度传感器的值。

 

MPU6050简介:MPU6050 是 InvenSense 公司推出的全球首款整合性 6 轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时之轴间差的问题,减少了安装空间。MPU6050 内部整合了 轴陀螺仪和 轴加速度传感器,并且含有一个第二 IIC 接口,可用于连接外部磁力传感器,并利用自带的数字运动处理器(DMP: Digital Motion Processor)硬件加速引擎,通过主 IIC 接口,向应用端输出完整的 轴融合演算数据。有了 DMP,我们可以使用 InvenSense 公司提供的运动处理资料库,非常方便的实现姿态解算,降低了运动处理运算对操作系统的负荷,同时大大降低了开发难度。

 

程序修改部分:芯片型号修改为stm32f103c8t6

                      根据原理修改mpu6050SDASCL引脚以及LED的引脚。


 三.实验现象如下:

 

 四.实验总结:本次实验的主要学习目的是利用stm32的软件IIC驱动MPU6050,并读取MPU6050的加速度、陀螺仪的原始数据,内部温度传感器的值。

 


助工
2015-08-15 23:13:49     打赏
12楼

实验6.多传感器数据融合实验

一.实验目的通过多传感器数据融合实验,学习MPU6050的DMP移植,从而得到与姿态相关的俯仰角、横滚角、航向角

二.实验过程及分析:本实验主要是学习 版主passoni的MPU6050的DMP移植教程,并将读取的数据通过串口发送到串口调试助手上面。

学习要点:MPU6050的DMP移植,并把读取的俯仰角、横滚角、航向角、温度值通过串口发送到串口调试助手上面。


重要公式:

q0 = quat[0] / q30; //q30格式转换为浮点数

q1 = quat[1] / q30;

q2 = quat[2] / q30;

q3 = quat[3] / q30;

//计算得到俯仰角/横滚角/航向角

*pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; // 俯仰角   *roll  = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // 横滚角

*yaw   = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3; //航向角


//读取温度公式

Temp=36.53+Temp/340;


程序修改部分:在Minibalance.c里添加读取温度函数;

修改MPU6050.c里的void Read_DMP(void)和

int Read_Temperature(void)。


Minibalance.c

把while(1)里面的程序改为

while(1)

{

Read_DMP();

Read_Temperature();

printf("\r\n\r\n\r\n\r\n");

}

MPU6050.c

在void Read_DMP(void)里添加读取横滚角、航向角并打印出来的程序

//计算得到俯仰角/横滚角/航向角

Pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; //俯仰角

Roll  = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // 横滚角

Yaw   = atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3; //航向角


printf("%f\r\n %f\r\n %f\r\n",Pitch,Roll,Yaw);


int Read_Temperature(void)里的读取温度的公式扩大10倍了,因为利用原来的公式串口打印出来的温度是300多度。

在int Read_Temperature(void)修改读取温度的公式并打印出来。

Temp=36.53+Temp/340;

//Temp=(36.53+Temp/340)*10;


printf("%f\r\n",Temp);

return (int)Temp;

三.实验现象如下:

四.实验总结:本次实验的主要目的学习MPU6050的移植,并读取与姿态相关的俯仰角、横滚角、航向角,以及内部温度传感器的值。

遇到问题:利用串口打印时,数据丢失?

如下所示,打印几次数据就会出现其中一次俯仰角、横滚角、航向角数据丢失,只打印出温度值?

10.474207

-1.122749

-29.808819

39.924118


10.473424

-1.123999

-29.808847

39.921177


10.472758

-1.126969

-29.809134

39.894707


39.903530


10.438786

-1.190631

-29.821899

39.900589


助工
2015-08-22 12:59:59     打赏
13楼

实验7.PID调试实验

一.实验目的:通过PID调试实验,学习PID的基础概念,PID调试的基本方法,并利用与姿态相关的俯仰角对平衡小车进行初步的角度环控制。

二.实验过程及分析:本实验主要是了解PID各个参数对平衡小车的影响,并学会平衡小车的角度环控制,积累PID调试经验。

学习要点:PID的基础概念,PID调试的基本方法,角度环控制。

PID的基础概念:

1、被调量
被调量就是反映被调对象的实际波动的量值。被调量是经常变化的。
2、设定值
PID调节器设定值就是人们期待被调量需要达到的值。设定值可以是固定的,也可以是变化的。
3、控制输出
控制输出指PID调节器根据被调量的变化情况运算之后发出的让外部执行结构按照它的要求动作的指令。在PID调节器和执行机构之间还会有其他环节,比如限幅、伺服放大器等。限幅功能通常在PID调节器内完成;如果如果将PID、限幅和伺服放大器功能做在一台仪表内就构成阀位控制PID调节器;将伺服放大器和限幅做在执行机构里就构成智能执行机构。
4、输入偏差
输入偏差是被调量和设定值之间的差值
5、P(比例)
P就是比例作用,简单说就是输入偏差乘以一个系数。
6、I(积分)
I就是积分,简单说就是将输入偏差进行积分运算。
7、D(积分)
D就是微分,简单说就是将输入偏差进行微分运算
8、PID基本公式
PID调节器参数整定过程通俗讲就是先把系统调为纯比例作用,逐步增强比例作用让系统振荡,记录下比例作用和振荡周期,然后这个比例作用乘以0.6,积分作用适当延长 KP=0.6 Km
KD= KP×π/4ω
KI= KP×ω/π
公式中KP为比例控制参数;KD为积分控制参数;KI为微分控制参数;Km为系统开始振荡是的比例值;ω为极坐标下振荡时的频率
9、单回路
单回路就是只有一个PID的调节系统。
10、串级
一个PID不够用,串级就是把两个PID串接起来形成一个串级调节系统,也被成为双回路调节系统。串级调节系统里PID调节器有主调和副调之分。
在串级调节系统中要调节被调量的PID叫做主调,输出直接去指挥执行器动作的PID叫做副调,主调的控制输出进入副调作为副调的设定值。主调选用单回路PID调节器,副调选用外给定调节器。
11、正作用
对于PID调节器而言,控制输出随被调量增高而增高,随被调量减少而减少的作用,叫做PID正作用。
12、负作用
对于PID调节器而言,控制输出随被调量增高而降低,随被调量减少而增高的作用,叫做PID负作用。
13、动态偏差
在调节过程中,被调量和设定值之间的偏差随时改变,任意时刻两者之间的偏差叫做动态偏差。
14、静态偏差
调节趋于稳定之后,被调量和设定值之间还存在的偏差叫静态偏差。消除静态偏差是通过PID调节器积分作用来实现的。
15、回调
调节器调节作用显示,使被调量开始由上升变为下降,或者由下降变为上升趋势成为回调。


PID调试的基本方法:

直立控制:PD 控制,这是最核心的控制,其他的控制相对直立控制而言都是干扰。

速度控制:PI 控制 对编码器信息进行低通滤波可以削弱电机控制的比重, 提高系统稳定性。

转向控制:PD 控制 结合了 Z 轴陀螺仪 PD 控制。


角度环控制(直立控制):调节PD参数使小车保持直立

调节这两个参数可以遵循先比例后微分的过程。首先调整比例参数,使得小车能够保持直立并且开始来回摆动了。说明此时比例参数已经可以克服重力的影响。然后逐步增加微分参数,小车逐步保持直立稳定。增大微分参数直到车模开始共振,这样就可以确定微分参数的最大值了。然后适当减小微分参数,然后逐步增加比例参数,直到车模又开始震荡,这样便可以确定比例参数的最大值。然后适当减小比例参数。在这些参数附近进行试验,直到寻找到一组小车直立的控制最优参数。


注意:由于mpu6050传感器安装误差以及信号的漂移,经过调整角度控制参数

的小车不会精致停留在某一点。 它会朝着小车角度倾斜的方向加速行驶。保持小车静止或者恒速运行需要通过速度控制来实现。


程序修改部分:首先在程序里注释掉速度PI控制和转向PD控制,然后在直立PD控制程序里调试P、D参数的大小

初步调试直立PD参数如下:

/**************************************************************************

函数功能:直立PD控制

入口参数:角度、角速度

返回  值:直立控制PWM

作    者:平衡小车之家

**************************************************************************/

int balance(float Angle,float Gyro)

{

float Bias;

int balance;

Bias=Angle+0;              //===求出平衡的角度中值 和机械相关 +0意味着身重中心在0度附近 如果身重中心在5度附近 那就应该减去5

balance=104*Bias+Gyro*0.072;//===计算平衡控制的电机PWM  PD控制

return balance;

}

三.实验现象:小车静止几秒,然后很快朝着小车角度倾斜的方向加速行驶。

具体视频如下


视频地址:http://player.youku.com/player.php/sid/XMTMxNjA2Nzg4OA==/v.swf

四.实验总结:本次实验的主要目的是学习PID调试的基本方法,并利用角度环控制使小车初步保持直立状态,保持小车静止或者恒速运行需要通过速度控制来实现。


助工
2015-08-22 14:01:13     打赏
14楼

PID写的很不错嘛


助工
2015-08-22 15:09:14     打赏
15楼

实验8. 实现平衡小车直立时处于静止状态


一.实验目的:通过实现平衡小车直立时处于静止状态实验,进一步学习PID调试的基本方法,通过实际调试最终使平衡小车初步实现直立时处于静止状态。


二.实验过程及分析:本实验主要是通过实际的调试PID各个参数,实现小车的直立静止,进一步积累PID调试经验。


学习要点:PID调试的基本方法,实际动手调试

PID调试的基本方法:

直立控制:PD 控制,这是最核心的控制,其他的控制都是相对直立控制而言都     是干扰。

速度控制:PI 控制 对编码器信息进行低通滤波可以削弱电机控制的比重,提高系统稳定性。

转向控制:PD 控制 结合了 Z 轴陀螺仪 PD 控制。


速度控制:PI 控制 速度的调制本质上是通过调整小车的角度来实现的。

具体的调试过程可以首先逐步增加比例参数,小车能够在一定平衡点附近来回运动。然后再逐步增加积分参数,小车就会很快停留在平衡点处。 使用外力冲击小车, 小车能够很快趋于静止。 然后再逐步增加比例和积分控制参数,使得小车抵抗外部干扰冲击的能力逐步增强。当比例和积分参数达到一定的数值后,小车开始出现摆动现象。至此可以知道比例和积分的大体范围。在此范围内通过几次调整测试,可以初步确定速度控制参数的最佳组合。


转向控制:PD 控制

具体的调试过程可以首先逐步增加比例参数,当该参数逐步增加时,小车方向回复速度逐步加快。当比例参数增加到一定数值之后,小车的方向回复由于过快,会出现方向过冲现象。此时通过增加微分控制参数可以抑制这种方向过冲的现象。通过几次组合测试,可以选择一组合适的比例控制和微分控制参数使得车模方向控制即迅速又不会出现过冲现象。


三.实验现象:小车初步保持直立静止状态。


视频地址:http://player.youku.com/player.php/sid/XMTMxNjA2ODYyMA==/v.swf

四.实验总结:本次实验的主要目的是学习如何调试PID各个参数,使小车处于初步直立静止状态,但效果还不是很好,有待继续调试PID参数,从而使小车更好地实现处于直立静止状态。


助工
2015-10-03 22:12:56     打赏
16楼

实验9.实现平衡小车绕圈圈


一.实验目的:通过实现平衡小车绕圈圈实验,学习让小车自动走出指定路线的方法,通过实际调试最终实现了平衡小车绕圈圈行走。

二.实验过程及分析:本实验主要是在程序中的5ms定时中断里面设置相应的指令,控制小车行走的前后左右的方向,使小车按照我们指定的路线行走。

学习要点:根据小车指定的行走路线设定小车的行走方向,具体在中断里面如何进行设置,实际调试参数,具体参考下面的代码

/**************************************************************************

函数功能:5MS定时中断函数 5MS控制周期

入口参数:无

返回  值:无

作    者:平衡小车之家

**************************************************************************/

int FiveMsCount=0,Balance_Pwm,Velocity_Pwm,Turn_Pwm;

void TIM1_UP_TIM16_IRQHandler(void)

{

if(TIM1->SR&0X0001)//5ms定时中断

{

TIM1->SR&=~(1<<0); //===清除定时器1中断标志位

readEncoder();                         //===读取编码器的值

if (FiveMsCount < 450)

{

Flag_Qian = 1,Flag_Hou = 0,Flag_Left = 0,Flag_Right =1;

}


else if(FiveMsCount==450)

{

FiveMsCount=0;

Flag_Qian=1,Flag_Hou=0,Flag_Left=0,Flag_Right=1;

}

FiveMsCount++;



Led_Flash(400);                                          //===LED闪烁;

Get_battery_volt();                                      //===获取电池电压

key(100);                                                //===扫描按键状态

Get_Angle(Way_Angle);                                    //===更新姿态

Balance_Pwm =balance(Angle_Balance,Gyro_Balance);        //===平衡PID控制

Velocity_Pwm=velocity(Encoder_Left,Encoder_Right);       //===速度环PID控制

Turn_Pwm    =turn(Encoder_Left,Encoder_Right,Gyro_Turn); //===转向环PID控制

Moto1=Balance_Pwm+Velocity_Pwm-Turn_Pwm;                 //===计算左轮电机最终PWM

Moto2=Balance_Pwm+Velocity_Pwm+Turn_Pwm;                 //===计算右轮电机最终PWM

Xianfu_Pwm();                                            //===PWM限幅

if(Turn_Off(Angle_Balance,Voltage)==0)                   //===如果不存在异常

Set_Pwm(Moto1,Moto2);                                    //===赋值给PWM寄存器

}

}

改变小车的转向速度和绕圈的半径

修改int turn(int encoder_left,int encoder_right,float gyro)函数里面Turn_Amplitude的大小

Turn_Amplitude=310/Way_Angle;

该值越大,小车的转向速度越大,绕圈的半径越小。

三.实验现象:小车在不停地绕圈圈

四.实验总结:本次实验的主要目的是学习如何让小车自动走出指定路线的方法,注意在进入中断时要先清除标志位,然后读取编码器数据,再执行其他指令。


助工
2015-10-03 22:51:31     打赏
17楼

助工
2015-10-09 13:26:40     打赏
18楼

实验10.实现平衡小车绕八字行走

本实验是对上一个实验实现平衡小车绕圈圈的完善,所以实验目的和实验过程及分析与上一个实验差不多,只是把指定路线改为八字。

接下来直接看代码

/**************************************************************************

函数功能:5MS定时中断函数 5MS控制周期

入口参数:无

返回  值:无

作    者:平衡小车之家

**************************************************************************/

int FiveMsCount=0,Balance_Pwm,Velocity_Pwm,Turn_Pwm;

void TIM1_UP_TIM16_IRQHandler(void)

{

if(TIM1->SR&0X0001)//5ms定时中断

{

TIM1->SR&=~(1<<0); //===清除定时器1中断标志位

readEncoder();                                           //===读取编码器的值

if (FiveMsCount < 501)

{

Flag_Qian = 1,Flag_Hou = 0,Flag_Left = 0,Flag_Right =1;

}


else if(FiveMsCount==501)

{

Flag_Qian=0,Flag_Hou=0,Flag_Left=0,Flag_Right=0;

}

else if(FiveMsCount<1002)

{

Flag_Qian=1,Flag_Hou=0,Flag_Left=1,Flag_Right=0;

}

else if(FiveMsCount>=1002)

{

FiveMsCount=0;

Flag_Qian=0,Flag_Hou=0,Flag_Left=0,Flag_Right=0;

}


FiveMsCount++;

Led_Flash(400);                                          //===LED闪烁;

Get_battery_volt();                                      //===获取电池电压

key(100);                                                //===扫描按键状态

Get_Angle(Way_Angle);                                    //===更新姿态

Balance_Pwm =balance(Angle_Balance,Gyro_Balance);        //===平衡PID控制

Velocity_Pwm=velocity(Encoder_Left,Encoder_Right);       //===速度环PID控制

Turn_Pwm    =turn(Encoder_Left,Encoder_Right,Gyro_Turn); //===转向环PID控制

Moto1=Balance_Pwm+Velocity_Pwm-Turn_Pwm;                 //===计算左轮电机最终PWM

Moto2=Balance_Pwm+Velocity_Pwm+Turn_Pwm;                 //===计算右轮电机最终PWM

Xianfu_Pwm();                                            //===PWM限幅

if(Turn_Off(Angle_Balance,Voltage)==0)                   //===如果不存在异常

Set_Pwm(Moto1,Moto2);                                    //===赋值给PWM寄存器

}

}


改变小车的转向速度和绕圈的半径

修改int turn(int encoder_left,int encoder_right,float gyro)函数里面Turn_Amplitude的大小

Turn_Amplitude=310/Way_Angle;

该值越大,小车的转向速度越大,绕圈的半径越小。

实验现象:小车在绕八字行走

实验总结:本次实验的主要目的是学习如何让小车自动走出指定路线的方法,注意在进入中断时要先清除标志位,然后读取编码器数据,再执行其他指令,另外小车在突然改变方向时,要缓冲一下。



助工
2015-10-09 13:36:18     打赏
19楼

助工
2015-10-10 23:13:37     打赏
20楼

实验11.实现小车自主避障

一、实验目的:通过小车自主避障实验,学习超声波测距相关知识,并实现小车的自主避障。

二.实验过程及分析:本实验首先需要通过阅读超声波模块的相关资料,掌握超声波测距的方法,然后学习如何使小车在蓝牙控制的同时也能实现避障功能。


学习要点:超声波测距知识点,小车自主避障


超声波测距知识点:

首先看看超声波模块长什么样子


接口定义:

Vcc、 Trig(控制端)、 Echo(接收端)、 Gnd

本产品使用方法:控制口发一个 10US 以上的高电平,就可以在接收口等待高电平输出.

一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测

距的时间,方可算出距离.如此不断的周期测,就可以达到你移动测量的值了。

 

超声波模块测距原理:

 

 应用注意事项:

1:此模块不宜带电连接,如果要带电连接,则先让模块的 Gnd 端先连接。否则会影响

模块工作。

2:测距时,被测物体的面积不少于 0.5 平方米且要尽量平整。否则会影响测试结果。

 

主要相关代码:

 

初始化函数 TIM2_Cap_Init,把 TIM2 的 CH4 初始化为输入捕获

/**************************************************************************

函数功能:定时器2通道4输入捕获

入口参数:入口参数:arr:自动重装值  psc:时钟预分频数 

返回  值:无

**************************************************************************/

void TIM2_Cap_Init(u16 arr,u16 psc)

{  

RCC->APB1ENR|=1<<0;    //TIM2 时钟使能 

RCC->APB2ENR|=1<<2;     //使能PORTA时钟     

GPIOA->CRL&=0XFFFF00FF; 

GPIOA->CRL|=0X00008200;//Pa.2 推挽输出    Pa.3 输入 


  TIM2->ARR=arr;   //设定计数器自动重装值   

TIM2->PSC=psc;   //预分频器 

TIM2->CCMR2|=1<<8; //CC1S=01  选择输入端 IC1映射到TI1

  TIM2->CCMR2|=0<<12;  //IC1F=0000 配置输入滤波器 不滤波

  TIM2->CCMR2|=0<<10;  //IC2PS=00  配置输入分频,不分频 

 

TIM2->CCER|=0<<13;  //CC1P=0 上升沿捕获

TIM2->CCER|=1<<12;  //CC1E=1  允许捕获计数器的值到捕获寄存器中

 

TIM2->DIER|=1<<4;    //允许捕获中断

TIM2->DIER|=1<<0;    //允许更新中断

TIM2->CR1|=0x01;     //使能定时器2

MY_NVIC_Init(1,3,TIM2_IRQn,1);

}


在 TIM2 的中断服务函数里面实现脉宽测量

/**************************************************************************

函数功能:超声波回波脉宽读取中断

入口参数:无

返回  值:无

作    者:平衡小车之家

**************************************************************************/

void TIM2_IRQHandler(void)

{              

 u16 tsr;

tsr=TIM2->SR;

if((TIM2CH4_CAPTURE_STA&0X80)==0)//还未成功捕获

{

if(tsr&0X01)//溢出

{     

if(TIM2CH4_CAPTURE_STA&0X40)//已经捕获到高电平了

{

if((TIM2CH4_CAPTURE_STA&0X3F)==0X3F)//高电平太长了

{

TIM2CH4_CAPTURE_STA|=0X80;//标记成功捕获了一次

TIM2CH4_CAPTURE_VAL=0XFFFF;

}else TIM2CH4_CAPTURE_STA++;

}  

}

    if(tsr&0x10)//捕获1发生捕获事件

     {

if(TIM2CH4_CAPTURE_STA&0X40) //捕获到一个下降沿 

{   

TIM2CH4_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽

TIM2CH4_CAPTURE_VAL=TIM2->CCR4; //获取当前的捕获值.

TIM2->CCER&=~(1<<13); //CC1P=0 设置为上升沿捕获

   }else   //还未开始,第一次捕获上升沿

   {

TIM2CH4_CAPTURE_STA=0; //清空

TIM2CH4_CAPTURE_VAL=0;

TIM2CH4_CAPTURE_STA|=0X40; //标记捕获到了上升沿

TIM2->CNT=0; //计数器清空

TIM2->CCER|=1<<13;  //CC1P=1 设置为下降沿捕获

}     

     }               

   }

 TIM2->SR=0;//清除中断标志位   

    

}


调用 Read_Distane 函数实现对超声波模块的触发和对回波脉宽的测量

/**************************************************************************

函数功能:超声波接收回波函数

入口参数:无

返回  值:无

**************************************************************************/

u16 TIM2CH4_CAPTURE_STA,TIM2CH4_CAPTURE_VAL;

void Read_Distane(void)

{   

 PAout(2)=1;    //Trig(控制端)产生一个10us以上的高电平

 delay_us(15);  

 PAout(2)=0;

if(TIM2CH4_CAPTURE_STA&0X80)//成功捕获到了一次高电平

{

Distance=TIM2CH4_CAPTURE_STA&0X3F;

Distance*=65536; //溢出时间总和

Distance+=TIM2CH4_CAPTURE_VAL; //得到总的高电平时间

Distance=Distance*170/1000;

//printf("&d \r\n",Distance);

TIM2CH4_CAPTURE_STA=0; //开启下一次捕获

}

}


注意:单片机定时器的个数有限,TIM2 也是平衡小车左路编码器的接口。但是如果采集超声波的话,就不再采集这一路编码器。 然后改用 右路编码器近似算出左路编码器的值。


int Balance_Pwm,Velocity_Pwm,Turn_Pwm;

int TIM1_UP_IRQHandler(void)  

{    

if(TIM1->SR&0X0001)//5ms定时中断

{   

  TIM1->SR&=~(1<<0);                                       //===清除定时器1中断标志位  

Encoder_Right=Read_Encoder(4);                           //===读取编码器的值

#if MODE_BIZHANG==1 

  Encoder_Left=Encoder_Right;                            //===避障模式,左路编码器直接由右路编码器近似,并取消转向环中的编码器使用,只用Z轴陀螺仪

#else 

Encoder_Left=-Read_Encoder(2);                         //===读取编码器的值,因为两个电机的旋转了180度的,所以对其中一个取反,保证输出极性一致

  #endif

......

 

小车自主避障:在避障时候,蓝牙遥控依然可以使用,但是小车检测到前方 0.5 米有障碍会自动后退。


关键代码:

 #if MODE_BIZHANG==1

  if(Distance<500)  

{

Movement+=700 ; 

    if(1==Flag_Qian)

Movement=700;

}

  #endif


三.实验现象:小车能够自主避障,也就是通过蓝牙控制小车的运动,当超声波模块检测到小车前方 0.5 米处有障碍时会自动后退。


四.实验总结:通过本次实验学习了利用超声波测距的相关知识和注意事项,并学习了如何实现小车的自主避障,避免了蓝牙控制和超声波避障的冲突。

 

 


共45条 2/5 1 2 3 4 5 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]