加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 一、常見(jiàn)的一些基本概念
    • 二、初探CW32的四足機(jī)器人控制
    • 三、展望與未來(lái)
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

【CW32開(kāi)發(fā)】初探四足機(jī)器人

09/23 08:30
880
閱讀需 20 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

機(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)主控原理圖

 

其中MCU核心板,選用CW32F030C8T6核心板。

主要使用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í)鐘

定時(shí)器

16位高級(jí)控制定時(shí)器,支持6路捕獲/比較通道和3對(duì)互補(bǔ)PWM輸出,死區(qū)時(shí)間和靈活的同步功能

四組 16 位通用定時(shí)器

三組 16 位基本定時(shí)器

窗口看門(mén)狗定時(shí)器

獨(dú)立看門(mén)狗定時(shí)器

通信接口

三路低功耗 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)點(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, &GTIM_InitStruct);    GTIM_TimeBaseInit(CW_GTIM2, &GTIM_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)指證。

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

以開(kāi)放、共享、互助為理念,致力于構(gòu)建武漢芯源半導(dǎo)體CW32系列MCU生態(tài)社區(qū)。無(wú)論是嵌入式MCU小自還是想要攻破技術(shù)難題的工程師,亦或是需求解決方案的產(chǎn)品經(jīng)理都可在CW32生態(tài)社區(qū)汲取營(yíng)養(yǎng)、共同成長(zhǎng)。

B站