大创


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实现自平衡即可告一段落

参考项目

蛋黄与nano —— 一个小巧的自平衡机器

平衡自行车

自平衡

语音助手Pico

自平衡教程1 自平衡教程2 自平衡教程3

25分钟平衡小车

自制平衡车-来自知乎

蓝牙控制小车

android蓝牙开发

android蓝牙串口开发

参考资料

PID控制算法解释视频

位置PID分析及调参
自平衡论文1

小米物联网开发者平台
步进电机和减速电机的区别

Arduino教程:MPU6050的数据获取、分析与处理

使用BLE(低功耗蓝牙技术)进行小米物联网开发

Arduino nano 引脚分布及解析

TB6612FNG与直流电机控制

TB6612FNG驱动

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 用来侦听来自其他设备的通信。
  • 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

硬件端 基本好了

  1. 加手机重后,调整平衡
  2. 整理代码,修改代码
  • 环境
    • 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
3. arduino 代码分析

文章作者: ╯晓~
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ╯晓~ !
评论
  目录