123下一页
返回列表 发新帖我要提问本帖赏金: 50.00元(功能说明)

[PIC®/AVR®/dsPIC®产品] 做一辆用手机遥控的玩具车吧,超简单,留给孩子玩

[复制链接]
 楼主| gaoyang9992006 发表于 2021-11-9 22:40 | 显示全部楼层 |阅读模式
<
#申请原创# @21小跑堂
这辆车有4个车轮,每个车轮可以独立驱动,所以我们可以叫它:四驱车


系统组成如下所示:通过蓝牙模块与手机APP通信,并根据接收的指令控制车轮的转动方向。如果富裕的话,还可以加上电子指南针之类的传感器,用于控制转向角度。这样可以防止在打滑的情况下转角不准。




这里我使用单片机是PIC18F16Q41 Curiosity Nano开发板。
我们可以看着开发板管脚的分布于MCC轻松配置管脚的分工。
串口UART1 连接BLE蓝牙模块,作为UART1的管脚是:RB7/TX1;RB5/RX1
由于该开发板仅仅有3组PWM,又因为我们用的减速电机,本身就跑的不会很快,所以这里我们就不调速了。
因此我们还需要4对IO来控制电机的正反转。如下所示:

我做的时候还利用了一路PWM控制舵机带动机械机构运动。这里可以不用。
感兴趣的另外自己加。
其实这个时候你电机线的顺序搞错了都没事,后面可以测一下确定,大不了软件里修改一下代码就行了。
其实只要测定后哪两个管脚控制某个轮子是正转的就行了,然后反转就是颠倒一下高低电平。比如我测定的正转时序如下所示
  1. void up(void)
  2. {
  3. //    左前
  4.     IO_RC4_SetHigh();
  5.     IO_RC5_SetLow();
  6. //    右前
  7.     IO_RC6_SetHigh();
  8.     IO_RC7_SetLow();
  9.    
  10. //    左后
  11.     IO_RB6_SetHigh();
  12.     IO_RB4_SetLow();
  13. //    右后  
  14.     IO_RA2_SetHigh();
  15.     IO_RC3_SetLow();
  16. }
相应的你应该知道怎么修改让某个轮子反转,或者停止了吧。
电机的驱动我们采用驱动桥,因为单片机的IO直接驱动那怎么可以?电机驱动芯片与原理图如下所示。图是用visio绘制。

接下来实现手机APP与单片机的交互协议。
为了方便扩展,我们将一条质量设置长一些:{AT:ABCD1234UP}
这就是我们的指令模板,以一对大括号作为指令内容,通过识别是否遇到了大括号的开始作为收到指令的依据,如果收到了大括号开始,我们就开始接收数据,并判断大括号结束是否在正确的位置,如果是,那说明这一条指令是完整的,然后从中取出对应的位,判断是什么指令,然后执行对应的命令。
为了方便理解,我将识别指令的程序段,直接放主函数里,你也可以通过串口中断实现,这样就可以让单片机在没有指令的时候干别的事情了。
  1.         while(getch()=='{')
  2.         {
  3.             cmd[0] = '{';
  4.             for(i=1;i<15;i++)
  5.                 cmd[i] = getch();
  6.             if(cmd[14]=='}')
  7.             {
  8.                 x=cmd[12];
  9.                 switch(x)
  10.                 {
  11.                 case 'U':
  12.                     up();
  13.                     printf("UP\n");
  14.                     break;
  15.                 case 'D':
  16.                     down();
  17.                     printf("DOWN\n");
  18.                     break;
  19.                 case 'L':
  20.                     left();
  21.                     printf("LEFT\n");
  22.                     break;
  23.                 case 'R':
  24.                     right();
  25.                     printf("RIGHT\n");
  26.                     break;
  27.                 case 'S':
  28.                     stop();
  29.                     printf("STOP\n");
  30.                     break;
  31.                 case 'T':
  32.                     Triangle(1);
  33.                     printf("T-UP   ");
  34.                     break;
  35.                 case 'V':
  36.                     Triangle(0);
  37.                     printf("T-DOWN ");
  38.                     break;
  39.                 }
  40.             }
  41.         }
那么APP怎么实现呢?

以上是APP的设计界面和功能按钮。当发送指令成功后,单片机就返回对应的内容,就是上面代码中的printf内容。
APP的开发教程在
https://bbs.21ic.com/icview-3173112-1-1.html
大家可以根据需要修改。
今年的TI电赛有个加分项,就是测量的信息在手机上显示。大家如果选择那个题目的话,可以参考我这个方案。
另外如果不想使用杜邦线接一堆线,可以自己做PCB板子,比如我做的这个丑八怪板子。

PIC18F16Q41的源码如下所示,仅供参考,需要MCC配置的可以根据上述图中的管脚分布根据自己的需求配置
  1.                                        #include "mcc_generated_files/mcc.h"
  2. uint16_t i=500;

  3. void led(void)
  4. {
  5.     PWM1_16BIT_SetSlice1Output1DutyCycleRegister(i);
  6.     PWM1_16BIT_LoadBufferRegisters();
  7.     LED_Toggle();
  8.     i=i+667;
  9.     if(i>1400) i=500;
  10.     printf("C\n");
  11. }
  12. /*
  13. 三角架开启与落下控制指令
  14. */
  15. void Triangle(bool i)
  16. {
  17.     if(i==true)
  18.     {
  19.         PWM1_16BIT_SetSlice1Output1DutyCycleRegister(1167);
  20.         PWM1_16BIT_LoadBufferRegisters();
  21.         LED_SetLow();
  22.     }
  23.     if(i==false)
  24.     {
  25.         PWM1_16BIT_SetSlice1Output1DutyCycleRegister(500);
  26.         PWM1_16BIT_LoadBufferRegisters();
  27.         LED_SetHigh();
  28.     }
  29. }
  30. void up(void)
  31. {
  32. //    左前
  33.     IO_RC4_SetHigh();
  34.     IO_RC5_SetLow();
  35. //    右前
  36.     IO_RC6_SetHigh();
  37.     IO_RC7_SetLow();
  38.    
  39. //    左后
  40.     IO_RB6_SetHigh();
  41.     IO_RB4_SetLow();
  42. //    右后  
  43.     IO_RA2_SetHigh();
  44.     IO_RC3_SetLow();
  45. }
  46. void down(void)
  47. {
  48.     IO_RC5_SetHigh();
  49.     IO_RC4_SetLow();
  50.     IO_RC7_SetHigh();
  51.     IO_RC6_SetLow();
  52.    
  53. //    左后
  54.     IO_RB4_SetHigh();
  55.     IO_RB6_SetLow();
  56. //    右后  
  57.     IO_RC3_SetHigh();
  58.     IO_RA2_SetLow();
  59.    
  60. }
  61. void left(void)
  62. {
  63.     //    左前后退
  64.     IO_RC5_SetHigh();
  65.     IO_RC4_SetLow();
  66. //    右前前进
  67.     IO_RC6_SetHigh();
  68.     IO_RC7_SetLow();
  69.    
  70. //    左后后退
  71.     IO_RB4_SetHigh();
  72.     IO_RB6_SetLow();
  73. //    右后前进
  74.     IO_RA2_SetHigh();
  75.     IO_RC3_SetLow();
  76. }
  77. void right(void)
  78. {
  79.     //    左前前进
  80.     IO_RC4_SetHigh();
  81.     IO_RC5_SetLow();
  82. //    右前后退
  83.     IO_RC7_SetHigh();
  84.     IO_RC6_SetLow();
  85.    
  86. //    左后前进
  87.     IO_RB6_SetHigh();
  88.     IO_RB4_SetLow();
  89. //    右后后退
  90.     IO_RC3_SetHigh();
  91.     IO_RA2_SetLow();
  92. }
  93. void stop(void)
  94. {
  95.     IO_RC4_SetLow();
  96.     IO_RC5_SetLow();
  97.     IO_RC6_SetLow();
  98.     IO_RC7_SetLow();
  99.    
  100.     IO_RB6_SetLow();
  101.     IO_RB4_SetLow();
  102.     IO_RA2_SetLow();
  103.     IO_RC3_SetLow();   
  104.    
  105.    
  106. }

  107. void main(void)
  108. {
  109.     unsigned char x;
  110.     unsigned char cmd[15];
  111.     unsigned int i=0;
  112.     // Initialize the device
  113.     SYSTEM_Initialize();


  114.     // Enable the Global Interrupts
  115.    INTERRUPT_GlobalInterruptEnable();

  116.     // Disable the Global Interrupts
  117.     //INTERRUPT_GlobalInterruptDisable();
  118.     INT0_SetInterruptHandler(led);
  119.     printf("Hello MyCar\n");
  120.   
  121.     while (1)
  122.     {
  123.         // {AT:ABCD1234UP}
  124. //       printf("Hello world!\n");
  125. //        __delay_ms(500);
  126.         while(getch()=='{')
  127.         {
  128.             cmd[0] = '{';
  129.             for(i=1;i<15;i++)
  130.                 cmd[i] = getch();
  131.             if(cmd[14]=='}')
  132.             {
  133.                 x=cmd[12];
  134.                 switch(x)
  135.                 {
  136.                 case 'U':
  137.                     up();
  138.                     printf("UP\n");
  139.                     break;
  140.                 case 'D':
  141.                     down();
  142.                     printf("DOWN\n");
  143.                     break;
  144.                 case 'L':
  145.                     left();
  146.                     printf("LEFT\n");
  147.                     break;
  148.                 case 'R':
  149.                     right();
  150.                     printf("RIGHT\n");
  151.                     break;
  152.                 case 'S':
  153.                     stop();
  154.                     printf("STOP\n");
  155.                     break;
  156.                 case 'T':
  157.                     Triangle(1);
  158.                     printf("T-UP   ");
  159.                     break;
  160.                 case 'V':
  161.                     Triangle(0);
  162.                     printf("T-DOWN ");
  163.                     break;
  164.                 }
  165.             }
  166.         }
  167.      }
  168. }
APP中按键触发发送指令部分代码
  1. 事件 按钮上.被单击()
  2.                 BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("{AT:ABCD1234UP}\r\n","GBK"))        
  3. 结束 事件

  4. 事件 按钮下.被单击()
  5.                 BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("{AT:ABCD1234DN}\r\n","GBK"))        
  6. 结束 事件

  7. 事件 按钮左.被单击()
  8.                 BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("{AT:ABCD1234LF}\r\n","GBK"))        
  9. 结束 事件

  10. 事件 按钮右.被单击()
  11.                 BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("{AT:ABCD1234RT}\r\n","GBK"))        
  12. 结束 事件


  13. 事件 三角按钮上.被单击()
  14.                 BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("{AT:ABCD1234T0}\r\n","GBK"))        
  15. 结束 事件

  16. 事件 三角按钮下.被单击()
  17.                 BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("{AT:ABCD1234V0}\r\n","GBK"))               
  18. 结束 事件

  19. 事件 停止按钮.被单击()
  20.                 BLE蓝牙1.写入数据(服务UUID,通道UUID,文本到字节("{AT:ABCD1234S0}\r\n","GBK"))        
  21. 结束 事件



战车雏形

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

打赏榜单

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

 楼主| gaoyang9992006 发表于 2021-11-9 22:46 | 显示全部楼层
本帖最后由 gaoyang9992006 于 2021-11-13 18:14 编辑

试车视频:https://www.bilibili.com/video/BV1Hf4y1T73F/扩展电路板收到了,把各个模块都插上。为何我这么做呢?不直接做一个完整的板子。
首先,这年头买模块比买芯片便宜。
另外单片机可以用论坛免费申请的,Microchip板块每个月都有开发板免费申请,赶紧参与进来。
另外就是用模块可以很快改变设计,让芯片重复利用。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
huquanz711 发表于 2021-11-9 23:19 来自手机 | 显示全部楼层
哈哈,不错,孩子喜欢吗?
yangxiaor520 发表于 2021-11-10 08:00 来自手机 | 显示全部楼层
楼主是男孩还是女孩儿
 楼主| gaoyang9992006 发表于 2021-11-10 09:10 | 显示全部楼层
yangxiaor520 发表于 2021-11-10 08:00
楼主是男孩还是女孩儿

都有。
 楼主| gaoyang9992006 发表于 2021-11-10 09:10 | 显示全部楼层
huquanz711 发表于 2021-11-9 23:19
哈哈,不错,孩子喜欢吗?

必须的喜欢。
七毛钱 发表于 2021-11-10 09:27 | 显示全部楼层
这个说实在话我不太喜欢,哈哈
 楼主| gaoyang9992006 发表于 2021-11-10 10:08 | 显示全部楼层
七毛钱 发表于 2021-11-10 09:27
这个说实在话我不太喜欢,哈哈

你做好看点就行了。哈哈,我这太简陋,因为打的板子刚刚收到,后面重新组装一下就好看了。
hu9jj 发表于 2021-11-10 16:56 | 显示全部楼层
建议改为三轮,一对驱动轮,一个万向轮,这样转弯更灵活方便。
yanzhengxin1 发表于 2021-11-11 09:14 | 显示全部楼层
可以啊,娃娃的玩具自己全部承包了。
 楼主| gaoyang9992006 发表于 2021-11-11 11:38 | 显示全部楼层
yanzhengxin1 发表于 2021-11-11 09:14
可以啊,娃娃的玩具自己全部承包了。

哈哈,最近在学3D建模,到时候可以打印外壳了。
szmy8311 发表于 2021-11-11 12:18 | 显示全部楼层
这个有点6
Gavin3389 发表于 2021-11-11 15:05 | 显示全部楼层
楼主,对你搞APP的这个软件,越来越感兴趣了
lcczg 发表于 2021-11-11 16:11 | 显示全部楼层
帅帅帅
 楼主| gaoyang9992006 发表于 2021-11-11 23:22 | 显示全部楼层
Gavin3389 发表于 2021-11-11 15:05
楼主,对你搞APP的这个软件,越来越感兴趣了

haha,那赶紧学起来,很容易上手的。
 楼主| gaoyang9992006 发表于 2021-11-11 23:22 | 显示全部楼层

哈哈,感谢支持,加油,一起学。
 楼主| gaoyang9992006 发表于 2021-11-11 23:23 | 显示全部楼层

有兴趣也学一下,很容易就做出来手机APP了。
toowm 发表于 2021-11-12 18:02 | 显示全部楼层
不管咋说,就两个字牛X
天意无罪 发表于 2021-11-13 11:41 | 显示全部楼层
楼主家的小孩儿是女孩还是男孩,喜欢玩吗?要不顺便培养一下他的兴趣,哈哈哈。
 楼主| gaoyang9992006 发表于 2021-11-13 18:15 | 显示全部楼层
天意无罪 发表于 2021-11-13 11:41
楼主家的小孩儿是女孩还是男孩,喜欢玩吗?要不顺便培养一下他的兴趣,哈哈哈。 ...

男孩女孩都有。是的,喜欢啊,以后长大了肯定要跟我一样学这些内容了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2046

主题

16351

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2046

主题

16351

帖子

222

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