开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情
一、风力摆
主控用的是msp430,传感器MPU6050,驱动mos管,空心杯电机,外加一个oled显示屏显示数据调试
1.1、MPU6050,DMP读取欧拉角
- 这个过程中遇到很多问题,首先移植DMP固件库
需要以下6个文件
编辑
修改inv_mpu.c文件里的一些3个函数,第一个是iic写,第二个iic连续读,第三个延时
编辑
- 然后就是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个函数,发现错误完美解决了 - 解决上面的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
睡觉模式:固定亮度3%,适合晚上睡觉
固定调节亮度:20%,40%。。。。。
在固定调节亮度的基础上可以微调亮度,1%的亮度加减