智能寻迹(循迹)小车项目思路 + 代码
生活随笔
收集整理的這篇文章主要介紹了
智能寻迹(循迹)小车项目思路 + 代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
說是智能循跡小車,其實一點也不智能,僅僅是幾個判斷語句而已。更高級的可以使用PID算法控制小車雙輪的轉速,從而實現智能小車控制。
作為一個項目作業,完成后想刪掉的,但是感覺有些可惜,故發布于博客上以便于其他人參考。
使用兩個紅外線接收器接受紅外線探測到的黑色軌跡,實現轉大小彎,直角(因為直角處軌跡寬度超過了探測器的寬度,所以有一些額外處理),但是無法通過銳角。
遇到轉彎的時候就將直行的速度降低到最高速度的slow%,以防止小車沖出彎道。保持直行狀態達到speedUp時間后,在fullGear-speedUp時間內將速度提升到最高,用來提升小車平均速度。每時每刻保存前一個轉向狀態,在傳感器全為黑時執行保存的轉向,以達到通過直角彎道的目的。
流程圖如下
完整代碼如下
#include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char// 電機部分 sbit P00 = P0^0; sbit P01 = P0^1; sbit P02 = P0^2; sbit P03 = P0^3; sbit P04 = P0^4; // 左電機使能 sbit P05 = P0^5; // 右電機使能 // 顯像器部分 sbit P20 = P2^0; sbit P21 = P2^1; sbit P22 = P2^2; sbit P23 = P2^3; sbit P24 = P2^4; sbit P25 = P2^5; sbit P26 = P2^6; sbit P27 = P2^7; // 紅外部分 sbit P33 = P3^3; sbit P35 = P3^5; // 左邊紅外 sbit P36 = P3^6; // 右側紅外 uint num; // 計數器 uint pwmR; uint pwmL; // 其它參數 uint speedUp = 5000; // 開始加速的直行時間 uint fullGear = 8000; // 加速到滿速的時間 uint slow = 60; // 遇到轉彎時的直行速度 uint delayMs = 0; // 轉彎延遲時間 unsigned long count = 0; uchar status = 'F'; uchar pstatus = 'F'; int flag = 0; // 為0時代表全速,為1時代表轉彎void init(); void leftFdw(); void leftBack(); void rightFdw(); void rightBack(); void back(); void forward(); void turnLeft(); void turnRight(); void stop(); void closeLight(); void delayms(uint); void printChar(uchar x); void motorsWrite(int speedL, int speedR);/*************************** 車輪控制基本程序 ***************************/ void leftFdw(){// 左輪前進P00 = 1;P01 = 0; }void leftBack(){// 左輪后退P00 = 0;P01 = 1; }void rightFdw(){// 右輪前進P02 = 1;P03 = 0; }void rightBack(){// 右輪后退P02 = 0;P03 = 1; }/*************************** 方向控制程序 ***************************/ void turnLeft(){// 左轉status = 'L';printChar('L');motorsWrite(0, 90); }void turnRLeft(){// 左轉status = 'L';printChar('L');motorsWrite(-70, 100); }void turnRight(){// 右轉status = 'R';printChar('R');motorsWrite(90, 0); }void turnRRight(){// 右轉status = 'R';printChar('R');motorsWrite(100, -70); }void forward(){// 前進status = 'F';printChar('F');if(flag){ // 轉彎motorsWrite(slow,slow);} else { // 直線加速uint dSpeed = slow;motorsWrite(dSpeed,dSpeed);} }void back(){// 后退status = 'B';printChar('B');motorsWrite(-100,-100); }void stop(){// 停車status = 'S';printChar('S');motorsWrite(0,0); }/********************** 延時程序 **********************/ void delayms(unsigned int xms){unsigned int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--); }/********************** 數碼管顯示程序 **********************/ void closeLight(){P21 = 1;P22 = 1;P23 = 1;P24 = 1;P25 = 1;P26 = 1;P27 = 1; }void printChar(uchar x){closeLight(); // if(x == 'L'){ // P22 = 0;P23 = 0;P24 = 0; // } else if(x == 'R'){ // P22 = 0;P23 = 0;P27 = 0; // } else if(x == 'F'){ // P21 = 0;P22 = 0;P23 = 0;P27 = 0; // } else if(x == 'B'){ // P21 = 0;P22 = 0;P23 = 0;P24 = 0;P25 = 0; // } else if(x == 'S'){ // P21 = 0;P24 = 0;P27 = 0; // } }/********************** 電機控制程序 **********************/ void motorsWrite(int speedL, int speedR){// 電機控制if(speedL > 100) speedL=100;if(speedR > 100) speedR=100;if(speedL < -100) speedL=-100;if(speedR < -100) speedR=-100;if(speedL < 0) {pwmL = -speedL;leftBack();} else {pwmL = speedL;leftFdw();}if(speedR < 0){pwmR = -speedR;rightBack();} else {pwmR = speedR;rightFdw();} }void init(){// PWM控制程序// 100us計時器TMOD = 0x01; // 定時器0模式1TH0 = 0x0FF; // 定時器0的高八位TL0 = 0x0A4;//TF0;// 如果定時器中斷(溢出),則TF0=1;EA = 1;ET0 = 1;TR0 = 1; // 表示開啟定時器0 }void main(){init();while(1){if(P35 == 0 && P36 == 0){forward();} else if(P35 == 0 && P36 == 1){turnRight();flag = 1;pstatus = 'R';} else if(P35 == 1 && P36 == 0){turnLeft();flag = 1;pstatus = 'L';} else if(P35 == 1 && P36 == 1){if(pstatus == 'F'){forward();} else if(pstatus == 'R'){turnRRight();delayms(delayMs);} else if(pstatus == 'L'){turnRLeft();delayms(delayMs);}}} }void Timer0Interrupt(void) interrupt 1 {TH0 = 0x0FF;TL0 = 0x0A4;if(num <= pwmL)P04 = 1;else P04 = 0;if(num <= pwmR)P05 = 1;else P05 = 0;num++;if(num >= 100)num=0;if(status == 'F') {count++;} else {count = 0;}if(count == speedUp && status == 'F') {flag = 0;} }總結
以上是生活随笔為你收集整理的智能寻迹(循迹)小车项目思路 + 代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PS选中部分区域调整透明度
- 下一篇: 初用vscode遇到中文乱码问题