|
基于arduino2560的循線小車的整體圖
q.jpg (2.3 MB, 下載次數: 82)
下載附件
小車的整體圖
2020-2-26 00:55 上傳
部分代碼如下
- /*
- * 電機:
- * 10 -> 左側:前進( > 90 ) ; 后退( < 90 ) ; 停止( 82 - 92)
- * 12 -> 右側:前進( < 90 ) ; 后退( > 90 ) ; 停止( 93 - 103);
- * F表示前B為后,D是在雙線上,S表示單線上
- *
- */
- /****************************整體實驗例程****************************/
- #include <Arduino.h>
- #include <Wire.h>
- #include <MultiLCD.h>
- #include <ServoTimer2.h>
- //定義車行進方向
- enum Dir{
- FORWARD = 1, BACK, LEFT, RIGHT, STOP
- };
- enum Trackingmode{
- FD= 1, BD, FS, BS //舉例FD就表示在雙線上前進循跡,主要前傳感器
- };//
- enum Turnmode{
- RFD= 1, LFD, RBD, LBD, RFS, LFS, RBS, LBS
- //舉例RFD表示 R向右轉彎,F轉完后要前進,D表示在雙線上
- };
- //Motor
- int left_motor_port = 4; //定義左側電機引腳
- int right_motor_port = 7; //定義右側電機引腳
- int motor_speed = 135; //定義電機停止速度
- void setup() {
- Serial.begin(9600);
- SensorInit();
- MotorInit();
-
- }
- /******************************設備初始化部分********************************/
- //傳感器引腳初始化
- void SensorInit(){
- //pinMode(f[3], INPUT);
- //pinMode(rf_s, INPUT);
- for(int i=0;i<8;i++){pinMode(f[i], INPUT);} //前傳感器數組
- //pinMode(b[3], INPUT);
- //pinMode(b[6], INPUT);
- for(int i=0;i<8;i++){pinMode(b[i], INPUT);} //后傳感器數組
- //pinMode(l_s, INPUT);
- //pinMode(r_s, INPUT);
- for(int i=0;i<8;i++){pinMode(l[i], INPUT);} //中間傳感器數組
- pinMode(debug_sensor, INPUT);
- //digitalWrite(A1,LOW);
- //digitalWrite(A5,LOW);
-
- }
- /******************************車行進控制部分********************************/
- int left_speed = 20;
- int right_speed = 20;
- void SpeedSet(int l, int r){
- left_speed = l; right_speed = r;
- }
- void Forward(){
- l_Servo.write(Angle2Pwm(motor_speed + left_speed));
- r_Servo.write(Angle2Pwm(motor_speed - right_speed));
- }
- void Back(){
- l_Servo.write(Angle2Pwm(motor_speed - left_speed));
- r_Servo.write(Angle2Pwm(motor_speed + right_speed));
- }
- void Left(){
- l_Servo.write(Angle2Pwm(motor_speed - 1.5*left_speed));
- r_Servo.write(Angle2Pwm(motor_speed - 1.5*right_speed));
- }
- void Right(){
- l_Servo.write(Angle2Pwm(motor_speed + 1.5*left_speed));
- r_Servo.write(Angle2Pwm(motor_speed + 1.5*right_speed));
- }
- void Stop(){
- l_Servo.write(Angle2Pwm(motor_speed));
- r_Servo.write(Angle2Pwm(motor_speed));
- delay(1000);
- }
- void Move(int dir){
- switch(dir){
- case FORWARD: Forward(); break;
- case BACK: Back(); break;
- case LEFT: Left(); break;
- case RIGHT: Right(); break;
- case STOP: Stop(); break;
- default: break;
- }
- }
- //電機速度寫入函數,調速的時候使用
- void CorrectLeftF(){
- l_Servo.write(Angle2Pwm(motor_speed));
- r_Servo.write(Angle2Pwm(motor_speed - 20));
- }
- void CorrectRightF(){
- l_Servo.write(Angle2Pwm(motor_speed + 20));
- r_Servo.write(Angle2Pwm(motor_speed));
- }
- void CorrectRightB(){
- l_Servo.write(Angle2Pwm(motor_speed - 20));
- r_Servo.write(Angle2Pwm(motor_speed));
- }
- void CorrectLeftB(){
- l_Servo.write(Angle2Pwm(motor_speed ));
- r_Servo.write(Angle2Pwm(motor_speed + 20));
- }
- /*
- void Turn(int mode){ //轉向函數
- switch(mode){
-
- case 1: //RF_D
- Move(RIGHT);
- while(!digitalRead(f[7]));
- //delay(500);
- while(!digitalRead(f[5]));
- SpeedSet(15,15);
- Move(RIGHT);
- //delay(dy);
- while(!digitalRead(f[2]));
- Move(STOP);
- SpeedSet(20,20);
- break;
-
- case 2: //LF_D
- Move(LEFT);
- while(!digitalRead(f[0]));
- //delay(500);
- while(!digitalRead(f[2]));
- SpeedSet(15,15);
- Move(LEFT);
- //delay(dy);
- while(!digitalRead(f[5]));
- Move(STOP);
- SpeedSet(20,20);
- break;
-
- case 3: //RB_D
- Move(RIGHT);
- while(!digitalRead(b[7]));
- //delay(500);
- while(!digitalRead(b[5]));
- SpeedSet(15,15);
- Move(RIGHT);
- //delay(dy);
- while(!digitalRead(b[2]));
- Move(STOP);
- SpeedSet(20,20);
- break;
-
- case 4: //LB_D
- Move(LEFT);
- while(!digitalRead(b[0]));
- //delay(500);
- while(!digitalRead(b[2]));
- SpeedSet(15,15);
- Move(LEFT);
- //delay(dy);
- while(!digitalRead(b[5]));
- Move(STOP);
- SpeedSet(20,20);
- break;
-
- case 5: //RF_S
- Move(RIGHT);
- while(!digitalRead(f[7]));
- //delay(500);
- while(!digitalRead(f[6]));
- SpeedSet(15,15);
- Move(RIGHT);
- //delay(dy);
- while(!digitalRead(f[3]));
- Move(STOP);
- SpeedSet(20,20);
- break;
-
- case 6: //LF_S
- Move(LEFT);
- while(!digitalRead(f[0]));
- //delay(500);
- while(!digitalRead(f[1]));
- SpeedSet(15,15);
- Move(LEFT);
- //delay(dy);
- while(!digitalRead(f[4]));
- Move(STOP);
- SpeedSet(20,20);
- break;
-
- case 7: //RB_S
- Move(RIGHT);
- while(!digitalRead(b[7]));
- //delay(500);
- while(!digitalRead(b[6]));
- SpeedSet(15,15);
- Move(RIGHT);
- //delay(dy);
- while(!digitalRead(b[3]));
- Move(STOP);
- SpeedSet(20,20);
- break;
-
- case 8: //LB_S
- Move(LEFT);
- while(!digitalRead(b[0]));
- //delay(500);
- while(!digitalRead(b[1]));
- SpeedSet(15,15);
- Move(LEFT);
- //delay(dy);
- while(!digitalRead(b[4]));
- Move(STOP);
- SpeedSet(20,20);
- break;
- }
- }
- /******************************路徑部分********************************/
- /*
- * 循跡函數
- * 返回值:無
- * 參數:mode:
- * FD:前進雙線循跡
- * BD:后退雙線循跡
- * FS:前進單線循跡
- * BS:后退單線循跡
- * 功能:通過車底傳感器檢測路線進行循跡
- */
- void Tracking(int mode){
- if(mode==1){//FD
- if(digitalRead(f[2]) && digitalRead(f[5])){
- Move(FORWARD);
- delay(20);
- }
- else if(digitalRead(f[2])){
- CorrectLeftF();
- }
- else if(digitalRead(f[5])){
- CorrectRightF();
- }
- else
- Move(FORWARD);
- delay(20);
-
- }
-
- if(mode==2){ //BD
- if(digitalRead(b[2]) && digitalRead(b[5])){
- Move(BACK);
- delay(20);
- }
- else if(digitalRead(b[2])){
- CorrectRightB();
- }
- else if(digitalRead(b[5])){
- CorrectLeftB();
- }
- else
- Move(BACK);
- delay(20);
-
- }
-
- if(mode==3){ //FS
- if(digitalRead(f[3]) && digitalRead(f[4])){
- Move(FORWARD);
- delay(20);
- }
- else if(digitalRead(f[3])){
- CorrectLeftF();
- }
- else if(digitalRead(f[4])){
- CorrectRightF();
- }
- else
- Move(FORWARD);
- delay(20);
-
- }
-
- if(mode==4){ //BS
- if(digitalRead(b[3]) && digitalRead(b[4])){
- Move(BACK);
- delay(20);
- }
- else if(digitalRead(b[3])){
- CorrectRightB();
- }
- else if(digitalRead(b[4])){
- CorrectLeftB();
- }
- else
- Move(BACK);
- delay(20);
- }
- }
- /*
- * 循線計數函數
- * 返回值:無
- * 參數:mode:
- * FD:前進雙線循跡
- * BD:后退雙線循跡
- * FS:前進單線循跡
- * BS:后退單線循跡
- * 參數:line:表示準備走幾條線
- * 功能:確定走的線數
- */
- void Trackingline(int mode, int line){
- switch(mode){
- case 1:
- for(int i=0;i<20;i++){Tracking(FD);}
- while(1){
- if(meridians < line){
- if(meridians < line-1){
- if(digitalRead(l[3])){
- meridians++;
- while(digitalRead(l[3]));
- delay(200);
- }
- else{
- Tracking(FD);
- }
- }
- else{
- if(digitalRead(l[3])){meridians++;}
- else{Tracking(FD);}
- }
- }
- else{
- //Move(BACK);
- //delay(200);
- //Move(STOP);
- meridians = 0;
- //Move(BACK);
- //while(!digitalRead(l[3]));
- Move(STOP);
- break;
- }
-
- }
- break;
- case 2:
- for(int i=0;i<20;i++){Tracking(BD);}
- while(1){
- if(meridians < line){
- if(meridians < line-1){
- if(digitalRead(l[4])){
- meridians++;
- while(digitalRead(l[4]));
- delay(200);
- }
- else{
- Tracking(BD);
- }
- }
- else{
- if(digitalRead(l[4])){meridians++;}
- else{Tracking(BD);}
- }
- }
- else{
- //Move(FORWARD);
- //delay(200) ;
- //Move(STOP);
- meridians = 0;
- //Move(FORWARD);
- //while(!digitalRead(l[4]));
- Move(STOP);
- break;
- }
- }
- break;
-
-
- case 3:
- for(int i=0;i<20;i++){Tracking(FS);}
- while(1){
- if(meridians < line){
- if(meridians < line-1){
- if(digitalRead(l[3])){
- meridians++;
- while(digitalRead(l[3]));
- delay(600);
- }
- else{
- Tracking(FS);
- }
- }
- else{
- if(digitalRead(l[3])){meridians++;}
- else{Tracking(FS);}
- }
- }
- else{
- //Move(BACK);
- //delay(200);
- //Move(STOP);
- meridians = 0;
- //Move(BACK);
- //while(!digitalRead(l[3]));
- Move(STOP);
- break;
- }
- }
- break;
- case 4:
- for(int i=0;i<20;i++){Tracking(BS);}
- while(1){
- if(meridians < line){
- if(meridians < line-1){
- if(digitalRead(l[4])){
- meridians++;
- while(digitalRead(l[4]));
- delay(600);
- }
- else{
- Tracking(BS);
- }
- }
- else{
- if(digitalRead(l[4])){meridians++;}
- else{Tracking(BS);}
- }
- }
- else{
- //Move(FORWARD);
- //delay(200);
- //Move(STOP);
- meridians = 0;
- //Move(FORWARD);
- //while(!digitalRead(l[4]));
- Move(STOP);
- break;
- }
- }
- break;
-
- }
- }
- /******************************路段部分********************************/
- //主函數部分,直接寫入要走的路
- void loop (){
- Turn(LFD);
- Trackingline(FD,3);
- Turn(RBS);
- Trackingline(BS,1);
- Turn(LBD);
- Trackingline(BD,2);
- Turn(RFS);
- Trackingline(FS,1);
- }
復制代碼 |
-
w.png
(935.92 KB, 下載次數: 143)
下載附件
2020-2-26 00:55 上傳
使用的八路巡線傳感器 前中后各一 全部接在數字口上
-
e.jpg
(55.61 KB, 下載次數: 130)
下載附件
2020-2-26 00:56 上傳
小車跑的場地,由單雙線交叉構成的網格,本程序讓小車沿線跑
-
-
sketch_mar30a.zip
2020-2-26 00:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
6.61 KB, 下載次數: 27, 下載積分: 黑幣 -5
程序的源碼
評分
-
查看全部評分
|