赞
踩
双轮平衡车是一种利用倒立摆原理的高度不稳定两轮机械装置,其力学特性具有多变量,非线性和不稳定等特点。本文使用STM32F103C8T6作为MCU,利用MPU6050六轴加速度陀螺仪和带霍尔编码器的MG315减速电机搭建平衡小车。通过整合小车的加速度、倾角进而速度信息,应用串级PID算法实现对小车的直立行走以及差速转向。此外,还使用HC-06蓝牙模块实现对小车的无线控制,利用4路光电模块完成寻迹功能,经过试验本系统具有较强的适应性和稳定性。
关键词:STM32F103C8T6;双轮平衡车;MPU6050;串级PID;
Abstract
Double-wheeled balanced car is a highly unstable two-wheeled mechanical device using the principle of inverted pendulum. Its mechanical characteristics are multivariable, non-linear and unstable. This essay uses STM32F103C8T6 as MCU, uses MPU6050 six-axis accelerometer gyroscope and MG315 deceleration motor with Hall encoder to build a balanced car. By integrating the acceleration, inclination and speed information of the car, a cascade PID algorithm is applied to achieve vertical walking and differential turning of the car. In addition, the HC-06 Bluetooth module is also used to achieve wireless control of the car, and 4 photoelectric modules are used to complete the tracking function. Finally, the system is proved to be very stable and flexible by experiments.
Keywords: STM32F103C8T6; Double-wheeled balancing car; MPU6050; Cascade PID;
双轮平衡车是一种应用广泛的动力学系统,具有多变量,非线性和不稳定等特点。在研究控制论和应用方面都有巨大的意义,近年来它的发展也受到了人们的广泛关注。
双轮直立平衡车可以简化为一阶倒立摆模型进行分析,设计的目标是保证小车能够在启动后快速到达平衡位置,并且能够在外界施加随机扰动后依旧没有振荡和过大的角度偏移。即当小车达到期望的状态后,能够通过控制系统实现动态稳定。
图1. 一阶倒立摆模型
本文中提到的直立小车使用MPU6050内部DMP算法读取小车当前在三个方向上的倾角和加速度作为输入量,此外利用霍尔传感器得到车轮转速作为反馈信息。小车左右两个轮子的转速和转向作为控制量,实现前后运动和差速转向。整个控制过程通过串级PID来实现,利用TB6612芯片调节PWM输出的占空比以改变电机转速。最后通过控制参数的调整和优化,实现小车的稳定运行。
通过这个项目我们可以学会MPU6050的使用,简单的PID算法和参数整定方法,以及基本的I2C,USART,外部中断以及定时器的使用。
2.1硬件框架
硬件方面主要由STM32F103C8T6最小系统,TB6612电机驱动,电源管理模块,HC-06蓝牙,OLED显示屏,控制按键和编码电机组成。通过单片机输出的PWM控制左右电机的转速,完成前后作用运动。利用寻迹模块检测地面黑线达到寻路功能,硬件框架如下图:
图2. 硬件框架图
2.2软件框架
软件方面主要是通过MPU6050读取的三轴角速度和倾角信息作为基本的控制信息,再加上霍尔编码器输出的左右轮转速作为反馈信息实现。算法方面使用串级PID算法,包括PD直立环、PI速度环以及PD转向环三个方面综合计算实现小车的稳定运行,软件框架如图所示:
图3. 算法框架图
3.1 平衡车结构论证与选择
小车需要搭乘多个模块,因此需要足够的空间。这里我们选择双层结构,层与层之间用铜柱和螺丝固定。模块和车体之间用捆扎带固定,杜邦线使用热熔胶固定。车体总的来说较为稳定,在旋转和高速运动时车上每个结构都能够保持相对静止。小车实物图如下:
图4.小车正视图
图5.小车侧视图
图6.小车俯视图
A.框架材料选择
平衡小车的重心要尽量低,且尽量处于车体的平面上的几何中心。这样小车加速度和倾角将更趋于线性,也将更便于控制和整定参数。因此我们选择铝制板和37电机支架这样较重的材料做车的底层,而顶层选择用亚克力。在保持结构有足够的刚度的同时,将重心尽量拉低。
B.车体大小选择
平衡小车的控制要点类似于四旋翼飞行器,两者的都是体积越大越容易控制,在受到随机扰动的时候也越容易保持稳定。但不同的是小车是需要严格控制一个方向(俯仰角)的角度,而四旋翼飞行器是要保持两个方向(俯仰角和翻滚角)的角度。也就是说垂直于小车运动方向的距离,即适当增大轮距有助于小车的平衡。
除了以上描述的一些部分外,其他材料的选择还有一些不太重要的考量,这里就不再一一赘述,使用的所有模块和硬件连接如下表(电源线和地线省略):
表1. 模块和硬件连接表
模块/材料 | 连接/材料类型 | 作用 |
MPU6050 | PB8->SCL, PB9 ->SDA, INT->PB5 | 获取小车加速度和倾角 |
电机驱动 | B12->BIN2, B13->BIN1, B14->AIN1, B15->AIN2 PWMA->A8, PWMB->A11 | 控制左右轮转向和转速 |
霍尔编码器 | B1A->B6 B1B->B7 B2A->A0, B2B->A1 | 获取左右电机的转速和转向 |
4线OLED | B4 ->SCL, B3 ->SDA | 显示读取的数和PID数值 |
HC-06蓝牙 | RXD ->B10, TXD->B11 | 使用单片机的USART3和上位机的通信 |
四路光电 寻迹模块 | D0->B1, D1->B0, D2->A7, D3->A6 | 完成小车寻迹功能 |
按键 | 1->A2, 2->A3,3->A4, 4->A5 | 调整PID和控制小车 |
板材框架 | 亚克力*1,铝板*1 37电机支架*2 | 用作载物和固定电机 |
支撑件 | 铜柱*4,M3螺丝*8,螺母*8 | 用于层与层之间的连接 |
固定件 | 捆扎带若干,绝缘胶带若干 | 固定模块,同时保证绝缘 |
3.2 陀螺仪论证与选择
方案一:
选用双轴倾角传感器LE-60-OEMLE-60-OEM,可以测量x, y方向上的重力加速度变换,以转换成倾角。具有成本低,体积小,重量轻等优点。但是操作复杂,软件处理难度大。此外,虽然小车的航向角Yaw不太重要,但是失去转向环对小车的稳定性依旧有一定影响。
方案二:
MPU-6050是全球首个整合性6轴运动处理组件,具有体积小、重量轻和响应速度快等优点。可以测量整个空间的加速度,全面反映运动物体的空间位置。芯片内部还有温度传感器能够拟补温度造成的误差,使用I2C即可完成与MCU的通信。此外利用芯片内置的DMP功能能够很便捷地获取姿态信息,避免了复杂的算法操作和外围电路。DMP(Digital Motion Processor)是MPU6050内部的运动引擎,可以通过它直接输出四元数,可以减轻外围微处理器的工作负担且避免了繁琐的滤波和数据融合,使用方便。
方案三:
MPU-6050加上外接3轴磁力计可以实现9轴运动处理。相比于单独的MPU-6050传感器,这种组合可以拟补测得的航向角因为磁场和硬件问题造成的积分累积偏差,但是也大大增加了硬件的成本。
由于较小的航向角误差对于小车的整体性能并不会有较大的影响,我们也不需要小车在复杂的磁场环境下长时间工作,这里我们直接选择方案二。
3.3 控制器的论证与选择
方案一:
STM32F103是一种处理能力强、运算速度快、超低功耗、片内资源丰富,具有方便高效的开发环境。通过I2C通信可以轻松读取MPU-6050中DMP输出的四元素,实现简单易于新手使用。缺点是今年由于美国芯片“禁运”导致国内芯片大涨,尤其是很多常用中低端芯片甚至涨价两三倍,使用成本较高。
方案二:
CH32F103是南京沁恒公司推出的对标STM32F103的芯片,其同样基于Cortex-M3架构,在绝大多数结构上和STM32F103一致。在软件上也同样兼容STM32F103程序,甚至不用做任何改动直接烧录就可以正常运行。成本低,在一般使用情况下,可以完美替代STM32F103。
最初我们选择并具体实施了方案二,但在使用过程中我们先后遇到了两大问题。首先是MPU-6050的DMP读取总是只能读取到初始化之后第一次的值,经过多方查找最后发现是硬件的FIFO溢出。当传感器在工作时,MPU6050对陀螺仪和加速度计按照一定的采样速率进行采样,并将采样得到的陀螺仪和加速度计数据通过DMP处理后得到姿态角然后存入FIFO中。如果FIFO当中的数据没有得到及时处理便会溢出,最终导致读取失败。遇到这种情况我们可以在每次读取输出时重置FIFO,这样的话即使处理速度达不到FIFO的溢出速度也能正常读取信息。
解决了第一个问题后本以为万事大吉,没想到第二个问题却接踵而来。每次读取时重置FIFO固然虽然可以保证数据的正常获取,但是整个系统运行的速度也就下降了。虽然也能保证每秒钟读取1~2次数据,但是造成的延时完全不满足平很车这个高度不稳定系统动态平衡的需求。由于网上关于CH32使用MPU6050的资料几乎为零,再加上自身经验的不足最终选择放弃。
之后我们开始尝试使用STM32F103,发现并不存在FIFO溢出的现象。说明STM32的运行速度可以满足MPU6050的正常读取,但是依旧有一定的延时,不能满足动态平衡的需求,针对这个问题的解决方案我将在之后的软件系统部分再详细。为了维持MP6050的高速读取,我们最终选择方案二。
3.4 电机驱动模块论证与选择
方案一:
L298N直流电机驱动模块是一种接受高电压的电机驱动器,被广泛应用到直流电机和步进电机的驱动。通过主控芯片的I/O输入对其控制电平进行设定,就可为电机进行正转反转驱动。总体来说其操作简单、稳定性好,可以满足直流电机的大电流驱动条件。
方案二:
TB6612N是一款功能基本等同于L298N的电机驱动芯片,相对于L298N它有体积小,结构简单的特点。此外它的PWM响应速度、效率都优于L298N,发热也更少。
综合考虑,我们选择能够快速相应且节省空间的TB6612芯片作为电机驱动。车轮转向通过输出的2位高低电平控制,转速由PWM调节真值表如下:
表2️. 电机转速和转向控制真值表
转速控制 | PWMA:控制电机1转速 | PWMB:控制电机2转速 | ||||||
转向控制 | AIN1 | 0 | 0 | 1 | BIN1 | 0 | 0 | 1 |
AIN2 | 0 | 1 | 0 | BIN2 | 0 | 1 | 0 | |
转向 | 停止 | 正转 | 反转 | 转向 | 停止 | 正转 | 反转 |
3.5 无线模块论证与选择
方案一:
HX1838B红外接收模块能够满足短距离内的遥控需求,且价格低廉,结构简单,只需要简单的解码就可以接收数据。但是使用它需要占用一个中断,影响程序的运行效率。
方案二:
HC-06是一种广泛应用于各种场合,且支持蓝牙4.0驱动的模块。在最新的安卓、IOS、Windows操作系统以及微信小程序中都能自由使用,具有很强的兼容性。此外,使用它可以直接通过USART串口和上位机通信,方法简单技术成熟。
实际测试中我们发现红外接收模块正常接收数据必须保证无遮挡,且正常通信距离不超过2m。这给我们的调试带来了很多不便,因此我们最终选择方案二。
3.6 电源和稳压模块的论证与选择
方案一:
12V18650锂电池+12V-5/3.3V电源模块可以满足电机12V驱动供电,以及单片机和其他模块的正常供电。
方案二:
12V聚合物电池+12V-5/3.3V电源模块功能与方案一相同,最大的区别在于聚合物电池的体积小。
对于需要重心高度集中的平衡小车而言选择小体积是必要的,此外聚合物锂电池放电效率也更高。所以我们选择方案二。
3.7 电机种类的论证与选择
方案一:步进电机是将电脉冲信号转变为角位移或线位移的开环控制元步进电机件,在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,电机的位置可以被精准控制。但是对于平衡小车这个极度不平衡的系统,受到的干扰很大,很难完成精准控制。
方案二:减速电机是在上普通电机加上了减速箱,这样便降低了转速,增加了扭力。满足了小车大载重和高速反应的需求,但是速度控制需要用PWM波调节,精确度不是很高。
综合考虑,我们选择方案二。小车的主要目的是能够平衡,对速度控制要求不高。
4.1 MPU6050数据读取
MPU6050的数据读取一般有三种方式,分别是DMP、互补滤波和卡尔曼滤波。互补滤波和卡尔曼滤波能够一定程度解决航向角偏移的问题,而且对于随机干扰也有更优秀的表现,但是实现较为复杂的算法。从自身实力考虑,我们选择使用MPU6050内置的DMP运动芯片自动解算模块,只需要通过简单读取寄存器操作便可以获得小车的姿态信息。
最初我们选择将读取DMP数据的函数和PID算法都放到main中执行,但无论我们怎样调整参数,小车只能维持短暂的平衡,且会在平衡之后进行高频振动。在多方查找资料后我们发现,PID算法需要保持良好的周期性。特别是在进行PD运算时,短暂的时差就会导致巨大的误差。而MCU的每个运行周期受到运算量的影响,所以PD算法也会有随机误差产生。
所以我们选择将DMP读取和PID算法同时放到外部中断当中,用MPU6050自带的中断引脚INT发出的信号作为定时信息。这样就能维持高度的周期性,且PID和DMP也会高度同步。这样原本的抖动现象就消失了,经过简单的参数整定就能保持稳定。
4.2 PID算法
我们选择简单的串级PID算法,所谓串级PID类似于串联,它将PD直立环(balance)、PI速度环(velocity)和PD转向环(turn)结果分别计算最后相加。得到输出左右轮的PWMA和PWMB输出。其极性代表转向。三个环量“你追我赶”,“相互制约”才能保证一个动态稳定的系统,具体计算公式如下:
其中直立环使用比例+微分变量(PD)进行控制,比例系数计算小车倾角与平衡位置的差(Bias),而微分系数计算小车俯仰角的加速度(gyroy)。小车的直立情况与积分量无关,主要与其位置和加速度有关,具体计算公式如下:
速度环使用优化后的限幅比例+积分变量(PI)进行控制,比例系数计算小车左右轮速度之和和零之间差值(Encoder_Least),积分系数计算小车速度差累加和(Encoder_Integral)。由于速度控制与小车的加速度几乎无关,所以只是用PI控制,具体公式如下:
转向环一般可以单独使用P控制,直接差速即可。但是在实验过程中,地面过于光滑调整参数后的整体效果极不理想,最后我们选择用限幅的PD控制。通过轮胎的反馈速度和航向角Yaw来给定差速。比例系数计算控制理想差速度(设置为0,小车理想状态是处于静止平衡状态)和实际差速度的差值(Turn_Target),微分系数计算z轴陀螺仪转向角(yaw),具体计算公式如下:
将以上三者融合在一起,我们可以得到以下框图用以表示本文中所用到PID算法流程:
图7. PID算法框图
4.3 电机测速
电机测速使用双输出的正交霍尔编码器输出,这种旋转编码器不仅可以测量速度还可以测量旋转方向,编码器的两组A/B输出相位差90度的300个双相脉冲。想要使用脉冲信息测量速度,首先使用定时器定时50ms。编码器转一圈会发送脉冲,一个脉冲可以产生一个中断,在中断函数里令一个变量自加,每产生一个脉冲总脉冲数就加一。
之后用脉冲数/300就可得到在这50ms内电机转动得圈数,乘以20就是每秒钟转的圈数。
4.4 寻迹功能
通过GPIO输入判断地面线的位置,使用IF语句处于不同位置的情况给予不同的转向力度。实现这个功能和原理比较简单,但是参数整定过程较为麻烦。
4.5 算法及程序流程图
除了以上算法之外,整个程序的运行还有一些小的优化,用语言表达过于繁琐,我将在下面的流程图中表示出来:
图8. 程序运行流程图
平衡小车的具体参数受到车体结构和地面倾斜角度的影响,参数整定是一个极为枯燥耗时的工作。参数整定没有好的方法,只能通过不断尝试,用“夹逼准则”才能找到最好的值。换言之,好的参数就是大量时间堆积出来的结果,而我们的课设意在学习使用PID,对于参数的调节不过分追求。但仅仅调出一个勉强能用的参数也耗费了我们大半个月的时间,这里我们简单叙述一下参数调整的过程。对于串级PID我们一般先调节直立环,再调节速度环,在调节完这两个环节之后小车就能很好地走直线了。最后我们调节转向环,用于调节转向。每个环的功能如下图所示:
图9. PID对应每部分功能
5.1确定小车机械中值
首先把平衡小车放在地面上,绕电机轴旋转平衡小车,寻找小车能够保持平衡的角度并记录,这里我们获得的角度是0°。
5.2直立环调节
直立环是保证小车能够直立的关键,有了直立环小车就能在无任何扰动的情况下保持直立。也就是说,小车可以根据自身的俯仰角数据控制轮胎的转向和转速。
A.Kp的极性和大小的确定
我们将PWM设置为 7200 代表占空比100当假如我们设定Kp值为720,那么平衡小车在±10°的时候就会满转。所以可以估计Kp值在0~720 之间。
首先我们确定Kp的极性,我们将小车的Kp设置为200。如果小车向那边倒车轮就像哪边转,这是我们不希望看到的正反馈。这时我们要修改Kp的极性,反之说明极性正确,这里我们的Kp极性确定为负值。
确定Kp大小的方法是将其一直增加,直到出现大幅度的低频抖动,大致过程如下:
B.Kd的极性和大小的确定
通过观察编码器回传的数据,我们发现最大值在3000左右,再根据7200 代表占空比100%,所以我们估算Kd值应该在0~2.4 之间。
将Kd的值设定为0,再设定Kd=0.5。当我们拿起小车旋转的时候,车轮会反向转动,并没有能够实现跟随效果。这说明了Kd的极性反了。接下来,我们设定Kd=-0.5,这个时候我们可以看到,当我们旋转小车的时候,车轮会同向以相同的速度跟随转动,这说明我们实现了角速度闭环,至此,我们可以确定kd 的极性是负的。
打开确定好的比例控制,将Kd从小到大增加,直到小车出现剧烈高频抖动。
按照前人的调试经验,这时我们已经获得了最大的比例和微分数值。这时,将我们这个数值乘以0.6就是我们需要的数值,最后通过微调得到:Kd=-97, Kd=-1.38。
5.3速度环调节
有了速度环后我们还并不能让小车保持直立。通过实验可以发现,当加入微小的扰动之后,小车会向一个方向快速倒下。这是因为只依靠俯仰角信息,我们不能使有一定速度的小车依然保持平衡,小车会由于惯性倒下。我们要让小车停下来,小车需要行驶更快的速度去“追”,小车运行的速度越快,去“追”的速度也就越快。
Kp和Ki的极性相同,且是一种线性控制器,它们的系数大小一般有Ki=Kp/200的关系。
A.确定Kp,Ki的极性
关闭直立环控制后,设置Kp=100,Ki=0.5,拿起小车将其中一个轮胎向任意一个方向旋转,另一个轮胎会自动反向旋转。这就是一般控制系统中的负反馈现象,这是我们不想看到的结果。
设置Kp=-100,Ki=-0.5,拿起小车将其中一个轮胎向任意一个方向旋转,另一个轮胎会向相同的方向旋转并逐渐加速到最大值。自此,我们可以确定Kp,Ki的极性为负值。
B,确定Kp,Ki的大小
由于直立环和速度环是相互制约的系统,所以先打开已经调整好的直立环控制。
通过以上步骤,我们可以判断Kp, Ki的范围为Kp:-150~-200,Ki:-0.75~-1,通过反复调整,最后我们确定Kp=-180,Ki=-0.9。
5.4转向环调节
我们前面说过,有了直立和转向环控制后小车就已经能够有很好的平衡性能。但是想要小车走直线或者转向还需要转向环控制转向角和两轮的差速度值。这里我们使用左右轮编码器数据之差的积分值作为比例控制量,以 Z 轴陀螺仪作为微分控制的输入进行 PD控制,目标是保持转向角为设定值。
A.确定Kp, Ki的极性
将直立环和速度环关闭,设置Kp=-10,Ki=-0.1,将小车放到地面尝试转动小车。发现小车能够很轻易地被转动,这样的正反馈是我们所不希望看到的。设置Kp=10,Ki=0.1重复上述操作,我们发现下车很难被转动,说明小车控制电机保持走直线,可以确定Kp, Ki均为正值。
B.确定Kp, Ki的极性
首先开启已经调试好的转向换和速度环。
可以确定Kp:30~70, Ki:0.3~0.7, 通过多次调整最终确定Kp=42,Ki=0.5。最后小车具有很好的平衡特性,且能完成前进后退以及转向的功能。
6.1小结
本次课设对我们小组的成员来说是一次勇敢的尝试和巨大的挑战。之所以这么说是因为我们的单片机基础比较差,还选择了这样有难度的题目。但是这一次尝试也给我们带来了宝贵的收获,下面就我们的课设做一下总结。
首先是准备阶段,我们提前前三个月开始恶补关于单片机,在花了一个月学习完了51单片机后,之后的时间就用来学习和使用STM32F103。相比于51的驾车就熟,STM32少了很多约束,但是随之而来让人眼花缭乱的库函数、寄存器操作让我们应接不暇。我们选择跟着野火的教程系统的学习STM32的标准库操作和初级实验,虽然知道我们实力不济但是在学习一个月后我们硬着头皮开始了课设。这是因为基础不牢,之后我们也是麻烦不断。
第一个遇到的问题就是使用MPU6050,我们参考了官方给的DMP手册和CSDN上的一些资料进行操作。一切看上去比较顺利,但是无论怎么样MPU6050只能读到上电时的初始数据。经过查阅资料我们发现是MPU6050的FIFO溢出,在每次读取数据之前对FIFO进行重置操作后问题得到了解决。但是严重的延时问题,最终还是让我们放弃了使用CH32。在赶完了所有程序之后,就是漫长的调参过程,一开始无论我们这样调整参数效果都不太理想。
首先我们将问题归结于机械结构,我们将小车拆了又装装了又拆,来来回回调整了十多次。一开始使用胶带固定模块,后来发现效果很差又改用了捆扎带。又将电池换成重量较小的聚合物电池,但是还是不太理想。最后我们像是搭积木一样从下而上一点一点搭建结构。每一步都尽量让小车的重心处于几何中心。这样没有上电的小车才能勉强立起来一两秒。
但是我们无论这样再优化参数最后小车总是在平衡几秒钟后向一个方向加速倒下。后来我们询问了有智能车比赛的学长得知应该是PID的读取没有定时的问题。之后一切豁然开朗我们将DMP读取和PID算法同时放到外部中断当中,用MPU6050自带的中断引脚INT发出的信号作为定时信息。这样就能维持高度的周期性,且PID和DMP也会高度同步。这样原本的抖动现象就消失了,经过简单的参数整定就能保持稳定。
至此我们的课设才画上一个句号,但是还是有一些遗憾。参数还可以进一步优化,之前的一些功能和想法也没来得及实现。但是我们收获了很多知识,也培养了自己多学多问大胆尝试的精神。在我们不够擅长的机械控制领域也有了一些涉足,也体会到了做一个完整的系统的困难。从硬件到软件只要有一步出错,最终的表现将大相径庭。在未来的工程应用和科研中,我们必定会遇到比这更困难的系统。这需要我们学会合作,认真的态度,从小事做起每一步都脚踏实地才能做成大事。
6.2团队分工
你猜!
[1]卓晴. 第七届全国大学生“飞思卡尔”杯智能汽车竞赛电磁组直立行车参考设计方案[M]. 智能车竞赛秘书组, 2012.
[2]刘火良. STM32库开发实战指南[M]. 机械工业出版社, 2013.
[3]卓晴, 黄开胜, 邵贝贝. 学做智能车:挑战"飞思卡尔"杯[M]. 北京航空航天大学出版社, 2007.
[4] Xiaogang R , Hongge R , 阮晓钢, et al. Two-wheeled self-balancing mobile robot dynamic model and balancing control两轮自平衡机器人动力学建模及其平衡控制*[J]. 计算机应用研究, 2009, 26(1):99-101.
[5]高正中, 龚群英, 宋森森. 基于STM32的智能平衡车控制系统设计[J]. 现代电子技术, 2016, v.39; No.469(14):46-48.
[6]王开亮, 王琪, 秦海亭,等. 基于电磁寻迹的二轮自平衡小车的设计与实现[J]. 自动化与仪器仪表, 2020, No.243(01):83-86.
[7]闻双云. 两轮自平衡小车控制算法的研究与优化[D]. 吉林大学.
[8]赖义汉, 王凯. 基于MPU6050的双轮平衡车控制系统设计[J]. 河南工程学院学报:自然科学版, 2014.
想要源代码的同学可以选择支持一下:基于stm32和MPU6050的平衡车代码+技术报告-嵌入式文档类资源-CSDN下载
或者前往我的B站专栏文末去白嫖
┭┮﹏┭┮B站同id:for逸
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。