电赛

279 阅读4分钟

​​​​​开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情

一、风力摆

主控用的是msp430,传感器MPU6050,驱动mos管,空心杯电机,外加一个oled显示屏显示数据调试

1.1、MPU6050,DMP读取欧拉角

  1. 这个过程中遇到很多问题,首先移植DMP固件库
    需要以下6个文件
    ​编辑
    修改inv_mpu.c文件里的一些3个函数,第一个是iic写,第二个iic连续读,第三个延时
    ​编辑
  2. 然后就是6050初始化和DMP初始化
    我移植完后发现DMP初始化出错了,然后就一步一步的调试,先是发现第四步,加载dmp固件dmp_load_motion_driver_firmware()函数出了问题,最终发现是memcmp(firmware+ii, cur, this_write) 这步过不去,当我把前面的LOAD_CHUNK (16) 16改为1 后发现通过了,就觉得是我的iic读函数出了问题,但我是完全移植的stm32的程序,怎么会出错呢?然后我就跳过了这步的错误参数改为1,继续往后调试(最终我的决定是错误的,问题就出在这里的iic读,这里浪费了很多时间)
    最终发现是iic读里面的发送应答出了问题,我把发送ack和nack换成了2个函数,发现错误完美解决了
  3. 解决上面的iic读后,后面的所有问题就都解决了,欧拉角也读了出来

1.2、硬件部分

因为材料比较短缺加上线太硬杆还是拿筷子做的,做出来后平衡性不是太好,想尽各种办法使他达到平衡,下面是最终的效果图

二、追小球的小车

使用openMV寻找最大色块,使用pid对色块的xy轴坐标运算,然后利用串口输出到MSP430,最终MSP430输出PWM控制小车动作,实现追小球

2.1、openMV部分

  • 配置感光元件sensor
  • 初始化串口Uart,pid参数,颜色阈值
  • 编写函数找最大色块
  • 主函数,获取一张图,找最大色块,找到pid计算,没有找到返回-404
  • 串口发送xy轴通过pid计算出来的值

2.2、MSP430部分

  • 主函数,初始化openMV和小车用到的PWM,读取openMV数据,判断是否发现小球,未发现原地转圈,发现控制小车的速度和方向追小球

  • openMV部分,串口接收openMV发送过来的数据,一帧数据是11个字节,因为发送过程中可能会丢包,所以接收2帧数据做一次处理

  • 使用联合体获取数据处理

    typedef union{ //联合体,供数据处理,4个char合并为1个long或float long word32; float byte32_arry; char data[4]; }Openmv_word_bytes;

三、照度稳定可调LED台灯

使用2块MSP430作为主控,其他部分我们采用手机APP控制台灯的亮灭调光,因为我主要负责软件,所以下面只说一下软件实现的思路。

整体效果图

3.1、数字显示照度表

主控为MSP430,使用一个光敏电阻,读取其的AD值,经过均值滤波等一系列处理,最后通过串口屏显示出来。

使用430读取AD和一系列滤波就不说了

3.2、台灯整体

分为3个模式,手动调光,自动调光,手机APP调光

  • 主函数main

通过按键改变模式

手动调节:通过改变电位器的AD值,从而改变PWM输出,最终改变台灯的亮度,同时亮度按百分比显示在OLED屏上

自动调节:通过4个光敏电阻,改变PWM,改变亮度

手机APP:通过改变变量esp,改变PWM最终改变台灯亮度

  • 自动调节程序

通过4个光敏,改变一路pwm(本来打算控制4路PWM的,最终因为材料短缺,只能4AD控制1PWM)

大体思路:判断4个AD值的变化,最终判断是哪个方向照射过来的光线,最后使用最优的一个光敏来改变PWM控制亮度

3.3、手机APP

具体制作及代码可以参考我前面的博文安卓APP项目

睡觉模式:固定亮度3%,适合晚上睡觉

固定调节亮度:20%,40%。。。。。

在固定调节亮度的基础上可以微调亮度,1%的亮度加减