STM32單片機的桌面寵物機器人(基于HAL庫)

?效果

基于STM32單片機的桌面寵物機器人

概要

語音模塊:ASR PRO,通過天問block軟件燒錄語音指令

主控芯片:STM32F103C8T6 使用HAL庫

屏幕:0.96寸OLED屏,用來顯示表情

4個舵機,用來當作四只腿

底部一個面包板

?分析

初始化代碼,使用TIM3定時器的四個通道輸出PWM驅動舵機,控制腿部的運動

    HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2);HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_4);OLED_Init();OLED_Clear();OLED_ShowImage(0, 0, 128, 64, BMP1);mode_stand();

ASR PRO獲取到語音后通過串口通信把數據發送到STM32,在單片機內使用中斷的方式獲取語音數據,,然后根據語音指令判斷當前的動作

    while (1) {HAL_UART_Receive_IT(&huart1, &command, 1);if (command == 0x32) {  // 前進mode_forward();} else if (command == 0x31) {mode_slowstand();} else if (command == 0x33) {  // 后退mode_behind();} else if (command == 0x34) {  // 左轉mode_left();} else if (command == 0x35) {  // 右轉mode_right();} else if (command == 0x36) {  // 前后搖擺mode_swing_qianhou();} else if (command == 0x37) {  // 左右搖擺mode_swing_zuoyou();} else if (command == 0x38) {  // 跳舞mode_dance();} else if (command == 0x39) {  // 立正mode_stand();} else if (command == 0x41) {  // 起身mode_slowstand();} else if (command == 0x61) {  // 坐下mode_strech();} else if (command == 0x63) {  // 伸懶腰mode_lanyao();} else if (command == 0x64) {  // 抬頭mode_headup();} else if (command == 0x65) {  // 趴下睡覺mode_sleeppa();} else if (command == 0x66) {  // 臥下睡覺mode_sleepwo();} else if (command == 0x68) {  // 睡覺mode_sleepwo();}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}

分別展示對應的表情和動作,OLED直接用的現成的庫

#include "Mode.h"
#include <stdlib.h>
#include "Movement.h"
#include "OLED.h"
#include "gpio.h"
#include "main.h"extern uint8_t command;
uint8_t previousCommand = 0;void mode_forward(void)  // 前進
{OLED_ShowImage(0, 0, 128, 64, BMP2);  // 前進臉move_forward();HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;
}
void mode_behind(void)  // 后退
{OLED_ShowImage(0, 0, 128, 64, BMP2);  // 前進臉move_behind();HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;
}
void mode_left(void)  // 左轉
{OLED_ShowImage(0, 0, 128, 64, BMP3);  // 左轉臉move_left();HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;
}
void mode_right(void)  // 右轉
{OLED_ShowImage(0, 0, 128, 64, BMP4);  // 右轉臉move_right();HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;
}void mode_swing_qianhou(void)  // 前后搖擺
{OLED_ShowImage(0, 0, 128, 64, BMP11);  // 迷糊臉move_shake_qianhou();HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;
}
void mode_swing_zuoyou(void)  // 左右搖擺
{OLED_ShowImage(0, 0, 128, 64, BMP11);  // 迷糊臉move_shake_zuoyou();HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;
}void mode_dance(void)  // 跳舞
{OLED_ShowImage(0, 0, 128, 64, BMP5);  // 特殊臉move_dance();HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;
}
void mode_stand(void)  // 立正
{OLED_ShowImage(0, 0, 128, 64, BMP1);  // 立正臉move_stand();HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;command = 0;HAL_Delay(1000);
}
void mode_slowstand(void)  // 起身
{OLED_ShowImage(0, 0, 128, 64, BMP1);  // 立正臉move_slow_stand(previousCommand);HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;command = 0;
}
void mode_strech(void)  // 坐下
{OLED_ShowImage(0, 0, 128, 64, BMP1);  // 立正臉move_slow_stand(previousCommand);OLED_ShowImage(0, 0, 128, 64, BMP2);  // 前進臉,move_stretch();OLED_ShowImage(0, 0, 128, 64, BMP12);  // 貓貓臉HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;command = 0;
}
void mode_twohands(void)  // 交替抬手
{OLED_ShowImage(0, 0, 128, 64, BMP1);  // 立正臉move_stand();move_two_hands();HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;command = 0;
}
void mode_lanyao(void)  // 懶腰
{OLED_ShowImage(0, 0, 128, 64, BMP1);  // 立正臉move_slow_stand(previousCommand);OLED_ShowImage(0, 0, 128, 64, BMP9);  // 開心臉lan_yao();OLED_ShowImage(0, 0, 128, 64, BMP1);  // 立正臉HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;command = 0;
}
void mode_headup(void)  // 抬頭
{OLED_ShowImage(0, 0, 128, 64, BMP1);  // 立正臉move_slow_stand(previousCommand);OLED_ShowImage(0, 0, 128, 64, BMP10);  // 調皮臉move_head_up();HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);previousCommand = command;command = 0;
}
void mode_sleeppa(void)  // 趴下睡覺
{OLED_ShowImage(0, 0, 128, 64, BMP1);  // 立正臉move_slow_stand(previousCommand);if (rand() % 2) {                         // 隨機產生兩種表情中的一種OLED_ShowImage(0, 0, 128, 64, BMP6);  // 普通睡覺臉} else {OLED_ShowImage(0, 0, 128, 64, BMP8);  // 酣睡臉}move_sleep_p();previousCommand = command;command = 0;
}
void mode_sleepwo(void)  // 臥下睡覺
{OLED_ShowImage(0, 0, 128, 64, BMP1);  // 立正臉move_slow_stand(previousCommand);if (rand() % 2) {                         // 隨機產生兩種表情中的一種OLED_ShowImage(0, 0, 128, 64, BMP6);  // 普通睡覺臉} else {OLED_ShowImage(0, 0, 128, 64, BMP8);  // 酣睡臉}move_sleep_w();previousCommand = command;command = 0;
}
void mode_nanshou(void)  // 難受
{OLED_ShowImage(0, 0, 128, 64, BMP2);  // 前進臉move_sleep_w();previousCommand = command;command = 0;
}

部分動作實現,分別設置對應腿的角度,通過延時達到效果

void move_stand(void) {  // 站立Servo_SetAngle1(90);Servo_SetAngle2(90);Servo_SetAngle3(90);Servo_SetAngle4(90);HAL_Delay(500);
}void move_forward(void) {  // 前進Servo_SetAngle1(135);Servo_SetAngle4(45);HAL_Delay(movedelay);Servo_SetAngle2(45);Servo_SetAngle3(135);HAL_Delay(movedelay);Servo_SetAngle1(90);Servo_SetAngle4(90);HAL_Delay(movedelay);Servo_SetAngle2(90);Servo_SetAngle3(90);HAL_Delay(movedelay);Servo_SetAngle2(135);Servo_SetAngle3(45);HAL_Delay(movedelay);Servo_SetAngle1(45);Servo_SetAngle4(135);HAL_Delay(movedelay);Servo_SetAngle2(90);Servo_SetAngle3(90);HAL_Delay(movedelay);Servo_SetAngle1(90);Servo_SetAngle4(90);HAL_Delay(movedelay);
}void move_behind(void) {  // 后退Servo_SetAngle1(45);Servo_SetAngle4(135);HAL_Delay(movedelay);Servo_SetAngle2(135);Servo_SetAngle3(45);HAL_Delay(movedelay);Servo_SetAngle1(90);Servo_SetAngle4(90);HAL_Delay(movedelay);Servo_SetAngle2(90);Servo_SetAngle3(90);HAL_Delay(movedelay);Servo_SetAngle2(45);Servo_SetAngle3(135);HAL_Delay(movedelay);Servo_SetAngle1(135);Servo_SetAngle4(45);HAL_Delay(movedelay);Servo_SetAngle2(90);Servo_SetAngle3(90);HAL_Delay(movedelay);Servo_SetAngle1(90);Servo_SetAngle4(90);HAL_Delay(movedelay);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76054.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76054.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76054.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機視覺初步(環境搭建)

1.anaconda 建議安裝在D盤&#xff0c;官網正常安裝即可&#xff0c;一般可以安裝windows版本 安裝成功后&#xff0c;可以在電腦應用里找到&#xff1a; 2.創建虛擬環境 打開anaconda prompt&#xff0c; 可以用conda env list 查看現有的環境&#xff0c;一般打開默認bas…

SQL Server數據庫引擎服務啟動失敗:端口沖突

問題現象&#xff1a; SQL Server 2022 安裝完成后&#xff0c;數據庫引擎服務無法啟動&#xff0c;日志報錯 “TCP 端口 1433 已被占用”&#xff08;ERROR_LOG_SYS_TCP_PORT&#xff09;。 快速診斷 檢測端口占用&#xff1a; # 查看 1433 端口占用情況&#xff08;需管理員權…

全局思維與系統思考

最近接到一些需求&#xff0c;1號位希望每個層級的領導者有眼界&#xff0c;胸懷&#xff0c;格局&#xff0c;全局觀&#xff0c;這些聽起來似乎很抽象&#xff0c;然而它們是每個人、每個團隊成長與成功的核心競爭力。那么&#xff0c;如何才能提升這些能力&#xff1f;就像我…

區間有關的貪心解題記錄435無重疊區間452用最少數量的箭引爆氣球

無重疊區間我的想法是開一個數組a&#xff0c;遍歷給出的區間&#xff0c;在數組a里將對應落在的區間index標記。如果有重復區間就只選擇最小的那個區間標記。但是這道題的區間好像很長-5 * 104 < starti < endi < 5 * 104沒法用數組a表示總的區間范圍。 核心思路是當…

天銳藍盾終端安全防護——企業終端設備安全管控

從辦公室的臺式電腦到員工手中的移動終端&#xff0c;這些設備不僅是工作的得力助手&#xff0c;更是企業數據的重要載體。然而&#xff0c;隨著終端設備的廣泛使用&#xff0c;安全風險也如影隨形。硬件設備使用不當、數據隨意傳輸等問題頻發&#xff0c;使得企業數據面臨著泄…

k8s網絡策略

k8s網絡策略 k8s網絡測試概述查看防火墻策略 k8s網絡策略網絡訪問控制案例&#xff1a;配置k8s網絡策略結果驗證 k8s網絡策略配置示例 k8s網絡測試概述 網絡策略就是設置防火墻 查看防火墻策略 # 獲取當前命名空間下的所有 NetworkPolicy 資源&#xff08;網絡策略&#xff0…

leetcode刷題日記——跳躍游戲 II

[ 題目描述 ]&#xff1a; [ 思路 ]&#xff1a; 題目要求在一個一定能達到數組末尾的跳躍數組中(見55題 跳躍游戲)&#xff0c;找出能夠跳到末尾的最小次數要求次數最少&#xff0c;那肯定是選取能選步數中最大的數。也就是在當前能夠達到的距離中&#xff0c;選擇能夠達到的…

【Java SE】Java比較器:Comparable、Comparator

目錄 1.前言 2.Comaprable接口 2.1 使用細節 2.2 案例演示 3.Comparator接口 3.1 為什么需要Comparator接口 3.2 使用細節 3.3 案例演示 4.Comparable、Comparator對比 1.前言 Java 中的對象&#xff0c;正常情況下&#xff0c;只能進行比較&#xff1a; 或 ! 。不…

(二)創建實例

在這節中&#xff0c; 創建一個實例初始化Vulkan庫,指定驅動程序需要使用的應用程序信息 1&#xff0c;要有個實例句柄 VkInstance instance; 2&#xff0c;設置創建Vulkan驅動程序需要的信息&#xff0c; VkInstanceCreateInfo createInfo {}; createInfo.sType VK_STRUCTUR…

HCIP之VRRP

1. VRRP是什么 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;虛擬路由冗余協議&#xff09;是一種用于提高網絡可靠性的容錯協議。它通過將多臺路由器虛擬成一臺虛擬路由器&#xff0c;實現網關的冗余備份。當主路由器&#xff08;Master&#xff09;出現故…

高效內存管理:x86-64架構中的分頁機制

在 x86-64 架構的世界里&#xff0c;內存分頁機制扮演著舉足輕重的角色&#xff0c;它就像是一座橋梁&#xff0c;連接著虛擬地址與物理地址。簡單來說&#xff0c;內存分頁機制就是將線性地址&#xff08;也就是虛擬地址&#xff09;切分成一個個固定大小的頁&#xff0c;并把…

【軟件工程】填空題

真題 2024-10 16.數據字典是用來定義_____中各個成分的具體含義的。 17.模塊設計的基本原則是_____。 18.接口是操作的一個集合,其中每個操作描述了類、構件或子系統的一個_____。 19.耦合是指不同模塊之間_____的度量。 20.RUP的突出特點是,它是一種以用況為驅動的、…

第二卷:海鹽城血戰(37-72回)正反人物群像

第二卷&#xff1a;海鹽城血戰&#xff08;37-72回&#xff09;正反人物群像 核心矛盾&#xff1a;寒門軍事崛起 → 內部傾軋 → 制度性腐敗 主題&#xff1a;通過人物群像展現寒門勝利的虛幻性與權力異化的必然性 一、正派陣營&#xff08;寒門抗爭勢力&#xff09; 1. 劉裕…

23_js面向對象

上次我們講運動函數&#xff0c;實際開發不會寫運動函數。只是講一下思想。 現在講一下用原生js去實現輪播圖&#xff0c;引入到對象 首先&#xff0c;要明確 面向對象不是語法&#xff0c;是一個思想&#xff0c;是一種編程模式 面向&#xff1a;朝向 面向對象&#xff1a…

torch不能使用cuda的解決方案

遇到了這樣的報錯&#xff0c;說明 torch不能使用cuda 反思 我頻繁地嘗試安裝不同的 nvdia 驅動&#xff0c;浪費了很多時間。因為我的錯誤地認為nvidia會自帶cuda&#xff0c;其實cuda需要單獨安裝。 還有我的torch是cpu版本的&#xff0c;即使nvidia cuda安裝了&#xff0…

kettle從入門到精通 第九十三課 ETL之kettle kettle 調用web service接口5種方法,一文徹底搞懂

場景&#xff1a;群里有小伙伴向我求助如何調用web service接口&#xff0c;趁著周末時間&#xff0c;給兄弟們搞demo。 1、本次使用的web service服務接口地址是http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?opgetSupportCityDataset&#xff0c; 此接口根據用戶輸入…

藍橋杯 14 天 十五屆藍橋杯 數字詩意

static boolean kkk(long x) {if(x1)return true;else {// 初始化xx為1&#xff0c;用于計算2的冪long xx 1;// 循環60次&#xff0c;檢查2的冪是否等于xfor (int i 1; i < 60; i) {xx * 2; // 每次將xx乘以2if (xx x) { // 如果xx等于x&#xff0c;說明x是2的冪&#xf…

異常與捕獲

1.C 異常概念 異常是一種處理錯誤的方式&#xff0c;當一個函數發現自己無法處理的錯誤時就可以拋出異常&#xff0c;讓函數的直接或間接的調用者處理這個錯誤。 throw&#xff1a;當問題出現時&#xff0c;程序會拋出一個異常。這是通過使用 throw 關鍵字來完成的。catch&am…

2025年最新自動化/控制保研夏令營預推免面試真題分享(東南大學蘇州校區/華東理工/南航/天大)

筆者來2021級本科自動化專業&#xff0c;以下部分將介紹我在夏令營以及預推免期間發生經歷和問題 東南大學蘇州校區蒙納士大學聯培 東南大學蘇州校區的項目算是一個比較小眾的項目&#xff0c;是第一年在蘇州校區&#xff0c;二三年到南京校區找導師&#xff08;不提供住宿自…

【SQL】MySQL基礎2——視圖,存儲過程,游標,約束,觸發器

文章目錄 1. 視圖2. 存儲過程2.1 創建存儲過程2.2 執行存儲過程 3. 游標4. 約束4.1 主鍵約束4.2 外鍵約束4.3 唯一約束4.4 檢查約束 5. 觸發器 1. 視圖 視圖是虛擬的表&#xff0c;它是動態檢索的部分。使用視圖的原因&#xff1a;避免重復的SQL語句&#xff1b;使用表的部分而…