雷德斯 and枕頭們,好久不見,大家是不是更優(yōu)秀了呢,哈哈,工作太忙啦,夜里肝一篇,大家久等啦,話不多說,來,干貨!
ART-PI-重力感應(yīng)無線智能小車第二彈-----OneNet+板載wifi控制電機轉(zhuǎn)動此次分享主要用到的軟硬件資源:軟件(RT-Studio平臺): 1、OneNet軟件包; 2、OneNet服務(wù)器; 3、pahomqtt軟件包 4、webclient軟件包 硬件: 1、板載wifi模塊 2、ART-PI擴展板(自設(shè)計,開源) 3、L298N電機驅(qū)動 4、4個普通IO 實現(xiàn)目標:OneNet服務(wù)器下發(fā)控制電機正轉(zhuǎn)、反轉(zhuǎn)、停止。
一、L298N簡介
此次使用的是左邊封裝的15引腳封裝
L298N是專用驅(qū)動集成電路,屬于H橋集成電路,其持續(xù)輸出電流為2A,最高電流4A,最高工作電壓46V,可以驅(qū)動感性負載,如大功率直流電機,步進電機,電磁閥等,輸入端可以與單片機直接相連接,方便單片機控制。當驅(qū)動直流電機時,可以直接控制步進電機,并可以實現(xiàn)電機正轉(zhuǎn)與反轉(zhuǎn),實現(xiàn)此功能只需改變輸入端的邏輯電平。L298N芯片可以驅(qū)動兩個二相電機,也可以驅(qū)動一個四相電機,輸出電壓最高可達46V,可以直接通過電源來調(diào)節(jié)輸出電壓;可以直接用單片機的IO口提供控制信號。 內(nèi)部結(jié)構(gòu)框圖:有興趣的可以分析分析里面的控制邏輯,也比較簡單,不多說了。
引腳定義:
L298N可接受標準TTL邏輯電平信號VSS,VSS可接4.5~7V電壓。4腳VS接電源電壓,VS電壓范圍為VIH+2.5~46V。輸出電流可達2A,可驅(qū)動電感性負載。1腳和15腳下管的發(fā)射極分別單獨引出以便接入電流采樣電阻,形成電流傳感信號。L298可驅(qū)動2個電動機,OUT1,OUT2和OUT3,OUT4之間可分別接電動機。5,7,10,12腳接輸入控制電平,控制電機的正反轉(zhuǎn)。EnA,EnB接控制使能端,控制電機的停轉(zhuǎn)。此次設(shè)計我們驅(qū)動兩個直流電機,OUT1和OUT2控制1個,OUT3和OUT4控制1個。 以上介紹我們知道,通過5,7,10,12引腳可以控制電機的正轉(zhuǎn),反轉(zhuǎn),停止,那么怎么實現(xiàn)呢,下面是控制IO的真值表,拿其中一組作為演示,另一組一樣的邏輯,手冊中給出的是:
從手冊給出的說明來看,欲要電機驅(qū)動輸出,需要以下步驟來實現(xiàn):1、使能EnA,EnB引腳,可以直接接到單片機系統(tǒng)電源或者由單片機IO輸出高電平來控制; 2、Input1、Input2必須是相反的電平,即以下邏輯,至于前進還是后退,跟電機的接線有關(guān)系哈,大家可以自己測試調(diào)整。
輸入信號 | 電機運行方式 | ||
使能端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,伙伴們?nèi)羰琴I的L298N模塊,IO可以自選。
電機:關(guān)于電機的介紹,大家可以移步到一位大佬的公眾號,介紹非常詳細啦,公眾號:嵌入式從0到1,大家可以多多關(guān)注,非常nice的一位號主。
組裝好的小車,用了2個輪子加一個萬向輪,剛好用一個L298N來驅(qū)動。
三、代碼控制實現(xiàn)
此前我們一直用的是ESP8266,現(xiàn)在我們改為使用板載的wifi模組,充分利用板載資源,沒有ART-PI板子的童鞋不要擔心,RT-Studio支持很多芯片的,大家可以使用手里現(xiàn)有的板子跟著做,一樣的,wifi部分可以使用小飛哥上個教程,使用esp8266或者其他方式,邏輯是一樣的啦。 1、新建工程,我們選擇如下的參數(shù),基于ART-PI開發(fā)板,當然沒有板子的伙伴可以選擇基于芯片,然后選擇示例工程,wifi工程,RT-Thread團隊已經(jīng)把AP6212部分做成庫封裝在RT-Studio平臺,建立好工程之后,setting里面可以看到關(guān)于AP6212的組件已經(jīng)勾選,main函數(shù)開始增加了2個函數(shù)調(diào)用,這兩個函數(shù)是用來上電自動初始化wifi部分,如果已經(jīng)連接了wifi,下次上電就會自動搜索完成連接。編譯完成之后,download進去,來看看初步效果:
控制臺輸入wifi help,可以看到關(guān)于wifi的一些命令
輸入wifi scan,掃描附近區(qū)域wifi,接下來輸入wifi join SSID password,由于小飛哥的板子之前連接過別的wifi,一直在搜索,但并沒有找到,輸入新的wifi名稱。
Wifi連接成功,現(xiàn)在重啟設(shè)備,看看自動連接效果,可以發(fā)現(xiàn),是逐個進行掃描的,成功找到當前wifi并連接成功,開機自動連接效果測試OK。
接下來是連接OneNet啦,熟悉小飛哥的應(yīng)該知道怎么做啦,第一次看小飛哥文章的麻煩移步前面的文章看看呀,不懂的,加群一起交流,群里有很多志同道合的好伙伴。 下面在我們的工程里面添加L298N控制邏輯代碼,主要是對IO的控制,也是比較簡單的,根據(jù)上面介紹的控制邏輯,讓相應(yīng)的IO輸出高低電平就可以啦,方向控制函數(shù)可以合成一個,小飛哥為了讓大家看的更簡單明了,分開寫了,要注意的是,方向控制跟你的L29N輸出接到電機的順序有關(guān),如果方向反了,修改代碼或者接線順序反一下就可以實現(xiàn)同樣的功能啦。有需要的伙伴,源碼都是開源的,可以跟小飛哥說一下,后續(xù)會上傳到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);
}
前進:
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);
}
接下來就是OneNet下發(fā)指令進行控制啦,這也是為后面的重力感應(yīng)遙控做鋪墊,小飛哥在之前代碼基礎(chǔ)上做了一些修改,不需要再一條條發(fā)命令接入Onenet啦,上電就可以自動連接wifi,接入Onenet服務(wù)器啦,省了不少麻煩,哈哈,無需輸入一條命令,就可以連接到Onenet服務(wù)器了。
設(shè)備已在線
然后在Onenet端做了一個無比丑陋的控制器。拿一個舉例子,電機ON是發(fā)送控制命令,OFF發(fā)送停止命令,相信到這里,之前做過Onenet控制控制板載LED的童鞋已經(jīng)知道怎么做啦,沒錯,LED控制函數(shù)中增加下車接收命令控制即可,完整函數(shù)內(nèi)容,占篇幅,可以直接跳過,主要是給大家拷貝方便點。
/* 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);
}
實現(xiàn)效果:
原文標題:ART-PI-重力感應(yīng)無線智能小車第二彈-----OneNet+板載wifi控制電機轉(zhuǎn)動
文章出處:【微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
責任編輯:haq
-
集成電路
+關(guān)注
關(guān)注
5389文章
11574瀏覽量
362332 -
封裝
+關(guān)注
關(guān)注
127文章
7947瀏覽量
143106 -
智能車
+關(guān)注
關(guān)注
21文章
403瀏覽量
76998
原文標題:ART-PI-重力感應(yīng)無線智能小車第二彈-----OneNet+板載wifi控制電機轉(zhuǎn)動
文章出處:【微信號:RTThread,微信公眾號:RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論