ZWFly项目记录
ZheWana / 2021-08-26 / 项目 / 阅读量 282

一切的开始

假期快结束了,这个假期挺无聊的,遂给自己想了一个小项目做来玩玩。虽然对于现在的我来说难度是有些稍大的,但是没关系,一边学习一边进步嘛。

自己给项目想了个名字:ZWFly

原因很简单,看很多开源飞控都叫某某fly,所以就这么叫了(当然我做出来的东西效果肯定不能和开源飞控比较),不过这个名字至少寄托了我希望自己做出堪比开源飞控无人机的小心思。

20210730硬件准备

笔者在朋友的帮助下,入手了一个无人机机架,机架本体自带四个820的空心杯电机,价格很便宜,质量也很满意:

智能车-1629183245865.jpg

由于本段并非与项目实时撰写,所以其实无人机架上面并不应该有控制板

20210731PCB绘制

  • 单片机选型为STM32F401CCU6
  • 空心杯为MOS直驱
  • 姿态传感器为MPU6050(DMP驱动)
  • 高度传感器使用US-100或VL53L0(未定)

明确以上后便开始了原理图的绘制工作:

首先是主控和电源部分,接着是驱动电路和检测电路。

经过考虑并没有加上充电电路。

接着完成了初版PCB的绘制。

原理图已经经过后续修改,故该版本原理图和PCB均无

20210801软件代码

首先笔者想实现的功能很简单:

  • 无人机采用X姿态进行飞行
  • 无人机能够实现平稳起飞以及平稳落地
  • 无人机能够实现定高悬停
  • 无人机能够实现遥控操作

为了实现对应功能,软件的大体构想如下:

  • 利用定时器中断来实现对数据的采集和处理
  • 姿态控制采用串级PID实现对于角速度和角度的串级控制
  • 高度控制采用串级PID实现对于Z轴加速度和高度的串级控制
  • 利用无线串口进行单片机间的数据通信

一些小问题

笔者在写软件的过程中不可避免的再一次遇到了IIC的Busy锁死问题,为了保证无人机运行过程中的稳定性,笔者尝试着解决了这个问题。

首先这个问题在官方的勘误手册中是有所提及的,并且给出了解决方法,我们需要做的仅仅是根据官方给出的解决方法写出代码。

官方给出的解决方法也非常简单粗暴:

将IIC外设关闭后用GPIO接管其控制权,当确保GPIO输出正常后再将IIC外设重新打开

代码当然也很简单粗暴:

//Init GPIO 
void My_IICBusyErrorGPIOInit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin) {

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /*Configure GPIO pin Output Level */
    HAL_GPIO_WritePin(GPIOx, GPIO_Pin, GPIO_PIN_SET);

    /*Configure GPIO pin : PB8 */
    GPIO_InitStruct.Pin = GPIO_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOx, &GPIO_InitStruct);

}


//Handle busy error
//IIC Pin:
//        SCL:PB6 
//        SDA:PB7
void HAL_IIC_BusyErrorHandler(void) {
    //Disable the I2C peripheral
    HAL_I2C_DeInit(&hi2c1);
    //Configure the SCL and SDA I/Os as General Purpose Output Open-Drain
    My_IICBusyErrorGPIOInit(GPIOB, GPIO_PIN_6 | GPIO_PIN_7);
    //Check SCL and SDA High level in GPIOx_IDR.
    if ((HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6) == 0)
        || (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7 == 0))) {
        UART_printf(&huart1, "Checking SCL and SDA in high level ERROR!\n");
    }

    //Configure the SDA I/O low level
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
    //Check SDA Low level in GPIOx_IDR.
    if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7)) {
        UART_printf(&huart1, "Checking SDA in low level ERROR!\n");
    }

    //Configure the SCL I/O low level
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
    //Check SCL Low level in GPIOx_IDR.
    if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6)) {
        UART_printf(&huart1, "Checking SCL in low level ERROR!\n");
    }

    //Configure the SCL I/O high level
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
    //Check SCL high level in GPIOx_IDR.
    if (!HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6)) {
        UART_printf(&huart1, "Checking SCL in high level ERROR!\n");
    }

    //Configure the SDA I/O high level
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
    //Check SDA Low level in GPIOx_IDR.
    if (!HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7)) {
        UART_printf(&huart1, "Checking SDA in high level ERROR!\n");
    }

    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6 | GPIO_PIN_7);
    MX_I2C1_Init();
}

20220119项目重启

重启原因

之前的项目炸了

由于一些不可抗力因素(懒),笔者已经很久没有继续进行这个项目了,之前的那部分其实是进行了一个失败的尝试,项目最终遇到的问题是:

机架过重导致无人机没法平衡姿态,仅仅是维持定高就需要超过70%的占空比,自然没法给姿态控制以足够的响应空间。

接着我改用了大一号的螺旋桨以期待能够获得更大的升力,结果由于负载增加导致电机电流增加,进而超过了电源开关的额定值而导致开关烧毁

尝试解决问题

后续的硬件解决方法以及更改内容如下:

  • 舍弃机架(我还挺喜欢的来着

采用直接使用电路板作为机架的方式来降低负重

  • 更换开关

更换为更适合功率输出的钮子开关

  • 添加功能

添加了锂电池充电电路

  • 更改通信方式

由原来的串口改为2.4G通信(希望能取得更好的效果

此外,由于电赛期间使用了自己写的时间片轮询库,因此这次打算继续使用和完善这个库,故打算直接将之前写好的源代码进行一次重构(之前的代码是直接裸机操作+中断),之前写的代码可移植性和拓展性实在堪忧,所以重构也算是借机提高一下自己的代码能力吧。

支付宝捐赠
请使用支付宝扫一扫进行捐赠
微信捐赠
请使用微信扫一扫进行赞赏
1 + 7 =
快来做第一个评论的人吧~