一、認(rèn)識機(jī)器人
機(jī)器人是一種自動執(zhí)行任務(wù)的機(jī)器,它可以模擬人類或其它生物的某些功能,并按照預(yù)設(shè)的程序或通過人工智能技術(shù)來執(zhí)行任務(wù)。
常見的一些基本概念有:
01定義:
機(jī)器人是具有感知、決策和執(zhí)行功能的自動化設(shè)備。它可以接受外部信息,進(jìn)行處理,并據(jù)此執(zhí)行一定的動作。
02組成:
感知系統(tǒng):如攝像頭、傳感器等,用于接收外部信息。
控制系統(tǒng):如電腦、單片機(jī)等,用于處理信息和做出決策。
執(zhí)行系統(tǒng):如機(jī)械臂、驅(qū)動器等,用于執(zhí)行具體的動作。
03分類:
工業(yè)機(jī)器人:用于制造業(yè),如焊接、組裝、搬運等。
服務(wù)機(jī)器人:用于服務(wù)業(yè),如醫(yī)療、清潔、娛樂等。
特種機(jī)器人:用于特殊環(huán)境,如深海探測、空間探測等。
04關(guān)鍵技術(shù):
驅(qū)動技術(shù):包括電動、液壓、氣動等驅(qū)動方式。
感知技術(shù):包括視覺、觸覺、聽覺等多種感知方式。
導(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è)、教育等多個領(lǐng)域。
二、初探CW32的四足機(jī)器人控制(用于玩和學(xué)習(xí))
本項目使用8自由度舵機(jī)控制的四足機(jī)器人。主要用于愛好者學(xué)習(xí)參考。可實現(xiàn)基本控制姿態(tài):前進(jìn)、左轉(zhuǎn)、右轉(zhuǎn)、打滑、伸展、站立、躺平、擺手。有興趣的朋友,也可以增加新步態(tài)控制。
01硬件組成
(1)主控原理圖
其中MCU核心板,選用CW32F030C8T6核心板。
主要使用CW32F030C8T6以下產(chǎn)品特性:
- 內(nèi)核:ARM? Cortex?-M0+ -- 最高主頻 64MHz
- 工作溫度:-40℃ 至 105℃;工作電壓:1.65V 至 5.5V
- 存儲容量
最大 64K 字節(jié) FLASH,數(shù)據(jù)保持 25 年 @85℃
最大 8K 字節(jié) RAM,支持奇偶校驗
128 字節(jié) OTP 存儲器
- 時鐘管理
4 ~ 32MHz 晶體振蕩器
32kHz 低速晶體振蕩器
內(nèi)置 48MHz RC 振蕩器
內(nèi)置 32kHz RC 振蕩器
內(nèi)置 10kHz RC 振蕩器
內(nèi)置 150kHz RC 振蕩器
內(nèi)置 PLL 鎖相環(huán)
時鐘監(jiān)測系統(tǒng)
允許獨立關(guān)斷各外設(shè)時鐘
16位高級控制定時器,支持6路捕獲/比較通道和3對互補PWM輸出,死區(qū)時間和靈活的同步功能
四組 16 位通用定時器
三組 16 位基本定時器
窗口看門狗定時器
獨立看門狗定時器
三路低功耗 UART,支持小數(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)點。
DX-BT04-E模塊與單片機(jī)連線 :
GND | GND |
5V | 5V |
TXD | PA10 |
RXD | PA9 |
使用時,打開手機(jī)藍(lán)牙助手應(yīng)用DX-SMART,設(shè)置UUID為BT16模塊,搜索藍(lán)牙設(shè)備連接BT04-E設(shè)備。
正常通訊界面如下:
溫馨提示:使用其它藍(lán)牙模塊時,注意2個問題:
1. 波特率設(shè)置時,藍(lán)牙模塊需與單片機(jī)相符。
2. 如果搜索不到設(shè)備,或Service失敗時,需指定正確的UUID,方可通訊。
(3)舵機(jī)控制
舵機(jī)是運動控制的主要執(zhí)行機(jī)構(gòu)。價格便宜,隨處可見。值得注意的是,就是因為便宜,堵轉(zhuǎn)過載時容易損壞。
本項目實驗時,也是隨機(jī)找了幾個舵機(jī),沒有作區(qū)分使用。
SG90舵機(jī)目前在高檔遙控玩具,如航模、包括飛機(jī)模型、潛艇模型、遙控機(jī)器人中已經(jīng)使用得比較普遍。
SG90舵機(jī)上有三根線,分別是GND(棕色線)、VCC(紅色線 接5V)和SIG(黃色線),也就是地線、電源線和信號線。
SG90舵機(jī)控制: 一般需要一個20ms 周期的時基脈沖,該脈沖的高電平部分一般為0.5ms~2.5ms 范圍內(nèi)的角度控制脈沖部分對應(yīng)0度-180度機(jī)械周期的調(diào)節(jié)范圍。以180 度角度伺服為例,那么對應(yīng)的控制關(guān)系是這樣的:
0.5ms ---------- 0 度;
1.0ms ---------- 45 度;
1.5ms ---------- 90 度;
2.0ms ---------- 135 度;
2.5ms ---------- 180 度;
值得一提的是:控制精度。本實驗使用的舵機(jī)配套的塑料齒。淘寶各賣家沒有提供具體齒數(shù)。
作者認(rèn)為,這個控制精度在玩具類應(yīng)用上沒有特別高要求。但需要明白這個角度控制精度為360度/齒數(shù)。
(4)結(jié)構(gòu)安裝
該項目使用8個舵機(jī)。編號定義分別為①~⑧。
安裝后的實物圖如下:
引腳定義如下:
在腳角安裝時,舵機(jī)的控制角度范圍需要測試并確定。以下圖為例,展示了①-④號舵機(jī)的角度限制范圍:
程序中需要對每個舵機(jī)的旋轉(zhuǎn)角度范圍做限制,才可輸出。否則,電機(jī)在旋轉(zhuǎn)時,受死角影響發(fā)生過載易產(chǎn)生損壞。
02 軟件組成
(1)使用的外設(shè)資源
(一)CW32F030內(nèi)部集成4 個通用定時器(GTIM),每個GTIM 完全獨立且功能完全相同,各包含一個16bit 自動重裝載計數(shù)器并由一個可編程預(yù)分頻器驅(qū)動。GTIM 支持定時器模式、計數(shù)器模式、觸發(fā)啟動模式和門控模式4 種基本工作模式,每組帶4 路獨立的捕獲/ 比較通道,可以測量輸入信號的脈沖寬度(輸入捕獲)或者產(chǎn)生輸出波形(輸出比較和PWM)。
項目中使用了通用定時器GTIM1GTIM2的PWM輸出功能。
(二)CW32F030的通用異步收發(fā)器(UART) 支持異步全雙工、同步半雙工和單線半雙工模式,支持硬件數(shù)據(jù)流控和多機(jī)通信;可編程數(shù)據(jù)幀結(jié)構(gòu);可以通過小數(shù)波特率發(fā)生器提供寬范圍的波特率選擇。UART 控制器工作在雙時鐘域下,允許在深度休眠模式下進(jìn)行數(shù)據(jù)的接收,接收完成中斷可以喚醒MCU 回到運行模式。
項目中使用了串口UART3外設(shè)資源。
(2)主要實現(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(Angle10)Angle=10;
if(Angle?>135)Angle=135;
PWM_SetCompare1(Angle / 180 * 2000 + 500);
}
void Servo_SetAngle2(float Angle)
{
if(Angle45)Angle=45;
if(Angle?>170)Angle=170;
PWM_SetCompare2(Angle / 180 * 2000 + 500);
}
void Servo_SetAngle3(float Angle)
{
if(Angle45)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(Angle50)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(Angle50)Angle=50;
PWM_SetCompare8(Angle / 180 * 2000 + 500);
}
通用定時器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時鐘使能
__RCC_GTIM2_CLK_ENABLE(); // GTIM1時鐘使能
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);
}
三、展望與未來
由于該項目為初探控機(jī)器人控制,使用的是現(xiàn)有硬件資源進(jìn)行組裝調(diào)試。后期有機(jī)會可以設(shè)計一款小巧控制板,裝入結(jié)構(gòu)中心,形成獨立機(jī)器人。
另外,姿態(tài)控制算法在本實驗中并未提及,數(shù)學(xué)基礎(chǔ)較好的愛好者可作深入研究。
本次項目為作者初次嘗試,如有不足之處,歡迎批評指證。
-
四足機(jī)器人
+關(guān)注
關(guān)注
1文章
90瀏覽量
15190 -
CW32
+關(guān)注
關(guān)注
1文章
196瀏覽量
592
發(fā)布評論請先 登錄
相關(guān)推薦
評論