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