【毕业设计】stm32单片机智能扫地机器人 - 嵌入式 物联网
文章目錄
- 0 簡介
- 1 課題背景
- 2 硬件系統總體框架
- 2.1 電機驅動
- 2.2 紅外線傳感器
- 2.3 超聲波傳感器
- 2.4 MPU6050
- 2.5 ATK-ESP8266 WI FI 模塊
- 2.6 電源管理模塊
- 3 軟件系統設計
- 3.1 MPU6050 數據讀取
- 3.2 超聲波傳感器數據讀取
- 3.3 電機控制
- 3.3.1 PID控制
- 3.4 掃地機器人路徑規劃
- 3.4.1 弓字型行走
- 4 測試
0 簡介
🔥 Hi,大家好,這里是丹成學長的畢設系列文章!
🔥 對畢設有任何疑問都可以問學長哦!
這兩年開始,各個學校對畢設的要求越來越高,難度也越來越大… 畢業設計耗費時間,耗費精力,甚至有些題目即使是專業的老師或者碩士生也需要很長時間,所以一旦發現問題,一定要提前準備,避免到后面措手不及,草草了事。
為了大家能夠順利以及最少的精力通過畢設,學長分享優質畢業設計項目,今天要分享的新項目是
🚩 基于stm32的智能掃地機器人設計與實現
🥇學長這里給一個題目綜合評分(每項滿分5分)
- 難度系數:4分
- 工作量:4分
- 創新點:3分
🧿 選題指導, 項目分享:
https://blog.csdn.net/molodi/article/details/125933857
1 課題背景
隨著人口老齡化的到來和人民對提升生活品質的需要, 人們對在現實生活場景中取代人力的服務機器人有著迫切的需要。 同時, 機電、 自動控制、 計算機、 傳感器等技術的發展也為制造服務機器人提供了技術支持。 掃地機器人是服務機器人中技術最成熟和最為廣泛使用的機器人。 它可以自動的在室內行走, 通過刷掃和吸塵將地面上的碎屑吸收進垃圾收集裝置中, 完成清潔地面的任務,有效的減少了人們清潔地面這種簡單重復的家務勞動, 節約了勞動力, 提高了生活品質。 對于許多忙于工作和生的人來說,掃地機器人已經成為家庭必備的產品。
2 硬件系統總體框架
學長設計的是一個傳統的掃地機器人,它使用紅外傳感器和超聲波傳感器來檢測障礙物,以及一個MPU6050運動傳感器來計算旋轉角度。使用兩個直流減速電機驅動車輪實現行走,兩邊的編碼器可以通過計算編碼器產生的脈沖數量來計算車輪的速度和距離。為了方便實驗過程及時獲取傳感器數據和向掃地機器人發送開機、關機命令,連接了一個ATK-ESP8266WIFI模塊,使用筆記本電腦安裝網絡調試助手軟件實現和WIFI模塊的通訊。該平臺的動力單元為一個電壓為12V、容量為9000mAh電池包,為電機驅動提供電力,并經過穩壓后為控制單元提供動力。主控制單元用于控制整個機器人,STM32F103ZET6被用作控制芯片,主控單元執行機械驅動、運動控制和傳感器數據采集等任務。
2.1 電機驅動
由于單片機輸出的電流不足以驅動電機,所以必須通過電機驅動模塊驅動電機。對于直流電機通常使用H橋驅動芯片進行驅動,本課題采用了兩塊L298N驅動模塊。L298N是專用驅動集成電路,屬于H橋集成電路。使用了ST公司的原裝全新芯片L298N,采用穩定性高的SMT工藝,使用了高質量的鋁電解電容,使電路工作穩定。作為直流電機驅動時,可以同時驅動兩路3-16V的直流電機。同時驅動板還提供了5V電源輸出接口,可以用于5V單片機的電路系統供電。支持3.3VMCUARM控制,可以通過單片機方便的控制直流電機的功率和轉動方向,也可以用于控制2相步進電機,5線4相步進電機。
雖然L298N驅動板可以個同時驅動兩個直流電機,但長時間工作在大功率條件下,驅動板可能出現過熱、燒板等問題。為了提高硬件系統穩定性,本課題中使用兩塊L298N驅動板,一塊驅動板控制一個電機。L298N驅動板的IN3IN4EN2OUT3OUT4直接浮空,VCC輸入12V電機驅動電源正極,負極接GND,VCC5V接5V電源正極,負極接地,EN1IN1連接STM32控制電機正反轉和啟停,IN2輸入PWM波。OUT1OUT2連接電機。
2.2 紅外線傳感器
這次的項目中, 學長設計通過紅外傳感器檢測掃地機器人運動方向是否有障礙物, 從而實現掃地機器人的自動避障的功能。 選用的E18-D80NK 型紅外傳感器電路如圖所示。
紅外傳感器使用 5V 電源供電, STM32 通過讀取黃色信號線的高低電平確定是否存在障礙物, 感應距離可以通過紅外傳感器上的旋鈕在 3-77cm 的范圍內進行調整。 在電路設計中在輸出端黃線加上拉電阻 10K 到 5V 電源, 再接入單片機檢測, 會比較穩定。
2.3 超聲波傳感器
學長選用US-100 超聲波測距模塊, US-100 超聲波測距模塊能夠通過自帶的溫度傳感器測量溫度并對測量結果進行校正。 可以通過GPIO或串口與單片機通信, 性能穩定。
US-100 超聲波測距模塊具有1個模式選擇跳線和5Pin接口, 本課題使用串口模式, 必須插上跳線帽, 5個接口1號Pin接VCC 5V電源, 2號Pin接外部電路UART 的 TX 端, 3號Pin接外部電路UART的 RX 端, 4號Pin接外部電路的地。5 號Pin接外部電路的地。
2.4 MPU6050
MPU6050 是全球首例 9 軸運動處理傳感器, 它集成了 3 軸 MEMS 陀螺儀, 3 軸 MEMS 加速度計, 以及一個可擴展的數字運動處理器 DMP。
MPU6050 電路連接圖
2.5 ATK-ESP8266 WI FI 模塊
ATK-ESP8266是ALIENTEK推出的一款高性能的UART-WiFi(串口-無線)模塊, ATK-ESP8266板載ai-thinker公司的ESP8266模塊。
ATK_ESP8266 模塊電路連接圖
2.6 電源管理模塊
電源管理模塊用于給控制系統個電路模塊供電, 由于電池電壓為 12V, 主控芯片供電電壓為 3. 3V, 不能直接為主控芯片供電, 同時部分外部功能模塊需要 5V 電壓供電, 因此本課題設計有降壓電路、 電壓選擇電路和 3. 3V/5V 輸出電路, 可以滿足控制系統的供電需要。 DC_IN 用于外部直流電源輸入, 范圍是DC6~24V, 輸入電壓經過 MP2359 芯片轉換為 5V 電源輸出, 其中 D4 是防反接二極管, 避免外部直流電源極性搞錯的時候, 燒壞控制系統電路。
3 軟件系統設計
學長設計的整體軟件架構如下:
3.1 MPU6050 數據讀取
MPU6050 傳感器內部包含陀螺儀和加速度計, 而且自帶了數字運動處理器,即 DMP通過 InvenSense 提供的 MPU6050 嵌入式運動驅動庫, 可以將陀螺儀和加速度計的原始數據直接轉換成四元數輸出, 通過四元數轉換可以直接計算出歐拉角從而得到: 航向角(yaw) 、 橫滾角(roll) 和俯仰角(pitch)。
學長這里選定了以 I2C 通信對 MPU6050 的 DMP 輸出的四元數進行讀取。
初始化 I2C 接口, 編程代碼下
1 void HmcIICInit(void) 2.{ 3. /*GPIO 初始化*/ 4. GPIO_InitTypeDef GPIO_InitStructure; 5. /* 配置硬件 IIC 需要的變量 */ 6. I2C_InitTypeDef I2C_InitStructure; 7. 8. /* 使能與 I2C1 有關的時鐘 */ 9. RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB,ENABLE ); 10. RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE); 11. 12. /* PB6-I2C1_SCL、 PB7-I2C1_SDA*/ 13. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; 14. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 15. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; 16. GPIO_Init(GPIOB, &GPIO_InitStructure); 17. 18. /*IIC 外設初始化*/ 19. 20. /* I2C 配置 */ 21. I2C_InitStructure.I2C_Mode = I2C_Mode_I2C ; //配置為普通 IIC 模式 22. //I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; 23.//I2C_InitStructure.I2C_OwnAddress1 = SlaveAddress; 24. I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; //使能自動應答 25. I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; 26. I2C_InitStructure.I2C_ClockSpeed = 50000; //5K 的速度 27. 28. 29. /* I2C1 初始化 */ 30. I2C_Init(I2C1, &I2C_InitStructure); 31. 32. /* 使能 I2C1 */ 33. I2C_Cmd (I2C1,ENABLE); 34. /*允許應答模式*/ 35. I2C_AcknowledgeConfig(I2C1, ENABLE);配置系統時鐘源并使能角速度傳感器和加速度傳感器, 代碼實現如下:
1. u8 MPU_Init(void) 2. { 3. u8 res; 4. IIC_Init();//初始化 IIC 總線 5. MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80); //復位 MPU6050 6. delay_ms(100); 7. MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00); //喚醒 MPU6050 8. MPU_Set_Gyro_Fsr(3); //陀螺儀傳感器, ±2000dps 9. MPU_Set_Accel_Fsr(0); //加速度傳感器,±2g 10. MPU_Set_Rate(50); //設置采樣率 50Hz 11. MPU_Write_Byte(MPU_INT_EN_REG, 0X00); //關閉所有中斷 12. MPU_Write_Byte(MPU_USER_CTRL_REG,0X00); //I2C 主模式關閉 13. MPU_Write_Byte(MPU_FIFO_EN_REG,0X00); //關閉 FIFO 14. MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80); //INT 引腳低電平有效 15. res=MPU_Read_Byte(MPU_DEVICE_ID_REG); 16. if(res==MPU_ADDR)//器件 ID 正確 17. { 18. MPU_Write_Byte(MPU_PWR_MGMT1_REG, 0X01); //設置 CLKSEL, PLL X 軸為參考 19. MPU_Write_Byte(MPU_PWR_MGMT2_REG, 0X00); //加速度與陀螺儀都工作 20. MPU_Set_Rate(50); //設置采樣率為 50Hz 21. }else return 1; 22. return 0; 23. } 24. //設置 MPU6050 陀螺儀傳感器滿量程范圍 25. //fsr: 0,±250dps;1,±500dps;2, ±1000dps;3,±2000dps 26.//返回值:0, 設置成功3.2 超聲波傳感器數據讀取
編寫超聲波發送函數, 串口發送0X55到超聲波模塊。相關代碼如下;
1. void uart_init(u32 bound) { 2. //GPIO端口設置 3. GPIO_InitTypeDef GPIO_InitStructure; 4. USART_InitTypeDef USART_InitStructure; 5. NVIC_InitTypeDef NVIC_InitStructure; 6. 7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1| RCC_APB2Periph_GPIOA, ENABLE) ; //使能USART1, GPIOA時鐘 8. //USART1_TX PA. 9 9. GPIO_InitStructure. GPIO_Pin = GPIO_Pin_9; //PA. 9 10. GPIO_InitStructure. GPIO_Speed = GPIO_Speed_50MHz; 11. GPIO_InitStructure. GPIO_Mode = GPIO_Mode_AF_PP; //復用推挽輸出 12. GPIO_Init(GPIOA, &GPIO_InitStructure) ; 13. 14.//USART1_RX PA. 10 15. GPIO_InitStructure. GPIO_Pin = GPIO_Pin_10; 16. GPIO_InitStructure. GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入 17. GPIO_Init(GPIOA, &GPIO_InitStructure) ; 18. 19. //Usart1 NVIC 配置 20. 21. NVIC_InitStructure. NVIC_IRQChannel = USART1_IRQn; 22. NVIC_InitStructure. NVIC_IRQChannelPreemptionPriority=3 ; //搶占優先級3 23. NVIC_InitStructure. NVIC_IRQChannelSubPriority = 3; //子優先級3 24. NVIC_InitStructure. NVIC_IRQChannelCmd = ENABLE; //IRQ 通 道使能 25. NVIC_Init(&NVIC_InitStructure) ; //根據指定的參數初始化VIC寄存器 26. 27. //USART 初始化設置 28. 29. USART_InitStructure. USART_BaudRate = bound; //一般設置為9600; 30. USART_InitStructure. USART_WordLength = USART_WordLength_8b; //字長為8位數據格式 31. USART_InitStructure. USART_StopBits = USART_StopBits_1; //一個停止位 32. USART_InitStructure. USART_Parity = USART_Parity_No; //無奇偶校驗位 33. USART_InitStructure. USART_HardwareFlowControl = USART_HardwareFlowControl_None; //無硬件數據流控制 34. USART_InitStructure. USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發模 式 35. 36.USART_Init(USART1, &USART_InitStructure) ; //初始化串口 37. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE) ; //開啟中斷 38. USART_Cmd(USART1, ENABLE) ; //使能串口 39. 40. }3.3 電機控制
3.3.1 PID控制
掃地機器人在二維平面內運動, 主要對航向角進行控制, 在運動過程中受到地面阻力、 碰撞等各種因數的影響, 無法建立精確的數學模型來編寫算法對掃地機器人進行精確的控制, 所以本課題中使用 PID 控制算法對掃地機器人進行控制。
PID(比例(proportion) 、 積分(integral) 、 導數(derivative) ) 控制器作為最早實用化的控制器已有近百年歷史, 現在仍然是應用最廣泛的工業控制器。 PID 控制器簡單易懂, 使用中不需精確的系統模型等先決條件, 因而成為應用最為廣泛的控制器。
PID流程
PID實現
struct _pid{float SetSpeed; //定義設定值float ActualSpeed; //定義實際值float err; //定義偏差值float err_last; //定義上一個偏差值float Kp,Ki,Kd; //定義比例、積分、微分系數float voltage; //定義電壓值(控制執行器的變量)float integral; //定義積分值float umax;float umin; }pid;void PID_init(){printf("PID_init begin \n");pid.SetSpeed=0.0;pid.ActualSpeed=0.0;pid.err=0.0;pid.err_last=0.0;pid.voltage=0.0;pid.integral=0.0;pid.Kp=0.2;pid.Ki=0.1; //注意,和上幾次相比,這里加大了積分環節的值pid.Kd=0.2;pid.umax=400;pid.umin=-200;printf("PID_init end \n"); } float PID_realize(float speed){int index;pid.SetSpeed=speed;pid.err=pid.SetSpeed-pid.ActualSpeed;if(pid.ActualSpeed>pid.umax) //灰色底色表示抗積分飽和的實現{if(abs(pid.err)>200) //藍色標注為積分分離過程{index=0;}else{index=1;if(pid.err<0){pid.integral+=pid.err;}}}else if(pid.ActualSpeed<pid.umin){if(abs(pid.err)>200) //積分分離過程{index=0;}else{index=1;if(pid.err>0){pid.integral+=pid.err;}}}else{if(abs(pid.err)>200) //積分分離過程{index=0;}else{index=1;pid.integral+=pid.err;}}pid.voltage=pid.Kp*pid.err+index*pid.Ki*pid.integral+pid.Kd*(pid.err-pid.err_last);pid.err_last=pid.err;pid.ActualSpeed=pid.voltage*1.0;return pid.ActualSpeed; }3.4 掃地機器人路徑規劃
3.4.1 弓字型行走
在沒有障礙物或房間結構變化不大的情況下, 掃地機器人可應用巡航路徑規劃算法。
步驟 1
掃地機器人從 MPU6050 模塊獲得偏航角, 并將此偏航角設定為參考角。然后掃地機器人在基于參考角調整偏航角的同時開始向前移動。 距離 D 由編碼器記錄, D 的值將被分配給一個名為 pre_Walkingcount 的變量。 當超聲波傳感器檢測到障礙物的存在時, 機器人會降低速度以避免碰撞發生。 如果紅外傳感器返回低電平, 則該算法切換到步驟 2。
步驟 2
機器人向左旋轉 90 度。 然后 機器人用編碼器記錄向前移動的距離 d。如果 d= Ic ,代表掃地機器人的清潔端口的寬度, 機器人再向左旋轉 90 度。 之后, 算法切換到步驟 3。 步驟 2 的編程實現中, 編寫了實現掃地機器人左轉 90°函數 Left_turn()和直行 的函數 Straight_go()。
步驟 3
步驟 3 類似于步驟 1, 但方向相反。 當機器人遇到障礙物時, 將距離 D與變量 pre_Walkingcount 進行比較。 比較的結果將決定重新覆蓋算法是否工作。如 果 D= pre_Walkingcount, 算 法切 換 到 步 驟 4, D 值將 被 分 配 給變 量
pre_Walkingcount。 通過與前面的距離進行比較, 機器人可以決定要運行哪種算法。
步驟 4
機器人向右轉 90 度。 然后機器人用編碼器記錄向前移動的距離 d。 如果 d= Ic , 機器人向右轉動 90 度。 之后, 算法切換到步驟 1, 并開始另一個新的循環
4 測試
機器人路徑主要基于弓字形路徑, 利用重復覆蓋算法對障礙物后方的區域進行清洗。 與具有隨機避障算法的掃地機器人相比, 新算法的機器人能夠覆蓋94. 61%的地面, 提高了掃地機器人的效率。
展示視頻
畢業設計:基于stm32的掃地機器人
🧿 選題指導, 項目分享:
https://blog.csdn.net/molodi/article/details/125933857
總結
以上是生活随笔為你收集整理的【毕业设计】stm32单片机智能扫地机器人 - 嵌入式 物联网的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 清风数学建模——插值算法
- 下一篇: python爬虫requests源码链家