一、認識
機器人是一種自動執行任務的機器,它可以人類或其它生物的某些功能,并按照預設的程序或通過技術來執行任務。
常見的一些基本概念有:
01定義:
機器人是具有感知、決策和執行功能的。它可以接受外部,進行處理,并據此執行一定的動作。
02組成:
感知系統:如攝像頭、等,用于接收外部信息。
:如、等,用于處理信息和做出決策。
執行系統:如臂、等,用于執行具體的動作。
03分類:
:用于制造業,如焊接、組裝、搬運等。
服務機器人:用于服務業,如醫療、清潔、娛樂等。
特種機器人:用于特殊環境,如深海探測、空間探測等。
04關鍵技術:
驅動技術:包括電動、液壓、氣動等驅動方式。
感知技術:包括視覺、觸覺、聽覺等多種感知方式。
導航與定位技術:如GPS、激光導航、慣性導航等。
05人工智能:
使機器人具備自主學習、推理和決策的能力。
06應用領域:
機器人廣泛應用于制造業、醫療、家政、軍事、農業、教育等多個領域。
二、初探CW32的四足機器人控制(用于玩和學習)
本項目使用8自由度舵機控制的四足機器人。主要用于愛好者學習參考。可實現基本控制姿態:前進、左轉、右轉、打滑、伸展、站立、躺平、擺手。有興趣的朋友,也可以增加新步態控制。
01組成
(1)主控原理圖
其中核心板,選用CW32F030C8T6核心板。
主要使用CW32F030C8T6以下特性:
- 內核:? Cortex?-M0+ -- 最高主頻 64MHz
- 工作溫度:-40℃ 至 105℃;工作電壓:1.65V 至 5.5V
- 存儲容量
最大 64K 字節 FLASH,數據保持 25 年 @85℃
最大 8K 字節 ,支持奇偶校驗
128 字節 OTP 存儲器
- 管理
4 ~ 32MHz 晶體
32kHz 低速晶體振蕩器
內置 48MHz RC 振蕩器
內置 32kHz RC 振蕩器
內置 10kHz RC 振蕩器
內置 150kHz RC 振蕩器
內置 PLL 鎖相環
時鐘監測系統
允許獨立關斷各外設時鐘
16位高級控制定時器,支持6路捕獲/比較通道和3對互補PWM輸出,死區時間和靈活的同步功能
四組 16 位通用定時器
三組 16 位基本定時器
窗口定時器
獨立看門狗定時器
三路低功耗 ,支持小數波特率
兩路 SPI 12Mbit/s
兩路 接口 1Mbit/s
IR 調制器
(2)模塊
DX-BT04-E藍牙模塊:采用BK3432,支持SPP V3.0+BLE V4.2藍牙協議。支持AT指令,用戶可根據需要更改串口波特率、設備名稱等。具有成本低、功耗低、接收靈敏高等優點。
DX-BT04-E模塊與單片機連線 :
GND | GND |
5V | 5V |
TXD | PA10 |
RXD | PA9 |
藍牙APPAPP,可掃描。
測試APP,請在蘋果下載DX-SMART。
使用時,打開手機藍牙助手應用DX-SMART,設置UUID為BT16模塊,搜索藍牙設備連接BT04-E設備。
正常通訊界面如下:
溫馨提示:使用其它藍牙模塊時,注意2個問題:
1. 波特率設置時,藍牙模塊需與單片機相符。
2. 如果搜索不到設備,或Serve失敗時,需指定正確的UUID,方可通訊。
(3)舵機控制
舵機是運動控制的主要執行機構。價格便宜,隨處可見。值得注意的是,就是因為便宜,堵轉過載時容易損壞。
本項目實驗時,也是隨機找了幾個舵機,沒有作區分使用。
SG90舵機目前在高檔遙控玩具,如航模、包括飛機模型、潛艇模型、遙控機器人中已經使用得比較普遍。
SG90舵機上有三根線,分別是GND(棕色線)、VCC(紅色線 接5V)和SIG(黃色線),也就是地線、線和線。
SG90舵機控制: 一般需要一個20ms 周期的時基脈沖,該脈沖的高電平部分一般為0.5ms~2.5ms 范圍內的角度控制脈沖部分對應0度-180度機械周期的調節范圍。以180 度角度伺服為例,那么對應的控制關系是這樣的:
0.5ms ---------- 0 度;
1.0ms ---------- 45 度;
1.5ms ---------- 90 度;
2.0ms ---------- 135 度;
2.5ms ---------- 180 度;
值得一提的是:控制精度。本實驗使用的舵機配套的塑料齒。淘寶各賣家沒有提供具體齒數。
作者認為,這個控制精度在玩具類應用上沒有特別高要求。但需要明白這個角度控制精度為360度/齒數。
(4)結構安裝
該項目使用8個舵機。編號定義分別為①~⑧。
安裝后的實物圖如下:
引腳定義如下:
在腳角安裝時,舵機的控制角度范圍需要測試并確定。以下圖為例,展示了①-④號舵機的角度限制范圍:
程序中需要對每個舵機的旋轉角度范圍做限制,才可輸出。否則,在旋轉時,受死角影響發生過載易產生損壞。
02 軟件組成
(1)使用的外設資源
(一)CW32F030內部集成4 個通用定時器(GM),每個GTIM 完全獨立且功能完全相同,各包含一個16bit 自動重裝載計數器并由一個可預分頻器驅動。GTIM 支持定時器模式、計數器模式、觸發啟動模式和門控模式4 種基本工作模式,每組帶4 路獨立的捕獲/ 比較通道,可以測量輸入信號的脈沖寬度(輸入捕獲)或者產生輸出波形(輸出比較和PWM)。
項目中使用了通用定時器GTIM1GTIM2的PWM輸出功能。
(二)CW32F030的通用異步(UART) 支持異步全雙工、同步半雙工和單線半雙工模式,支持硬件數據流控和多機;可編程數據幀結構;可以通過小數波特率發生器提供寬范圍的波特率選擇。UART 工作在雙時鐘域下,允許在深度休眠模式下進行數據的接收,接收完成中斷可以喚醒MCU 回到運行模式。
項目中使用了串口UART3外設資源。
(2)主要實現代碼
主程序:
int mn()
{
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')//左轉
{
zhanli();
Delay_ms(1000);
zhanli2();
Delay_ms(1000);
zuozhuan();
Delay_ms(1000);
zuozhuan();
}
if(RxDate == 'f')//打滑
{
dahua();
dahua();
}
if(RxDate == 'g')//前進
{
zhanli();
Delay_ms(200);
qianjin();
Delay_ms(200);
qianjin();
Delay_ms(200);
qianjin();
}
if(RxDate == 'h')//右轉
{
youzhuan();
youzhuan();
youzhuan();
}
UART_Flag=0;
}
}
}
藍牙串口中斷:
void UART3_IRQHandler(void)//串口3中斷服務函數
{
if (USART_GetITStatus(CW_UART3, USART_IT_RC) != RESET)//如果接受到了消息
{
RxDate = USART_ReceiveData_8bit(CW_UART3);//將的數據轉存在TxRxBuffer
UART_Flag=1;
USART_SendData_8bit(CW_UART3, RxDate);//將收到的消息發回給串口
USART_ClearITPendingBit(CW_UART3, USART_IT_RC);
}
}
/*復位或躺平姿態*/
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);
}
舵機角度限制,并輸出控制。
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.ns = 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.ReloValue =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);
}
三、展望與未來
由于該項目為初探控機器人控制,使用的是現有硬件資源進行組裝調試。后期有機會可以設計一款小巧控制板,裝入結構,形成獨立機器人。
另外,姿態控制算法在本實驗中并未提及,數學基礎較好的愛好者可作深入研究。
本次項目為作者初次嘗試,如有不足之處,歡迎批評指證。
上一篇:智能機器人行業的進化:開發門檻大降,大模型部署高性能低功耗兼得
下一篇:100T極致算力+全鏈路開發支持,地瓜機器人為具身智能造“基座”
- 熱門資源推薦
- 熱門放大器推薦
- 使用 Analog Devices 的 LTC4002EDD-8.4 的參考設計
- XRD9814EVAL,基于帶有 14 位 ADC 的 XRD9814 高性能模擬信號處理器的評估系統
- 冰墩墩掛件
- 4.2V/3.9V鋰電充電器
- LT8335IDDB 3V 至 6V 輸入、12V 升壓轉換器的典型應用電路
- NCV7755GEVB:NCV7755 簡單評估板
- LT3970EMS-5 5V 降壓轉換器在啟動期間具有降低的輸入電流的典型應用
- LTC2908CTS8-B1、3.3V 和 2.5V 雙電源監視器的典型應用電路,未來可能擴展至多達六個電源
- 使用 MaxLinear, Inc 的 SPX385AN-1.2 的參考設計
- 具有欠壓鎖定功能的 LT3973EDD-3.3 5V 降壓轉換器的典型應用
- 顛覆iToF技術,安森美如何突破30米深度感知極限?
- 利用驗證框架 JAIST揭示開源自動駕駛系統的安全漏洞
- 現代汽車集團擬采用VR模擬器替代道路測試 提升未來車型的競爭力
- 研究人員開發光驅動致動器 可用于驅動水下機器人
- 吉利將發射“千里浩瀚”衛星,實現輔助駕駛系統與衛星功能深度融合
- 以鴻道工業操作系統為核心 打造工業智能機器人新生態
- UNIST研發出新表面處理技術 延長下一代鋰金屬電池的壽命
- 車載SerDes芯片行業的"DeepSeek"時刻——瑞發科HSMT SerDes閃耀2025上海車展
- 豐田顛覆傳統,固態電池明年就能量產,最受傷的將是中國?
- 基于恩智浦與onsemi的駕駛員監控系統方案