項目環(huán)境:
- 1. MSP430F5529
- 2. Code Composer Studio
- 3. 藍牙調試助手
項目簡介:
小車可分為3種工作模式,每種工作模式都會打印在OLED顯示屏上,通過按鍵轉換工作模式。
模式1: 小車紅外循跡,通過超聲波實時監(jiān)測障礙物距離,若超出規(guī)定路線,距離障礙物相對較近時,原地停止,等待指令。
模式2: 自主駕駛,通過超聲掃描各障礙物距離,當小于一定距離時原地左轉。
模式3: 藍牙遠程遙控
一、硬件清單
本項目用到的模塊有:
- MSP430F5529開發(fā)板
- 紅外循跡模塊 TCRT5000L
- 超聲波 HC-SR04
- 藍牙 ATK_HC-05
- 顯示屏 四針OLED
- 充電電池 12V
- TT電機及車輪
- 電機驅動 L298N
- 萬向輪
- VCC、GND拓展口(自焊)
- 若干杜邦線及銅柱螺母
二、模塊連接
手冊先行
1. 藍牙: UART
UART(A0): P3.4、P3.3(RX和TX)
UART(A1): P4.5、P4.4(RX和TX)
2. OLED : IIC
IIC(B0): P3.0、P3.1(SCL和SDA)
IIC(B1): P4.2、P4.1(SCL和SDA)
3. 超聲波: TIMER
TA0:P1.1、P1.2、P1.3、P1.4、P1.5
TA1:P1.7、P2.0、P2.1
TA2:P2.3、P2.4、P2.5
TB0:P3.6、P5.6、P5.7、P7.4、P7.5、P7.6、P7.7
以上為該項目需要部分引腳分配,以下為我的模塊連接示例:
-
Motor:
P3.5、P3.6
P3.0、P3.1
-
PWM:
P2.4、P2.5
-
TCRT5000L:
P3.4、P6.6、P1.6
-
OLED:
P2.0(SCL)、P2.2(SDA)
-
HC_SR-04:
P1.2(echo)、P1.4(Trig)
-
ATK_HC-05:
P4.4(TX)、P4.5(RX)
三、程序設計
1. motor_And_infrared_GPIOInit
P3SEL &= ~BIT0; //右輪
P3DIR |= BIT0;
P3SEL &= ~BIT1;
P3DIR |= BIT1;
P3SEL &= ~BIT5; //左輪
P3DIR |= BIT5;
P3SEL &= ~BIT6;
P3DIR |= BIT6;
P3SEL &=~BIT4;
P3DIR &=~BIT4;
P3REN |=BIT4;//左邊
P1SEL &=~BIT6;
P1DIR &=~BIT6;
P1REN |=BIT6;//右邊
P6SEL &=~BIT6;
P6DIR &=~BIT6;
P6REN |=BIT6;//中間
2. SetPwm_Init
P2DIR |= BIT4; //配置P2.4復用為定時器TA2.4
P2SEL |= BIT4; //配置P2.4為輸出
TA2CTL = TASSEL_2+MC_1+ID_3;
TA2CCTL1 = OUTMOD_7 ;
TA2CCR1 = arr;
TA2CCR0 = psc;
P2DIR |= BIT5; //配置P2.5復用為定時器TA2.5
P2SEL |= BIT5; //配置P2.5為輸出
TA2CTL = TASSEL_2+MC_1+ID_3;
TA2CCTL2 = OUTMOD_7 ;
TA2CCR2 = arr;
TA2CCR0 = psc;
3. OLED_Init
//OLED初始化函數
void OLED_Init(void)
{
P2DIR |= BIT0; //設置引腳為輸出模式
P2DIR |= BIT2;
P2OUT |=BIT0; //設置為高電平
P2OUT |=BIT2;
IIC_SDA_IN0;
delay_ms(200);
IIC_SDA_IN1;
//
OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
OLED_WR_Byte(0x40,OLED_CMD);//--set start line address Set Mapping RAM Display Start Line (0x00~0x3F)
OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
OLED_WR_Byte(0xCF,OLED_CMD);// Set SEG Output Current Brightness
OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping 0xa0脳貿脫脪路麓脰脙 0xa1脮媒魯攏
OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction 0xc0脡脧脧脗路麓脰脙 0xc8脮媒魯攏
OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset Shift Mapping RAM Counter (0x00~0x3F)
OLED_WR_Byte(0x00,OLED_CMD);//-not offset
OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
OLED_WR_Byte(0x12,OLED_CMD);
OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
OLED_WR_Byte(0x02,OLED_CMD);//
OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)
OLED_Clear();
OLED_WR_Byte(0xAF,OLED_CMD);
}
4. BlueTooth_Init
P4SEL |=BIT4+BIT5 ; // P4.5 P4.4 = USCI_A1 TXD/RXD
UCA1CTL1 |= UCSWRST; // **Put state machine in reset**
UCA1CTL1 |= UCSSEL_2; // SMCLK
UCA1BR0 = 9; // 1MHz 115200 (see User's Guide)
UCA1BR1 = 0; // 1MHz 115200
UCA1MCTL |= UCBRS_1 + UCBRF_0; // Modulation UCBRSx=1, UCBRFx=0
UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA1IE |= UCRXIE; // Enable USCI_A1 RX interrupt
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0, interrupts enabled
5. TIMER_Init
TA0CCTL0 = CCIE; //CCR0中斷使能
TA0CCR0 = a*1000; //設定計數值
TA0CTL =TASSEL_2+MC_1+TACLR;//SMCLK,增計數模式,清除TAR
_bis_SR_register(LPM0_bits+GIE);//低功耗模式0,使能中斷
6. HCSR04_Init
USONUD_OUT |= TRIG;
USOUND_DIR |= TRIG;
USOUND_SEL |= ECHO ; //CCI0A
7. Key_Init
P1DIR &=~BIT1;//板載按鍵s2設為輸入
P2DIR &=~BIT1;//板載按鍵s1設為輸入
P2REN =BIT1;//上拉電阻
P1REN =BIT1;//上拉電阻
P1OUT |=BIT1;
P2OUT |=BIT1;//初始狀態(tài)為高電平
//低電平觸發(fā)函數
8. interrupt
// Echo back RXed character, confirm TX buffer is ready first,發(fā)送數據之前確定發(fā)送緩存準備好
#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{
switch(__even_in_range(UCA1IV,4))
{
case 0: //無中斷
break; // Vector 0 - no interrupt
case 2: // Vector 2 - RXIFG 接受中斷
while (!(UCA1IFG&UCTXIFG)); // USCI_A1 TX buffer ready? UCTXIFG(USCI Transmit Interrupt Flag)
UCA1TXBUF = UCA1RXBUF; //等待數據發(fā)送完成 完成UCTXIFG置1 跳出循環(huán) // TX -> RXed character
break;
case 4:
break; // Vector 4 - TXIFG 發(fā)送中斷
default: break;
}
}
// UCTXIFG=0x02,UCA1IFG&UCTXIFG,當UCA1IFG的UCTXIFG位為1時,說明UCA1TXBUF為空,
//跳出while循環(huán)循環(huán);當UCTXIFG位為0時UCA1TXBUF不為空,停在循環(huán)。
四、項目源碼
若需項目源碼可留言評論區(qū)QQ郵箱 或 私信即可。文章來源:http://www.zghlxwxcb.cn/news/detail-401383.html
著急的小伙伴可直接加好友聯系 ??文章來源地址http://www.zghlxwxcb.cn/news/detail-401383.html
到了這里,關于基于MSP430 紅外避障-遙控小車(電賽必備 附項目代碼)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!