毕业设计 - 单片机自动写字机器人设计与实现 - 物联网 嵌入式 stm32


0 前言

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

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

🚩 基于单片机的自动写字机器人设计与实现

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

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

1 简介

基于RTthread的写字机控制系统,采用独立研发的运动控制系统,结合RTT的多线程,将运动控制分解,速度前馈、折线速度平滑优化。AB32VG1开发板作为UI交互和sd卡gc文件读取,采用串口将运动命令发送给STM32。STM32负责将串口接收到的G命令进行解析,运动计算、控制输出P合适的PWM频率和脉冲个数给4个电机。运动控制算法完全独立创作。 Halo项目是我9月初时候的一个自研3D打印机的固件,前期在工作中接触到Marlin(一款优秀的开源3D打印固件,提供了丰富的扩展功能,拥有完整成熟的生态),遂想自研一款基于国产芯片和操作系统的3D打印系统,能提供在咱国产的芯片中方便移植与运行,提供3D打印所需的所有功能,降低硬件成本和软件适配成本。

2 主要器件

  • STM32F4单片机
  • AB32VG1单片机
  • RT-Thread物联网操作系统
  • SD卡文件读取与发送
  • 速度前馈、折角优化、加速处理等算法

3 实现效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4 硬件设计

总体框架

AB32V负责GUI和SD卡文件,STM32负责运动控制

最初设想是采用两块AB32的板子,一个负责GUI人机交互和SD卡文件读取与发送,一块负责接收Gcode命令,完成速度前馈、折角优化、加速处理等算法,实现完整的运动控制算法。但实际在AB32上跑控制时,发现浮点运算会导致异常的问题,同时打印日志都经常遇到栈溢出导致系统崩溃,因此将运动控制算法移植到STM32F4的板子上运行,控制效果良好。

在这里插入图片描述

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 软件说明

总体框架

在这里插入图片描述
代码树

在这里插入图片描述

6 部分核心代码

int main(void)
{
    rt_thread_mdelay(1000);
    serial_thread_init(NULL);
    while(1){
        //debug_error("Insufficient system memory");
        while(refresh_file_names("/") == 0){
            rt_thread_mdelay(1000);
        }
        uart_lcd_thread_init();
        rt_thread_mdelay(100);
        gui_into_print_list(NULL);
        while(1){
            rt_thread_mdelay(1000);;
        }
    }
    g_gcode_ringbuff = ringbuff_create(sizeof(uint8_t), 4096);
    if(g_gcode_ringbuff == NULL){
        debug_error("Insufficient system memory");
        while(1);
    }
    while(1){
        rt_thread_mdelay(1000);
        debug_info("rt - thread\r\n");
    }
    while (1)
    {
        list_cur_dir_files("/");

        if(dfs_file_open(&s_fd, get_cur_dif_file_name(0), O_RDONLY) < 0){
            debug_info("open file %s error", get_cur_dif_file_name(0));
            continue;
        }
        debug_info("open file %s ok", get_cur_dif_file_name(0));
        int read_bytes;
        uint8_t buff[512];
        int idx = 0;
        do{
            memset(buff, 0, sizeof(buff));
            read_bytes = dfs_file_read(&s_fd, buff, sizeof(buff));
            while(ringbuff_remin(g_gcode_ringbuff) < read_bytes){
                rt_thread_yield();
            }
            for(int i = 0; i < read_bytes; i++){
                ringbuff_push(g_gcode_ringbuff, &buff[i]);
            }
        }while(read_bytes > 0);
        dfs_file_close(&s_fd);
    }

    return RT_EOK;
}
/* 定时器超时回调函数 */
#if (defined SOC_AB32VG1)
RT_SECTION(".irq.timer")
#endif
static rt_err_t step_run_schdule(rt_device_t dev, rt_size_t size)
{
    extern motion_control_t *motion_control;
    if((motion_control->motion_step_z.ops->is_motion(&(motion_control->motion_step_z)) == true) ||
            (ringbuff_is_empty(motion_control->motion_step_z.step_drv->pulse_list) == false)){
        motion_control->motion_step_z.step_drv->ops-> \
                        timer_schdule(motion_control->motion_step_z.step_drv);

        return RT_EOK;
    }

    motion_control->motion_step_x.step_drv->ops-> \
            timer_schdule(motion_control->motion_step_x.step_drv);
    motion_control->motion_step_y.step_drv->ops-> \
            timer_schdule(motion_control->motion_step_y.step_drv);
    motion_control->motion_step_y_1.step_drv->ops-> \
                timer_schdule(motion_control->motion_step_y_1.step_drv);

    return RT_EOK;
}


/* 初始化挤出机 */
void fdm_extruder_init(void)
{
    if(false == temperature_register(&s_temperature_ntc, temperature_type_ntc)){
        return;
    }

    /* 初始化传感器接口 */
    if(false == temperature_init(&s_temperature_ntc,            /* 描述符 */
                                 TEMPERATURE_NTC_ADC_DEV_NAME,  /* 驱动名称 */
                                 TEMPERATURE_NTC_ADC_DEV_CHANNEL, /* 通道号 */
                                 12,                            /* adc精度 */
                                 ntc_mode_zm_1460,              /* ntc传感器型号 */
                                 4700)){                        /* 上拉电阻阻值 */

    }
}

void fdm_printer_test(void)
{
    /* 初始化所有的温度传感器 */
    //fdm_extruder_init();

    rt_pin_mode(49, PIN_MODE_OUTPUT);
    rt_pin_write(49, PIN_HIGH);

#if 0
    heater_t *heater;
    heater = heater_create(pid_type_position);
    /* 设置pid的三个参数,输出最大、最小值 */
    heater->pid->ops->init(heater->pid, 0.5, 0.5, 1, 100, 0);
    /* 设置调节的目标值 */
    heater->pid->ops->target_set(heater->pid, 30);
    /* 绑定温度传感器,设置pid的计算周期 */
    heater->ops->init(heater, 1, true, 3000, &s_temperature_ntc);
    /* 开始软件定时器 */
    heater->ops->start(heater);
#endif
    hard_task_t *hard_task;
    /* 创建硬实时任务对象 */
    hard_task = hard_task_creater();

    hard_task->ops->init(hard_task, STEP_SCHDULE_HWTIMER_DEV_NAME,
                         STEP_SCHDULE_TIMER_FREQ);//
    hard_task->ops->set_run(hard_task, step_run_schdule);

    hard_task->ops->start(hard_task, STEP_SCHDULE_FREQ);
}

7 最后

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IBM 开源的一个 DIY 纸板器人:TJBot ,召集世界各地的 Bot 爱好者来制作属于自己的个性化 Bot。TJBot 延续了手工社区的精神,它是一套 DIY 工具包,可让你建立由 Waston 驱动的可编程纸板器人。该器人由一块切割的纸板(可以是 3D 打印或者激光切割)、Raspberry Pi 和多种插件(包括一个 RGB LED 灯、一个麦克风、一个伺服电和一个摄像头)构成。同时,TJ Bot 还是一个开源项目,我们可在 Instructables.com 和 GitHub 上查看相关指导。IBM 的团队已经提供了三个 TJ Bot 启动指导,但他们希望所有人都能贡献出自己的 DIY 器人装配指导。以下是已有的 TJ Bot 制作过程:让 TJ Bot 回应情感。TJ Bot 头上的 RGB LED 灯会根据 Twitter 上的某个给定话题的公共情绪改变颜色。它与 Twitter API(https://dev.twitter.com/overview/api)相连,能自动抓取推文,并能通过运行Watson Tone Analyzer(http://www.ibm.com/watson/developercloud/tone-analyzer.html) 来识别整体的情绪。例如,你可以给 TJ Bot 编程让它实时跟踪关于艾美奖的大众社会情绪。教程地址:http://www.instructables.com/id/Make-Your-Robot-Respond-to-Emotions-Using-Watson/用你的声音控制 TJ Bot。你可以用你的声音给 TJ Bot 下一些基础的命令。例如,你可以要求TJ Bot「把光调成黄色」,然后它就会把自己的灯光调成黄色。TJ Bot使用Watson Speech To Text API 来转录、分析和理解你说的话。教程地址:http://www.instructables.com/id/Use-Your-Voice-to-Control-a-Light-With-Watson/与TJ Bot聊天。使用三个Watson API创作一个“聊天”bot,你只需要三步。Watson Speech To Text API(http://www.ibm.com/watson/developercloud/speech-to-text.html)会将你的声音转换成文本,然后Watson Conversation(https://www.ibm.com/watson/developercloud/conversation.html)会处理文本并计算出一个回复,之后Watson Text To Speech会将文本转换成音频,让 TJ Bot 做出回应。你可以和 TJ Bot 聊从天气到你最喜爱的电视节目的任何事情,这取决于你如何编程你的Rasberry Pi。 教程地址:http://www.instructables.com/id/Build-a-Talking-Robot-With-Watson-and-Raspberry-Pi/TJ Bot 是『具身认识(embodied cognition)』的一个例子,也就是将人工智能植入你日常生活中的具体物体中。在这个例子中,我们把 Watson 技术放入一个切割的纸板中,想象着让你家的墙壁、你的家具或你家里的各种物体能具备以上几种能力。创作出认知具身的关键之一就是理解人类与事物互动的方式。与这些物体的互动,比如与TJ Bot 的互动要比与现有计算设备互动更加自然:你不需要用键盘打字,只需用声音命令它可以了。 不论你是想写出一个具有「big idea」的代码,还是完成课业的某个课题,都可以参与 TJ Bot 的开源项目中来。 部分内容转载自器之心 标签:TJBot
基于STM32的巡查安全保障器人设计实现,是一种利用STM32单片机技术与器人控制技术相结合的解决方案。 首先,基于STM32的巡查安全保障器人需要进行硬件设计。可以选择适合器人控制的STM32单片机,根据具体的需求选择不同型号,并进行电路设计和制板。同时,器人需要配备各种传感器,如红外线传感器、超声波传感器、摄像头等,用于感知环境信息,并将这些信息传输给STM32单片机。 其次,基于STM32的巡查安全保障器人的软件设计实现需要进行编程。可以使用Keil或者STM32Cube等开发工具,选择合适的编程语言如C语言进行编写。首先,需要编写STM32单片机的底层驱动程序,来实现对各种传感器的控制与数据采集。然后,编写上层的逻辑控制程序,根据传感器的数据进行判断和决策,使器人能够自主地巡查和保障安全。另外,还需要设计交互界面,以便操作员与器人进行交互和监控。 最后,基于STM32的巡查安全保障器人的实现需要进行系统调试与测试。在进行系统调试时,需要验证硬件与软件的兼容性,确保各部分的正常运行。在测试阶段,可以通过模拟环境或者实际场景来测试器人的巡查效果和安全保障能力,对器人的性能进行优化和改进。 综上所述,基于STM32的巡查安全保障器人的设计实现是一项综合性的工程,需要充分考虑硬件的设计与制造、软件的编程和系统的调试与测试等各环节,以确保器人能够稳定地工作,实现安全保障的目标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值