野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 215|回复: 0

【野火】第二期瑞萨RA MCU创意氛围赛+遛娃三轮车

[复制链接]
发表于 2024-12-11 19:28:13 | 显示全部楼层 |阅读模式
本帖最后由 argent 于 2024-12-14 15:04 编辑

一、引言

现如今独生子女越来越普遍,大人对小孩的宠爱也是常态,儿童玩具市场新品层出不穷,买一款小巧且安全耐用的儿童电动摩托车既能满足小孩的玩耍,又能减少遛娃的辛苦。开发一款性价比相对较高的儿童电动摩托车具有很大的市场需求,本期计划使用野火启明RA6T2电机控制板实现电动摩托车基本功能。野火启明RA6T2电机板是集成R7FA6T2BD3CFP MCU,该款MCU具备高性能,240MHz主频,Arm Cortex-M33内核、高达512KB的后台运行代码闪存、16KB数据闪存和带ECC的64KBSRAM,想必开发一款儿童电动摩托车是游刃有余吧。
儿童电动摩托车.png

二、系统框图
系统框架.png
      根据以上系统框图,可大致解说一下,该系统支持手机小程序与串口调试接口控制motorA与motorB运行状态,按键组控制SG90舵机转动。其它外加功能,OLED屏显示DHT11实时采集周围环境的温湿度值,HC-SR04超声波测距传感器驱使自动避障减速功能。这里的motorA代表电动摩托车的左轮,motorB代表电动摩托车的右轮,SG90舵机代表电动摩托车的前轮,按键组表示手握的方向盘。

三、硬件资源
      启明6T2电机板硬件资源非常丰富,尤其是在电机应用方面,项目中只是运用到部分硬件接口。启明6T2电机板硬件资源标注图:
启明6T2电机板硬件资源标注图1.png
启明6T2电机板硬件资源标注图2.png
      首先直接来张实物连线全景图!
连线.png
     基于以上硬件资源,相信大家都比较熟悉了,这里着重介绍一下蓝牙模块。该蓝牙模块是本人在某宝平台上掏得的,MX-01P模块的封装尺寸脚位定义如下:
模块引脚图.png
    这款性价比不错,本人还专程买了搭配的底板,这样焊接在底板上,只需要将BRTS管脚接地,然后通过四根杜邦线与电机板正确连接好即可。模组的管脚定义如下:
引脚定义.png

四、FSP灵活配置
使用的Stacks资源如下:
Stacks.png
         主控R7FA6T2BD3CFP的管脚利用分布:
利用的管脚分布.png
       这个简单解说一下:
(1)“g_ioport”包括项目中所有用到IO口的配置g_bsp_pin_cfg,包括LED、蜂鸣器、DHT11等GPIO口的基本配置。
(2)“debug_uart9”为type-c接口的USB转串口,用于串口信息打印,上位机串口调试助手的指令控制。
(3)“g_i2c0”是OLED屏的IIC接口的配置。
(4)“sw2_irq”与“sw3_irq”为Key1、Key2按键的配置。
(5)“gear_pwm”是方向舵机的配置。
(6)“g_timer0”为HC-SR04超声波测距模块的定时器配置,“g_external_irq10”为HC-SR04的外部中断检测。
(7)“g_timer1”为GTIOC1A(PE12),一路PWM信号连接L298N模块的IN1脚。
(8)“g_timer2”为GTIOC2A(PE10),一路PWM信号连接L298N模块的IN2脚。
(9)“g_timer3”为GTIOC3A(PC14),一路PWM信号连接L298N模块的IN3脚。
(10)“g_timer4”为GTIOC4B(PE01),一路PWM信号连接L298N模块的IN4脚。
(11)“g_uart3”为连接蓝牙模块的接口配置。
(12)“g_external_irq0”、“g_external_irq1”、“g_timer5”为电机转速反馈控制,引入pid算法。


五、指令说明
使用两个字节来控制,recv_buf[0]为电机参数控制命令,recv_buf[1]为自动模式、手动模式选项。
       recv_buf[0]:0,空闲默认状态
       recv_buf[0]:1,左右电机前进
       recv_buf[0]:2,左右电机后退
       recv_buf[0]:3,左电机转,向右转大弯
       recv_buf[0]:4,右电机转,向左转大弯
       recv_buf[0]:5,左右电机全速运行,快速前进
       recv_buf[0]:6,左右电机停止运行


       recv_buf[1]:1,自动模式
       recv_buf[1]:2,手动模式


六、部分代码
       hal_entry.c
  1. #include "hal_data.h"

  2. FSP_CPP_HEADER
  3. void R_BSP_WarmStart(bsp_warm_start_event_t event);
  4. FSP_CPP_FOOTER

  5. #include "led/bsp_led.h"
  6. #include "dht11/bsp_dht11.h"
  7. #include "key.h"
  8. #include "debug_uart/bsp_debug_uart.h"
  9. #include "motor_servo/motor_servo.h"
  10. #include "oled.h"
  11. #include "bmp.h"
  12. #include "hc_sr04.h"
  13. #include "bluetooth.h"
  14. #include "motor_dc.h"
  15. #include "motor_pid.h"
  16. #include "pid_calculate.h"
  17. #include "motor_speed.h"

  18. extern char Order_Buff[1];
  19. extern int8_t direct;

  20. /*******************************************************************************************************************//**
  21. * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
  22. * is called by main() when no RTOS is used.
  23. **********************************************************************************************************************/
  24. void hal_entry(void)
  25. {
  26.     uint8_t temper[2] = {0};     
  27.     uint8_t humidity[2] = {0};
  28.     /* TODO: add your own code here */
  29.     IRQ_Init();
  30.     InitServoMotor();
  31.     LED_Init();
  32.     HC_SR04_Init();
  33.     motor_dc_init();
  34.     Debug_UART9_Init();
  35.     blueTooth_Init();
  36.     setGearAngle(0);//上电使舵机回到0度位置
  37.     pid_param_init();
  38.     Motor_speed_Init();
  39.     oled_Init();
  40.     oled_Clear();
  41.     printf("\r\n***********************\r\n");
  42.     printf("\n欢迎使用启明6T2开发板\r\n");
  43.     printf("\n儿童三轮代步车控制实验\r\n");
  44.     printf("\n按下按键1:小幅度左转\r\n");
  45.     printf("\n按下按键2:小幅度右转\r\n");
  46.     printf("\r\n***********************\r\n");
  47.         
  48.      oled_Clear();
  49.      oled_ShowCHinese(10,0,0);//欢
  50.      oled_ShowCHinese(18+10,0,1);//迎
  51.      oled_ShowCHinese(36+10,0,2);//使
  52.      oled_ShowCHinese(54+10,0,3);//用
  53.      oled_PrintfString(6,3,(unsigned char*)"RA6T2 MotorTest");
  54.      oled_PrintfString(6,6,(unsigned char*)"2024-12-08");
  55.      R_BSP_SoftwareDelay(1200, BSP_DELAY_UNITS_MILLISECONDS);
  56.      oled_Clear();
  57.      oled_ShowCHinese(10,0,4);//瑞
  58.      oled_ShowCHinese(28,0,5);//萨
  59.      oled_PrintfString(46,0,(unsigned char*)"MCU");
  60.      oled_PrintfString(76,0,(unsigned char*)"2024");
  61.      oled_ShowCHinese(110,0,9);//年
  62.      oled_DrawBMP(0,2,128,8,BMP1);
  63.      R_BSP_SoftwareDelay(1200, BSP_DELAY_UNITS_MILLISECONDS);
  64.      oled_Clear();
  65.      oled_DrawBMP(0,0,128,8,BMP2);
  66.      R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);        
  67.      oled_SetCharSize(FONT_16);
  68.      while(1)
  69.      {
  70.                 DHT11_Read_Data(temper,humidity);
  71.                 R_BSP_SoftwareDelay(300,BSP_DELAY_UNITS_MILLISECONDS);

  72.                 if(direct == 0)
  73.                 {
  74.                         oled_Clear();
  75.                         oled_ShowCHinese(0,2,10);//当
  76.                         oled_ShowCHinese(18,2,11);//前
  77.                         oled_ShowCHinese(36,2,12);//温
  78.                         oled_ShowCHinese(54,2,13);//度
  79.                         oled_PrintfString(72,2,(unsigned char*)":");
  80.                         oled_ShowNum(80,2,temper[0],2);
  81.                         oled_ShowCHinese(98,2,16);//℃
  82.                         oled_ShowCHinese(0,5,10);//当
  83.                         oled_ShowCHinese(18,5,11);//前
  84.                         oled_ShowCHinese(36,5,14);//温
  85.                         oled_ShowCHinese(54,5,15);//度
  86.                         oled_PrintfString(72,5,(unsigned char*)":");
  87.                         oled_ShowNum(80,5,humidity[0],2);
  88.                         oled_PrintfString(98,5,(unsigned char*)"%RH");
  89.                 }
  90.                 if(direct==1)
  91.                 {
  92.                         oled_Clear();
  93.                         oled_DrawBMP(0,0,128,8,BMP3);
  94.                         direct = 0;
  95.                 }
  96.                 else if(direct==2)
  97.                 {
  98.                         oled_Clear();
  99.                         oled_DrawBMP(0,0,128,8,BMP4);
  100.                         direct = 0;
  101.                 }
  102.                  if( stru_BlueCmd.mode ==  MANUAL )
  103.                {
  104.                     motor_ActRunCtrl();
  105.                }
  106.                else if( stru_BlueCmd.mode ==  AUTO )
  107.               {
  108.                     motor_pid_control();
  109.               }
  110.              memset(temper,0,sizeof(temper));
  111.              memset(humidity,0,sizeof(humidity));
  112.          }
  113.      
  114. #if BSP_TZ_SECURE_BUILD
  115.     /* Enter non-secure code */
  116.     R_BSP_NonSecureEnter();
  117. #endif
  118. }

  119. /*******************************************************************************************************************//**
  120. * This function is called at various points during the startup process.  This implementation uses the event that is
  121. * called right before main() to set up the pins.
  122. *
  123. * @param[in]  event    Where at in the start up process the code is currently at
  124. **********************************************************************************************************************/
  125. void R_BSP_WarmStart (bsp_warm_start_event_t event)
  126. {
  127.     if (BSP_WARM_START_RESET == event)
  128.     {
  129. #if BSP_FEATURE_FLASH_LP_VERSION != 0

  130.         /* Enable reading from data flash. */
  131.         R_FACI_LP->DFLCTL = 1U;

  132.         /* Would normally have to wait tDSTOP(6us) for data flash recovery. Placing the enable here, before clock and
  133.          * C runtime initialization, should negate the need for a delay since the initialization will typically take more than 6us. */
  134. #endif
  135.     }

  136.     if (BSP_WARM_START_POST_C == event)
  137.     {
  138.         /* C runtime environment and system clocks are setup. */

  139.         /* Configure pins. */
  140.         R_IOPORT_Open(&g_ioport_ctrl, g_ioport.p_cfg);
  141.     }
  142. }

  143. #if BSP_TZ_SECURE_BUILD

  144. BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ();

  145. /* Trustzone Secure Projects require at least one nonsecure callable function in order to build (Remove this if it is not required to build). */
  146. BSP_CMSE_NONSECURE_ENTRY void template_nonsecure_callable ()
  147. {

  148. }
  149. #endif
复制代码

七、控制效果演示
        录制的视频是采用手机端的小程序蓝牙无线控制方式,去控制左右电机的转动状态。由于HC-SR04超声波测距模块需要在比较空旷的地方,组装成小车模型才好演示其自动控制效果,这里就不再录制视频,不过发送指令切换成自动模式后,用手移动HC-SR04超声波测距模块,电机会做出相应动作。当然上位机串口调试助手也是可以通过发送hex格式的数据进行控制左右电机运转的。
上位机指令控制.png
第二期瑞萨RA MCU创意氛围赛+启明儿童三轮车

八、工程源码分享
       Remote_Control_Tricycle.zip (1.73 MB, 下载次数: 5)

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-12-27 07:48 , Processed in 0.138298 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表