[开源硬件] 【21ic DIY秀】基于MM32F031 的遥感智能小车

[复制链接]
2993|37
 楼主 | 2019-3-22 21:33 | 显示全部楼层 |阅读模式
本帖最后由 hsxs 于 2019-4-8 21:30 编辑

前些日子正好想做个小车玩一下,
正好公司有批新的国产单片机,
然后我就拿过来连连手学习一下。

1.主控用的是MM32F031
2.电源   准备使用锂电池,所以想着干脆上面堆一个充电模块好了,也便宜。
而且自己焊接还有好多分立器件麻烦
锂电池3.7V ,后面用了个升压模块升压到5V。
供电部分的电路全部都是用的模块,这两个模块加起来4块钱都不到。

3.电机 用到是淘宝买的 N20减速电机  6V200转的,后面感觉速度还是慢了些,
配套的固定件,轴连器,螺丝等等
没有使用分立元件搭建驱动,直接用了电机驱动芯片TB6612..单买好贵,加运费一个都快4,5块了。

4.RGB 灯光效果用到是ws2812的RGB灯,这个便宜而且效果很好,不过对时序要求满厉害的,
最后用到方案是DMA+PWM,后面看起来效果还是很不错的。

5.蓝牙 之前看过有人专门写了个APP ,里面有摇杆控制,重力控制等等,还是挺好用的,
所以我买了蓝牙串口模块堆上去,方便快捷。

6.蜂鸣器,堆料堆了一个无源的贴片蜂鸣器,这个也便宜。

7.其他 搞了一个OLED屏和几个按键,准备做点交互按钮,还有超声波模块预留,
超声波这块程序还没开始写。不过看了原理和应用应该不难,

8.PID 巡线 失策了好像,之前没做过没用过这类元器件,用了个ITR8307贴片的,后来发现轮子太大了
反射距离好像有点高,,所以这块功能也还没开始写。

先放张PCB 图, 正好上次注册捷配账号,给送了20块钱优惠卷 ,只花了15块钱,
关键是顺丰包邮!!!

小车主板

小车主板


PCB 图   没想好放什么logo 就放了个 vans 的
挺好看的。我觉得这个logo ,

119685c95bcffd4b55.png


top
470905c95bd56417a8.png

https://www.bilibili.com/video/av48727886?pop_share=1




 楼主 | 2019-3-22 21:56 | 显示全部楼层
本帖最后由 hsxs 于 2019-3-22 22:04 编辑

先来一张 材料全图
21f49ce45786536ec4af6aeaabeaff8.jpg
当时焊了贴片的元器件,很舒服
ce6c8dd15dd55e5a78d81edb7d157ef.jpg


慢慢的装好零件
4134adabcdee31c77bb355dd8a83acf.jpg


说真的,这轮子好贵。。15块钱一对。。。。
但是确实很舒服
5f8b3772f562dffa0effc7a949a0ae2.jpg

3d26c3aa66794e78f1ec84614e67e91.jpg


f5635533f32505ceec10843a58b3510.jpg

使用特权

评论回复
 楼主 | 2019-3-22 22:05 | 显示全部楼层
本帖最后由 hsxs 于 2019-3-27 22:25 编辑

后面第一步先亮灯!
发现视频得挂链接。。视频网站得审核,,审核好了我再挂上链接

明天在挂上原理图+程序源码。今天先这样了。。

之后再写 其他功能的程序,。。目前就完成了 电机驱动 控制,还有rgb灯,但是把一些驱动都写好了
剩下的就是功能整合了
/********************************************************************************************************
**函数信息 :void TIM3_PWM_Init(u16 arr,u16 psc)                        
**功能描述 :TIM3 PWM初始化
**输入参数 :
**输出参数 :
********************************************************************************************************/
void TIM3_PWM_Init(u16 arr,u16 psc,u16 pluse)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        TIM_DeInit(TIM3);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);                   //打开定时器3的时钟
        //复用初始
        GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_1);
        GPIO_InitStructure.GPIO_Pin = RGB_PIN;                                   //TIM3_CH1
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                         //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);

        
        TIM_TimeBaseStructure.TIM_Period = arr-1;                                   //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
        TIM_TimeBaseStructure.TIM_Prescaler =psc;                                   //设置用来作为TIMx时钟频率除数的预分频值
        /*****TIM_Period和TIM_Prescaler决定了周期*****=(480000)/(arr+1)*(psc+1)*/
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                     //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                 //TIM向上计数模式
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);                             //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
        TIM_ARRPreloadConfig(TIM3, ENABLE);                                         //使能TIMx在ARR上的预装载寄存器

        TIM_OCStructInit(&TIM_OCInitStructure);                                                    //装载默认值
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;                           //选择定时器模式:TIM脉冲宽度调制模式1
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                //比较输出使能
        TIM_OCInitStructure.TIM_Pulse = pluse;                                                     //设置待装入捕获比较寄存器的脉冲值
        /*******TIM_Pulse决定了占空比******/
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                    //输出极性
        TIM_OC1Init(TIM3, &TIM_OCInitStructure);                                    //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
        TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);                           //CH1预装载使能        

        TIM_DMACmd(TIM3, TIM_DMA_Update|TIM_DMA_Trigger, ENABLE);
        TIM_DMACmd(TIM3, TIM_DMA_CC1, ENABLE);
        //        TIM_Cmd(TIM2, ENABLE);                                                      //使能TIMx   
}
/********************************************************************************************************
**函数信息 :DMA_m8tom8_test(void)         
**功能描述 : 把存储器中的某一地址开始的64个8位数据搬到存储器的另一个地址,并以8位方式存储
**输入参数 :无
**输出参数 :无
********************************************************************************************************/
#define TIM3_CCR1_Address 0x40000434

void DMA_TIM3_Init()
{
//        NVIC_InitTypeDef NVIC_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;
        DMA_DeInit(DMA1_Channel4);                                                        //通道2
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
        
        DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)TIM3_CCR1_Address;           //目标地址
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)LED_BYTE_Buffer;                        //数据地址
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                                //传输方向  MtoP
        DMA_InitStructure.DMA_BufferSize = 10;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;                 //TIM2_CCR2地址不变
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                                                         // automatically increase buffer index
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;          //16位
        DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                                                                             // stop DMA feed after buffer size is reached
                                                                                         //不循环
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;                              //通道优先级 高
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                                     //非存储器到存储器
        
//        NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_3_IRQn;
//        NVIC_InitStructure.NVIC_IRQChannelPriority = 2;
//        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//        NVIC_Init(&NVIC_InitStructure);
        DMA_Init(DMA1_Channel4, &DMA_InitStructure);
//        DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);        
                                         
}  


串楼贴图
??????
191c7426823cd6f66343226b9655475.jpg

137665c978f371e17b.png

使用特权

评论回复
| 2019-3-23 12:01 | 显示全部楼层
hsxs 发表于 2019-3-22 22:05
后面第一步先亮灯!
发现视频得挂链接。。视频网站得审核,,审核好了我再挂上链接

加油,还有一周时间

使用特权

评论回复
 楼主 | 2019-3-23 12:36 | 显示全部楼层
springvirus 发表于 2019-3-23 12:01
加油,还有一周时间

哈哈哈哈好的 ,

使用特权

评论回复
 楼主 | 2019-3-23 12:36 | 显示全部楼层
本帖最后由 hsxs 于 2019-3-23 12:44 编辑

美好的周末         爬起来       继续更新帖子   
昨天上传视频,今天审核通过了,先挂上RGB的调试

写这个程序用了DMA+PWM的方式, 原因是这个RGB灯珠用的是WS2812的芯片,时序时间很短,
调试这个功能的时候,第一次使用DMA ,照着手册,再看例程,一步一步的调试,还是很用意思的。
并且学到了很多关于DMA的知识。

https://www.bilibili.com/video/av47031181

613845c95b993626cb.png
百度上有很详细的资料,,这个灯珠效果还是很好的。

使用特权

评论回复
 楼主 | 2019-3-23 12:47 | 显示全部楼层
这是小车的原理图
406125c95ba78d90a9.png
75305c95ba6726836.png

使用特权

评论回复
 楼主 | 2019-3-23 12:52 | 显示全部楼层
本帖最后由 hsxs 于 2019-3-23 14:35 编辑

花了一个晚上多的时间,调试了 APP上的摇杆控制功能,。
虽然可以PWM 调速,但是由于惯性的原因,刚开始小车容易急刹和急停
控制的原理其实就是XY 坐标的数据通过蓝牙串口传送数据,在进行帧的解析。



这个是加了优化后的控制效果

https://www.bilibili.com/video/av47033234
跑起来的那种感觉还是很顺畅的 看着很舒服

电机控制我用的是 TIM1定时器的PWM通道的 CH1N 和 CH3
因为当时画板子没考虑那么多,后来仔细看了一下手册上的引脚复用功能,还好是一个定时器的
要不然定时器要开好多个浪费资源。


我又上传了优酷的视频连接   
https://v.youku.com/v_show/id_XNDEwNzk0MjE5Mg==.html?spm=a2hzp.8244740.0.0
https://v.youku.com/v_show/id_XNDEwNzk0MjE5Mg==.html?spm=a2hzp.8244740.0.0




使用特权

评论回复
 楼主 | 2019-3-23 13:08 | 显示全部楼层
本帖最后由 hsxs 于 2019-3-23 13:29 编辑

再贴个功能整合的


RGB 的协议
RGB:1               表示自动呼吸效果
RGB:0               表示手动模式,后面不加数据代表关闭灯光
RGB:0  FFFFFF   表示手动模式,后面分别是红绿蓝三色的值

开机后蜂鸣器叫一声,蓝牙脸上后叫两声

https://www.bilibili.com/video/av47032462

使用特权

评论回复
 楼主 | 2019-3-23 13:12 | 显示全部楼层
本帖最后由 hsxs 于 2019-3-24 10:23 编辑

今天的小目标
  想把超声波测距 功能调试好后,显示在OLED 上面

麻烦的点就在与怎么弄好看,。,,OLED
不知道界面有什么好的样式可以模仿一下。。。


超声波测距原理挺简单的,我用的是模块
365635c96e972cc71d.png

984825c96ea096eaae.png
发送脉冲后,打开定时器,检测高电平的时间,
然后计算

使用特权

评论回复
| 2019-3-23 14:11 | 显示全部楼层
Vans是什么鬼

使用特权

评论回复
 楼主 | 2019-3-23 14:31 | 显示全部楼层

哈哈哈哈,好看的LOGO 找不到几个。就贴了个vans

使用特权

评论回复
 楼主 | 2019-3-23 14:36 | 显示全部楼层
怎么才能帖子里面直接贴视频啊,,我看这个点链接去视频网站看,有点麻烦

使用特权

评论回复

评论

21ic小喇叭 2019-4-11 10:19 回复TA
上传到优酷,然后分享flash代码,在帖子的高级模式里选视频,粘贴代码即可 
一叶倾城wwq 2019-3-28 17:29 回复TA
和楼主一起坐等答案 
| 2019-3-23 16:44 | 显示全部楼层
车做的不错啊....    那个轮胎 在哪买的啊 链接还能告诉一下, 还有与N20电机 能配套的 万向轮 哪能买到啊...

使用特权

评论回复
| 2019-3-23 16:49 | 显示全部楼层
这个PCB  是 用 AD画的吗, 那个 N20 电机底座的 PCB 封装还能共享一下啊, 谢了....

使用特权

评论回复
 楼主 | 2019-3-23 18:02 | 显示全部楼层
zmg1688 发表于 2019-3-23 16:44
车做的不错啊....    那个轮胎 在哪买的啊 链接还能告诉一下, 还有与N20电机 能配套的 万向轮 哪能买到啊. ...

轮胎 在那个平衡小车之家买的,,

使用特权

评论回复
 楼主 | 2019-3-23 18:03 | 显示全部楼层
本帖最后由 hsxs 于 2019-3-23 18:05 编辑
zmg1688 发表于 2019-3-23 16:49
这个PCB  是 用 AD画的吗, 那个 N20 电机底座的 PCB 封装还能共享一下啊, 谢了.... ...

AD18 画的, 哪个封装我自己量的    可以呀  我发你 car.zip (547.58 KB, 下载次数: 13)

使用特权

评论回复
| 2019-3-23 21:43 | 显示全部楼层
hsxs 发表于 2019-3-23 14:31
哈哈哈哈,好看的LOGO 找不到几个。就贴了个vans

你也是,自己画个专属的就好了嘛

使用特权

评论回复
 楼主 | 2019-3-23 21:47 | 显示全部楼层
一叶倾城wwq 发表于 2019-3-23 21:43
你也是,自己画个专属的就好了嘛

哈哈哈哈没有不会画画

使用特权

评论回复
| 2019-3-23 22:05 | 显示全部楼层
hsxs 发表于 2019-3-23 21:47
哈哈哈哈没有不会画画

小车都弄出来了,还怕个LOGO?对了,视频怎么上传,附个链接就好了吗?

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /6 下一条

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