機(jī)器人是一種自動(dòng)執(zhí)行任務(wù)的機(jī)器,它可以模擬人類或其它生物的某些功能,并按照預(yù)設(shè)的程序或通過(guò)人工智能技術(shù)來(lái)執(zhí)行任務(wù)。
一、常見(jiàn)的一些基本概念
01定義:
機(jī)器人是具有感知、決策和執(zhí)行功能的自動(dòng)化設(shè)備。它可以接受外部信息,進(jìn)行處理,并據(jù)此執(zhí)行一定的動(dòng)作。
02組成:
感知系統(tǒng):如攝像頭、傳感器等,用于接收外部信息。
控制系統(tǒng):如電腦、單片機(jī)等,用于處理信息和做出決策。
執(zhí)行系統(tǒng):如機(jī)械臂、驅(qū)動(dòng)器等,用于執(zhí)行具體的動(dòng)作。
03分類:
工業(yè)機(jī)器人:用于制造業(yè),如焊接、組裝、搬運(yùn)等。
服務(wù)機(jī)器人:用于服務(wù)業(yè),如醫(yī)療、清潔、娛樂(lè)等。
特種機(jī)器人:用于特殊環(huán)境,如深海探測(cè)、空間探測(cè)等。
04關(guān)鍵技術(shù):
驅(qū)動(dòng)技術(shù):包括電動(dòng)、液壓、氣動(dòng)等驅(qū)動(dòng)方式。
感知技術(shù):包括視覺(jué)、觸覺(jué)、聽(tīng)覺(jué)等多種感知方式。
導(dǎo)航與定位技術(shù):如GPS、激光導(dǎo)航、慣性導(dǎo)航等。
05人工智能:
使機(jī)器人具備自主學(xué)習(xí)、推理和決策的能力。
06應(yīng)用領(lǐng)域:
機(jī)器人廣泛應(yīng)用于制造業(yè)、醫(yī)療、家政、軍事、農(nóng)業(yè)、教育等多個(gè)領(lǐng)域。
二、初探CW32的四足機(jī)器人控制
(用于玩和學(xué)習(xí))
本項(xiàng)目使用8自由度舵機(jī)控制的四足機(jī)器人。主要用于愛(ài)好者學(xué)習(xí)參考。可實(shí)現(xiàn)基本控制姿態(tài):前進(jìn)、左轉(zhuǎn)、右轉(zhuǎn)、打滑、伸展、站立、躺平、擺手。有興趣的朋友,也可以增加新步態(tài)控制。
01、?硬件組成
(1)主控原理圖
主要使用CW32F030C8T6以下產(chǎn)品特性:
內(nèi)核:ARM? Cortex?-M0+??--??最高主頻 64MHz
工作溫度:-40℃ 至 105℃;工作電壓:1.65V 至 5.5V
存儲(chǔ)容量
最大 64K 字節(jié) FLASH,數(shù)據(jù)保持 25 年 @85℃
最大 8K 字節(jié) RAM,支持奇偶校驗(yàn)
128 字節(jié) OTP 存儲(chǔ)器
時(shí)鐘管理
4 ~ 32MHz 晶體振蕩器
32kHz 低速晶體振蕩器
內(nèi)置 48MHz RC 振蕩器
內(nèi)置 32kHz RC 振蕩器
內(nèi)置 10kHz RC 振蕩器
內(nèi)置 150kHz RC 振蕩器
內(nèi)置 PLL 鎖相環(huán)
時(shí)鐘監(jiān)測(cè)系統(tǒng)
允許獨(dú)立關(guān)斷各外設(shè)時(shí)鐘
16位高級(jí)控制定時(shí)器,支持6路捕獲/比較通道和3對(duì)互補(bǔ)PWM輸出,死區(qū)時(shí)間和靈活的同步功能
四組 16 位通用定時(shí)器
三組 16 位基本定時(shí)器
獨(dú)立看門(mén)狗定時(shí)器
兩路 SPI 接口 12Mbit/s
兩路 I2C 接口 1Mbit/s
IR 調(diào)制器
(2)藍(lán)牙模塊
DX-BT04-E藍(lán)牙模塊:采用BK3432芯片,支持SPP V3.0+BLE V4.2藍(lán)牙協(xié)議。支持AT指令,用戶可根據(jù)需要更改串口波特率、設(shè)備名稱等參數(shù)。具有成本低、功耗低、接收靈敏高等優(yōu)點(diǎn)。
DX-BT04-E模塊與單片機(jī)連線?:
GND | GND |
5V | 5V |
TXD | PA10 |
RXD | PA9 |
藍(lán)牙APP安卓手機(jī)APP,可掃描下載。
IOS測(cè)試APP,請(qǐng)?jiān)谔O(píng)果商城下載DX-SMART。
使用時(shí),打開(kāi)手機(jī)藍(lán)牙助手應(yīng)用DX-SMART,設(shè)置UUID為BT16模塊,搜索藍(lán)牙設(shè)備連接BT04-E設(shè)備。
正常通訊界面如下:
溫馨提示:使用其它藍(lán)牙模塊時(shí),注意2個(gè)問(wèn)題:
1. 波特率設(shè)置時(shí),藍(lán)牙模塊需與單片機(jī)相符。
2. 如果搜索不到設(shè)備,或Service失敗時(shí),需指定正確的UUID,方可通訊。
(3)舵機(jī)控制
舵機(jī)是運(yùn)動(dòng)控制的主要執(zhí)行機(jī)構(gòu)。價(jià)格便宜,隨處可見(jiàn)。值得注意的是,就是因?yàn)楸阋耍罗D(zhuǎn)過(guò)載時(shí)容易損壞。
本項(xiàng)目實(shí)驗(yàn)時(shí),也是隨機(jī)找了幾個(gè)舵機(jī),沒(méi)有作區(qū)分使用。
SG90舵機(jī)目前在高檔遙控玩具,如航模、包括飛機(jī)模型、潛艇模型、遙控機(jī)器人中已經(jīng)使用得比較普遍。
SG90舵機(jī)上有三根線,分別是GND(棕色線)、VCC(紅色線?接5V)和SIG(黃色線),也就是地線、電源線和信號(hào)線。
SG90舵機(jī)控制:??一般需要一個(gè)20ms 周期的時(shí)基脈沖,該脈沖的高電平部分一般為0.5ms~2.5ms 范圍內(nèi)的角度控制脈沖部分對(duì)應(yīng)0度-180度機(jī)械周期的調(diào)節(jié)范圍。以180 度角度伺服為例,那么對(duì)應(yīng)的控制關(guān)系是這樣的:
0.5ms ---------- 0 度;
1.0ms ---------- 45 度;
1.5ms ---------- 90 度;
2.0ms ---------- 135 度;
2.5ms ---------- 180 度;
值得一提的是:控制精度。本實(shí)驗(yàn)使用的舵機(jī)配套的塑料齒。淘寶各賣家沒(méi)有提供具體齒數(shù)。
作者認(rèn)為,這個(gè)控制精度在玩具類應(yīng)用上沒(méi)有特別高要求。但需要明白這個(gè)角度控制精度為360度/齒數(shù)。
(4)結(jié)構(gòu)安裝
該項(xiàng)目使用8個(gè)舵機(jī)。編號(hào)定義分別為①~⑧。
安裝后的實(shí)物圖如下:
引腳定義如下:
在腳角安裝時(shí),舵機(jī)的控制角度范圍需要測(cè)試并確定。以下圖為例,展示了①-④號(hào)舵機(jī)的角度限制范圍:
程序中需要對(duì)每個(gè)舵機(jī)的旋轉(zhuǎn)角度范圍做限制,才可輸出。否則,電機(jī)在旋轉(zhuǎn)時(shí),受死角影響發(fā)生過(guò)載易產(chǎn)生損壞。
02、?軟件組成
(1)使用的外設(shè)資源
(一)CW32F030內(nèi)部集成4 個(gè)通用定時(shí)器(GTIM),每個(gè)GTIM 完全獨(dú)立且功能完全相同,各包含一個(gè)16bit 自動(dòng)重裝載計(jì)數(shù)器并由一個(gè)可編程預(yù)分頻器驅(qū)動(dòng)。GTIM 支持定時(shí)器模式、計(jì)數(shù)器模式、觸發(fā)啟動(dòng)模式和門(mén)控模式4 種基本工作模式,每組帶4 路獨(dú)立的捕獲/ 比較通道,可以測(cè)量輸入信號(hào)的脈沖寬度(輸入捕獲)或者產(chǎn)生輸出波形(輸出比較和PWM)。
項(xiàng)目中使用了通用定時(shí)器GTIM1GTIM2的PWM輸出功能。
(二)CW32F030的通用異步收發(fā)器(UART) 支持異步全雙工、同步半雙工和單線半雙工模式,支持硬件數(shù)據(jù)流控和多機(jī)通信;可編程數(shù)據(jù)幀結(jié)構(gòu);可以通過(guò)小數(shù)波特率發(fā)生器提供寬范圍的波特率選擇。UART 控制器工作在雙時(shí)鐘域下,允許在深度休眠模式下進(jìn)行數(shù)據(jù)的接收,接收完成中斷可以喚醒MCU 回到運(yùn)行模式。
項(xiàng)目中使用了串口UART3外設(shè)資源。
(2)主要實(shí)現(xiàn)代碼
主程序:
int main()
{
Board_Iint();
USART_SendString(CW_UART3,"Power on!");
fuwei2();
while (1)
{
if(UART_Flag == 1)
{
if(RxDate == 'a')//站立
{
zhanli();
}
if(RxDate == 'b')// 躺平
{
tangping();
}
if(RxDate == 'c')//擺手
{
baishou();
}
if(RxDate == 'd')//搖擺
{
yaobai();
Delay_ms(500);
yaobai();
Delay_ms(500);
}
if(RxDate == 'e')//左轉(zhuǎn)
{
zhanli();
Delay_ms(1000);
zhanli2();
Delay_ms(1000);
zuozhuan();
Delay_ms(1000);
zuozhuan();
}
if(RxDate == 'f')//打滑
{
dahua();
dahua();
}
if(RxDate == 'g')//前進(jìn)
{
zhanli();
Delay_ms(200);
qianjin();
Delay_ms(200);
qianjin();
Delay_ms(200);
qianjin();
}
if(RxDate == 'h')//右轉(zhuǎn)
{
youzhuan();
youzhuan();
youzhuan();
}
UART_Flag=0;
}
}
}
藍(lán)牙串口中斷:
void UART3_IRQHandler(void)//串口3中斷服務(wù)函數(shù)
{
if (USART_GetITStatus(CW_UART3, USART_IT_RC) != RESET)//如果接受到了消息
{
RxDate = USART_ReceiveData_8bit(CW_UART3);//將寄存器的數(shù)據(jù)轉(zhuǎn)存在TxRxBuffer
UART_Flag=1;
USART_SendData_8bit(CW_UART3, RxDate);//將收到的消息發(fā)回給串口
USART_ClearITPendingBit(CW_UART3, USART_IT_RC);
}
}
/*復(fù)位或躺平姿態(tài)*/
void fuwei2 (void){
Servo_SetAngle(90);
Delay_ms(500);
Servo_SetAngle2(90);
Delay_ms(500);
Servo_SetAngle3(90);
Delay_ms(500);
Servo_SetAngle4(90);
Delay_ms(500);
Servo_SetAngle5(90);
Delay_ms(500);
Servo_SetAngle6(90);
Delay_ms(500);
Servo_SetAngle7(90);
Delay_ms(500);
Servo_SetAngle8(90);
Delay_ms(500);
}
舵機(jī)角度限制,并輸出控制。
void Servo_SetAngle(float Angle)
{
if(Angle<10)Angle=10;
if(Angle>135)Angle=135;
PWM_SetCompare1(Angle / 180 * 2000 + 500);
}
void Servo_SetAngle2(float Angle)
{
if(Angle<45)Angle=45;
if(Angle>170)Angle=170;
PWM_SetCompare2(Angle / 180 * 2000 + 500);
}
void Servo_SetAngle3(float Angle)
{
if(Angle<45)Angle=45;
PWM_SetCompare3(Angle / 180 * 2000 + 500);
}
void Servo_SetAngle4(float Angle)
{
if(Angle>135)Angle=135;
PWM_SetCompare4(Angle / 180 * 2000 + 500);
}
void Servo_SetAngle5(float Angle)
{
if(Angle<50)Angle=50;
PWM_SetCompare5(Angle / 180 * 2000 + 500);
}
void Servo_SetAngle6(float Angle)
{
if(Angle>130)Angle=130;
PWM_SetCompare6(Angle / 180 * 2000 + 500);
}
void Servo_SetAngle7(float Angle)
{
Angle=180-Angle;
if(Angle>130)Angle=130;
PWM_SetCompare7(Angle / 180 * 2000 + 500);
}
void Servo_SetAngle8(float Angle)
{
Angle=180-Angle;
if(Angle<50)Angle=50;
PWM_SetCompare8(Angle / 180 * 2000 + 500);
}
通用定時(shí)器GTIM控制初始化。
void GTIM_GPIOInit(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
__RCC_GPIOB_CLK_ENABLE();
__RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pins = GPIO_PIN_0|GPIO_PIN_1;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
PB00_AFx_GTIM1CH3();
PB01_AFx_GTIM1CH4();
GPIO_InitStruct.Pins = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_6|GPIO_PIN_7;
GPIO_Init(CW_GPIOA, &GPIO_InitStruct);
PA00_AFx_GTIM2CH1();
PA01_AFx_GTIM2CH2();
PA02_AFx_GTIM2CH3();
PA03_AFx_GTIM2CH4();
PA06_AFx_GTIM1CH1();
PA07_AFx_GTIM1CH2();
}
void g_tim_init(void)
{
GTIM_InitTypeDef GTIM_InitStruct ;
__RCC_GTIM1_CLK_ENABLE(); // GTIM1時(shí)鐘使能
__RCC_GTIM2_CLK_ENABLE(); // GTIM1時(shí)鐘使能
GTIM_GPIOInit();
GTIM_InitStruct.Mode = GTIM_MODE_TIME;
GTIM_InitStruct.OneShotMode = GTIM_COUNT_CONTINUE;
GTIM_InitStruct.Prescaler =GTIM_PRESCALER_DIV64;
GTIM_InitStruct.ReloadValue =20000; //20MS
GTIM_InitStruct.ToggleOutState = DISABLE;
GTIM_TimeBaseInit(CW_GTIM1, >IM_InitStruct);
GTIM_TimeBaseInit(CW_GTIM2, >IM_InitStruct);
GTIM_OCInit(CW_GTIM1, GTIM_CHANNEL1, GTIM_OC_OUTPUT_PWM_LOW);
GTIM_OCInit(CW_GTIM1, GTIM_CHANNEL2, GTIM_OC_OUTPUT_PWM_LOW);
GTIM_OCInit(CW_GTIM1, GTIM_CHANNEL3, GTIM_OC_OUTPUT_PWM_LOW);
GTIM_OCInit(CW_GTIM1, GTIM_CHANNEL4, GTIM_OC_OUTPUT_PWM_LOW);
GTIM_OCInit(CW_GTIM2, GTIM_CHANNEL1, GTIM_OC_OUTPUT_PWM_LOW);
GTIM_OCInit(CW_GTIM2, GTIM_CHANNEL2, GTIM_OC_OUTPUT_PWM_LOW);
GTIM_OCInit(CW_GTIM2, GTIM_CHANNEL3, GTIM_OC_OUTPUT_PWM_LOW);
GTIM_OCInit(CW_GTIM2, GTIM_CHANNEL4, GTIM_OC_OUTPUT_PWM_LOW);
GTIM_Cmd(CW_GTIM1, ENABLE);
GTIM_Cmd(CW_GTIM2, ENABLE);
}
三、展望與未來(lái)
由于該項(xiàng)目為初探控機(jī)器人控制,使用的是現(xiàn)有硬件資源進(jìn)行組裝調(diào)試。后期有機(jī)會(huì)可以設(shè)計(jì)一款小巧控制板,裝入結(jié)構(gòu)中心,形成獨(dú)立機(jī)器人。
另外,姿態(tài)控制算法在本實(shí)驗(yàn)中并未提及,數(shù)學(xué)基礎(chǔ)較好的愛(ài)好者可作深入研究。
本次項(xiàng)目為作者初次嘗試,如有不足之處,歡迎批評(píng)指證。