#include #define IR_PIN 2 //红外线接收器 OUTPUT 信号接在 pin 2 #define IRM_L_PIN A0//左红外避障 #define IRM_R_PIN A1//右红外避障 #define MOTOR_R1_PIN 5//右电机1 #define MOTOR_R2_PIN 6//右电机2 #define MOTOR_L1_PIN 9//左电机1 #define MOTOR_L2_PIN 10//左电机2 #define BUZZ_PIN 13//蜂鸣器 #define AG_L_PIN 7//左循迹 #define AG_M_PIN 4//中循迹 #define AG_R_PIN 12//右循迹 #define IR_ADVANCE 0x00FFA857 //前进---"+" #define IR_BACK 0x00FFE01F //后退---"-" #define IR_RIGHT 0x00FFE21D //右转---"CH+" #define IR_LEFT 0x00FFA25D //左转---"CH-" #define IR_STOP 0x00FF629D //停止---"CH" #define IR_turnsmallleft 0x00FF02FD //维持原来状态---"NEXT" enum DS { MANUAL_DRIVE,//手动控制 }Drive_Status=MANUAL_DRIVE; enum DN { GO_ADVANCE, //前进 GO_LEFT, //左转 GO_RIGHT,//右转 GO_BACK,//后退 STOP_STOP,//停止 DEF }Drive_Num=DEF; IRrecv IR(IR_PIN); // 定义 IRrecv 物件来接收红外线信号 decode_results IRresults; bool stopFlag = true;//停止标志位 bool JogFlag = false; uint16_t JogTimeCnt = 0; uint32_t JogTime=0; //电机控制 void go_Advance() //双轮前进 { // digitalWrite(MOTOR_R1_PIN, LOW); // digitalWrite(MOTOR_R2_PIN, HIGH); // digitalWrite(MOTOR_L1_PIN, LOW); // digitalWrite(MOTOR_L2_PIN, HIGH); analogWrite(MOTOR_R1_PIN, 200); analogWrite(MOTOR_R2_PIN, 0); analogWrite(MOTOR_L1_PIN, 200); analogWrite(MOTOR_L2_PIN, 0); } void go_Left(int t=0) //双轮左转 { // digitalWrite(MOTOR_R1_PIN, LOW); // digitalWrite(MOTOR_R2_PIN, HIGH); // digitalWrite(MOTOR_L1_PIN, HIGH); // digitalWrite(MOTOR_L2_PIN, LOW); analogWrite(MOTOR_R1_PIN, 0); analogWrite(MOTOR_R2_PIN, 200); analogWrite(MOTOR_L1_PIN, 200); analogWrite(MOTOR_L2_PIN, 0); delay(t); } void go_Right(int t=0) //双轮右转 { // digitalWrite(MOTOR_R1_PIN, HIGH); // digitalWrite(MOTOR_R2_PIN, LOW); // digitalWrite(MOTOR_L1_PIN, LOW); // digitalWrite(MOTOR_L2_PIN, HIGH); analogWrite(MOTOR_R1_PIN, 200); analogWrite(MOTOR_R2_PIN, 0); analogWrite(MOTOR_L1_PIN, 0); analogWrite(MOTOR_L2_PIN, 200); delay(t); } void go_Back(int t=0) //双轮后退 { // digitalWrite(MOTOR_R1_PIN, HIGH); // digitalWrite(MOTOR_R2_PIN, LOW); // digitalWrite(MOTOR_L1_PIN, HIGH); // digitalWrite(MOTOR_L2_PIN, LOW); analogWrite(MOTOR_R1_PIN, 0); analogWrite(MOTOR_R2_PIN, 200); analogWrite(MOTOR_L1_PIN, 0); analogWrite(MOTOR_L2_PIN, 200); delay(t); } void stop_Stop() //双轮停止 { // digitalWrite(MOTOR_R1_PIN, LOW); // digitalWrite(MOTOR_R2_PIN, LOW); // digitalWrite(MOTOR_L1_PIN, LOW); // digitalWrite(MOTOR_L2_PIN, LOW); analogWrite(MOTOR_R1_PIN, 0); analogWrite(MOTOR_R2_PIN, 0); analogWrite(MOTOR_L1_PIN, 0); analogWrite(MOTOR_L2_PIN, 0); } void go_Oleft() //单轮左转 { // digitalWrite(MOTOR_R1_PIN, LOW); // digitalWrite(MOTOR_R2_PIN, HIGH); // digitalWrite(MOTOR_L1_PIN, LOW); // digitalWrite(MOTOR_L2_PIN, LOW); analogWrite(MOTOR_R1_PIN, 200); analogWrite(MOTOR_R2_PIN, 0); analogWrite(MOTOR_L1_PIN, 0); analogWrite(MOTOR_L2_PIN, 0); } void go_Oright() //单轮右转 { // digitalWrite(MOTOR_R1_PIN, LOW); // digitalWrite(MOTOR_R2_PIN, LOW); // digitalWrite(MOTOR_L1_PIN, LOW); // digitalWrite(MOTOR_L2_PIN, HIGH); analogWrite(MOTOR_R1_PIN, 0); analogWrite(MOTOR_R2_PIN, 0); analogWrite(MOTOR_L1_PIN, 200); analogWrite(MOTOR_L2_PIN, 0); } void buzz_ON() //蜂鸣器开 { digitalWrite(BUZZ_PIN, LOW); } void buzz_OFF() //蜂鸣器关 { digitalWrite(BUZZ_PIN, HIGH); } //红外遥控控制 void do_IR_Tick() { if(IR.decode(&IRresults)) { if(IRresults.value==IR_ADVANCE) { Drive_Status=MANUAL_DRIVE; Drive_Num=GO_ADVANCE; } else if(IRresults.value==IR_RIGHT) { Drive_Status=MANUAL_DRIVE; Drive_Num=GO_RIGHT; } else if(IRresults.value==IR_LEFT) { Drive_Status=MANUAL_DRIVE; Drive_Num=GO_LEFT; } else if(IRresults.value==IR_BACK) { Drive_Status=MANUAL_DRIVE; Drive_Num=GO_BACK; } else if(IRresults.value==IR_STOP) { Drive_Status=MANUAL_DRIVE; Drive_Num=STOP_STOP; } IRresults.value = 0; IR.resume(); } } //自动循迹 void start_AUTO_AG() { int SL = digitalRead(AG_L_PIN); int SM = digitalRead(AG_M_PIN); int SR = digitalRead(AG_R_PIN); if (SM == HIGH)//中传感器在黑色区域 { if (SL == HIGH && SR == LOW) // 左黑右白, 向左转弯 { go_Oleft(); } else if (SL == LOW && SR == HIGH) //左白右黑, 向右转弯 { go_Oright(); } else if (SL == LOW && SR == LOW) // 两侧均为白色, 直进 { go_Advance(); } else { go_Oleft(); } } else // 中传感器在白色区域 { if (SL == HIGH && SR == LOW)// 左黑右白, 快速左转 { go_Oleft(); } else if (SL == LOW && SR == HIGH) // 左白右黑, 快速右转 { go_Oright(); } else if (SL == HIGH && SR == HIGH) // 左黑右黑, 向左转弯 { go_Oleft(); } else // 都是白色, 停止 { go_Back(); } } } //小车电机控制 void do_Drive_Tick() { if(Drive_Status == MANUAL_DRIVE)//手动控制模式 { switch (Drive_Num) { case GO_ADVANCE:go_Advance();JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;//前进 case GO_LEFT: go_Left();JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;//左转 case GO_RIGHT: go_Right();JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;//右转 case GO_BACK: go_Back();JogFlag = true;JogTimeCnt = 1;JogTime=millis();break;//后退 case STOP_STOP: stop_Stop();JogTime = 0;break;//停止 default:break; } Drive_Num=DEF; //保持小车运动状态200ms if(millis()-JogTime>=200) { JogTime=millis(); if(JogFlag == true) { stopFlag = false; if(JogTimeCnt <= 0) { JogFlag = false; stopFlag = true; } JogTimeCnt--; } if(stopFlag == true) { JogTimeCnt=0; stop_Stop(); } } } } //初始化 void init_GPIO() { /*设置GPIO模式*/ pinMode(MOTOR_R1_PIN, OUTPUT); pinMode(MOTOR_R2_PIN, OUTPUT); pinMode(MOTOR_L1_PIN, OUTPUT); pinMode(MOTOR_L2_PIN, OUTPUT); stop_Stop(); /*设置GPIO模式*/ pinMode(AG_R_PIN, INPUT); pinMode(AG_M_PIN, INPUT); pinMode(AG_L_PIN, INPUT); pinMode(BUZZ_PIN, OUTPUT); digitalWrite(BUZZ_PIN, HIGH);//设置GPIO口电平 digitalWrite(IR_PIN, HIGH); //设置GPIO口电平 IR.enableIRIn(); // 启动红外线解码 } //主函数 void setup() { Serial.begin(9600);//波特率设置 init_GPIO(); } /*循环*/ void loop() { do_IR_Tick(); do_Drive_Tick(); }