原文引自CSDN社區(qū) 《[立創(chuàng)&傳智&黑馬程序員&CSDN]訓練營——仿生機械狗》
編者按 昨天的《玩嗨OpenHarmony:基于OpenHarmony的仿生四足狗開發(fā)分享》,大家看到了一只12個自由度可在3D空間移動的機械狗的開發(fā)心得。今天分享的機械狗會更上一層樓,不僅僅支持藍牙操控實現(xiàn)復雜動作,而且還是支持通過語音控制的哦。相信大家會喜歡。 1. 功能描述 話不多說,我們先上圖上視頻: 正視圖:
俯視圖:
視頻展示: 狗狗名字叫小嘉,目前這只狗狗已經(jīng)支持語音控制前進、后退、左轉(zhuǎn)、右轉(zhuǎn)、扭身子、握手、跳躍等;支持AP模式,用終端連接熱點,訪問網(wǎng)頁進行控制;還支持使用HC05和藍牙調(diào)試器進行控制;超聲波避障還在優(yōu)化中。 2. 硬件介紹 電源: 由于整個項目需要驅(qū)動9個舵機,需要比較大的電流,所以供電選用兩節(jié)18(直徑)65(長度)0(圓柱形)鋰電池,電源部分主要使用12V-5V,以及5V-3.3V的LDO(這里有個優(yōu)化點,當時圖簡單,使用的都是LDO(編者注:Low Dropout Regulator 線性穩(wěn)壓電源 的英文縮寫),實測發(fā)熱還是比較嚴重,后面有打算換成DC/DC進行供電)。 用到了LM1084 (商城料號:C259973)和UZ1084(商城料號:C84897)。
實際使用電路如下:
2.1 主控電路: 主控使用的是傳智教育的HI3861模組(商城料號C2923578),該模組內(nèi)置最小系統(tǒng)電路,簡化了該部分電路設計,只需要額外增加一個復位電路以及在電源部分添加一個100nF的旁路電容C7(大電容濾除低頻噪聲,小電容濾除高頻噪聲)即可。
下載電路: 在之前的鴻蒙訓練營,沒有添加CH340需要外部接線,給我人接麻了,疼定思痛,加上了CH340G模塊,由于使用的是Typec接口,所以在CC1和CC2要下來倆個電阻,方便電腦識別如果不加有可能會識別不到。另外,Hi3861是3.3V電壓基準,為了保證統(tǒng)一電平,這里CH340G采用3.3V供電(上一期筆者有用5V供電燒錄失敗的經(jīng)歷)所以對應的V3端口也要接3.3V,而非5V供電時的那樣。
PCB實物如下:
2.2 舵機驅(qū)動模塊: 由于PCA9685商城沒有現(xiàn)貨,在某寶查了一下價格,買個芯片和買個模塊要花差不多的米,本著提高成功率的態(tài)度,買了模塊。
2.3 語音識別模塊:
語音識別使用的是鹿小班語音識別模塊,官方簡介:
ASR-01是一顆專用于語音處理的人工智能芯片,可廣泛應用于家電、家居、照明、玩具等產(chǎn)品領域,實現(xiàn)語音交互及控制。
ASR-ONE內(nèi)置自主研發(fā)的腦神經(jīng)網(wǎng)絡處理器BNPU(編者注:Brain Neural Network Processing Unit的英文縮寫),支持200條命令詞以內(nèi)的本地語音識別,內(nèi)置CPU核和高性能低功耗Audio Codec模塊,集成多路UART(編者注:通用非同步收發(fā)傳輸器Universal Asynchronous Receiver/Transmitter的英文縮寫)、IIC(編者注:Inter-Integrated Circuit 內(nèi)部集成電路的英文縮寫)、PWM(編者注:Pulse Width Modulation 脈沖寬度調(diào)制的英文縮寫)、GPIO(編者注:General-purpose input/output 通用輸入輸出的英文縮寫)等外圍控制接口,可以開發(fā)各類高性價比單芯片智能語音產(chǎn)品方案。
他們近期出了一款PRO版本,據(jù)說是支持聲紋識別的,筆者還沒買來嘗鮮,有興趣的同學自行了解吧。 2.4 超聲波模塊:
這里筆者使用的是2022款的超聲波測距模塊HC-SR04 超聲波傳感器,支持兼容UNO R3/51/STM32,該模塊支持普通GPIO模式、IIC模式、UART模式、1-Wire模式,由于串口和IIC已經(jīng)被用到了其他地方,所以只能選擇GPIO模式或者是1-Wire模式。筆者使用的是GPIO模式,不需要更改電阻。如果使用其他模式需要根據(jù)操作手冊進行修改。 3. 軟件介紹 3.1 主體框架: 程序主體還是用的傳智官方的示例,在此基礎上進行了億點點修改,主要是增加了一個串口任務和動作邏輯。
static void UART_Task(void) { IotUartAttribute uart_attr = { //baud_rate: 9600 .baudRate = 9600, //data_bits: 8bits .dataBits = 8, .stopBits = 1, .parity = 0, .rxBlock = 0, .txBlock = 0, }; //Initialize uart driver IoTUartInit(HI_UART_IDX_1, &uart_attr); while (1) { printf("======================================= "); printf("*************SIZU_example************** "); printf("======================================= "); // //通過串口1發(fā)送數(shù)據(jù) // IoTUartWrite(HI_UART_IDX_1, (unsigned char *)data, strlen(data)); //通過串口1接收數(shù)據(jù) IoTUartRead(HI_UART_IDX_1, uart_buff_ptr, UART_BUFF_SIZE); SIZU_Uart_Cmd((char *)uart_buff_ptr); printf("Uart1 read data:%s ", uart_buff_ptr); usleep(500000); } } static void start(void) { osThreadAttr_t attr; //設置GPIO_2引腳復用功能為PWM IoTIoSetFunc(IOT_IO_NAME_5, IOT_IO_FUNC_5_UART1_RXD); IoTIoSetFunc(IOT_IO_NAME_6, IOT_IO_FUNC_6_UART1_TXD); IoTIoSetFunc(IOT_IO_NAME_10, IOT_IO_FUNC_10_I2C0_SDA); IoTIoSetFunc(IOT_IO_NAME_9, IOT_IO_FUNC_9_I2C0_SCL); IoTI2cInit(0, 400000); dog_init(); genki_services_start(); init_service(); attr.name = "UART_Task"; attr.attr_bits = 0U; attr.cb_mem = NULL; attr.cb_size = 0U; attr.stack_mem = NULL; attr.stack_size = UART_TASK_STACK_SIZE; attr.priority = UART_TASK_PRIO; if (osThreadNew((osThreadFunc_t)UART_Task, NULL, &attr) == NULL) { printf("[ADCExample] Falied to create UART_Task! "); } } APP_FEATURE_INIT(start);動作邏輯主要參考如下視頻:
// -------- -------- // | D9 | | D7 | // | joint9 | | joint7 | // ----- -------- --------- ----- // | D8 | | D6 | // | joint8 | | joint6 | // -------- -------- // | D2 | | D4 | // | joint2 | | joint4 | // ----- -------- --------- ----- // | D3 | | D5 | // | joint3 | | joint5 | // -------- -------- // Front ————————————————3.2 語音識別: 語音識別參考的筆者之前做的筆記: 《OpenHarmony學習筆記——Hi3861+ASR-01的語音識別助手》(https://blog.csdn.net/qq_41954556/article/details/123905578)。 由于功能比較簡單,也就沒有去弄數(shù)據(jù)包,一個簡單的開頭和一個數(shù)字,然后使用atoi函數(shù)獲取數(shù)字,進行判斷,最后執(zhí)行操作即可。
// An highlighted block enum{ Get_Down,//趴下 Hand_shake,//握手 Go_Forward,//前進 Go_Backward,//后退 Go_Left,//左轉(zhuǎn) Go_Right,//右轉(zhuǎn) Twist_Body,//扭身子 Stretch_Oneself,//伸懶腰 WAIT//d }; //檢測串口指令 void SIZU_Uart_Cmd(char *str) { char *Str; unsigned char ID=255; Str=&str[1];//定位到指令的數(shù)字部分“U1” ID=atoi(Str); if(strstr((const char *)str,"G")!=NULL) //如果字符串str中包含有“G” { switch(ID) { case Get_Down: //趴下 G0 sithome(); printf("Get_Down "); break; case Hand_shake: // 握手G1 wink(10); printf("Handshake "); break; case Go_Forward: // 前進G2 forward(5); printf("Go_Forward "); break; case Go_Backward: // 后退G3 backward(5); printf("Go_Backward "); break; case Go_Left: // 左轉(zhuǎn)G4 leftturn(5); printf("Go_Left "); break; case Go_Right: // 右轉(zhuǎn)G5 rightturn(5); printf("Go_Right "); break; case Twist_Body: // 扭身子 twist(); printf("LED_Add "); break; case Stretch_Oneself: //伸懶腰 printf("LED_Reduce "); stand3(); break; default: printf("%s ERROR",str); standhome(); break; } } memset(uart_buff,0,sizeof(uart_buff)); }OLED顯示表情,這個需要找到表情包GIF然后分離出單幀表情,取模,顯示,詳細的取模過程參考博客:《0.96寸OLED取模教程——字符與圖片取?!罚╤ttps://blog.csdn.net/qq_39400113/article/details/108036400) 語音識別的關鍵詞使用的是天問的鹿小班模塊,內(nèi)置圖形化編程模塊,YYDS!會拖動模塊就可以了,想玩語音識別的,強烈推薦此款。
3.3 超聲波測距: 這里筆者使用的是GPIO模式,利用兩個GPIO口進行控制和捕獲,進而計算出距離,詳細介紹請參考筆者的博客《OpenHarmony南向?qū)W習筆記——Hi3861+HC-SR04超聲波檢測》(https://blog.csdn.net/qq_41954556/article/details/125910794)
通信流程:
主控芯片與TRIG連接的IO配置為輸出模式,與ECHO連接的IO配置為輸入模式;
MCU(編者注:Micro Controller Unit 微控制單元的英文縮寫)給TRIG引腳輸出一個大于10us的高電平脈沖;
模塊通過ECHO腳返回一個高電平脈沖信號;
主控記錄ECHO腳高電平脈沖時間T并代入公式計算。
代碼:
// An highlighted block #define Echo 8 //Echo //GPIO8 #define Trig 7 //Trig //GPIO7 #define GPIO_FUNC 0 float GetDistance (void) { static unsigned long start_time = 0, time = 0; float distance = 0.0; IotGpioValue value = IOT_GPIO_VALUE0; unsigned int flag = 0; /*========GPIO通信模式流程1初始化GPIO =============== */ IoTIoSetFunc(Echo, GPIO_FUNC);//設置Echo連接IO為普通GPIO模式,無復用 IoTGpioSetDir(Echo, IOT_GPIO_DIR_IN);//設置Echo連接IO為輸入模式 IoTGpioSetDir(Trig, IOT_GPIO_DIR_OUT);//設置Trig連接IO為輸出模式 /* ======== GPIO通信模式流程 2輸出起始信號 =============== */ IoTGpioSetOutputVal(Trig, IOT_GPIO_VALUE1);//拉高Trig IoTUdelay(20);//20us IoTGpioSetOutputVal(Trig, IOT_GPIO_VALUE0);//拉低Trig /* ======== GPIO通信模式流程 3檢測Echo腳輸出的高電平時間 ==== */ while (1) { IoTGpioGetInputVal(Echo, &value);//讀取Echo腳的電平狀態(tài) if ( value == IOT_GPIO_VALUE1 && flag == 0) {//如果為高 start_time = IoTGetUs();//獲取此時時間 flag = 1; } if (value == IOT_GPIO_VALUE0 && flag == 1) {//高電平結(jié)束變成低電平 time = IoTGetUs() - start_time;//計算高電平維持時間 start_time = 0; break; } } /* ======== GPIO通信模式流程 4代入公式計算 ====== */ distance = time * 0.034 / 2; // printf("distance is %f ",distance); return distance; }4. 機械結(jié)構(gòu) 筆者也是第一次自己繪制3D結(jié)構(gòu)件,還不太OK啊,跟著畫了個錘子,然后覺著自己畫的結(jié)構(gòu)實在不太靠譜,于是去海鮮市場撈了一個,有相同煩惱的同學可以去看看。
4.1 物料清單:
四足機器人3D打印件(打印件不是整機,電子件、螺絲等自備)38 * 1
SG90 MG90S 9g舵機 固定翼航模遙控飛機 9克 馬達航模5.99 * 9
16路PWM舵機驅(qū)動板PCA9685控制器機器人IIC適用MG90S SG90 MG995 19.6 * 1
鋰電池兩節(jié)18650或者2S,大約30-40,加上OLED、超聲波模塊,M3螺絲、螺母、銅柱、模組、芯片一起大約200成本。
總結(jié) 感謝立創(chuàng)EDA、傳智、黑馬程序員、CSDN提供的鴻蒙物聯(lián)網(wǎng)實戰(zhàn)訓練營活動,在本次活動中學到了很多之前未接觸的知識,受益良多。 寫在最后 我們最近正帶著大家玩嗨OpenHarmony。如果你有好玩的東東,歡迎投稿,讓我們一起嗨起來!有點子,有想法,有Demo,立刻聯(lián)系我們: 合作郵箱:[email protected]
![]() |
原文標題:玩嗨OpenHarmony:基于OpenHarmony的機械狗進階版——聽話的狗子
文章出處:【微信公眾號:開源技術(shù)服務中心】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
-
機械狗
+關注
關注
0文章
18瀏覽量
4869 -
OpenHarmony
+關注
關注
25文章
3749瀏覽量
16638
原文標題:玩嗨OpenHarmony:基于OpenHarmony的機械狗進階版——聽話的狗子
文章出處:【微信號:開源技術(shù)服務中心,微信公眾號:共熵服務中心】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
OpenHarmony程序分析框架論文入選ICSE 2025
![<b class='flag-5'>OpenHarmony</b>程序分析框架論文入選ICSE 2025](https://file1.elecfans.com/web3/M00/04/96/wKgZO2d2KGCAUcJVAAAk9btwCMQ998.png)
OpenHarmony應用開發(fā)精品課程重磅來襲
![<b class='flag-5'>OpenHarmony</b>應用開發(fā)精品課程重磅來襲](https://file1.elecfans.com/web2/M00/0B/A2/wKgaomcl7I6ALF_mAABKmm_UzRw351.png)
第三屆OpenHarmony技術(shù)大會星光璀璨、致謝OpenHarmony社區(qū)貢獻者
第三屆OpenHarmony技術(shù)大會 “OpenHarmony開發(fā)者激勵計劃”授牌儀式圓滿舉行
![第三屆<b class='flag-5'>OpenHarmony</b>技術(shù)大會 “<b class='flag-5'>OpenHarmony</b>開發(fā)者激勵計劃”授牌儀式圓滿舉行](https://file1.elecfans.com/web1/M00/F3/55/wKgZoWcVzxCASN0LAAAYOsR_Kuo899.jpg)
OpenHarmony年度技術(shù)俱樂部、個人及活動評選結(jié)果公示
基于ArkTS語言的OpenHarmony APP應用開發(fā):HelloOpenharmony
![基于ArkTS語言的<b class='flag-5'>OpenHarmony</b> APP應用開發(fā):Hello<b class='flag-5'>Openharmony</b>](https://file.elecfans.com/web2/M00/26/21/pYYBAGG5jjSALfrEAAAwAa9Oig8799.png)
基于ArkTS語言的OpenHarmony APP應用開發(fā):HelloOpenharmony
河南大學OpenHarmony技術(shù)俱樂部正式揭牌成立
![河南大學<b class='flag-5'>OpenHarmony</b>技術(shù)俱樂部正式揭牌成立](https://file1.elecfans.com/web2/M00/06/04/wKgaombWxOqAQD0cAAAfRRDqwjM483.jpg)
openharmony移植AT32F407編譯時錯誤
OpenHarmony之開機優(yōu)化
鴻蒙OpenHarmony【創(chuàng)建工程并獲取源碼】
![鴻蒙<b class='flag-5'>OpenHarmony</b>【創(chuàng)建工程并獲取源碼】](https://file1.elecfans.com/web2/M00/C9/99/wKgaomYeL0WAZFDHAAACSiKnE8w930.jpg)
OpenHarmony南向能力征集令
OpenAtom OpenHarmony 4.1 Release版本正式發(fā)布
OpenHarmony內(nèi)核編程實戰(zhàn)
![<b class='flag-5'>OpenHarmony</b>內(nèi)核編程實戰(zhàn)](https://file1.elecfans.com/web2/M00/8F/50/wKgZomTMciWAD54NAABOGP2pQZY452.png)
評論