原文引自CSDN社區(qū) 《[立創(chuàng)&傳智&黑馬程序員&CSDN]訓(xùn)練營(yíng)——仿生機(jī)械狗》
編者按 昨天的《玩嗨OpenHarmony:基于OpenHarmony的仿生四足狗開(kāi)發(fā)分享》,大家看到了一只12個(gè)自由度可在3D空間移動(dòng)的機(jī)械狗的開(kāi)發(fā)心得。今天分享的機(jī)械狗會(huì)更上一層樓,不僅僅支持藍(lán)牙操控實(shí)現(xiàn)復(fù)雜動(dòng)作,而且還是支持通過(guò)語(yǔ)音控制的哦。相信大家會(huì)喜歡。 1. 功能描述 話不多說(shuō),我們先上圖上視頻: 正視圖:
俯視圖:
視頻展示: 狗狗名字叫小嘉,目前這只狗狗已經(jīng)支持語(yǔ)音控制前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)、扭身子、握手、跳躍等;支持AP模式,用終端連接熱點(diǎn),訪問(wèn)網(wǎng)頁(yè)進(jìn)行控制;還支持使用HC05和藍(lán)牙調(diào)試器進(jìn)行控制;超聲波避障還在優(yōu)化中。 2. 硬件介紹 電源: 由于整個(gè)項(xiàng)目需要驅(qū)動(dòng)9個(gè)舵機(jī),需要比較大的電流,所以供電選用兩節(jié)18(直徑)65(長(zhǎng)度)0(圓柱形)鋰電池,電源部分主要使用12V-5V,以及5V-3.3V的LDO(這里有個(gè)優(yōu)化點(diǎn),當(dāng)時(shí)圖簡(jiǎn)單,使用的都是LDO(編者注:Low Dropout Regulator 線性穩(wěn)壓電源 的英文縮寫(xiě)),實(shí)測(cè)發(fā)熱還是比較嚴(yán)重,后面有打算換成DC/DC進(jìn)行供電)。 用到了LM1084 (商城料號(hào):C259973)和UZ1084(商城料號(hào):C84897)。
實(shí)際使用電路如下:
2.1 主控電路: 主控使用的是傳智教育的HI3861模組(商城料號(hào)C2923578),該模組內(nèi)置最小系統(tǒng)電路,簡(jiǎn)化了該部分電路設(shè)計(jì),只需要額外增加一個(gè)復(fù)位電路以及在電源部分添加一個(gè)100nF的旁路電容C7(大電容濾除低頻噪聲,小電容濾除高頻噪聲)即可。
下載電路: 在之前的鴻蒙訓(xùn)練營(yíng),沒(méi)有添加CH340需要外部接線,給我人接麻了,疼定思痛,加上了CH340G模塊,由于使用的是Typec接口,所以在CC1和CC2要下來(lái)倆個(gè)電阻,方便電腦識(shí)別如果不加有可能會(huì)識(shí)別不到。另外,Hi3861是3.3V電壓基準(zhǔn),為了保證統(tǒng)一電平,這里CH340G采用3.3V供電(上一期筆者有用5V供電燒錄失敗的經(jīng)歷)所以對(duì)應(yīng)的V3端口也要接3.3V,而非5V供電時(shí)的那樣。
PCB實(shí)物如下:
2.2 舵機(jī)驅(qū)動(dòng)模塊: 由于PCA9685商城沒(méi)有現(xiàn)貨,在某寶查了一下價(jià)格,買(mǎi)個(gè)芯片和買(mǎi)個(gè)模塊要花差不多的米,本著提高成功率的態(tài)度,買(mǎi)了模塊。
2.3 語(yǔ)音識(shí)別模塊:
語(yǔ)音識(shí)別使用的是鹿小班語(yǔ)音識(shí)別模塊,官方簡(jiǎn)介:
ASR-01是一顆專(zhuān)用于語(yǔ)音處理的人工智能芯片,可廣泛應(yīng)用于家電、家居、照明、玩具等產(chǎn)品領(lǐng)域,實(shí)現(xiàn)語(yǔ)音交互及控制。
ASR-ONE內(nèi)置自主研發(fā)的腦神經(jīng)網(wǎng)絡(luò)處理器BNPU(編者注:Brain Neural Network Processing Unit的英文縮寫(xiě)),支持200條命令詞以內(nèi)的本地語(yǔ)音識(shí)別,內(nèi)置CPU核和高性能低功耗Audio Codec模塊,集成多路UART(編者注:通用非同步收發(fā)傳輸器Universal Asynchronous Receiver/Transmitter的英文縮寫(xiě))、IIC(編者注:Inter-Integrated Circuit 內(nèi)部集成電路的英文縮寫(xiě))、PWM(編者注:Pulse Width Modulation 脈沖寬度調(diào)制的英文縮寫(xiě))、GPIO(編者注:General-purpose input/output 通用輸入輸出的英文縮寫(xiě))等外圍控制接口,可以開(kāi)發(fā)各類(lèi)高性價(jià)比單芯片智能語(yǔ)音產(chǎn)品方案。
他們近期出了一款PRO版本,據(jù)說(shuō)是支持聲紋識(shí)別的,筆者還沒(méi)買(mǎi)來(lái)嘗鮮,有興趣的同學(xué)自行了解吧。 2.4 超聲波模塊:
這里筆者使用的是2022款的超聲波測(cè)距模塊HC-SR04 超聲波傳感器,支持兼容UNO R3/51/STM32,該模塊支持普通GPIO模式、IIC模式、UART模式、1-Wire模式,由于串口和IIC已經(jīng)被用到了其他地方,所以只能選擇GPIO模式或者是1-Wire模式。筆者使用的是GPIO模式,不需要更改電阻。如果使用其他模式需要根據(jù)操作手冊(cè)進(jìn)行修改。 3. 軟件介紹 3.1 主體框架: 程序主體還是用的傳智官方的示例,在此基礎(chǔ)上進(jìn)行了億點(diǎn)點(diǎn)修改,主要是增加了一個(gè)串口任務(wù)和動(dòng)作邏輯。
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("======================================= "); // //通過(guò)串口1發(fā)送數(shù)據(jù) // IoTUartWrite(HI_UART_IDX_1, (unsigned char *)data, strlen(data)); //通過(guò)串口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; //設(shè)置GPIO_2引腳復(fù)用功能為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);動(dòng)作邏輯主要參考如下視頻:
// -------- -------- // | D9 | | D7 | // | joint9 | | joint7 | // ----- -------- --------- ----- // | D8 | | D6 | // | joint8 | | joint6 | // -------- -------- // | D2 | | D4 | // | joint2 | | joint4 | // ----- -------- --------- ----- // | D3 | | D5 | // | joint3 | | joint5 | // -------- -------- // Front ————————————————3.2 語(yǔ)音識(shí)別: 語(yǔ)音識(shí)別參考的筆者之前做的筆記: 《OpenHarmony學(xué)習(xí)筆記——Hi3861+ASR-01的語(yǔ)音識(shí)別助手》(https://blog.csdn.net/qq_41954556/article/details/123905578)。 由于功能比較簡(jiǎn)單,也就沒(méi)有去弄數(shù)據(jù)包,一個(gè)簡(jiǎn)單的開(kāi)頭和一個(gè)數(shù)字,然后使用atoi函數(shù)獲取數(shù)字,進(jìn)行判斷,最后執(zhí)行操作即可。
// An highlighted block enum{ Get_Down,//趴下 Hand_shake,//握手 Go_Forward,//前進(jìn) Go_Backward,//后退 Go_Left,//左轉(zhuǎn) Go_Right,//右轉(zhuǎn) Twist_Body,//扭身子 Stretch_Oneself,//伸懶腰 WAIT//d }; //檢測(cè)串口指令 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: // 前進(jìn)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顯示表情,這個(gè)需要找到表情包GIF然后分離出單幀表情,取模,顯示,詳細(xì)的取模過(guò)程參考博客:《0.96寸OLED取模教程——字符與圖片取模》(https://blog.csdn.net/qq_39400113/article/details/108036400) 語(yǔ)音識(shí)別的關(guān)鍵詞使用的是天問(wèn)的鹿小班模塊,內(nèi)置圖形化編程模塊,YYDS!會(huì)拖動(dòng)模塊就可以了,想玩語(yǔ)音識(shí)別的,強(qiáng)烈推薦此款。
3.3 超聲波測(cè)距: 這里筆者使用的是GPIO模式,利用兩個(gè)GPIO口進(jìn)行控制和捕獲,進(jìn)而計(jì)算出距離,詳細(xì)介紹請(qǐng)參考筆者的博客《OpenHarmony南向?qū)W習(xí)筆記——Hi3861+HC-SR04超聲波檢測(cè)》(https://blog.csdn.net/qq_41954556/article/details/125910794)
通信流程:
主控芯片與TRIG連接的IO配置為輸出模式,與ECHO連接的IO配置為輸入模式;
MCU(編者注:Micro Controller Unit 微控制單元的英文縮寫(xiě))給TRIG引腳輸出一個(gè)大于10us的高電平脈沖;
模塊通過(guò)ECHO腳返回一個(gè)高電平脈沖信號(hào);
主控記錄ECHO腳高電平脈沖時(shí)間T并代入公式計(jì)算。
代碼:
// 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);//設(shè)置Echo連接IO為普通GPIO模式,無(wú)復(fù)用 IoTGpioSetDir(Echo, IOT_GPIO_DIR_IN);//設(shè)置Echo連接IO為輸入模式 IoTGpioSetDir(Trig, IOT_GPIO_DIR_OUT);//設(shè)置Trig連接IO為輸出模式 /* ======== GPIO通信模式流程 2輸出起始信號(hào) =============== */ IoTGpioSetOutputVal(Trig, IOT_GPIO_VALUE1);//拉高Trig IoTUdelay(20);//20us IoTGpioSetOutputVal(Trig, IOT_GPIO_VALUE0);//拉低Trig /* ======== GPIO通信模式流程 3檢測(cè)Echo腳輸出的高電平時(shí)間 ==== */ while (1) { IoTGpioGetInputVal(Echo, &value);//讀取Echo腳的電平狀態(tài) if ( value == IOT_GPIO_VALUE1 && flag == 0) {//如果為高 start_time = IoTGetUs();//獲取此時(shí)時(shí)間 flag = 1; } if (value == IOT_GPIO_VALUE0 && flag == 1) {//高電平結(jié)束變成低電平 time = IoTGetUs() - start_time;//計(jì)算高電平維持時(shí)間 start_time = 0; break; } } /* ======== GPIO通信模式流程 4代入公式計(jì)算 ====== */ distance = time * 0.034 / 2; // printf("distance is %f ",distance); return distance; }4. 機(jī)械結(jié)構(gòu) 筆者也是第一次自己繪制3D結(jié)構(gòu)件,還不太OK啊,跟著畫(huà)了個(gè)錘子,然后覺(jué)著自己畫(huà)的結(jié)構(gòu)實(shí)在不太靠譜,于是去海鮮市場(chǎng)撈了一個(gè),有相同煩惱的同學(xué)可以去看看。
4.1 物料清單:
四足機(jī)器人3D打印件(打印件不是整機(jī),電子件、螺絲等自備)38 * 1
SG90 MG90S 9g舵機(jī) 固定翼航模遙控飛機(jī) 9克 馬達(dá)航模5.99 * 9
16路PWM舵機(jī)驅(qū)動(dòng)板PCA9685控制器機(jī)器人IIC適用MG90S SG90 MG995 19.6 * 1
鋰電池兩節(jié)18650或者2S,大約30-40,加上OLED、超聲波模塊,M3螺絲、螺母、銅柱、模組、芯片一起大約200成本。
總結(jié) 感謝立創(chuàng)EDA、傳智、黑馬程序員、CSDN提供的鴻蒙物聯(lián)網(wǎng)實(shí)戰(zhàn)訓(xùn)練營(yíng)活動(dòng),在本次活動(dòng)中學(xué)到了很多之前未接觸的知識(shí),受益良多。 寫(xiě)在最后 我們最近正帶著大家玩嗨OpenHarmony。如果你有好玩的東東,歡迎投稿,讓我們一起嗨起來(lái)!有點(diǎn)子,有想法,有Demo,立刻聯(lián)系我們: 合作郵箱:zzliang@atomsource.org
原文標(biāo)題:玩嗨OpenHarmony:基于OpenHarmony的機(jī)械狗進(jìn)階版——聽(tīng)話的狗子
文章出處:【微信公眾號(hào):開(kāi)源技術(shù)服務(wù)中心】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
機(jī)械狗
+關(guān)注
關(guān)注
0文章
18瀏覽量
4861 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3725瀏覽量
16370
原文標(biāo)題:玩嗨OpenHarmony:基于OpenHarmony的機(jī)械狗進(jìn)階版——聽(tīng)話的狗子
文章出處:【微信號(hào):開(kāi)源技術(shù)服務(wù)中心,微信公眾號(hào):共熵服務(wù)中心】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論