基與OpenWRT的智能偵察車
內容見附件,下面是ppt內容預覽:
項目分析:
下位機作為上位機和小車控制的橋梁,需要進行有效地通訊,并對接收到的命令做出相應的動作控制命令接收:通過與上位機的串口相連,通過串口接收上位機的命令;
小車姿態控制:下位機通過IO操作控制小車的兩個電機的正反轉動從而控制車體的姿態位置;
車上數據獲取:讀取IO設備上的傳感器數據并發送給上位機;
軟硬件開發環境:
硬件選型:STM32F103RC核心板帶下載模塊
開發環境:Keil μVision5 IDE 及ARM.CMSIS.3.20.4.pack 接口標準Keil.STM32F1xx支持庫
開發語言:C語言 基于STM32F1xx庫函數開發
GPIO寄存器描述 《STM32參考手冊中文-p75》
1、端口配置低寄存器(GPIOx_CRL)(x = A...E)
2、端口配置高寄存器(GPIOx_CRH)(x = A...E)
3、端口輸入數據寄存器(GPIOx_IDR)(x = A...E)
這些位為只讀并只能以字(16位)的形式讀出。讀出的值為對應I/O口的狀態。
4、端口輸出數據寄存器(GPIOx_ODR)(x = A...E)
只能以字(16bit)的形式操作,復位值全是0。寫0即輸出0,寫1即輸出1。
5、端口位設置/清除寄存器(GPIOx_BSRR)(x = A...E)
高16bit寫1用于清0,低16bit寫1用于置位,同時寫1的話低16bi有效。
6、端口位清除寄存器(GPIOx_BRR)(x = A...E)
低16位寫1用于置位。
7、端口配置鎖定寄存器(GPIOx_LCKR)(x = A...E)
GPIO八種模式
typedef enum
{ GPIO_Mode_AIN = 0x0, /* 模擬輸入 */
GPIO_Mode_IN_FLOATING = 0x04, /* 浮空輸入,復位后的狀態 */
GPIO_Mode_IPD = 0x28, /* 下拉輸入 */
GPIO_Mode_IPU = 0x48, /* 上拉輸入 */
GPIO_Mode_Out_OD = 0x14, /* 開漏輸出 */
GPIO_Mode_Out_PP = 0x10, /* 推挽輸出 */
GPIO_Mode_AF_OD = 0x1C, /* 復用開漏輸出 */
GPIO_Mode_AF_PP = 0x18 /* 復用推挽輸出 */
}GPIOMode_TypeDef;
下位機開發重點:
串口移植與配置,串口中斷配置,串口數據接收循環隊列;
命令/數據傳輸完整性的判斷,判斷命令是否格式完整,未完整存儲再讀。
傳輸的數據格式檢查,檢查命令格式,長度;
開發總結:
實現了一個下位機基本功能,可以通過串口傳來的命令數據準確地完成車體運動的控制;
需要考慮串口中斷通訊帶來的數據是否完整性的問題。
不足與展望:
對傳來的命令數據校驗糾錯不足,以及錯誤后需要請求重傳功能;
后期可采集更多車載傳感器數據上傳到上位機。
后期通過PWM調制進行小車更精準的控制。
單片機源程序如下:
- /**
- ******************************************************************************
- * @file main.c
- * @author fire
- * @version V1.0
- * @brief 測試led
- ******************************************************************************
- **/
- #include "usart3_config.h"
- #include "HumanBodySensor.h"
- #include "stm32f10x.h"
- #include "CarInit.h"
- #include "SmartCarControl.h"
- #include <stdlib.h>
- #include "led.h"
- void LED_GPIO_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOB, &GPIO_InitStructure);
- GPIO_SetBits(GPIOB, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14); // turn off all led
- }
- void Delay(__IO u32 nCount) //簡單的延時函數
- {
- for(; nCount != 0; nCount--);
- }
- /*
- * 函數名:main
- * 描述 :主函數
- * 輸入 :無
- * 輸出 :無
- */
- int main(void)
- {
- LED_GPIO_Config();
-
- LED2(ON);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
-
-
- /************CarInit.c******************************************************************/
- CarPherialInit(); //車體控制GPIO 人體傳感器輸入GPIO
- LED3(ON);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
-
- InterruptInit();
- GPIO_SetBits(GPIOB, GPIO_Pin_13|GPIO_Pin_14);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- /************CarInit end***************************************************************/
-
-
- USARTx_Config(); //串口配置
-
-
- GPIO_ResetBits(GPIOB, GPIO_Pin_13|GPIO_Pin_14);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- GPIO_SetBits(GPIOB, GPIO_Pin_13|GPIO_Pin_14);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- GPIO_ResetBits(GPIOB, GPIO_Pin_13|GPIO_Pin_14);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- GPIO_SetBits(GPIOB, GPIO_Pin_13|GPIO_Pin_14);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
- Delay(0x0FFFEF);
-
- while(1)
- {
- int a=345;//cm
- char b[12]={0};
- SmartCarControl();
- Delay(0x0FFFEF);
- HumanBodySensor();
- sprintf(b,"%d",a);
- printf("%scm",b);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
孫昊.rar
(691.61 KB, 下載次數: 44)
2018-2-1 00:59 上傳
點擊文件名下載附件
wifi小車
|