紅外對管模塊
紅外對管模塊由發射管接收管和配套電路組成,工作時發射管發射紅外線,接收管接收發射回來的紅外線。當紅外線被深色物體吸收較多而發射回來的很少時,OUT端為高電平,否則為低電平。下圖是實物圖和線路圖。一般白色的是發射管,黑色的是接收管。
圖1 紅外對管模塊實物圖
圖2 紅外對管模塊線路
此模塊有三個引腳,定義如下
VCC 外接3.3V-5V電壓(可以單片機5v或3.3v)
GND 外接GND
OUT 數字量輸出接口(0和1)
模塊的使用說明
模塊的LED檢測到強反光障礙物時,電路板上綠色指示燈點亮,同時OUT端口持續輸出低電平信號;模塊的LED檢測到黑色吸光障礙物時,電路板上綠色指示燈熄滅,同時OUT端口持續輸出高電平信號。該模塊檢測距離2~30cm,檢測角度35°,檢測距離可以通過電位器進行調節,順時針調電位器,檢測距離增加;逆時針調電位器,檢測距離減少。
小車紅外循跡的原理
這里的循跡是指小車在白色地板上循黑線行走,通常采取的方法是下圖所示紅外對管探測法,利用紅外線在不同顏色的物體表面具有不同反射性質的特點,在小車行駛過程中不斷地向地面發射紅外光,當紅外光遇到白色地板時發生漫反射,反射光被裝在接收管接收,如果遇到黑線則紅外光被吸收,接收管接收不到紅外光。單片機根據是否收到反射回來的紅外光來確定黑線的位置和小車的行走路線。
小車簡單循跡時,一般裝兩個紅外對管模塊,且兩個發射管要在黑線中間,因此要求兩個對管模塊的安裝和黑線的寬度要合適。如果要求小車能在丁字線上停止,需要裝四個紅外對管。對管輸出端為高電平則表示對管在黑線上,輸出端為低電平則表示對管在黑線外。
圖3 小車循跡黑線示意圖1
圖4 小車循跡黑線示意圖2
紅外對管對管模塊小車循跡電氣原理圖
圖5 小車循跡行走電氣原理圖
接線如下:紅外對管的兩個輸出分別接控制板的2,3引腳,直流電機驅動板的輸入引腳ENA,N1,IN2, ENB,IN3,IN4分別接控制板的6,10,9,5,8,7引腳,電機左電機右分別接驅動板的2,3和4,5引腳。
程序設計
1 //控制板引腳定義 2 int motor_L_ENA = 6; //左電機控制端連接於Arduino板的6,10,9引腳 3 int motor_L_IN1 = 10; 4 int motor_L_IN2 = 9; 5 int motor_R_ENB = 5; //右電機控制端連接於Arduino板的5,8,7引腳 6 int motor_R_IN3 = 8; 7 int motor_R_IN4 = 7; 8 9 int infrared_LL = A0; //左左側紅外傳感器連接於Arduino板的A0引腳 10 int infrared_L = A1; //左側紅外傳感器連接於Arduino板的A1引腳 11 int infrared_R = A2; //右側紅外傳感器連接於Arduino板的A2引腳 12 int infrared_RR = A3; //右右側紅外傳感器連接於Arduino板的A3引腳 13 14 int sensor_LL = 0; //左左側紅外傳感器的檢測值,默認值為1,在黑線外 15 int sensor_L = 1; //左側紅外傳感器的檢測值,默認值為1,在黑線上 16 int sensor_R = 1; //右側紅外傳感器的檢測值,默認值為1,在黑線上 17 int sensor_RR = 0; //右右側紅外傳感器的檢測值,默認值為0,在黑線外 18 int low_speed = 100; //左轉右轉時的高速低速設定,可調整 19 int high_speed = 200; 20 21 //子函數定義 22 void go_forward_high_speed() //小車前進 23 { 24 analogWrite(motor_L_ENA, high_speed); //左電機正轉 25 digitalWrite(motor_L_IN1, 0); 26 digitalWrite(motor_L_IN2, 1); 27 28 analogWrite(motor_R_ENB,high_speed); //右電機正轉 29 digitalWrite(motor_R_IN3, 0); 30 digitalWrite(motor_R_IN4, 1); 31 } 32 33 void stop_with_brake() //小車制動 34 { 35 digitalWrite(motor_L_ENA, 1); //左電機制動 36 digitalWrite(motor_L_IN1, 1); 37 digitalWrite(motor_L_IN2, 1) ; 38 39 digitalWrite(motor_R_ENB, 1); //右電機制動 40 digitalWrite(motor_R_IN3, 1); 41 digitalWrite(motor_R_IN4, 1) ; 42 } 43 44 void go_forward_left() //小車左轉 45 { 46 digitalWrite(motor_L_IN1, 0); 47 digitalWrite(motor_L_IN2, 1); 48 analogWrite(motor_L_ENA, low_speed); //左輪低速 49 50 digitalWrite(motor_R_IN3, 0); 51 digitalWrite(motor_R_IN4, 1); 52 analogWrite(motor_R_ENB, high_speed); //右輪高速 53 } 54 55 void go_forward_right() //小車右轉 56 { 57 digitalWrite(motor_L_IN1, 0); 58 digitalWrite(motor_L_IN2, 1); 59 analogWrite(motor_L_ENA, high_speed); //左輪高速 60 61 digitalWrite(motor_R_IN3, 0); 62 digitalWrite(motor_R_IN4, 1); 63 analogWrite(motor_R_ENB, low_speed); //右輪低速 64 } 65 66 67 void setup() 68 { 69 pinMode(motor_L_ENA, OUTPUT); //左電機使能和PWM調速口 70 pinMode(motor_L_IN1, OUTPUT); //左電機控制口1 71 pinMode(motor_L_IN2, OUTPUT); //左電機控制口2 72 73 pinMode(motor_R_ENB, OUTPUT); //右電機使能和PWM調速口 74 pinMode(motor_R_IN3, OUTPUT); //右電機控制口3 75 pinMode(motor_R_IN4, OUTPUT); //左電機控制口4 76 77 pinMode(infrared_L, INPUT); //左側紅外傳感器 78 pinMode(infrared_LL, INPUT); //左左側紅外傳感器 79 80 pinMode(infrared_R, INPUT); //右側紅外傳感器 81 pinMode(infrared_RR, INPUT); //右右側紅外傳感器 82 } 83 84 void loop() 85 { 86 sensor_LL=digitalRead(infrared_LL); 87 sensor_L=digitalRead(infrared_L); 88 sensor_R=digitalRead(infrared_R); 89 sensor_RR=digitalRead(infrared_RR); 90 91 if(sensor_LL==0 & sensor_L==1 & sensor_R==1 & sensor_RR==0) //小車在黑線上 92 { 93 go_forward_high_speed(); //前進 94 } 95 96 if(sensor_L==1 & sensor_R==0) //小車右偏 97 { 98 go_forward_left(); //小車左轉100毫秒,時間可調整 99 delay(100); 100 } 101 102 if(sensor_L==0 & sensor_R==1) //小車左偏 103 { 104 go_forward_right(); //小車右轉100毫秒,時間可調整 105 delay(100); 106 } 107 108 if(sensor_LL==1 & sensor_L==1 & sensor_R==1 & sensor_RR==1) //小車在停止線上 109 { 110 stop_with_brake(); //制動2秒 111 delay(2000); 112 } 113 }
運行效果
小車可沿黑線循跡行走,在丁字路口上自動停止。
注
實驗時可以調整車行速度,可以調整糾偏力度和糾偏時間長度。