preface
关于报销,目前大概率申报成功+报销,听说报销好麻烦,最坏打算吧,当作自己的捣鼓项目,把别人的破事加在自己身上是真的憨憨。
关于学校资源,NLP也是要靠自己学啊,反正互联网能给的已经超过老师了,没有业界大佬带的情况下,自己动手吧。
#这是一个自平衡的应用项目,
需要:安卓开发
,arduino基础
,蓝牙通信
,电工手工基础
人们会因为看不到价值而否定,但并不代表你做的事没有价值。
目前的问题
小车重心高低的问题,众说纷纭。。。低些好吧。
小米物联网方案有效性问题…企业开发组认证…
。。。硬件涉及到底层是巨麻烦的,不是工科学校,能避免就避免吧。
项目历程
Alicia 1.0
先实现基本模型,及平衡
- 主控板BLE-NANO,淘宝地址,说明书非常重要,通过Serial可与手机蓝牙进行通信
- 减速电机(带编码器可测速),淘宝地址【参考一下他人的,选择了DC 6V A06型 减速比1:30 额定转速为300rpm 34mm轮子】
- MPU6050(3轴陀螺仪3轴加速计传感器),淘宝地址 【GY-521,IIC通信】
- 电池,淘宝地址,12V,串联两个电机
- 电机驱动,TB6612FNG电机驱动板模块,淘宝地址
- 其它:超声波模块,直角固定架(暂时用的纸板,以后3D打印时不需要了)
- 耗材:电线,胶带,热熔枪,电烙铁,纸板
一些说明:热熔胶不导电,可以对电路板进行固定及保护
还是要弄一个3D模型去打印一下
mpu6050可以不需要的,手机上写个PID的APP,并且更加精确,
正在实践中,东西固定在纸板上,PID实现自平衡即可告一段落
参考项目
③自平衡
参考资料
⑤Arduino教程:MPU6050的数据获取、分析与处理⭐
altium designer PCB板的设计
上位机的制作
关于模型,还是想3D打印一个
中望3D2021…
关于电机驱动,查阅到arduino uno的IO引脚支持电流20ma,3.3V引脚支持电流50ma,仅能驱动LED等小功率负载设备。大功率驱动不了,还可能烧板子。
还可以理解为逻辑供电的接口不能用于物理供电。
驱动电机需要较大电流,单片机的作用在于高低点平控制电机而不是直接驱动。
关于带编码器电机的使用:
- M1,M2接口
- 电机接电
- VCC,GND接口
- 编码器接电
- C1,C2接口
- 编码器AB相
其它: 空心杯电机,买着玩玩,35000~50000转速,转起来有点吓人…
PID:一种应用广泛的控制算法。
- 比例项P(根据误差调整,参数kp)
- 积分项I(根据误差的累积调整,参数ki,)
- 微分项D(根据误差的变化率调整,参数kd,相当于缓冲)
伪代码:
pre_error=0
total_error=0
while True:
error = setpoint - measured_value
total_error += error*dt
derivative = (error-pre_error)/dt
output = kp*error+ki*total_error+kd*derivative
pre_error = error
wait(dt) #dt为测量的时间间隔
一些应用:DIY飞机的控制,超声波感知地面高度。
倒立摆:想想你如何用手去支撑一个直立的东西,一个模型
闭环控制是根据控制对象输出反馈来进行校正的控制方式,它是在测量出实际与计划发生偏差时,按定额或标准来进行纠正的。
蓝牙
//这是BLE-NANO自带的测试程序
//由于arduino语言没有高亮,这里用c表示
//可以看出也是串口进行通信
byte comdata;
void setup()
{
Serial.begin(9600);
Serial.println("BLE Test");
}
void loop()
{
while (Serial.available() > 0)
{
comdata = Serial.read();
delay(2);
Serial.write(comdata);
}
}
RSSI表示接受信号的强度,<-20
不管是集成的,还是独立的HC06蓝牙模块,都用的AT指令集,蓝牙SSP串口通信,所以直接用集成板了
蓝牙还分为主机M
,从机S
。进行一次主从变换后,电脑发送指令无效,变成从机被手机扫描到。
这个部分指令表基于BLE-NANO,(要大写,不能空格),经过2021-1-20
实践:
指令 | 效果 |
---|---|
AT |
+OK,这是一个测试指令 |
AT+ALL |
查看所有配置信息 |
AT+SCAN |
蓝牙主从模式下扫描附近从机 |
AT+MAC |
查看蓝牙mac12位地址 |
AT+NAME=<Param> |
配置蓝牙名字 |
AT+ROLE |
查看蓝牙主从模式,0表示主机,1表示从机 |
AT+ROLE=0 |
将其变成主机。 |
AT+AUTOCON=<Param> |
0:关闭自动连接上次的设备,1:开启 |
AT+DISCON |
断开连接 |
AT+AUTH=<Param> |
0:蓝牙的连接无密码,1:需要 |
AT+PASS=<Param> |
设置密码 |
AT+MODE=<Param> |
设置蓝牙的工作模式,0:透传(串口透传),1:驱动模式,2:iBeacon |
AT+BLEUSB=<Param> |
设置蓝牙的 USB 和蓝牙数据传输模式,3:USB串口通信和BLE透传,0:关闭 |
AT+TXPOWER=<Param> |
设置蓝牙的发射功率 |
AT+MINI_INTERVAL=<Param> |
设置芯片最小通信间隔,单位ms |
AT+MAX_INTERVAL=<Param> |
设置芯片最大通信间隔 |
AT+SETTING=DEFAULT |
恢复出厂设置 |
开发说明:产品的蓝牙是透传功能,所以蓝牙编程,其实是对arduino串口进行读写操作。BLE协议规定每个蓝牙数据包的长度不能超过20byte,每一包数据发送间隔需要超过 150ms,否则容易丢包。
蓝牙模块大致结束了,接下来就是修改安卓APP实现控制了
java编译成一种特殊的class文件,然后java虚拟机充当解释器执行。Jet Brains第三方公司开发了可被java虚拟机解释的编程语言Kotlin,兼容java,更加简洁高级,于是成为了Android开发的推荐语言。
蓝牙API都在arduino.bluetooth包下,查看蓝牙开发文档
BluetoothAdapter
- 本地蓝牙适配器,是所有蓝牙交互的入口,表示蓝牙设备自身的一个蓝牙设备适配器,整个系统只有一个蓝牙适配器。通过它可以发现其它蓝牙设备,查询配对设备列表,使用已知的 Mac 地址实例化
BluetoothDevice
以及创建BluetoothServerSocket
用来侦听来自其他设备的通信。
- 本地蓝牙适配器,是所有蓝牙交互的入口,表示蓝牙设备自身的一个蓝牙设备适配器,整个系统只有一个蓝牙适配器。通过它可以发现其它蓝牙设备,查询配对设备列表,使用已知的 Mac 地址实例化
BluetoothDevice
- 表示远程的蓝牙设备。利用它可以通过
BluetoothSocket
请求与某个远程设备建立连接,或查询有关该设备的信息,例如设备的名称、地址、类和绑定状态等。
- 表示远程的蓝牙设备。利用它可以通过
BluetoothSocket
- 代表一个蓝牙socket的接口(和TCP Socket类似)。这是一个连接点,它允许一个应用与其他蓝牙设备通过InputStream和OutputStream交换数据。
BluetoothServerSocket
- 代表一个开放的服务器socket,它监听接受的请求(与TCP ServerSocket类似)。为了连接两台Android设备,一个设备必须使用这个类开启一个服务器socket。当一个远程蓝牙设备开始一个和该设备的连接请求,BluetoothServerSocket将会返回一个已连接的BluetoothSocket,接受该连接。
BluetoothHealth
- 表示一个Health Device Profile代理,它控制蓝牙服务。
安卓传感器
参考地址:安卓开发者官方文档
Android 平台支持三大类传感器:
- 动态传感器(加速度计、重力传感器、陀螺仪和旋转矢量传感器)
- 环境传感器(气压计、光度计和温度计)
- 位置传感器(屏幕方向传感器和磁力计)
所有运动传感器都为每个 SensorEvent 返回传感器值的多维数组。
MIUI12 多次点击内核版本可进入cit测试。
- 加速度感应器测试
- x, y, z 三个方向,及 curAngle
curAngle
对PID控制有用
- 速度感应,可以使用电机的霍尔编码器测速
闭环控制,
关于小米物联网
目的:①更好调用手机的功能②了解IOT,软硬件开发Xiaomi Vela
是小米基于NuttX(RTOS实时操作系统)打造的物联网嵌入式软件平台,Vela在各种物联网硬件平台上提供统一的软件服务。
- Xiaomi Vela对系统资源的要求远小于Linux,但是可以提供和Linux系统相近的功能和性能,可以被看作很多低端Linux系统的替代方案,切换到Xiaomi Vela以后,可以降低硬件成本,提升产品整体的性价比。
…企业开发组认证中
时间线
2021.2.19
目前思路:利用手机算出倾角及误差,结合PID,通过BLE向arduino传输电机运动的pwm信息,初步平衡
遇到的问题:
- 获取手机的倾角的API
- 实际的PID算法怎么写
- 蓝牙通信
- 以安卓应用的方式接入小爱同学,语音控制输出的pwm即可
2021.8.25
$$pwm = k_p e(k) + k_i \sum e(k) + k_d[e(k)-e(k-1)]$$
- $k_p$,关系到响应速度
- $k_i$,静差
- $k_d$,抑制震荡
arduino pwm频率 500hz,analogWrite 0~255
硬件端
基本好了
- 加手机重后,调整平衡
- 整理代码,修改代码
- 环境
- JDK, Android SDK, Android Studio
- 项目结构模式
- Android
- Project
1. 蓝牙测试
首先, 使用内置的 Blink 代码测试
板子没有问题
然后,参考文章进行蓝牙模块测试
https://www.cnblogs.com/rayray/p/3157601.html
arduino rx, tx 堵住时,上传不了程序
蓝牙模块为 HC-06,测试时现在手机设置里面配对上,再打开APP
使用测试代码如下:
byte comdata;
void setup()
{
Serial.begin(9600);
Serial.println("BLE Test");
}
void loop()
{
while (Serial.available() > 0)
{
comdata = Serial.read();
delay(2);
Serial.write(comdata);
}
}
厂商写的软件:前进为f(仅一次),后退为b,左l,右r,松开为s
2. 安卓基础
- 主要组件:
- Activity
- Service
- BroadcastReceiver
- ContentProvider
empty activity,HelloWorld 项目,API 21: Android 5.0,在 AVD 上运行成功
- app
- build
- libs
- src
- androidTest
- main
- java
- res
- AndroidManifest.xml
- test
- …