毕业设计 基于单片机的多功能遥控器设计

201 篇文章 123 订阅
187 篇文章 120 订阅
本文介绍了一个毕业设计项目,即使用中科蓝讯AB32VG1单片机创建一个多功能遥控器,该遥控器利用蓝牙功能远程控制多种设备,并通过RT-Thread操作系统进行软件开发。项目涉及ADC驱动用于摇杆控制,OLED显示屏用于用户界面,提供了一种具有创新点的毕设方案。
摘要由CSDN通过智能技术生成

0 前言

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

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

🚩 毕业设计 基于单片机的多功能遥控器设计

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

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

🧿 选题指导, 项目分享:

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 简介

基于中科蓝讯AB32VG1开发套件,设计实现一种能够远程遥控多种无线设备的遥控装置。 本项目准备利用AB32VG1板载的蓝牙功能,实现对多种蓝牙设备远程控制,除此之外,还可以利用板载丰富的IO扩展资源实现其他的无线遥控方案。

2 主要器件

  • 中科蓝讯的AB32VG1单片机
  • RT-Thread物联网操作系统
  • ssd1306 1.3寸 OLED
  • 摇杆扩展板
  • 远程遥控多种无线设备的遥控装置

3 实现效果

4 硬件设计

总体框架

在这里插入图片描述

AB32VG1主控MCU

简介

开发板采用中科蓝讯的32位RISC-V指令集的AB32VG1型号MCU,主频120M。MCU有8M的Flash,和192K SRAM。支持3.0V-5.0V供电。
与一般MCU不同的是,这款MCU具有MPU模块,就是电源管理模块,支持Charge电路、BUCK电路、LDO电路等等,手册第十页给出了MPU模块的详细参数。
在这里插入图片描述
开发环境搭建

根据官方的指导,使用的是RT-thread官方stduio平台,先更新软件源代码至最新版,下载中科蓝讯软件包,下载RISC-V-GCC工具链,编译程序会用到。

在这里插入图片描述

软件包配置

在这里插入图片描述
接下来选择我们本次实验用到的软件包,wavplayer软件包、optparse软件包和multibutton软件包,实现通过板载按键控制声音的播放语音量的增减。
在这里插入图片描述
然后对软件包进行简单配置,按键的示例代码可以勾选也可以不勾选,后面要对此进行修改,改为评测板上的用户按键,optparse软件包默认即可。
在这里插入图片描述

5 软件说明

本次项目实验软件部分均是在RT-Thread Studio中进行开发设计,相关软件包均能通过软件仓库获取到。

本次项目实验中使用到的软件包如下,包括ssd1306 oled驱动包和bluetrum_sdk
包。使用到的组件包括串口、GPIO和软件模拟IIC组件。rtt-soft-packets.png

程序模块说明

摇杆驱动程序设计

摇杆主要使用的是ADC来进行驱动,通过读取摇杆中的电位器的电压值,来判断当前摇杆的状态。驱动示例代码如下。

static int adc_vol_sample(int argc, char *argv[])

{

    rt_adc_device_t adc_dev;

    rt_uint32_t value, vol;

    rt_err_t ret = RT_EOK;

    /* 查找设备 */

    adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);

    if (adc_dev == RT_NULL)

    {

    rt_kprintf("adc sample run failed! can't find %s device!\n", ADC_DEV_NAME);

    return RT_ERROR;

    }
/* 使能设备 */

    ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL_1);

    /* 读取采样值 */

    value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL_1);

    rt_kprintf("the value is :%d \n", value);

    /* 转换为对应电压值 */

    vol = value * REFER_VOLTAGE / CONVERT_BITS;

    rt_kprintf("the voltage is :%d.%02d \n", vol / 100, vol % 100);

    /* 关闭通道 */

    ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL_1);

    return ret;
    
    }


OLED驱动程序

void ssd_1306_draw()
{
  ssd1306_Init();

  ssd1306_Fill(BLACK);

  ssd1306_DrawCircle(32, 32, 25,WHITE);  // 32 32
  ssd1306_Line(32, 7, 32, 57, WHITE);
  ssd1306_Line(7, 32, 57, 32, WHITE);
  ssd1306_fillCircle(32,32,2,WHITE);


   /* A */
   ssd1306_DrawCircle(88, 30, 12,WHITE);

   /* B */
   ssd1306_DrawCircle(115, 24, 12,WHITE);

   /* joystick */
   ssd1306_Line(70, 50, 120, 50, WHITE);
   ssd1306_fillCircle(95,50,3,WHITE);


   ssd1306_Line(70, 60, 120, 60, WHITE);
   ssd1306_fillCircle(95,60,3,WHITE);
   ssd1306_UpdateScreen();
   
   }

屏幕图形绘制程序设计,遥控器应用界面设计

static void ctl_test()
{
    rt_adc_device_t adc_dev;
  rt_uint32_t value, vol;
  rt_uint16_t x_x, x_y;
  rt_uint16_t joystick_x, joystick_y;
  rt_uint16_t joystick_y_max;

  rt_err_t ret = RT_EOK;

  rt_kprintf(" %s\n",__FUNCTION__);
  rt_kprintf("ssd1306_Init ... \n");

  ssd1306_Init();

  ssd1306_Fill(BLACK);



  ssd1306_DrawCircle(32, 32, 25,WHITE);  // 32 32
  ssd1306_Line(32, 7, 32, 57, WHITE);
  ssd1306_Line(7, 32, 57, 32, WHITE);
  ssd1306_fillCircle(32,32,2,WHITE);


   /* A */
   ssd1306_DrawCircle(88, 30, 12,WHITE);

   /* B */
   ssd1306_DrawCircle(115, 24, 12,WHITE);

   /* joystick */
   ssd1306_Line(70, 50, 120, 50, WHITE);
   ssd1306_fillCircle(95,50,3,WHITE);


   ssd1306_Line(70, 60, 120, 60, WHITE);
   ssd1306_fillCircle(95,60,3,WHITE);
   ssd1306_UpdateScreen();


  /* 查找设备 */
  adc_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
  if (adc_dev == RT_NULL)
  {
  rt_kprintf("adc sample run failed! can't find %s device!\n", ADC_DEV_NAME);
  return RT_ERROR;
  }
  /* 使能设备 */
  ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL_1);

  ret = rt_adc_enable(adc_dev, ADC_DEV_CHANNEL_2);

    while(1)
    {



        /* 读取采样值 */
        value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL_1);
//        rt_kprintf("PB2_ADC4 adc0 :%d \n", value);
        /* 转换为对应电压值 */
        vol = value * REFER_VOLTAGE / CONVERT_BITS;
//        rt_kprintf("adc0 the voltage is :%d.%02d \n", vol / 100, vol % 100);

//        rt_kprintf("\r\n");

        x_x = 70+ value * 50/CONVERT_BITS;
        joystick_x = 7 + value*50/CONVERT_BITS;

        /* 读取采样值 */
        value = rt_adc_read(adc_dev, ADC_DEV_CHANNEL_2);
//        rt_kprintf("PB1_ADC3 adc1  :%d \n", value);
        /* 转换为对应电压值 */
        vol = value * REFER_VOLTAGE / CONVERT_BITS;
//        rt_kprintf("adc1 the voltage is :%d.%02d \n", vol / 100, vol % 100);

        x_y = 70+ value * 50/CONVERT_BITS;
        joystick_y = 57 - value*50  /CONVERT_BITS;

        ssd1306_fillCircle(32, 32, 37,BLACK);
        ssd1306_DrawCircle(32, 32, 25,WHITE);  // 32 32
        ssd1306_Line(32, 7, 32, 57, WHITE);
        ssd1306_Line(7, 32, 57, 32, WHITE);


        // 求坐标 将 圆点的轴坐标固定到圆周内部

        joystick_y_max = sqrt(25*25-((joystick_x-32)*(joystick_x-32)));
        if(joystick_y>32)
        {
            if(joystick_y-32 >= joystick_y_max)
                joystick_y=joystick_y_max+32;
        }
        else if(joystick_y<32) {
            if(32-joystick_y >=joystick_y_max)
                joystick_y=32-joystick_y_max;
        }

        ssd1306_fillCircle(joystick_x,joystick_y,2,WHITE);
        // oled show

        // 局部清屏
        ssd1306_fillRect(60, 46, 125, 66,BLACK);

        ssd1306_Line(70, 50, 120, 50, WHITE);
        ssd1306_Line(70, 60, 120, 60, WHITE);

        ssd1306_fillCircle(x_x,50,3,WHITE);
        ssd1306_fillCircle(x_y,60,3,WHITE);

        ssd1306_UpdateScreen();

        rt_thread_mdelay(5);

    }
  /* 关闭通道 */
  ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL_1);
  ret = rt_adc_disable(adc_dev, ADC_DEV_CHANNEL_2);


}


/* 导出到 msh 命令列表中 */

//MSH_CMD_EXPORT(adc_oled, adc voltage loop);
INIT_APP_EXPORT(adc_oled);

最后

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值