1. 智能小車循跡程序
電設小車循跡模塊 轉自:http://blog.sina.com.cn/s/blog_4bb018e10100ermy.html供參考://包含所需頭文件
#include <ioM16v.h>
#include <macros.h>
#include"time1_init.h"
#include"motor.h"#define ahead 1
#define backwards 0
#define compare(x,y) (x<y?1:0)
#define mid 0X17//埠初始化
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x08;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
}void timer0_init(void)
{
TCCR0 = 0x00;//停止定時器
TCNT0 = 0x00;//初始值
OCR0 = 0x17;//匹配值
TIMSK |= 0x00;//中斷允許
TCCR0 = 0x7D;//啟動定時器
}void adc_init(void)
{
//adc轉換初始化
ADCSRA = 0x00; //禁止AD轉換
ADCSRA|=BIT(ADIF);
ADMUX=0X46;
SFIOR |= 0x00;
ACSR = 0x80; //禁止模擬比較器
ADCSRA = 0xE7;
}void init_devices(void)
{
CLI(); //禁止所有中斷
MCUCR = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR = 0x00;
port_init();
timer0_init();
timer1_init();
adc_init();
SEI();//開全局中斷
}uint sensor_head[3],sensor_back[3],cord; //存儲6個感測器AD轉換的值
uchar offset ; //黑線偏移小車中心軸的距離
uint sensor_compare_head[3]={300,300,300},sensor_compare_back[3]={300,300,300}; //判斷黑線是否位於感測器下的閾值uchar start_head_sensor(void)
{
uchar i,j=0,sum=0;
ADMUX=0X40;
ADCSRA=0xC7;
while(ADCSRA&BIT(ADSC));
for(i=0;i<3;i++)
{
ADMUX=0X40+i; //啟用前端感測器0,1,2通道
ADCSRA=0xC7;
while(ADCSRA&BIT(ADSC));
sensor_head[i]=ADC;
}
for(i=3;i;i--)
{
if(compare(sensor_head[i-1],sensor_compare_head[i-1]))
{
sum+=i-1;
j++;
}
}
if(j)
offset=sum*2/j;
ADMUX=0X46;
ADCSRA=0xE7;
return offset;
}
uchar start_back_sensor(void)
{
uchar i,j=0,sum=0;
ADMUX=0X43;
ADCSRA=0xC7;
while(ADCSRA&BIT(ADSC));
for(i=0;i<3;i++)
{
ADMUX=0X43+i; //啟用前端感測器0,1,2通道
ADCSRA=0xC7;
while(ADCSRA&BIT(ADSC));
sensor_back[i]=ADC;
}
for(i=3;i;i--)
{
if(compare(sensor_back[i-1],sensor_compare_back[i-1]))
{
sum+=i-1;
j++;
}
}
if(j)offset=sum*2/j;
ADMUX=0X46;
ADCSRA=0XE7;
return offset;
}//角度感測器濾波函數
uint cord_sensor(void)
{
uchar i;
uint max=0,min=1023,sum=0;
for(i=0;i<5;i++)
{
ADCSRA|=BIT(ADIF);
while(!(ADCSRA&BIT(ADIF)));
cord=ADC;
sum+=cord;
max=(max>cord)?max:cord;
min=(min<cord)?min:cord;
}
return (sum-max-min)/3;
}void direc_ctrl(uchar x,uchar y)
{
if(y)
{
if(x==0)OCR0=mid+3;
if(x==4)OCR0=mid-3;
if(x==2) OCR0=mid;
}
else OCR0=mid+x-2;
}void menmber_path(void)
{
uchar j;
uint i;
uint max_head[3]={0,0,0},min_head[3]={1023,1023,1023},max_back[3]={0,0,0},min_back[3]={1023,1023,1023};
for(i=4000;i;i--)
{
start_head_sensor();
for(j=0;j<3;j++)
{
max_head[j]=(max_head[j]>sensor_head[j])?max_head[j]:sensor_head[j];
min_head[j]= (min_head[j]<sensor_head[j])?min_head[j]:sensor_head[j];
}
start_back_sensor();
for(j=0;j<3;j++)
{
max_back[j]=(max_back[j]>sensor_back[j])?max_back[j]:sensor_back[j];
min_back[j]= (min_back[j]<sensor_back[j])?min_back[j]:sensor_back[j];
}
}
for(j=0;j<3;j++)
{
sensor_compare_head[j]=(max_head[j]+min_head[j])/2;
sensor_compare_back[j]=(max_back[j]+min_back[j])/2;
}
}
uchar head_sensor_all(void)
{
start_head_sensor();
if( compare(sensor_head[0], sensor_compare_head[0]) && compare(sensor_head[1], sensor_compare_head[1]) && compare(sensor_head[2], sensor_compare_head[2]))
return 1;
else
return 0;
}uchar back_sensor_all(void)
{
start_back_sensor();
if( compare(sensor_back[0], sensor_compare_back[0]-30) && compare(sensor_back[1], sensor_compare_back[1]-30) && compare(sensor_back[2], sensor_compare_back[2]-30))
return 1;
else
return 0;
}
void search_path_ahead(uchar speed)
{
motor_autorun(ahead,speed);
while(1)
{
if(head_sensor_all())
{
motor_stop();
return;
}
else
{
direc_ctrl(offset,1);
}
}
}
void search_path_backward(uchar speed)
{
motor_autorun(0,speed);
while(1)
{
if(back_sensor_all())
{
motor_stop();
return;
}
else
direc_ctrl(offset,0);
}
}
2. 這種模電循跡小車的工作原理,非單片機,要很詳細,最好有這種實訓報告。謝謝啦
(LED1、R12) 和 (LED2、R14)應該是兩組光電感測器,如果是遁跡,當LED探尋到顏色不同的物體時,光的強弱改變,同時導致R12和R14的阻值發生改變,最終導致比較器U1A /U2B的輸入電壓改變,控制Q1 Q2的通斷,來控制電機的開關或者是速度
3. 怎麼設計循跡小車
1. 小車控制及驅動單元的選擇 此部分是整個小車的大腦,是整個小車運行的核心部件,起著控制小車所有運行狀態的作用。通常選用單片機作為小車的核心控制單元,在這里用台灣凌陽公司的SPCE061A單片機來做小車的控制單元。SPCE061是一款擁有2K RAM、32KFlash、32 個I/O 口,並集成了AD/DA功能強大的16位微處理器,它還擁有豐富的語音處理功能,為小車的功能擴展提供了相當大的空間。只要按照該單片機的要求對其編製程序就可以實現很多不同的功能。小車驅動電機一般利用現成的玩具小車上的配套直流電機。考慮到小車必須能夠前進、倒退、停止,並能靈活轉向,在左右兩輪各裝一個電機分別進行驅動。當左輪電機轉速高於右輪電機轉速時小車向右轉,反之則向左轉。為了能控制車輪的轉速,可以採取PWM調速法,即由單片機的IOB8、IOB9輸出一系列頻率固定的方波,再通過功率放大來驅動電機,在單片機中編程改變輸出方波的占空比就可以改變加到電機上的平均電壓,從而可以改變電機的轉速。左右輪兩個電機轉速的配合就可以實現小車的前進、倒退、轉彎等功能。 2. 小車循跡的原理 這里的循跡是指小車在白色地板上循黑線行走,通常採取的方法是紅外探測法。紅外探測法,即利用紅外線在不同顏色的物體表面具有不同的反射性質的特點,在小車行駛過程中不斷地向地面發射紅外光,當紅外光遇到白色紙質地板時發生漫反射,反射光被裝在小車上的接收管接收;如果遇到黑線則紅外光被吸收,小車上的接收管接收不到紅外光。單片機就是否收到反射回來的紅外光為依據來確定黑線的位置和小車的行走路線。紅外探測器探測距離有限,一般最大不應超過15cm。對於發射和接收紅外線的紅外探頭,可以自己製作或直接採用集成式紅外探頭。 (1)自製紅外探頭電路如圖1所示,紅外光的發送接收選用型號為ST168的對管。當小車在白色地面行駛時,裝在車下的紅外發射管發射紅外線信號,經白色反射後,被接收管接收,一旦接收管接收到信號,那麼圖中光敏三極體將導通,比較器輸出為低電平;當小車行駛到黑色引導線時,紅外線信號被黑色吸收後,光敏三極體截止,比較器輸出高電平,從而實現了通過紅外線檢測信號的功能。將檢測到的信號送到單片機I/O口,當I/O口檢測到的信號為高電平時,表明紅外光被地上的黑色引導線吸收了,表明小車處在黑色的引導線上;同理,當I/O口檢測到的信號為低電平時,表明小車行駛在白色地面上。此種方法簡單,價格便宜,靈敏度可調,但是容易受到周圍環境的影響,特別是在圖1較強的日光燈下,對檢測到的信號有一定的影響。 (2)集成式紅外探頭可以採用型號為E3F-DS10C4集成斷續式光電開關探測器,它具有簡單、可靠的工作性能,只要調節探頭上的一個旋鈕就可以控制探頭的靈敏度。該探頭輸出端只有三根線(電源線、地線、信號線),只要將信號線接在單片機的I/O口,然後不停地對該I/O口進行掃描檢測,當其為高電平時則檢測到白紙,當為低電平時則檢測到黑線。此種探頭還能有效地防止普通光源(如日光燈等)的干擾。其缺點則是體積比較大,佔用了小車有限的空間。 3.紅外探頭的安裝 在小車具體的循跡行走過程中,為了能精確測定黑線位置並確定小車行走的方向,需要同時在底盤裝設4個紅外探測頭,進行兩級方向糾正控制,提高其循跡的可靠性。這4個紅外探頭的具體位置如圖2所示。圖中循跡感測器共安裝4個,全部在一條直線上。其中InfraredMR與InfraredML 為第一級方向控制感測器,InfraredSR 與InfraredSL 為第二級方向控制感測器。小車行走時,始終保持黑線(如圖2 中所示的行走軌跡黑線)在InfraredMR和InfraredML這兩個第一級感測器之間,當小車偏離黑線時,第一級探測器一旦探測到有黑線,單片機就會按照預先編定的程序發送指令給小車的控 制系統,控制系統再對小車路徑予以糾正。若小車回到了軌道上,即4個探測器都只檢測到白紙,則小車會繼續行走;若小車由於慣性過大依舊偏離軌道,越出了第一級兩個探測器的探測范圍,這時第二級動作,再次對小車的運動進行糾正,使之回到正確軌道上去。可以看出,第二級方向探測器實際是第一級的後備保護,從而提高了小車循跡的可靠性。 4.軟體控制 其程序控制框圖如圖3。小車進入循跡模式後,即開始不停地掃描與探測器連接的單片機I/O口,一旦檢測到某個I/O口有信號,即進入判斷處理程序(switch),先確定4個探測器中的哪一個探測到了黑線,如果InfraredML(左面第一級感測器)或者InfraredSL(左面第二級感測器)探測到黑線,即小車左半部分壓到黑線,車身向右偏出,此時應使小車向左轉;如果是InfraredMR(右面第一級感測 器)或InfraredSR(右面第二級感測器)探測到了黑線,即車身右半部壓住黑線,小車向左偏出了軌跡,則應使小車向右轉。在經過了方向調整後,小車再繼續向前行走,並繼續探測黑線重復上述動作。 由於第二級方向控制為第一級的後備,則兩個等級間的轉向力度必須相互配合。 電動循跡小車設計1. 小車控制及驅動單元的選擇 此部分是整個小車的大腦,是整個小車運行的核心部件,起著控制小車所有運行狀態的作用。通常選用單片機作為小車的核心控制單元,在這里用台灣凌陽公司的SPCE061A單片機來做小車的控制單元。SPCE061是一款擁有2K RAM、32KFlash、32 個I/O 口,並集成了AD/DA功能強大的16位微處理器,它還擁有豐富的語音處理功能,為小車的功能擴展提供了相當大的空間。只要按照該單片機的要求對其編製程序就可以實現很多不同的功能。小車驅動電機一般利用現成的玩具小車上的配套直流電機。考慮到小車必須能夠前進、倒退、停止,並能靈活轉向,在左右兩輪各裝一個電機分別進行驅動。當左輪電機轉速高於右輪電機轉速時小車向右轉,反之則向左轉。為了能控制車輪的轉速,可以採取PWM調速法,即由單片機的IOB8、IOB9輸出一系列頻率固定的方波,再通過功率放大來驅動電機,在單片機中編程改變輸出方波的占空比就可以改變加到電機上的平均電壓,從而可以改變電機的轉速。左右輪兩個電機轉速的配合就可以實現小車的前進、倒退、轉彎等功能。 2. 小車循跡的原理 這里的循跡是指小車在白色地板上循黑線行走,通常採取的方法是紅外探測法。紅外探測法,即利用紅外線在不同顏色的物體表面具有不同的反射性質的特點,在小車行駛過程中不斷地向地面發射紅外光,當紅外光遇到白色紙質地板時發生漫反射,反射光被裝在小車上的接收管接收;如果遇到黑線則紅外光被吸收,小車上的接收管接收不到紅外光。單片機就是否收到反射回來的紅外光為依據來確定黑線的位置和小車的行走路線。紅外探測器探測距離有限,一般最大不應超過15cm。對於發射和接收紅外線的紅外探頭,可以自己製作或直接採用集成式紅外探頭。 (1)自製紅外探頭電路如圖1所示,紅外光的發送接收選用型號為ST168的對管。當小車在白色地面行駛時,裝在車下的紅外發射管發射紅外線信號,經白色反射後,被接收管接收,一旦接收管接收到信號,那麼圖中光敏三極體將導通,比較器輸出為低電平;當小車行駛到黑色引導線時,紅外線信號被黑色吸收後,光敏三極體截止,比較器輸出高電平,從而實現了通過紅外線檢測信號的功能。將檢測到的信號送到單片機I/O口,當I/O口檢測到的信號為高電平時,表明紅外光被地上的黑色引導線吸收了,表明小車處在黑色的引導線上;同理,當I/O口檢測到的信號為低電平時,表明小車行駛在白色地面上。此種方法簡單,價格便宜,靈敏度可調,但是容易受到周圍環境的影響,特別是在圖1較強的日光燈下,對檢測到的信號有一定的影響。 (2)集成式紅外探頭可以採用型號為E3F-DS10C4集成斷續式光電開關探測器,它具有簡單、可靠的工作性能,只要調節探頭上的一個旋鈕就可以控制探頭的靈敏度。該探頭輸出端只有三根線(電源線、地線、信號線),只要將信號線接在單片機的I/O口,然後不停地對該I/O口進行掃描檢測,當其為高電平時則檢測到白紙,當為低電平時則檢測到黑線。此種探頭還能有效地防止普通光源(如日光燈等)的干擾。其缺點則是體積比較大,佔用了小車有限的空間。 3.紅外探頭的安裝 在小車具體的循跡行走過程中,為了能精確測定黑線位置並確定小車行走的方向,需要同時在底盤裝設4個紅外探測頭,進行兩級方向糾正控制,提高其循跡的可靠性。這4個紅外探頭的具體位置如圖2所示。圖中循跡感測器共安裝4個,全部在一條直線上。其中InfraredMR與InfraredML 為第一級方向控制感測器,InfraredSR 與InfraredSL 為第二級方向控制感測器。小車行走時,始終保持黑線(如圖2 中所示的行走軌跡黑線)在InfraredMR和InfraredML這兩個第一級感測器之間,當小車偏離黑線時,第一級探測器一旦探測到有黑線,單片機就會按照預先編定的程序發送指令給小車的控 制系統,控制系統再對小車路徑予以糾正。若小車回到了軌道上,即4個探測器都只檢測到白紙,則小車會繼續行走;若小車由於慣性過大依舊偏離軌道,越出了第一級兩個探測器的探測范圍,這時第二級動作,再次對小車的運動進行糾正,使之回到正確軌道上去。可以看出,第二級方向探測器實際是第一級的後備保護,從而提高了小車循跡的可靠性。 4.軟體控制 其程序控制框圖如圖3。小車進入循跡模式後,即開始不停地掃描與探測器連接的單片機I/O口,一旦檢測到某個I/O口有信號,即進入判斷處理程序(switch),先確定4個探測器中的哪一個探測到了黑線,如果InfraredML(左面第一級感測器)或者InfraredSL(左面第二級感測器)探測到黑線,即小車左半部分壓到黑線,車身向右偏出,此時應使小車向左轉;如果是InfraredMR(右面第一級感測 器)或InfraredSR(右面第二級感測器)探測到了黑線,即車身右半部壓住黑線,小車向左偏出了軌跡,則應使小車向右轉。在經過了方向調整後,小車再繼續向前行走,並繼續探測黑線重復上述動作。 由於第二級方向控制為第一級的後備,則兩個等級間的轉向力度必須相互配合。第二級通常是在超出第一級的控制范圍的情況下發生作用,它也是最後一層保護,所以它必須要保證小車回到正確軌跡上來,則通常使第二級轉向力度大於第一級,即level2>level1(level1、level2為小車轉向力度,其大小通過改變單片機輸出的占空比的大小來改變),具體數值在實地實驗中得到。根據上面所講述的方法,我們可以較容易地做出按照一定軌跡行走的智能電動小車。但是按照該方法行走的小車如果是走直線,有可能會是蛇形前進。為了使小車能夠按軌跡行走的更流暢,可以在軟體編程時運用一些簡單的演算法。例如,在對小車進行糾偏時,適當提前停止糾偏,而不要等到小車完全不偏時再停止,以防止小車的過沖。 第二級通常是在超出第一級的控制范圍的情況下發生作用,它也是最後一層保護,所以它必須要保證小車回到正確軌跡上來,則通常使第二級轉向力度大於第一級,即level2>level1(level1、level2為小車轉向力度,其大小通過改變單片機輸出的占空比的大小來改變),具體數值在實地實驗中得到。 根據上面所講述的方法,我們可以較容易地做出按照一定軌跡行走的智能電動小車。但是按照該方法行走的小車如果是走直線,有可能會是蛇形前進。為了使小車能夠按軌跡行走的更流暢,可以在軟體編程時運用一些簡單的演算法。例如,在對小車進行糾偏時,適當提前停止糾偏,而不要等到小車完全不偏時再停止,以防止小車的過沖