DIY娃娃机

目录

  • 前言
  • 一、硬件材料
  • 二、软件设计
    • 1.实现功能
    • 2.设计思路
    • 3.资源分配
  • 三、总结


前言

  不知道大家有没有和我一样,有时候脑子里突然冒出来一个大胆的想法,然后就立马行动,学习,努力去实现它!
  这不,有一次我去游乐场,看到商场里的娃娃机,理工男思维马上上线:这个娃娃机的主控板是什么呢?整个程序的代码是怎么样的呢?步进电机怎么控制爪子的移动,爪子抓取收放又是怎么样的呢?


  于是,半年后,就有了下面这个东西。

夹娃娃

一、硬件材料

  原本只想搭个简易版的,但是越做下去就野心越大,买的东西越来越多:
  带显示屏的主控板STM32103探索者100+,木板+亚克力50+,亚克力爪子套件30+,遥控手柄30+,蓝牙音箱40+,HC-05蓝牙模块30+,电机3x20+,舵机,红外传感器,霍尔传感器*3,稳压模块,5V升9V的数据线(插上充电宝就能用),H桥驱动模块x2,传送带齿轮联轴器,游戏币,一堆小娃娃…

上图吧:
DIY娃娃机_第1张图片

DIY娃娃机_第2张图片

二、软件设计

1.实现功能

  1. LCD屏幕显示操作界面与动画。
  2. 投币检测。
  3. 索尼PS2手柄无线控制娃娃机。
  4. 舵机控制爪子抓取,减速电机控制爪子前后左右上下移动。
  5. HC-05蓝牙模块接收来自手机APP端发来的指令。
  6. 支持60s倒计时无投币动作就待机睡眠。

2.设计思路

  1. 整个程序搭载在UCOSIII实时多任务操作系统中运行:
      把各个功能独立至一个个任务中,每个任务按重要性划分出优先级,采用时间片轮换调度的方式给任务分配合适的时间片来占用CPU,确保每个任务都能在较短的时间完成一个任务周期。
  2. 把所有任务分成三种类型,方便管理:
     (1)在特定时间环节才要执行的任务。整个娃娃机的功能实现可以根据不同的环节把它们划分成三步任务:1等待投币->2选择模式->3夹娃娃 ->回到1。这些任务按顺序运行,当判断到该结束当前任务时就挂起它,然后切换至下个任务,如此循环往复,便实现了整个娃娃机的功能。
     (2)全程都要执行的任务。例如读取PS2手柄数据,接收蓝牙收到来自手机的信息等。把它们创建成一个个独立出来的任务,按照实际情况设定间隔多少时间运行一次,定时更新接收的数据信息。
     (3)不确定何时会发生的任务。比如说投币检测、暂停调试按键等这些外部事件。这些重要的意外发生任务就交由外部中断函数处理,把中断的优先级设置到最高,可以打断正常运行的程序,确保投币、调试等动作能快速准确地响应。

3.资源分配

  1. USART3串口连接HC-05模块(USART3_TX 接 PB10,USART3_RX接 PB11)接收APP上位机数据。
  2. 定时器TIM2用于夹娃娃倒计时。
  3. TIM3_CH1~CH2(PC6 ~7)输出PWM方波控制爪子前后、左右的电机。
  4. TIM4_CH1~CH2(PD 12-13))输出PWM方波,分别控制上下收发爪子的电机和爪子抓取的舵机。
  5. 按键WK_UP(PA0)占用IO总线0外部中断,用于待机唤醒。
  6. IO口PA2占用IO总线2外部中断,连接红外传感器,用于投币检测。
  7. 按键KEY0~KEY1(PE4、PE3)占用IO总线4、3外部中断,用于调试爪子上下位置故障。
  8. IO口PF6接霍尔传感器,占用IO总线EXTI9_5外部中断,用于检测爪子上下电机旋转的圈数。
  9. PAin(4)、PAin(5)连接两个霍尔传感器,用于爪子前后左右移动的限位检测。
  10. PB12~15接PS2接收器(分别对应DI、DO、CS、CLK),接收PS无线手柄的数据。

注: 写这部分的目的是记录下资源使用情况,这样出问题了方便检修。


三、总结

  最后,整个项目从外形框架的搭建到程序规范收尾,修修补补写了几千行代码,做做停停也用了大半年,整个过程下来还是有所感悟有所收获的:

  1. 一旦下定决心做一件事情,就一定要坚持到底,只要你努力去学习和付出,到最后肯定会成功的!
  2. 遇到问题卡住无法前行时,千万不要气馁,可以先冷静放松一下,过一段时间再去思考这个问题时,你会有不一样的思路的。要相信若遇到的问题和障碍上百,那解决克服它们的方法肯定上千。
      例如,我在想如何升降爪子的时候,就卡了很久,一开始想的是用舵机配合伸缩杆的方案的,但是舵机的扭矩不够大;于是只能用电机,电机方案则需要带有编码器来记录上下圈数的,由此去找了带编码器的电机,如步进电机等,但是找到的体积重量功率都太大了;于是最后找了全网体积最小的减速电机,扭矩功率都满足要求,但是它没有自带编码器,我就想,都到了这一步了,就自己设计一个编码器吧,然后一个基于霍尔传感器+磁铁的方案就产生了,但是做好之后又出现了新问题:当磁铁刚好停在传感器附近时,就会产生很多毛躁干扰信号,直接导致数据错误!濒临崩溃的时候我想到了解决方法:检测完后强制延时让电机转出这个干扰区再停下!哈哈,最后终于得出了一套稳定的方案了,感谢当时的坚持!
  3. 每一部分的程序都要先单独测试一遍先,切忌全部程序写好再测试!切忌全部程序写好再测试!切忌全部程序写好再测试!重要的事情说三遍,特别是程序量大的时候,这是血的教训!
      刚开始的时候我就异常自信,非常相信自己的逻辑思维能力,然后直接写了个几个模块集成到一起的程序,编译的时候也没问题,但是下载到板子上后程序跑飞了!我检查了好久,浪费了很多时间跟精力!最后才发现是定时器的一个参数配置错了!
      所以,我就记住了,以后每创建一个任务以实现某个功能前,都要先备份好,写个独立于其他模块的简单例程,看看这份新加上去的代码有没有Bug,能不能实现预期效果;因为如果全部程序写完的话出错是很难定位查Bug 的。
      有时候,按部就班是最有效率的。

你可能感兴趣的:(娃娃机,作品展示,程序人生,嵌入式,单片机,操作系统)