• 【毕业设计】基于单片机无线充电的4轴飞行器 -物联网 嵌入式 stm32



    0 前言

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

    为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

    🚩 基于单片机无线充电的4轴飞行器

    🥇学长这里给一个题目综合评分(每项满分5分)

    • 难度系数:4分
    • 工作量:4分
    • 创新点:3分

    🧿 选题指导, 项目分享:

    https://gitee.com/dancheng-senior/project-sharing-1/blob/master/%E6%AF%95%E8%AE%BE%E6%8C%87%E5%AF%BC/README.md


    1 简介

    目前无人机的发展前景一片大好,大部分的应用例如航拍、电力巡线、森林防火训检、军事侦察。在人无法进入的区域难以更换电池是长期困扰无人机应用的一个问题。
    本项目对无线充电技术的发展和推广可降低无人机对备用电池或充电线缆的依赖,平台多样化可适应多种场合下给无人机充电,延长无人机的续航时间,为无人机顺利完成任务提供保障。外部充电口也不再是必要的结构设计,可推动未来的小型无人机设计完全密封系统,这更有助于其在恶劣环境中作业。

    2 主要器件

    • IDT15W无线充电开发套件

    • L298电机驱动芯片

    • HC-05蓝牙模块

    • RGB指示灯

    3 实现效果

    IMG_20171022_150240_看图王.jpg

    IMG_20171022_150256_看图王.jpg

    4_看图王.jpg

    3_看图王.jpg

    2_看图王.jpg

    1_看图王.jpg

    4 设计原理

    4.1 硬件说明

    平台部分硬件电路说明

    在测量地面与飞机的高度是起作用,配合飞控的气压计和GPS定高,增加稳定性

    超声波.png

    HC-05蓝牙模块主要是与移动平台进行数据传输,控制平台动作

    蓝牙.png

    运用L298电机驱动芯片,在大载重的情况下有能力输出。

    电机驱动.png

    平台的电子开关。控制平台动力电源,控制无线充电供电开关。

    继电器.png

    RGB指示灯。可指示不同颜色代表不同信号。第二个功能指示给无人机做围栏信号灯

    指示灯.png

    IMG_20171021_114957_看图王.jpg

    IMG_20171022_145239_5_看图王.jpg

    平台的框架

    IMG_20171021_114928_看图王.jpg

    5 部分核心代码

    #define sampleFreq    512.0f        // sample frequency in Hz
    #define betaDef        0.1f        // 2 * proportional gain
    
    
    volatile float beta = betaDef;
    volatile float q0 = 1.0f, q1 = 0.0f, q2 = 0.0f, q3 = 0.0f;
    
    float invSqrt(float x);
    
    void MadgwickAHRSupdateIMU(float gx, float gy, float gz, float ax, float ay, float az) {
        float recipNorm;
        float s0, s1, s2, s3;
        float qDot1, qDot2, qDot3, qDot4;
        float _2q0, _2q1, _2q2, _2q3, _4q0, _4q1, _4q2 ,_8q1, _8q2, q0q0, q1q1, q2q2, q3q3;
    
        // Rate of change of quaternion from gyroscope
        qDot1 = 0.5f * (-q1 * gx - q2 * gy - q3 * gz);
        qDot2 = 0.5f * (q0 * gx + q2 * gz - q3 * gy);
        qDot3 = 0.5f * (q0 * gy - q1 * gz + q3 * gx);
        qDot4 = 0.5f * (q0 * gz + q1 * gy - q2 * gx);
    
        // Compute feedback only if accelerometer measurement valid (avoids NaN in accelerometer normalisation)
        if(!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f))) {
    
            // Normalise accelerometer measurement
            recipNorm = invSqrt(ax * ax + ay * ay + az * az);
            ax *= recipNorm;
            ay *= recipNorm;
            az *= recipNorm;
    
            // Auxiliary variables to avoid repeated arithmetic
            _2q0 = 2.0f * q0;
            _2q1 = 2.0f * q1;
            _2q2 = 2.0f * q2;
            _2q3 = 2.0f * q3;
            _4q0 = 4.0f * q0;
            _4q1 = 4.0f * q1;
            _4q2 = 4.0f * q2;
            _8q1 = 8.0f * q1;
            _8q2 = 8.0f * q2;
            q0q0 = q0 * q0;
            q1q1 = q1 * q1;
            q2q2 = q2 * q2;
            q3q3 = q3 * q3;
    
            // Gradient decent algorithm corrective step
            s0 = _4q0 * q2q2 + _2q2 * ax + _4q0 * q1q1 - _2q1 * ay;
            s1 = _4q1 * q3q3 - _2q3 * ax + 4.0f * q0q0 * q1 - _2q0 * ay - _4q1 + _8q1 * q1q1 + _8q1 * q2q2 + _4q1 * az;
            s2 = 4.0f * q0q0 * q2 + _2q0 * ax + _4q2 * q3q3 - _2q3 * ay - _4q2 + _8q2 * q1q1 + _8q2 * q2q2 + _4q2 * az;
            s3 = 4.0f * q1q1 * q3 - _2q1 * ax + 4.0f * q2q2 * q3 - _2q2 * ay;
            recipNorm = invSqrt(s0 * s0 + s1 * s1 + s2 * s2 + s3 * s3); // normalise step magnitude
            s0 *= recipNorm;
            s1 *= recipNorm;
            s2 *= recipNorm;
            s3 *= recipNorm;
    
            // Apply feedback step
            qDot1 -= beta * s0;
            qDot2 -= beta * s1;
            qDot3 -= beta * s2;
            qDot4 -= beta * s3;
        }
    
        // Integrate rate of change of quaternion to yield quaternion
        q0 += qDot1 * (1.0f / sampleFreq);
        q1 += qDot2 * (1.0f / sampleFreq);
        q2 += qDot3 * (1.0f / sampleFreq);
        q3 += qDot4 * (1.0f / sampleFreq);
    
        // Normalise quaternion
        recipNorm = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
        q0 *= recipNorm;
        q1 *= recipNorm;
        q2 *= recipNorm;
        q3 *= recipNorm;
    }
    
    
    float invSqrt(float x) {
        float halfx = 0.5f * x;
        float y = x;
        long i = *(long*)&y;
        i = 0x5f3759df - (i>>1);
        y = *(float*)&i;
        y = y * (1.5f - (halfx * y * y));
        return y;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87

    5 最后

  • 相关阅读:
    在 Windows 操作系统中,可以通过命令行工具来杀死进程
    java Map集合基本概念
    计算机毕业设计(附源码)python在线共享笔记系统
    css实现dom脱离文档流定位固定位置
    抛弃moment.js,基于date-fns封装日期相关utils
    入门力扣自学笔记194 C++ (题目编号:754)
    解决uniapp局部页面(scrollview)下拉刷新出现不能复位的问题
    一、高频题集
    100天精通Python(数据分析篇)——第57天:Pandas读写Excel(read_excel、to_excel)
    散列算法比较:MD5、SHA1、SHA256有哪些区别
  • 原文地址:https://blog.csdn.net/m0_71572576/article/details/126724780