雷德斯 and枕頭們,好久不見(jiàn),大家是不是更優(yōu)秀了呢,哈哈,工作太忙啦,夜里肝一篇,大家久等啦,話不多說(shuō),來(lái),干貨!
ART-PI-重力感應(yīng)無(wú)線智能小車(chē)第二彈-----OneNet+板載wifi控制電機(jī)轉(zhuǎn)動(dòng)此次分享主要用到的軟硬件資源:軟件(RT-Studio平臺(tái)): 1、OneNet軟件包; 2、OneNet服務(wù)器; 3、pahomqtt軟件包 4、webclient軟件包 硬件: 1、板載wifi模塊 2、ART-PI擴(kuò)展板(自設(shè)計(jì),開(kāi)源) 3、L298N電機(jī)驅(qū)動(dòng) 4、4個(gè)普通IO 實(shí)現(xiàn)目標(biāo):OneNet服務(wù)器下發(fā)控制電機(jī)正轉(zhuǎn)、反轉(zhuǎn)、停止。
一、L298N簡(jiǎn)介
此次使用的是左邊封裝的15引腳封裝

L298N是專(zhuān)用驅(qū)動(dòng)集成電路,屬于H橋集成電路,其持續(xù)輸出電流為2A,最高電流4A,最高工作電壓46V,可以驅(qū)動(dòng)感性負(fù)載,如大功率直流電機(jī),步進(jìn)電機(jī),電磁閥等,輸入端可以與單片機(jī)直接相連接,方便單片機(jī)控制。當(dāng)驅(qū)動(dòng)直流電機(jī)時(shí),可以直接控制步進(jìn)電機(jī),并可以實(shí)現(xiàn)電機(jī)正轉(zhuǎn)與反轉(zhuǎn),實(shí)現(xiàn)此功能只需改變輸入端的邏輯電平。L298N芯片可以驅(qū)動(dòng)兩個(gè)二相電機(jī),也可以驅(qū)動(dòng)一個(gè)四相電機(jī),輸出電壓最高可達(dá)46V,可以直接通過(guò)電源來(lái)調(diào)節(jié)輸出電壓;可以直接用單片機(jī)的IO口提供控制信號(hào)。 內(nèi)部結(jié)構(gòu)框圖:有興趣的可以分析分析里面的控制邏輯,也比較簡(jiǎn)單,不多說(shuō)了。

引腳定義:



L298N可接受標(biāo)準(zhǔn)TTL邏輯電平信號(hào)VSS,VSS可接4.5~7V電壓。4腳VS接電源電壓,VS電壓范圍為VIH+2.5~46V。輸出電流可達(dá)2A,可驅(qū)動(dòng)電感性負(fù)載。1腳和15腳下管的發(fā)射極分別單獨(dú)引出以便接入電流采樣電阻,形成電流傳感信號(hào)。L298可驅(qū)動(dòng)2個(gè)電動(dòng)機(jī),OUT1,OUT2和OUT3,OUT4之間可分別接電動(dòng)機(jī)。5,7,10,12腳接輸入控制電平,控制電機(jī)的正反轉(zhuǎn)。EnA,EnB接控制使能端,控制電機(jī)的停轉(zhuǎn)。此次設(shè)計(jì)我們驅(qū)動(dòng)兩個(gè)直流電機(jī),OUT1和OUT2控制1個(gè),OUT3和OUT4控制1個(gè)。 以上介紹我們知道,通過(guò)5,7,10,12引腳可以控制電機(jī)的正轉(zhuǎn),反轉(zhuǎn),停止,那么怎么實(shí)現(xiàn)呢,下面是控制IO的真值表,拿其中一組作為演示,另一組一樣的邏輯,手冊(cè)中給出的是:

從手冊(cè)給出的說(shuō)明來(lái)看,欲要電機(jī)驅(qū)動(dòng)輸出,需要以下步驟來(lái)實(shí)現(xiàn):1、使能EnA,EnB引腳,可以直接接到單片機(jī)系統(tǒng)電源或者由單片機(jī)IO輸出高電平來(lái)控制; 2、Input1、Input2必須是相反的電平,即以下邏輯,至于前進(jìn)還是后退,跟電機(jī)的接線有關(guān)系哈,大家可以自己測(cè)試調(diào)整。
| 輸入信號(hào) | 電機(jī)運(yùn)行方式 | ||
| 使能端A/B | 輸入引腳1(5)/3(10) | 輸入引腳2(7)/4(12) | |
| 1 | 1 | 0 | 前進(jìn) |
| 1 | 0 | 1 | 后退 |
| 1 | 1 | 1 | 緊急停車(chē) |
| 1 | 0 | 0 | 緊急停車(chē) |
| 0 | X | X | 停止 |

前半部分是光耦隔離芯片,用來(lái)抗干擾以及保護(hù)單片機(jī)IO,P8、P9是使能端,如果不接單片機(jī)IO控制,直接短路帽短接即可,P7是電機(jī)控制輸出端口。 與ART-PI的接口采用的是4個(gè)普通IO,伙伴們?nèi)羰琴I(mǎi)的L298N模塊,IO可以自選。

電機(jī):關(guān)于電機(jī)的介紹,大家可以移步到一位大佬的公眾號(hào),介紹非常詳細(xì)啦,公眾號(hào):嵌入式從0到1,大家可以多多關(guān)注,非常nice的一位號(hào)主。
組裝好的小車(chē),用了2個(gè)輪子加一個(gè)萬(wàn)向輪,剛好用一個(gè)L298N來(lái)驅(qū)動(dòng)。
三、代碼控制實(shí)現(xiàn)
此前我們一直用的是ESP8266,現(xiàn)在我們改為使用板載的wifi模組,充分利用板載資源,沒(méi)有ART-PI板子的童鞋不要擔(dān)心,RT-Studio支持很多芯片的,大家可以使用手里現(xiàn)有的板子跟著做,一樣的,wifi部分可以使用小飛哥上個(gè)教程,使用esp8266或者其他方式,邏輯是一樣的啦。 1、新建工程,我們選擇如下的參數(shù),基于ART-PI開(kāi)發(fā)板,當(dāng)然沒(méi)有板子的伙伴可以選擇基于芯片,然后選擇示例工程,wifi工程,RT-Thread團(tuán)隊(duì)已經(jīng)把AP6212部分做成庫(kù)封裝在RT-Studio平臺(tái),建立好工程之后,setting里面可以看到關(guān)于AP6212的組件已經(jīng)勾選,main函數(shù)開(kāi)始增加了2個(gè)函數(shù)調(diào)用,這兩個(gè)函數(shù)是用來(lái)上電自動(dòng)初始化wifi部分,如果已經(jīng)連接了wifi,下次上電就會(huì)自動(dòng)搜索完成連接。編譯完成之后,download進(jìn)去,來(lái)看看初步效果:




控制臺(tái)輸入wifi help,可以看到關(guān)于wifi的一些命令
輸入wifi scan,掃描附近區(qū)域wifi,接下來(lái)輸入wifi join SSID password,由于小飛哥的板子之前連接過(guò)別的wifi,一直在搜索,但并沒(méi)有找到,輸入新的wifi名稱(chēng)。


Wifi連接成功,現(xiàn)在重啟設(shè)備,看看自動(dòng)連接效果,可以發(fā)現(xiàn),是逐個(gè)進(jìn)行掃描的,成功找到當(dāng)前wifi并連接成功,開(kāi)機(jī)自動(dòng)連接效果測(cè)試OK。

接下來(lái)是連接OneNet啦,熟悉小飛哥的應(yīng)該知道怎么做啦,第一次看小飛哥文章的麻煩移步前面的文章看看呀,不懂的,加群一起交流,群里有很多志同道合的好伙伴。 下面在我們的工程里面添加L298N控制邏輯代碼,主要是對(duì)IO的控制,也是比較簡(jiǎn)單的,根據(jù)上面介紹的控制邏輯,讓相應(yīng)的IO輸出高低電平就可以啦,方向控制函數(shù)可以合成一個(gè),小飛哥為了讓大家看的更簡(jiǎn)單明了,分開(kāi)寫(xiě)了,要注意的是,方向控制跟你的L29N輸出接到電機(jī)的順序有關(guān),如果方向反了,修改代碼或者接線順序反一下就可以實(shí)現(xiàn)同樣的功能啦。有需要的伙伴,源碼都是開(kāi)源的,可以跟小飛哥說(shuō)一下,后續(xù)會(huì)上傳到github,大家可以自行下載。
IO初始化配置函數(shù):
#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);
}
前進(jìn):
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);
}
右轉(zhuǎn):
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);
}
左轉(zhuǎn):
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);
}
接下來(lái)就是OneNet下發(fā)指令進(jìn)行控制啦,這也是為后面的重力感應(yīng)遙控做鋪墊,小飛哥在之前代碼基礎(chǔ)上做了一些修改,不需要再一條條發(fā)命令接入Onenet啦,上電就可以自動(dòng)連接wifi,接入Onenet服務(wù)器啦,省了不少麻煩,哈哈,無(wú)需輸入一條命令,就可以連接到Onenet服務(wù)器了。

設(shè)備已在線

然后在Onenet端做了一個(gè)無(wú)比丑陋的控制器。拿一個(gè)舉例子,電機(jī)ON是發(fā)送控制命令,OFF發(fā)送停止命令,相信到這里,之前做過(guò)Onenet控制控制板載LED的童鞋已經(jīng)知道怎么做啦,沒(méi)錯(cuò),LED控制函數(shù)中增加下車(chē)接收命令控制即可,完整函數(shù)內(nèi)容,占篇幅,可以直接跳過(guò),主要是給大家拷貝方便點(diǎn)。

/* 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);
}
實(shí)現(xiàn)效果:

原文標(biāo)題:ART-PI-重力感應(yīng)無(wú)線智能小車(chē)第二彈-----OneNet+板載wifi控制電機(jī)轉(zhuǎn)動(dòng)
文章出處:【微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
責(zé)任編輯:haq
-
集成電路
+關(guān)注
關(guān)注
5452文章
12572瀏覽量
374557 -
封裝
+關(guān)注
關(guān)注
128文章
9249瀏覽量
148628 -
智能車(chē)
+關(guān)注
關(guān)注
21文章
411瀏覽量
78509
原文標(biāo)題:ART-PI-重力感應(yīng)無(wú)線智能小車(chē)第二彈-----OneNet+板載wifi控制電機(jī)轉(zhuǎn)動(dòng)
文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
軌道小車(chē)無(wú)線控制系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
ART-Pi中啟用外部flash是在哪里配置了qspi的引腳呢?
ART-PI使用新的env工具已經(jīng)無(wú)法編譯SDK倉(cāng)庫(kù)里的示例工程了,怎么解決?
art_pi_lrs007_lora_gw_driver示例工程無(wú)法創(chuàng)建怎么解決?
按照官方文檔在ART-PI上開(kāi)啟PWM,但是串口輸出找不到設(shè)備,怎么解決?
如何在 ART-Pi 平臺(tái)使用 openocd 直接燒錄到外部 spi flash?
ART-PI2串口DMA累計(jì)接收超過(guò)buf設(shè)置的大小后就不能再接收了為什么?
ART-PI2的CherryUSB cdc_acm例程 在復(fù)位后需要好久才能出來(lái)COM口?
全智芯433MHz無(wú)線傳輸人體感應(yīng)門(mén)鈴方案概述
無(wú)線充電利用了電磁感應(yīng)原理嗎?
ART PI重力感應(yīng)無(wú)線智能小車(chē)
評(píng)論