智能循跡小車
1、小車架構(gòu)
(1)車架:
車架是淘寶上買的雙層亞克力的兩輪小車,配備了兩個(gè)直流電機(jī),兩個(gè)驅(qū)動(dòng)輪,兩個(gè)輔助萬向輪,一個(gè)兩節(jié)的電池盒,這些東西淘寶上很多都是打包售賣的。


(2)電源模塊

電源模塊采用的是兩節(jié)高電壓的5號(hào)可充電電池(沒節(jié)電池3.2V),由于手上沒有DC線,干脆直接將電池盒連上了兩根飛線插在面包板上,然后又將DC接口下面的正負(fù)極引腳焊接了兩根公對(duì)公的杜邦線然后插在面包板上,這樣就可以直接利用電池給這塊HW-131面包板供電模塊供電了。這塊供電模塊內(nèi)置穩(wěn)壓芯片可以輸出多路的3.3V和5V的電壓,這樣就正好可以解決電機(jī)和循跡班5V供電的問題啦。
(3)驅(qū)動(dòng)板

非常尷尬,不會(huì)利用畫圖軟件畫原理圖,所以用的洞洞板焊接,用的是一塊STM32F103C8T6、TB6612電機(jī)驅(qū)動(dòng)模塊,另外還預(yù)留了一塊NRF24L01-2.4G無線通信模塊想要后面做個(gè)遙控器,加上遙控功能。剛練習(xí)焊接,所以洞洞板的后面其實(shí)焊得跟塊大便一樣,就不做介紹了,核心思想就是用飛線各種飛。。。。。。好在利用萬用表一直測,沒有出現(xiàn)短路燒板子之類的壞現(xiàn)象,并且最后功能也都可以完成。
2、采用TCRT5000五路循跡模塊實(shí)現(xiàn)循跡功能

循跡模塊用的是TCRT5000五路循跡模塊,便宜好用,非常nice,至少自己用來玩玩是可以的,如果比賽要用的話應(yīng)該需要哪種灰度循跡模塊(太貴了舍不得買),循跡函數(shù)的話中規(guī)中矩。
void Track_Correct(uint8_t RoadwayData)
{
if(RoadwayData == 0x00)
{
Track_Flag=0;
Stop_Flag=1;
}else if(RoadwayData==0x1B)//11011
{
LSpeed=Car_Speed;
RSpeed=Car_Speed;
}else if(RoadwayData==0x1D)//11101
{
LSpeed=Car_Speed+20;
RSpeed=Car_Speed-20;
}else if(RoadwayData==0x19)//11001 有向右的大彎道
{
LSpeed=Car_Speed+20;
RSpeed=Car_Speed-40;
}else if(RoadwayData==0x18)//11000 有向右的直角彎道
{
LSpeed=Car_Speed;
RSpeed=-Car_Speed;
}else if(RoadwayData==0x1E)//11110
{
LSpeed=Car_Speed+40;
RSpeed=Car_Speed-40;
}else if(RoadwayData==0x17)//10111
{
LSpeed=Car_Speed-20;
RSpeed=Car_Speed+20;
}else if(RoadwayData==0x13)//10011 有向左的大彎道
{
LSpeed=Car_Speed-40;
RSpeed=Car_Speed+20;
}else if(RoadwayData==0x03)//00011 有向左的直角彎道
{
LSpeed=-Car_Speed;
RSpeed=Car_Speed;
}else if(RoadwayData==0x0F)//01111
{
LSpeed=Car_Speed-40;
RSpeed=Car_Speed+40;
}else
{
LSpeed=Car_Speed;
RSpeed=Car_Speed;
}
if(Track_Flag != 0)
{
Track_Go(LSpeed,RSpeed);
}
}
3、超聲波
超聲波用的是一個(gè)HC-SR04超聲波模塊,實(shí)現(xiàn)了正向避障的功能,該模塊有一個(gè)Trig引腳和Echo引腳,當(dāng)給Trig觸發(fā)引腳一個(gè)大于10us的高電平脈沖,則Echo會(huì)開始工作,模塊會(huì)給出一個(gè)與距離等比的高電平脈沖信號(hào),在Echo工作前清零計(jì)數(shù)器的計(jì)數(shù)值,并在電平重新變?yōu)榈碗娖胶螳@取計(jì)數(shù)值,就可以根據(jù)計(jì)數(shù)值的大小來計(jì)算距離。


void Wave_TimerInit(void){ //超聲波定時(shí)器初始化函數(shù)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
TIM_InternalClockConfig(TIM1);
TIM_TimeBaseInitTypeDef Timer_InitStructure;
Timer_InitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
Timer_InitStructure.TIM_CounterMode=TIM_CounterMode_Up;
Timer_InitStructure.TIM_Period=10000-1;
Timer_InitStructure.TIM_Prescaler=7200-1;//7200Hz=0.0001s=0.1ms=10us
Timer_InitStructure.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM1,&Timer_InitStructure);
//TIM_Cmd(TIM3,ENABLE);
}
void Wave_Init(void){ //超聲波中斷初始化函數(shù)
Wave_TimerInit();
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource11);
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line11;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);
}
void Wave_Start(void){ //超聲波開始函數(shù)
if(Wave_Flag==1){
GPIO_SetBits(GPIOA,GPIO_Pin_5);
Delay_us(50);
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
}
}
void Wave_Check(void){ //超聲波避障實(shí)現(xiàn)函數(shù)
if(Distance<=1300){
Car_Stop();Delay_ms(500);
Car_Back(60);Delay_ms(1000);
Car_Stop();Delay_ms(500);
Car_Left(40);
}else if(Distance?>=2000){
Car_Go(Car_Speed);
}
}
void EXTI15_10_IRQHandler(void){ //外部中斷處理函數(shù)
Delay_us(10);
if(EXTI_GetITStatus(EXTI_Line11)!=RESET){
TIM_SetCounter(TIM1,0);
TIM_Cmd(TIM1,ENABLE);
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11));
TIM_Cmd(TIM1,DISABLE);
Distance=TIM_GetCounter(TIM1)*340/2.0;
OLED_ShowNum(2,6,Distance,5);
Wave_Check();
EXTI_ClearITPendingBit(EXTI_Line11);
}
}
4、總結(jié)
學(xué)習(xí)單片機(jī)以來的第一個(gè)小項(xiàng)目,也是受到了江科大的一期視頻的啟發(fā),就決定復(fù)刻一下這個(gè)小車,后面還會(huì)再做一個(gè)遙控器,繼續(xù)去完善,初學(xué)者我很菜,僅供參考。
審核編輯 黃宇
-
單片機(jī)
+關(guān)注
關(guān)注
6058文章
44821瀏覽量
644704 -
STM32
+關(guān)注
關(guān)注
2283文章
10986瀏覽量
361297 -
智能循跡小車
+關(guān)注
關(guān)注
1文章
11瀏覽量
10658
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
20.3-使用兩個(gè)通道進(jìn)行電磁循跡 智能車競賽 電磁桿原理圖 電磁循跡小車 STM32電磁小車 電磁循跡算法

智能循跡小車簡介
怎樣去設(shè)計(jì)基于STM32的智能循跡小車
基于STM32的智能循跡小車設(shè)計(jì)
怎樣去設(shè)計(jì)基于STM32的智能循跡小車
怎樣去設(shè)計(jì)一種基于STM32的智能循跡小車
怎么實(shí)現(xiàn)基于STM32的智能循跡往返小車設(shè)計(jì)?
基于stm32單片機(jī)的紅外避障及循跡小車

基于stm32循跡小車運(yùn)動(dòng)實(shí)例

基于stm32的智能小車作品(循跡避障藍(lán)牙)(上)

評(píng)論