返回列表 发新帖我要提问本帖赏金: 60.00元(功能说明)

[RISC-V MCU 应用开发] RISC-V MCU-遥控智能小车

[复制链接]
7120|22
 楼主| 51xlf 发表于 2022-7-8 16:44 | 显示全部楼层 |阅读模式
#申请原创#   @21小跑堂
先介绍一下CH32V307吧,赤菟V307是搭载沁恒自研RISC-V内核青稞V4F的高性能互联型MCU,主频支持144MHz,支持硬件浮点运算(FPU),提供八个UART接口、USB2.0高速接口(480Mbps)并内置了PHY收发器、千兆以太网MAC并集成10M PHY、2个CAN接口等丰富的外设资源。赤菟V307评估板自带WCH-Link仿真调试器,并配备丰富的板载资源,包括LCD显示屏、距离与环境光传感器、六轴姿态传感器、温湿度传感器、麦克风、蓝牙模块接口。
搜狗截图22年07月08日1557_3.jpg
板子上有一个蓝牙BLE模块,所以想着用这个模块开发一个基于蓝牙控制的小车系统。该系统采用了上位机和下位机两个部分。下位机采用的是CH32V307作为主控制器,通过PWM控制小车,并通过AHT10读取环境温湿度,并将参数显示在LCD上,通过MOS模块驱动加湿器模块。下位机和上位机通过蓝牙模块进行交互,下位机将温湿度数据发送给APP,同时,上位机通过APP将数据发给下位机。APP通过android studio编写。
系统框图如下所示。
搜狗截图22年07月08日1556_2.jpg
建立系统工程文件,记得要选择是CH32V307的芯片,这里没有使用操作系统。
1.jpg
该开发板提供的资料不少,很多的源代码都不需要自己来编写的,使用官网的代码即可。
建立的工程如下所示。
2.jpg
因为我们后期需用到AHT11和LCD,所以将两个系统文件复制到工程文件下。
搜狗截图22年07月08日1609_6.jpg
这里的驱动文件就不再赘述了。使用用来读取数据和显示数据使用。
首先,要实现的是读取温湿度数据并将该数据显示在LCD,并发送数据到蓝牙上。
驱动代码中已经提供了如何获取温湿度数据,这里只要需要调用即可。
  1. temperature = AHT10_Read_Temperature();
  2.             humidity = AHT10_Read_Humidity();
  3.             lcd_set_color(BLACK,GREEN);
  4.             lcd_show_string(30, 192, 16,"Temperature : %5d", (int)(temperature));
  5.             lcd_show_string(30, 208, 16,"Humidity    : %5d", (int)(humidity));
为了更好的实现控制,这里不使用延时函数,而是采用定时器实现内部时钟,采用的是定时器2实现中断计数的功能。
然后通过时间差实现1s采集和更新一次数据的功能。计算时间差的函数如下
  1. u32 get_tDiff(u32 lt)
  2. {
  3.     return timer_cnt-lt;
  4. }
timer_cnt为全局变量,用于定时器的计数,形成系统时钟。
  1. void TIM2_IRQHandler(void)
  2. {
  3.     if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查TIM2中断是否发生。
  4.       {
  5.         TIM_ClearITPendingBit(TIM2,TIM_IT_Update);    //清除TIM2的中断挂起位。
  6. timer_cnt++;
  7.       }
  8. }
BLE模块的数据主要是通过串口实现的 ,只要向串口发送数据,手机端就可以收到相关的数据了。
串口的配置这里就不再赘述了,官网提供个代码已经实现了,只需要简单的复制就行了。
这里是将温湿度数据转换为json格式的数据,发送到手机上,然后在手机端进行解析,将温湿度数据显示在手机上。
实现的代码如下所示。
  1.         if(get_tDiff(last_time0)>1000){
  2.             last_time0=timer_cnt;
  3.             temperature = AHT10_Read_Temperature();
  4.             humidity = AHT10_Read_Humidity();
  5.             lcd_set_color(BLACK,GREEN);
  6.             lcd_show_string(30, 192, 16,"Temperature : %5d", (int)(temperature));
  7.             lcd_show_string(30, 208, 16,"Humidity    : %5d", (int)(humidity));
  8.             sprintf(s_Str,"{"t":%d,"h":%d}",(int)(temperature),(int)(humidity));
  9.             while(uartWriteBLEstr(s_Str)==RESET);
  10.         }



为了能够更好的控制小车,这里使用的是PWM来控制,PWM的占空比可以通过手机端进行操作。
其初始化代码如下所示,pwm.h
  1. /*
  2. * pwm.h
  3. *
  4. *  Created on: Jun 8, 2022
  5. *      Author: flying
  6. */

  7. #ifndef USER_PWM_H_
  8. #define USER_PWM_H_


  9. void initPwm(void);

  10. #endif /* USER_PWM_H_ */
pwm.c,配置的定时器3的1和2通道,分别对PB0和PB1输出PWM信号,并通过驱动电路实现小车的控制。
PWM的周期为1ms,默认的占用比为50%;
  1. #include "pwm.h"
  2. void initPwm(void)
  3. {
  4.     GPIO_InitTypeDef GPIO_InitStructure={0};
  5.         TIM_OCInitTypeDef TIM_OCInitStructure={0};
  6.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure={0};
  7.         RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB , ENABLE );
  8.         RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE );
  9.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  11.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  12.         GPIO_Init( GPIOB, &GPIO_InitStructure );
  13.         TIM_TimeBaseInitStructure.TIM_Period = 1000-1;
  14.         TIM_TimeBaseInitStructure.TIM_Prescaler = 72-1;
  15.         TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  16.         TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  17.         TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStructure);
  18.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  19.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  20.         TIM_OCInitStructure.TIM_Pulse = 0;
  21.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  22.         TIM_OC3Init( TIM3, &TIM_OCInitStructure );
  23.         TIM_OC4Init( TIM3, &TIM_OCInitStructure );
  24.         TIM_CtrlPWMOutputs(TIM3, ENABLE );
  25.         TIM_OC3PreloadConfig( TIM3, TIM_OCPreload_Disable );
  26.         TIM_OC4PreloadConfig( TIM3, TIM_OCPreload_Disable );
  27.         TIM_ARRPreloadConfig( TIM3, ENABLE );
  28.         TIM_Cmd( TIM3, ENABLE );
  29. }


下面开始对小车的控制方式进行设计,分别涉及到前进、后退、左转和右转、停止三个功能。
其实现函数如下所示。
  1. uint16_t speed=500;
  2. void foward(void)
  3. {
  4.     GPIO_WriteBit(GPIOE, GPIO_Pin_13,Bit_RESET);
  5.     GPIO_WriteBit(GPIOE, GPIO_Pin_15,Bit_RESET);
  6.     TIM_SetCompare3(TIM3, speed);
  7.     TIM_SetCompare4(TIM3, speed);
  8. }

  9. void back(void)
  10. {
  11.     GPIO_WriteBit(GPIOE, GPIO_Pin_13,Bit_SET);
  12.     GPIO_WriteBit(GPIOE, GPIO_Pin_15,Bit_SET);
  13.     TIM_SetCompare3(TIM3, 0);
  14.     TIM_SetCompare4(TIM3, 0);
  15. }

  16. void left(void)
  17. {
  18.     GPIO_WriteBit(GPIOE, GPIO_Pin_13,Bit_RESET);
  19.     GPIO_WriteBit(GPIOE, GPIO_Pin_15,Bit_RESET);
  20.     TIM_SetCompare3(TIM3, 0);
  21.     TIM_SetCompare4(TIM3, speed);
  22. }
  23. void right(void)
  24. {
  25.     GPIO_WriteBit(GPIOE, GPIO_Pin_13,Bit_RESET);
  26.     GPIO_WriteBit(GPIOE, GPIO_Pin_15,Bit_RESET);
  27.     TIM_SetCompare3(TIM3, speed);
  28.     TIM_SetCompare4(TIM3, 0);
  29. }
  30. void stop(void)
  31. {    GPIO_WriteBit(GPIOE, GPIO_Pin_13,Bit_RESET);
  32.     GPIO_WriteBit(GPIOE, GPIO_Pin_15,Bit_RESET);
  33.     TIM_SetCompare3(TIM3, 0);
  34.     TIM_SetCompare4(TIM3, 0);
  35. }
小车部分的实现图片。
111.jpg
然后再开始设计BLE的控制程序,这个代码参考的是沁恒的BLE程序,下载链接如下所示。
https://www.wch.cn/downloads/WCHBleLib_MultiOS_ZIP.html
只需要简单修改几个代码就可以,然后是修改发送的功能,
在安卓里面定义显示温湿度的TextView和控制按键Button
然后修改MainActivity.java的功能
这里显示温湿度的代码在private void updateValueTextView(final byte[] data) 中,修改代码为
  1. JSONObject jb = new JSONObject(new String(data));


  2.             double tt =jb.getDouble("t");
  3.             tv_tt.setText(""+tt +" ℃");
  4.             tt =jb.getDouble("h");
  5.             tv_temp.setText(""+tt +" %");
这样温湿度数据就会显示了。
下面实现发送的代码。前面根据xml文件的ID,将实例化该空间。
因为代码重复性太大,这里就拿左转命令来介绍,当发送‘A’的时候小车实现前进,
在APP实现的代码
  1.         btn_qian.setOnClickListener(new View.OnClickListener() {
  2.             @Override
  3.             public void onClick(View v) {
  4.                 if (!checkBtEnabled()) {
  5.                     showToast("请先打开蓝牙");
  6.                     return;
  7.                 }
  8.                 try {
  9.                     byte[] bytes = new byte[0];
  10.                     bytes = "A".getBytes("utf-8");
  11.                     write(SendType.TYPE_SINGLE, bytes, 0);
  12.                 } catch (UnsupportedEncodingException e) {
  13.                     e.printStackTrace();
  14.                 }
  15.             }
  16.         });
在单片机里面实现控制的方式就是
  1.             if(buffer[0]=='A'){
  2.                 foward();
  3. }
  4. buffer[0]=0;
设计的APP界面如下所示。
112.jpg
源代码如下所示 code.rar (22.61 KB, 下载次数: 22)
因为视频上传不了,所以放两张操作图片吧。
搜狗截图22年07月08日1643_8.jpg 搜狗截图22年07月08日1642_7.jpg

打赏榜单

21小跑堂 打赏了 60.00 元 2022-07-11
理由:恭喜通过原创文章审核!请多多加油哦!

评论

学习了  发表于 2024-10-31 13:57
不错,看看  发表于 2022-11-3 18:51
简单系统的实现了蓝牙控制小车行驶,开发思路清晰,完成度较好,可尝试添加更多传感器实现更好的行驶效果  发表于 2022-7-11 18:03
zhuomuniao110 发表于 2022-7-12 21:37 | 显示全部楼层
学习了。非常好啊。
BryanChang 发表于 2022-7-15 14:23 | 显示全部楼层
支持RISCV,棒棒哒!
F99343441 发表于 2022-7-21 16:22 | 显示全部楼层
这板子是哪里来的,看起来很厉害呀,我也想要!!
麻花油条 发表于 2022-8-5 16:41 来自手机 | 显示全部楼层
哪里弄来这么好的板子
uytyu 发表于 2022-8-16 20:39 | 显示全部楼层
比stm32的性能强吗   
suzhanhua 发表于 2022-8-19 22:02 | 显示全部楼层
能够提交照片到网络吗  
tifmill 发表于 2022-8-20 14:51 | 显示全部楼层
这个是wifi控制的吗     
xiaoyaodz 发表于 2022-9-5 15:45 | 显示全部楼层
这个看着挺高端呢。   
jimmhu 发表于 2022-9-5 17:33 | 显示全部楼层
蓝牙代码怎么实现的呢   
everyrobin 发表于 2022-10-1 14:05 | 显示全部楼层
这个app的代码有吗?              
typeof 发表于 2022-10-1 14:52 | 显示全部楼层
这个不错,制作的非常详细呢              
sparrow054 发表于 2022-10-2 14:45 | 显示全部楼层
干的漂亮~~~
vivilyly 发表于 2022-10-13 15:04 | 显示全部楼层
制作智能小车需要学什么               
cehuafan 发表于 2022-10-13 15:30 | 显示全部楼层
蓝牙智能遥控小车非常不错的。        
jonas222 发表于 2022-10-13 16:07 | 显示全部楼层
如何用安卓遥控智能小车                  
beacherblack 发表于 2022-10-13 17:00 | 显示全部楼层
用L298N作遥控车有刷电调 控制小车正反转 可调速 怎么做  
robertesth 发表于 2022-10-13 17:52 | 显示全部楼层
如何利用移动基站来遥控智能小车?
gangong 发表于 2024-10-26 20:36 | 显示全部楼层
漂亮楼主了
forgot 发表于 2024-10-31 13:57 | 显示全部楼层
支持RISCV,非常棒
您需要登录后才可以回帖 登录 | 注册

本版积分规则

551

主题

9967

帖子

24

粉丝
快速回复 在线客服 返回列表 返回顶部