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

雷德斯 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必须是相反的电平,即以下逻辑,至于前进还是后退,跟电机的接线有关系哈,大家可以自己测试调整。

输入信号

电机运行方式

使能端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

停止

二、电路设计

前半部分是光耦隔离芯片,用来抗干扰以及保护单片机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 <rtthread.h>

#include <rtdevice.h>

#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 %.*s\n", 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\n");

}

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 off\n");

}

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

}

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 off\n");

}

else

{

//rt_kprintf("ledcmd ERROR!\n");

}

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

{

MotorCtrlForward();

rt_kprintf("forward is on\n");

}

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

}

实现效果:

视频演示效果:

见公众号

如果你觉得对自己有帮助的话,给个赞,点个关注,点个在看,感谢前进的道路上有你的陪伴!

伙伴们可以关注ART-PI官方指导网站:

https://github.com/ART-Pi/website/tree/main/docs/tutorial

欢迎大家关注 Embeded小飞哥  ,我是小飞哥,让我快点遇到优秀的你,然后一起变得更加优秀,加油!!!

小飞哥微信号:w974762670,加好友进群一起交流呀!

公众号:

ART-PI调试记录----重力感应无线智能小车第二弹之OneNet+板载wifi控制电机转动相关推荐

  1. ART-PI调试记录---重力感应无线智能小车第一弹之扩展板设计

    ART-PI重力感应无线智能小车第一弹-----ART-PI扩展板设计 雷德斯 and枕头们,小飞哥又又叒好久没更新文章啦,最近实在是太忙啦,大家久等啦,这次是系列文章,一步步教你如何在ART-PI上 ...

  2. 最简单DIY基于ESP8266的智能彩灯⑦(APP通过彩虹调色板和WIFI控制WS2812彩灯)

    ESP8266和ESP32智能彩灯开发系列文章目录 第一篇:最简单DIY基于ESP8266的智能彩灯①(在网页用按钮点亮普通RGB灯) 第二篇:最简单DIY基于ESP8266的智能彩灯②(在网页用按键 ...

  3. WIFI小车APP远程控制,无线智能小车之ESP8266例程

    WIFI小车无线远程控制,智能小车之ESP8266例程 第一.原理讲解 第二.小车改装 第三. ESP8266 例程代码 第四.WIFI配网 程序测试 第五.安卓app制作 第一.原理讲解 原理简述: ...

  4. 香蕉派 Banana pi BPI-M1+ 双核开源单板计算机. 板载WIFI

     Banana PI BPI-M1+是一款高性能双核开源硬件单板计算机,Banana PI BPI-M1+是一款比树莓派更强悍的双核Android4.4与Linux产品. Banana PI BP ...

  5. android继电器指令,手机 蓝牙 控制 继电器 无线门锁 物联网 安卓源码 安卓开发 Android WIFI控制 详细注释测试稳定无bug...

    一.功能: 1.Android  WIFI连接与断开,保存连接IP及端口. 2.WIFI控制3个继电器 3.16进制发送指令,可以单条和多条发送,用逗号隔开. 4.16进制接收 如需特别功能可以找我定 ...

  6. 【毕业设计之树莓派系列】基于树莓派的智能小车设计

    基于树莓派的智能小车设计 摘要 随着人们对智能化生活的需求不断增长,智能小车的发展逐渐受到关注.然而,现有的智能小车硬件和软件设计有一定的局限性,需要进一步改进和完善.本文旨在基于树莓派PICO开发板 ...

  7. 无线智能路由器家长控制宽带

    家长对控制孩子的上网问题颇为头痛,其实只要方法用对,控制孩子上网是完全没有问题的.我总结了三条供家长们分享. 6-16岁的孩子正是学习知识,塑造性格最佳时期,辨别事物也最为薄弱.要想控制孩子上网,首先 ...

  8. AML8726调试记录

    一:源代码下载: 1:Installing Repo # mkdir ~/bin # PATH=~/bin:$PATH # curl https://dl-ssl.google.com/dl/goog ...

  9. c语言 数组放空自己,基于Arduino和Labview的无线遥控智能小车的设计与实现.docx

    PAGE V MACROBUTTON MTEditEquationSection2 SEQ MTEqn \r \h SEQ MTSec \r 1 \h SEQ MTChap \r 1 \h 中文摘要 ...

最新文章

  1. HOWTO: InstallShield中通过修改注册表关闭Vista/Windows 7的UAC
  2. select2 手动输入匹配下拉框内容可多选
  3. 基于Tomcat5.0和Axis2开发Web Service应用实例
  4. 下面不是python合法标识符_哪个不是python合法标识符
  5. android 使用photoshop 裁剪图片
  6. wpf 可以取消的单选checkbox
  7. 第五节:框架前期准备篇之锁机制处理并发
  8. 模型训练太慢?显存不够用?这个算法让你的GPU老树开新花
  9. 烂泥:Tomcat免安装版与JRE免安装版集成
  10. 卸载列表信息——Uninstall注册表
  11. 从单个静止图像进行 3d 深度重建(论文2007)
  12. 看视频用这个太爽了!自动实时翻译英语视频
  13. Mac批量恢复废纸篓文件
  14. 阿里云短信服务-个人账户测试短信服务
  15. UVALive - 5713 Qin Shi Huang's National Road System
  16. maya腿的蒙皮旋转枢轴_完美动力小课堂:怎么快速修改物体枢轴?这个方法值得收藏!...
  17. HTTP报文结构详细讲解(HTTP请求报文和响应报文格式)
  18. Firefox - 附加软件 - Firesizer
  19. python绘制地图的第三方库_10个用于GIS和地图绘制的Python库
  20. c语言的调试是对源文件进行,理解C语言——从小菜到大神的晋级之路(3)——C源程序的基本结构与调试方法...

热门文章

  1. Linux软件安装失败问题,source.list用了bionic,实际上我的Linux是focal版本
  2. python 筛选重复数据和不重复数据_[Python] Pandas 对数据进行查找、替换、筛选、排序、重复值和缺失值处理...
  3. C++ 中的隐含 *this
  4. 我de虚拟经济学系列---第二章 经济繁荣不建桥
  5. B站 bilibili 视频、分区、up主数据合集
  6. C++ 封装 信息隐藏
  7. 微信开放平台应用绑定
  8. 网站三大标签是什么? 网页三大标签在优化中分别有什么作用?
  9. 使用libjpeg处理图像(libjpeg的使用压缩与解压缩jpg格式)
  10. Laplacian eigenmap 拉普拉斯特征映射