文章目录
基于涂鸦模组和ITOP4412开发板的宠物喂食器
在不知不觉中,身边已经充斥着各种智能设备,很多人都过上了智能生活,很多事几乎都不用亲力亲为,不仅人们的生活被智能设备占领,宠物市场也是如此,尤其是宠物智能喂食器已经成为家喻户晓的智能设备,如今也正是宠物智能喂食器飞速发展和技术更成熟的时候,宠物智能喂食器未来是我市场前景将不可估量。近来由于新冠疫情的影响,宠物被独自放置在家中,宠物的温饱成了一个大问题,为了不让铲屎官白天工作的时候担心宠物会饿肚子,宠物喂食器应运而生。
1、作品描述
宠物喂食器,基于涂鸦wifi模组和ITOP4412开发板,因为之前没有使用过单片机,本次采用的是在linux环境下进行开发,涂鸦VWXR2模组出厂已经烧录好固件,所以不需要开发,十分方便,该模组主要是进行数据转发,itop4412开发板主要是进行数据处理,和外设控制。
2、作品介绍
2.1 开发环境
2.1.1硬件设备
(1) 涂鸦VWXR2 WIFI通信模组
(2) 涂鸦12V电源板
(3) 涂鸦H桥电机驱动板
(4) ITOP4412开发板
(5) 385直流电机
2.2 主要实现的功能
2.1.1 通过涂鸦APP直接进行喂食;
2.1.2 定时喂食,当没有网络时,依旧可以根据设置的闹钟来自动喂食
2.1.3 小夜灯模式
2.1.4 语音唤醒
2.3 后续更新
3、开发流程
3.1 使用涂鸦IOT平台创建项目
3.1.1 进入涂鸦IOT平台创建产品
在涂鸦IOT平台找到 创建产品 -> 小家电 -> 宠物喂食器
3.1.2 给宠物喂食器添加功能点
3.1.3 选择设备面板
这里可以选择公版面板,也可以选择自定义面板,当现有的需求公版面板不满足时,就需要使用自定义面板了;
这里我选择公版面板
3.1.4 硬件开发下载SDK
后期根据我们下载的MCU SDK进行开发
3.2 熟悉涂鸦模组的通讯协议
首先下载完SDK以后,分析其源码,花了一些时间理清了大致的框架,用户主要做的是命令下发后,主控板接收到wifi模组转发的数据,经过SDK对数据的解析,然后根据对应的数据帧中的命令字
字段进入相应的功能处理函数,最后用户在功能函数中,对下发的数据进行处理,例如,当接收到客户端下发的快速喂食命令,便执行打开电机的操作。
3.3 将涂鸦模组的SDK移植到linux
这个SDK的移植相对简单,因为不涉及依赖库的问题,所以只需要使用交叉编译器进行编译然后使用nfs服务挂载到开发板即可,这里我使用的交叉编译器是arm-linux-4.4.3。
3.3.1 首先完善串口的读写操作
在linux中对于串口的读写,并不复杂,主要步骤 1、打开串口 2、对串口参数进行配置 3、对串口进行读写;
3.3.1.1对串口的读取操作
int uart_receive(void)
{
int ret ;
unsigned char c;
do{
ret = read(fd_wifi_uart, &c, 1);
}while(ret == -1 && errno == EINTR);
if (-1 == ret)
{
perror("read");
// return -1;
}
if (1 == ret)
uart_receive_input(c);
// printf("recv:0x%x\n",c);
return ret;
}
3.3.1.2 将数据通过串口发送
static void wifi_uart_write_data(unsigned char *in, unsigned short len)
{
if((NULL == in) || (0 == len)) {
return;
}
/* 串口发送数据*/
if (-1 == write(fd_wifi_uart, in, len))
{
perror("uart write");
return ;
}
}
3.3.2 处理APP下发的喂食指令
因为喂食操作需要对电机进行操作,需要将电机的驱动编译到内核中去,但是电机驱动占用了我的摄像头驱动,所以只能先将摄像头驱动给砍掉,导致我的远程监控功能暂时搁浅,后期想方法解决。
对于喂食操作也相对简单,例如快速喂食,当APP下发指令后,开发板收到指令进入相应的功能函数,只需要打开电机或者关闭电机。
3.3.2.1 快速喂食
static unsigned char dp_download_quick_feed_handle(const unsigned char value[], unsigned short length)
{
//示例:当前DP类型为BOOL
unsigned char ret;
//0:关/1:开
unsigned char quick_feed;
quick_feed = mcu_get_dp_download_bool(value,length);
if(quick_feed == 0) {
//开关关
}else {
// 打开电机开关
//开关开
printf("quick feed\n");
motor_on('R