0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ART PI重力感应无线智能小车

RTThread物联网操作系统 来源:RTThread物联网操作系统 作者:RTThread物联网操作 2021-01-20 09:29 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

雷德斯 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引脚封装

05bc42ba-59b9-11eb-8b86-12bb97331649.png

L298N是专用驱动集成电路,属于H桥集成电路,其持续输出电流为2A,最高电流4A,最高工作电压46V,可以驱动感性负载,如大功率直流电机,步进电机,电磁阀等,输入端可以与单片机直接相连接,方便单片机控制。当驱动直流电机时,可以直接控制步进电机,并可以实现电机正转与反转,实现此功能只需改变输入端的逻辑电平。L298N芯片可以驱动两个二相电机,也可以驱动一个四相电机,输出电压最高可达46V,可以直接通过电源来调节输出电压;可以直接用单片机的IO口提供控制信号。 内部结构框图:有兴趣的可以分析分析里面的控制逻辑,也比较简单,不多说了。

05deb890-59b9-11eb-8b86-12bb97331649.png

引脚定义:

061b0552-59b9-11eb-8b86-12bb97331649.png

064224ca-59b9-11eb-8b86-12bb97331649.png

069843dc-59b9-11eb-8b86-12bb97331649.png

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的真值表,拿其中一组作为演示,另一组一样的逻辑,手册中给出的是:

06b53500-59b9-11eb-8b86-12bb97331649.png

从手册给出的说明来看,欲要电机驱动输出,需要以下步骤来实现:1、使能EnA,EnB引脚,可以直接接到单片机系统电源或者由单片机IO输出高电平来控制; 2、Input1、Input2必须是相反的电平,即以下逻辑,至于前进还是后退,跟电机的接线有关系哈,大家可以自己测试调整。

输入信号 电机运行方式
使能端A/B 输入引脚1(5)/3(10) 输入引脚2(7)/4(12)
1 1 0 前进
1 0 1 后退
1 1 1 紧急停车
1 0 0 紧急停车
0 X X 停止

二、电路设计

070553f0-59b9-11eb-8b86-12bb97331649.png

前半部分是光耦隔离芯片,用来抗干扰以及保护单片机IO,P8、P9是使能端,如果不接单片机IO控制,直接短路帽短接即可,P7是电机控制输出端口。 与ART-PI的接口采用的是4个普通IO,伙伴们若是买的L298N模块,IO可以自选。

075b3efa-59b9-11eb-8b86-12bb97331649.png

电机:关于电机的介绍,大家可以移步到一位大佬的公众号,介绍非常详细啦,公众号:嵌入式从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进去,来看看初步效果:

0889c7b0-59b9-11eb-8b86-12bb97331649.png

08bfcfa4-59b9-11eb-8b86-12bb97331649.png

08fa909e-59b9-11eb-8b86-12bb97331649.png

092e72a6-59b9-11eb-8b86-12bb97331649.png

控制台输入wifi help,可以看到关于wifi的一些命令

输入wifi scan,扫描附近区域wifi,接下来输入wifi join SSID password,由于小飞哥的板子之前连接过别的wifi,一直在搜索,但并没有找到,输入新的wifi名称。

096b668e-59b9-11eb-8b86-12bb97331649.png

09c27898-59b9-11eb-8b86-12bb97331649.png

Wifi连接成功,现在重启设备,看看自动连接效果,可以发现,是逐个进行扫描的,成功找到当前wifi并连接成功,开机自动连接效果测试OK。

0a08d626-59b9-11eb-8b86-12bb97331649.png

接下来是连接OneNet啦,熟悉小飞哥的应该知道怎么做啦,第一次看小飞哥文章的麻烦移步前面的文章看看呀,不懂的,加群一起交流,群里有很多志同道合的好伙伴。 下面在我们的工程里面添加L298N控制逻辑代码,主要是对IO的控制,也是比较简单的,根据上面介绍的控制逻辑,让相应的IO输出高低电平就可以啦,方向控制函数可以合成一个,小飞哥为了让大家看的更简单明了,分开写了,要注意的是,方向控制跟你的L29N输出接到电机的顺序有关,如果方向反了,修改代码或者接线顺序反一下就可以实现同样的功能啦。有需要的伙伴,源码都是开源的,可以跟小飞哥说一下,后续会上传到github,大家可以自行下载。

IO初始化配置函数:

#include

#include

#include"drv_common.h"

#include"motor_drv.h"

#defineMotorCtrl1Pin GET_PIN(B, 0)

#defineMotorCtrl2Pin GET_PIN(B, 2)

#defineMotorCtrl3Pin GET_PIN(B, 1)

#defineMotorCtrl4Pin GET_PIN(A, 11)

voidMotorCtrlPinInit()

{

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);

}

前进:

voidMotorCtrlForward()

{

rt_pin_write(MotorCtrl1Pin, PIN_HIGH);

rt_pin_write(MotorCtrl2Pin, PIN_LOW);

rt_pin_write(MotorCtrl3Pin, PIN_HIGH);

rt_pin_write(MotorCtrl4Pin, PIN_LOW);

}

后退:

voidMotorCtrlBack()

{

rt_pin_write(MotorCtrl1Pin, PIN_LOW);

rt_pin_write(MotorCtrl2Pin, PIN_HIGH);

rt_pin_write(MotorCtrl3Pin, PIN_LOW);

rt_pin_write(MotorCtrl4Pin, PIN_HIGH);

}

右转:

voidMotorCtrlRight()

{

rt_pin_write(MotorCtrl1Pin, PIN_LOW);

rt_pin_write(MotorCtrl2Pin, PIN_HIGH);

rt_pin_write(MotorCtrl3Pin, PIN_HIGH);

rt_pin_write(MotorCtrl4Pin, PIN_LOW);

}

左转:

voidMotorCtrlLeft()

{

rt_pin_write(MotorCtrl1Pin, PIN_HIGH);

rt_pin_write(MotorCtrl2Pin, PIN_LOW);

rt_pin_write(MotorCtrl3Pin, PIN_LOW);

rt_pin_write(MotorCtrl4Pin, PIN_HIGH);

}

停止:

voidMotorCtrlStop()

{

/* 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服务器了。

0a27bb0e-59b9-11eb-8b86-12bb97331649.png

设备已在线

0c5b0610-59b9-11eb-8b86-12bb97331649.png

然后在Onenet端做了一个无比丑陋的控制器。拿一个举例子,电机ON是发送控制命令,OFF发送停止命令,相信到这里,之前做过Onenet控制控制板载LED的童鞋已经知道怎么做啦,没错,LED控制函数中增加下车接收命令控制即可,完整函数内容,占篇幅,可以直接跳过,主要是给大家拷贝方便点。

0cb34c8a-59b9-11eb-8b86-12bb97331649.png

/* onenetmqttcommand response callback function */

staticvoidonenet_cmd_rsp_cb(uint8_t*recv_data, size_trecv_size, uint8_t**resp_data, size_t*resp_size)

{

charres_buf[] = { "cmdis received! "};

LOG_D("recvdata is %.*s ", 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 on ");

}

elseif(!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 off ");

}

else

{

//rt_kprintf("ledcmdERROR! ");

}

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 on ");

}

elseif(!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 off ");

}

else

{

//rt_kprintf("ledcmdERROR! ");

}

if(!strncmp((char*)recv_data, "forward", 7))//

{

MotorCtrlForward();

rt_kprintf("forward is on ");

}

elseif(!strncmp((char*)recv_data, "back", 4))//

{

MotorCtrlBack();

}

elseif(!strncmp((char*)recv_data, "turnright", 9))//

{

MotorCtrlRight();

}

elseif(!strncmp((char*)recv_data, "turnleft", 8))//

{

MotorCtrlLeft();

}

elseif(!strncmp((char*)recv_data, "stop", 4)){

MotorCtrlStop();

}

/* user have to mallocmemory 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);

}

实现效果:

0d10a3a8-59b9-11eb-8b86-12bb97331649.png

原文标题:ART-PI-重力感应无线智能小车第二弹-----OneNet+板载wifi控制电机转动

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 集成电路
    +关注

    关注

    5464

    文章

    12688

    浏览量

    375744
  • 封装
    +关注

    关注

    128

    文章

    9333

    浏览量

    149052
  • 智能车
    +关注

    关注

    21

    文章

    412

    浏览量

    78583

原文标题:ART-PI-重力感应无线智能小车第二弹-----OneNet+板载wifi控制电机转动

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    轨道小车无线控制系统设计与实现

    断裂、信号衰减,故障率高达35%,严重制约柔性生产与智能化升级。 一、无线技术优势 1. 工业级抗干扰与超远传输 双频智能切换:2.4GHz/5GHz自适应频段,结合MIMO多天线技术,穿透金属隔挡能力提升3倍,传输距离最远3公
    的头像 发表于 01-26 10:11 353次阅读
    轨道<b class='flag-5'>小车</b><b class='flag-5'>无线</b>控制系统设计与实现

    ART-Pi中启用外部flash是在哪里配置了qspi的引脚呢?

    。由于我是按照以芯片建立工程,并没有使用ART-PI的工程。 2、我目前了解到在ART-PI工程中会有这个下载算法。 在这个链接文件要配置地址 3、于是我有个好奇的点是在工程中没看到有QSPI的配置
    发表于 10-10 06:09

    ART-PI使用新的env工具已经无法编译SDK仓库里的示例工程了,怎么解决?

    ART-PI 使用新的env工具已经无法编译SDK仓库里的示例工程了 希望还是能维护一下,新的env已经无法构建出工程进行编译了 使用scons —target=mdk5 直接报错了 希望有方
    发表于 10-09 06:47

    一体化ROS智能驾驶小车及实训教学平台解决方案

    一体化ROS智能驾驶小车及实训教学平台解决方案
    的头像 发表于 09-26 17:34 1875次阅读
    一体化ROS<b class='flag-5'>智能</b>驾驶<b class='flag-5'>小车</b>及实训教学平台解决方案

    art_pi_lrs007_lora_gw_driver示例工程无法创建怎么解决?

    art_pi_lrs007_lora_gw_driver示例工程无法创建 1.log
    发表于 09-25 06:57

    按照官方文档在ART-PI上开启PWM,但是串口输出找不到设备,怎么解决?

    , tim_config.h里也仿照TIM13加入了有关TIM3的代码, stm32h7xx_hal_msp.c里也打开了TIM3的使能, 最后按照官方文档上的代码,拷贝到ART-PI的模板例程里。但是不能发现TIM3的设备
    发表于 09-17 06:27

    如何在 ART-Pi 平台使用 openocd 直接烧录到外部 spi flash?

    ART-Pi 内置的 128Kb flash太小了,我现在在 Linux openocd 烧录程序,请问有没有人成功使用 openocd 可以直接烧写到外部 Quad spi flash 的?
    发表于 09-15 07:32

    ART-PI2串口DMA累计接收超过buf设置的大小后就不能再接收了为什么?

    使用ART-PI2板子串口1DMA接收数据,buf的大小为64,只能累计接收64字节,如果扩大到256字节,也只能累计接受到256字节。数据及时读取,缓冲区应该是没有溢出的,应用程序移到F4的板子是正常,求解
    发表于 09-12 07:56

    ART-PI2的CherryUSB cdc_acm例程 在复位后需要好久才能出来COM口?

    第一次使用ART-PI2上的USB-HS接口。在ART-PI2上烧录编译的art_pi2_cherryusb_usbdev_cdc_acm工程,程序能够正常运行: 但是在复位后,需要等待2分钟
    发表于 09-12 07:01

    全智芯433MHz无线传输人体感应门铃方案概述

    全智芯433MHz无线传输人体感应门铃方案采用433.92MHz无线射频技术与人体红外感应技术结合实现一种无线传输
    的头像 发表于 08-27 16:14 1368次阅读

    无线充电利用了电磁感应原理吗?

    无线充电基于电磁感应,通过高频电流产生磁场,实现无接触能量传输,但需紧密贴合以保证效率。
    的头像 发表于 08-26 08:33 1732次阅读
    <b class='flag-5'>无线</b>充电利用了电磁<b class='flag-5'>感应</b>原理吗?

    智能小车设计源码和图纸资料

    智能小车设计源码和图纸
    发表于 08-25 15:38 1次下载

    无线充电器隔空充电是电磁感应原理吗?

    无线充电与隔空充电技术差异在于:前者基于电磁感应,依赖近距离磁场;后者采用无线射频技术,实现远距离传输,如“能量Wi-Fi”。
    的头像 发表于 08-25 11:28 1701次阅读
    <b class='flag-5'>无线</b>充电器隔空充电是电磁<b class='flag-5'>感应</b>原理吗?

    ART-PI H750-USB-MSC设备描述符异常的原因?怎么解决?

    主控:STM32H750XBH6- ART-Pi 开发环境:CubeMX+MDK V5.27问题背景:当前已经调试通SD卡+Fatfs文件系统,(通过主控来模拟读卡器)使用单根USB-C线缆连接至
    发表于 06-19 06:52

    感应电机智能调速

    原理,感应电机的MATLAB®/Simulink 建模和仿真,智能控制 MATLAB®/Simulink仿真基础,感应电机的专家系统控制,混合模糊/PI两段控制方法,基于人工神经网络(
    发表于 05-28 15:53