本專案實現一款低功耗、WiFi 遠程控制、實時視頻回傳的智能小車。核心控制器採用 TI MSP430G2553(LaunchPad G2),通訊模組採用刷入 OpenWrt 的 TP-Link TL-WR703N 路由器,整合攝像頭驅動與 ser2net 服務,實現視頻流與控制指令雙通道傳輸。適用於消防偵察、有毒環境探測等危險場景。
mjpg-streamer(攝像頭驅動)與 ser2net(串口轉 TCP)。
| 參數 | 數值 |
|---|---|
| 驅動電壓 (Vs) | 5V ~ 35V |
| 峰值電流 | 2A / 橋 |
| 邏輯電壓 (Vss) | 4.5V ~ 5.5V |
| 最大功耗 | 20W |
採用三輪差速驅動:兩側 DC 減速電機 + 1 萬向輪,靈活轉向。
採用4 字節定長包,格式:包頭(0xFF) + 類型碼 + 數據碼 + 包尾(0xFF)
| 類型碼 | 數據碼 | 功能 |
|---|---|---|
| 0x00 | 0x01 | 前進 |
| 0x00 | 0x02 | 後退 |
| 0x00 | 0x03 | 左轉 |
| 0x00 | 0x04 | 右轉 |
| 0x00 | 0x00 | 停止 |
| 0x01 | 0x00 | LED1 亮 |
| 0x01 | 0x01 | LED1 滅 |
範例:前進指令 = FF 00 01 FF。MSP430 串口中斷逐字節接收,收到包尾 0xFF 後解析執行。
// UART 初始化 9600-8-N-1,SMCLK 1MHz
UCA0CTL1 |= UCSSEL_2; UCA0BR0 = 0x68; UCA0BR1 = 0x00; UCA0MCTL = UCBRS0;
IE2 |= UCA0RXIE; __enable_interrupt();
// 低功耗主循環
while(1) LPM1; // 進入 LPM1 睡眠,等待 RX 中斷喚醒
// RX 中斷服務程序
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void) {
LPM1_EXIT; // 喚醒 CPU
// ... 接收 4 字節組包、校驗、分發至 RunCommand()
RunCommand();
}
void Moto_Forward() { P2OUT = 0x0A; } // IN1=1,IN2=0,IN3=1,IN4=0
void Moto_Backward() { P2OUT = 0x05; } // IN1=0,IN2=1,IN3=0,IN4=1
void Moto_TurnLeft() { P2OUT = 0x02; } // 左輪停、右輪轉
void Moto_TurnRight(){ P2OUT = 0x08; } // 右輪停、左輪轉
void Moto_Stop() { P2OUT &= 0x00; }
#include "msp430g2553.h"
#define uchar unsigned char
#define uint unsigned int
uchar Tempdatatable[4], CommandData[4];
int URTAReceivedCount=0, n=1;
void Delay_1ms(uint i) { ... }
void Moto_Forward() { P2OUT = 0x0A; }
void Moto_Backward() { P2OUT = 0x05; }
void Moto_TurnLeft() { P2OUT = 0x02; }
void Moto_TurnRight(){ P2OUT = 0x08; }
void Moto_Stop() { P2OUT &= 0x00; }
void RunCommand(void) {
if(CommandData[0]==0xFF && CommandData[3]==0xFF) {
switch(CommandData[1]) {
case 0x00: switch(CommandData[2]) {
case 0x00: Moto_Stop(); break;
case 0x01: Moto_Forward(); break;
case 0x02: Moto_Backward(); break;
case 0x03: Moto_TurnLeft(); break;
case 0x04: Moto_TurnRight(); break;
} break;
case 0x01: switch(CommandData[2]) {
case 0x00: P1OUT |= BIT0; break; // LED1 ON
case 0x01: P1OUT &= ~BIT0; break; // LED1 OFF
} break;
}
}
}
void main(void) {
WDTCTL = WDTPW + WDTHOLD;
P1SEL = P1SEL2 = BIT1 + BIT2; // UART
P1DIR |= BIT0; P1OUT &= ~BIT0; // LED
P2DIR = 0xFF; P2OUT = 0x00; // Motor
UCA0CTL1 |= UCSSEL_2; UCA0BR0 = 0x68; UCA0BR1 = 0x00; UCA0MCTL = UCBRS0;
UCA0CTL1 &= ~UCSWRST; IE2 |= UCA0RXIE; __enable_interrupt();
while(1) LPM1;
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void) {
LPM1_EXIT; IE2 &= ~UCA0RXIE;
uchar temp = UCA0RXBUF;
// ... 組包邏輯同原文 ...
RunCommand();
IE2 |= UCA0RXIE;
}