完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
雷德斯 and枕头们,好久不见,大家是不是更优秀了呢,哈哈,工作太忙啦,夜里肝一篇,大家久等啦,话不多说,来,干货!
ART-PI-重力感应无线智能小车第二弹-----OneNet+板载wifi控制电机转动 此次分享主要用到的软硬件资源: 软件(RT-Studio平台): 1、OneNet软件包; 2、OneNet服务器; 3、pahomqtt软件包 4、webclient软件包 硬件: 1、板载wifi模块 2、ART-PI扩展板(自设计,开源) 3、L298N电机驱动 4、4个普通IO 实现目标: OneNet服务器下发控制电机正转、反转、停止。 一、L298N简介 此次使用的是左边封装的15引脚封装 L298N是专用驱动集成电路,属于H桥集成电路,其持续输出电流为2A,最高电流4A,最高工作电压46V,可以驱动感性负载,如大功率直流电机,步进电机,电磁阀等,输入端可以与单片机直接相连接,方便单片机控制。当驱动直流电机时,可以直接控制步进电机,并可以实现电机正转与反转,实现此功能只需改变输入端的逻辑电平。L298N芯片可以驱动两个二相电机,也可以驱动一个四相电机,输出电压最高可达46V,可以直接通过电源来调节输出电压;可以直接用单片机的IO口提供控制信号。 内部结构框图: 有兴趣的可以分析分析里面的控制逻辑,也比较简单,不多说了。 引脚定义: L298N可接受标准TTL逻辑电平信号VSS,VSS可接4.5~7V电压。4脚VS接电源电压,VS电压范围为VIH+2.5~46V。输出电流可达2A,可驱动电感性负载。1脚和15脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。L298可驱动2个电动机,OUT1,OUT2和OUT3,OUT4之间可分别接电动机。5,7,10,12脚接输入控制电平,控制电机的正反转。EnA,EnB接控制使能端,控制电机的停转。此次设计我们驱动两个直流电机,OUT1和OUT2控制1个,OUT3和OUT4控制1个。 以上介绍我们知道,通过5,7,10,12引脚可以控制电机的正转,反转,停止,那么怎么实现呢,下面是控制IO的真值表,拿其中一组作为演示,另一组一样的逻辑,手册中给出的是: 从手册给出的说明来看,欲要电机驱动输出,需要以下步骤来实现: 1、使能EnA,EnB引脚,可以直接接到单片机系统电源或者由单片机IO输出高电平来控制; 2、Input1、Input2必须是相反的电平,即以下逻辑,至于前进还是后退,跟电机的接线有关系哈,大家可以自己测试调整。
前半部分是光耦隔离芯片,用来抗干扰以及保护单片机IO,P8、P9是使能端,如果不接单片机IO控制,直接短路帽短接即可,P7是电机控制输出端口。 与ART-PI的接口采用的是4个普通IO,伙伴们若是买的L298N模块,IO可以自选。 电机:关于电机的介绍,大家可以移步到一位大佬的公众号,介绍非常详细啦,公众号: 嵌入式从0到1,大家可以多多关注,非常nice的一位号主。 组装好的小车,用了2个轮子加一个万向轮,刚好用一个L298N来驱动。 三、代码控制实现 此前我们一直用的是ESP8266,现在我们改为使用板载的wifi模组,充分利用板载资源,没有ART-PI板子的童鞋不要担心,RT-Studio支持很多芯片的,大家可以使用手里现有的板子跟着做,一样的,wifi部分可以使用小飞哥上个教程,使用esp8266或者其他方式,逻辑是一样的啦。 1、新建工程,我们选择如下的参数,基于ART-PI开发板,当然没有板子的伙伴可以选择基于芯片,然后选择示例工程,wifi工程,RT-Thread团队已经把AP6212部分做成库封装在RT-Studio平台,建立好工程之后,setting里面可以看到关于AP6212的组件已经勾选,main函数开始增加了2个函数调用,这两个函数是用来上电自动初始化wifi部分,如果已经连接了wifi,下次上电就会自动搜索完成连接。编译完成之后,download进去,来看看初步效果: 控制台输入wifi help,可以看到关于wifi的一些命令 输入wifi scan,扫描附近区域wifi,接下来输入wifi join SSID password,由于小飞哥的板子之前连接过别的wifi,一直在搜索,但并没有找到,输入新的wifi名称, Wifi连接成功,现在重启设备,看看自动连接效果,可以发现,是逐个进行扫描的,成功找到当前wifi并连接成功,开机自动连接效果测试OK。 接下来是连接OneNet啦,熟悉小飞哥的应该知道怎么做啦,第一次看小飞哥文章的麻烦移步前面的文章看看呀,不懂的,加群一起交流,群里有很多志同道合的好伙伴。 下面在我们的工程里面添加L298N控制逻辑代码,主要是对IO的控制,也是比较简单的,根据上面介绍的控制逻辑,让相应的IO输出高低电平就可以啦,方向控制函数可以合成一个,小飞哥为了让大家看的更简单明了,分开写了,要注意的是,方向控制跟你的L29N输出接到电机的顺序有关,如果方向反了,修改代码或者接线顺序反一下就可以实现同样的功能啦。有需要的伙伴,源码都是开源的,可以跟小飞哥说一下,后续会上传到github,大家可以自行下载。 IO初始化配置函数: #include #include #include "drv_common.h" #include "motor_drv.h" #define MotorCtrl1Pin GET_PIN(B, 0) #define MotorCtrl2Pin GET_PIN(B, 2) #define MotorCtrl3Pin GET_PIN(B, 1) #define MotorCtrl4Pin GET_PIN(A, 11) void MotorCtrlPinInit() { rt_pin_mode(MotorCtrl1Pin, PIN_MODE_OUTPUT); rt_pin_mode(MotorCtrl2Pin, PIN_MODE_OUTPUT); rt_pin_mode(MotorCtrl3Pin, PIN_MODE_OUTPUT); rt_pin_mode(MotorCtrl4Pin, PIN_MODE_OUTPUT); rt_pin_write(MotorCtrl1Pin, PIN_LOW); rt_pin_write(MotorCtrl2Pin, PIN_LOW); rt_pin_write(MotorCtrl3Pin, PIN_LOW); rt_pin_write(MotorCtrl4Pin, PIN_LOW); } 前进: void MotorCtrlForward() { rt_pin_write(MotorCtrl1Pin, PIN_HIGH); rt_pin_write(MotorCtrl2Pin, PIN_LOW); rt_pin_write(MotorCtrl3Pin, PIN_HIGH); rt_pin_write(MotorCtrl4Pin, PIN_LOW); } 后退: void MotorCtrlBack() { rt_pin_write(MotorCtrl1Pin, PIN_LOW); rt_pin_write(MotorCtrl2Pin, PIN_HIGH); rt_pin_write(MotorCtrl3Pin, PIN_LOW); rt_pin_write(MotorCtrl4Pin, PIN_HIGH); } 右转: void MotorCtrlRight() { rt_pin_write(MotorCtrl1Pin, PIN_LOW); rt_pin_write(MotorCtrl2Pin, PIN_HIGH); rt_pin_write(MotorCtrl3Pin, PIN_HIGH); rt_pin_write(MotorCtrl4Pin, PIN_LOW); } 左转: void MotorCtrlLeft() { rt_pin_write(MotorCtrl1Pin, PIN_HIGH); rt_pin_write(MotorCtrl2Pin, PIN_LOW); rt_pin_write(MotorCtrl3Pin, PIN_LOW); rt_pin_write(MotorCtrl4Pin, PIN_HIGH); } 停止: void MotorCtrlStop() { /* rt_pin_mode(MotorCtrl1Pin, PIN_MODE_OUTPUT); rt_pin_mode(MotorCtrl2Pin, PIN_MODE_OUTPUT); rt_pin_mode(MotorCtrl3Pin, PIN_MODE_OUTPUT); rt_pin_mode(MotorCtrl4Pin, PIN_MODE_OUTPUT);*/ rt_pin_write(MotorCtrl1Pin, PIN_LOW); rt_pin_write(MotorCtrl2Pin, PIN_LOW); rt_pin_write(MotorCtrl3Pin, PIN_LOW); rt_pin_write(MotorCtrl4Pin, PIN_LOW); } 接下来就是OneNet下发指令进行控制啦,这也是为后面的重力感应遥控做铺垫,小飞哥在之前代码基础上做了一些修改,不需要再一条条发命令接入Onenet啦,上电就可以自动连接wifi,接入Onenet服务器啦,省了不少麻烦,哈哈,无需输入一条命令,就可以连接到Onenet服务器了。 设备已在线 然后在Onenet端做了一个无比丑陋的控制器。。。键值拿一个举例子,电机ON是发送控制命令,OFF发送停止命令,相信到这里,之前做过Onenet控制控制板载LED的童鞋已经知道怎么做啦,没错,LED控制函数中增加下车接收命令控制即可,完整函数内容,占篇幅,可以直接跳过,主要是给大家拷贝方便点。 /* onenet mqtt command response callback function */ static void onenet_cmd_rsp_cb(uint8_t *recv_data, size_t recv_size, uint8_t **resp_data, size_t *resp_size) { char res_buf[] = { "cmd is received!n" }; LOG_D("recv data is %.*sn", recv_size, recv_data); if(!strncmp((char*)recv_data, "led0 on", 7)) //(strstr((char*)recv_data, "led0 on")) { rt_pin_write(LED_PIN, 0); rt_snprintf(res_buf, sizeof(res_buf), "led0 is on"); rt_kprintf("led0 is onn"); } else if(!strncmp((char*)recv_data, "led0 off", 8))//(strstr((char*)recv_data, "led0 off")) { rt_pin_write(LED_PIN, 1); rt_snprintf(res_buf, sizeof(res_buf), "led0 is off"); rt_kprintf("led0 is offn"); } else { //rt_kprintf("ledcmd ERROR!n"); } if(!strncmp((char*)recv_data, "led1 on", 7))//(strstr((char*)recv_data, "led1 on")) { //rt_pin_write(LED1_PIN, 0); rt_snprintf(res_buf, sizeof(res_buf), "led1 is on"); rt_kprintf("led1 is onn"); } else if(!strncmp((char*)recv_data, "led1 off", 8))//(strstr((char*)recv_data, "led1 off")) { //rt_pin_write(LED1_PIN, 1); rt_snprintf(res_buf, sizeof(res_buf), "led1 is off"); rt_kprintf("led1 is offn"); } else { //rt_kprintf("ledcmd ERROR!n"); } if(!strncmp((char*)recv_data, "forward", 7))// { MotorCtrlForward(); rt_kprintf("forward is onn"); } else if(!strncmp((char*)recv_data, "back", 4))// { MotorCtrlBack(); } else if(!strncmp((char*)recv_data, "turnright", 9))// { MotorCtrlRight(); } else if(!strncmp((char*)recv_data, "turnleft", 8))// { MotorCtrlLeft(); } else if(!strncmp((char*)recv_data, "stop", 4)){ MotorCtrlStop(); } /* user have to malloc memory for response data */ *resp_data = (uint8_t *) ONENET_MALLOC(strlen(res_buf)); strncpy((char *)*resp_data, res_buf, strlen(res_buf)); *resp_size = strlen(res_buf); } 实现效果: |
|||
|
|||
只有小组成员才能发言,加入小组>>
2441 浏览 0 评论
9126 浏览 4 评论
36804 浏览 19 评论
5031 浏览 0 评论
24788 浏览 34 评论
1543浏览 2评论
1762浏览 1评论
2210浏览 1评论
1568浏览 0评论
541浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 04:42 , Processed in 1.348803 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号