|
- #include <AFMotor.h>
- int RelayPin = 13; //继电器
- int EchoPin = 14; //超声波Echo
- int TrigPin = 15; //超声波Trig
- int SensorL = 16; //避障前左 16
- int SensorR = 17; //避障前右 17
- int Jiguang = 18; //激光开关
- int mid = 0 ;
- int snum[3];
- int state;
- float cm;
- int val;
- AF_DCMotor motor1(1, MOTOR12_64KHZ);// 创建左前轮,速度是64KHz pwm
- AF_DCMotor motor2(2, MOTOR12_64KHZ);// 创建左后轮,速度是64KHz pwm
- AF_DCMotor motor3(3, MOTOR12_64KHZ);// 创建右前轮,速度是64KHz pwm
- AF_DCMotor motor4(4, MOTOR12_64KHZ);// 创建右后轮,速度是64KHz pwm
- /****************************** 小车行驶状态 ***********************************/
- void carGoFwd()
- { // 小车前进
- motor1.run(FORWARD);// 电机前进
- motor2.run(FORWARD);// 电机前进
- motor3.run(FORWARD);// 电机前进
- motor4.run(FORWARD);// 电机前进
- Serial.print("car forward");
- }
- void carGoBwd()
- { // 小车后退
- motor1.run(BACKWARD);// 电机后退
- motor2.run(BACKWARD);// 电机后退
- motor3.run(BACKWARD);// 电机后退
- motor4.run(BACKWARD);// 电机后退
- Serial.print("car back");
- }
- void carTurnL()
- { // 小车左转
- motor1.run(BACKWARD);// 电机后退
- motor2.run(BACKWARD);// 电机后退
- motor3.run(FORWARD);// 电机前进
- motor4.run(FORWARD);// 电机前进
- Serial.print("car turn left");
- }
-
- void carTurnR()
- { // 小车右转
- motor1.run(FORWARD);// 电机前进
- motor2.run(FORWARD);// 电机前进
- motor3.run(BACKWARD);// 电机后退
- motor4.run(BACKWARD);// 电机后退
- Serial.print("car turn right");
- }
- void carGoL()
- { // 小车左前行
- motor1.run(BACKWARD);// 电机后退
- motor2.run(FORWARD);// 电机后退
- motor3.run(FORWARD);// 电机前进
- motor4.run(FORWARD);// 电机前进
- Serial.print("car go left");
- }
- void carGoR()
- { // 小车右前行
- motor1.run(FORWARD);// 电机前进
- motor2.run(FORWARD);// 电机前进
- motor3.run(FORWARD);// 电机后退
- motor4.run(BACKWARD);// 电机后退
- Serial.print("car go right");
- }
- void carStop()
- { // 小车制动
- motor1.run(RELEASE);// 电机停步
- motor2.run(RELEASE);// 电机停步
- motor3.run(RELEASE);// 电机停步
- motor4.run(RELEASE);// 电机停步
- Serial.print("car barke");
-
- }
- void randTrun()
- {
- long randNumber;
- randomSeed(analogRead(5));
- randNumber = random(0, 10);
- if(randNumber > 5) {
- carTurnR();
- }
- else
- {
- carTurnL();
- }
- }
- /******************************* 测距模块 **************************/
- int distance()
- {
- digitalWrite(TrigPin, LOW); // 给触发脚低电平2μs
- delayMicroseconds(2);
- digitalWrite(TrigPin, HIGH); // 给触发脚高电平10μs,这里至少是10μs
- delayMicroseconds(20);
- digitalWrite(TrigPin, LOW); // 持续给触发脚低电
- float Fdistance = pulseIn(EchoPin, HIGH); // 读取高电平时间(单位:微秒)
- Fdistance= Fdistance/58; //为什么除以58等于厘米, Y米=(X秒*344)/2
- // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
- return (int)Fdistance;
- Serial.print(Fdistance);
- Serial.println(Fdistance);
- }
- /******************************* 避障过程 **************************/
- void autorun()
- {
- snum[0]=digitalRead(16); //这三个依次为左右红外传感器
- snum[1]=digitalRead(17);
- mid = distance();
- #ifdef send
- Serial.print("mid=");
- Serial.println(mid);
- #endif
- if ((snum[0]==1) && snum[1]==1 ) //所有传感器都没有检测到障碍物
- {
- carGoFwd();//直行
- }
- if (snum[0]==0 && (snum[1]==1)) //右边传感器检测到障碍物
- {
- carStop();
- delay(500);
- carGoBwd();
- delay(200);
- carTurnR();
- delay(1000);
- }
- if (snum[0]==1 && snum[1]==0) //左边传感器检测到障碍物
- {
- carStop();
- delay(500);
- carGoBwd();
- delay(500);
- carTurnL();//小车向右转
- delay(500);
- }
- if (mid <=15) //所有传感器都没有检测到障碍物
- {
- carStop();
- delay(500);
- carGoBwd();
- delay(500);
- randTrun();
- delay(500);
- }
- }
- void setup()
- { // 初始化串口通信及连接SR04的引脚
- Serial.begin(9600);
- pinMode(RelayPin,OUTPUT); //定义继电器 RelayPin接口为输出接口
- pinMode(TrigPin, OUTPUT); //定义SR04 TrigPin接口为输出接口
- pinMode(EchoPin, INPUT); //定义SR04 EchoPin接口为输入 接口
- pinMode(SensorL,INPUT); //定义左传感器接口为输入接口
- pinMode(SensorR,INPUT); //定义右传感器接口为输入接口
- pinMode(Jiguang,OUTPUT); //定义激光头
- motor1.setSpeed(150);// 设置电机速度,从200/255之间任意
- motor2.setSpeed(150);// 设置电机速度,从200/255之间任意
- motor3.setSpeed(160);// 设置电机速度,从200/255之间任意
- motor4.setSpeed(160);// 设置电机速度,从200/255之间任意
- digitalWrite(RelayPin,HIGH);
- }
- void loop()
- {
- if(Serial.available()>0) //查询串口有无数据
- {
- val=Serial.read();//读取labview下达的命令
- if(val=='Q')//发送字符'Q',则小车自动巡行
- {
- autorun();//
- }
- if(val=='W')//发送字符'W',则小车前进
- {
- carGoFwd();//
- }
- if(val=='S')//发送字符'S',则小车后退
- {
- carGoBwd();//
- }
- if(val=='A')//发送字符'A',则小车左转
- {
- carTurnL();//
- }
- if(val=='D')//发送字符'D',则小车右转
- {
- carTurnR();//
- }
- if(val=='Z')//发送字符'y',则小车停止
- {
- carStop();//
- }
- if(val=='M')//
- {
- {
- digitalWrite(Jiguang,HIGH);
- delay(10000);
- digitalWrite(Jiguang,LOW);
- }
- if(val=='N')//
- digitalWrite(RelayPin,LOW);
- delay(10000);
- digitalWrite(RelayPin,HIGH);
- }
- }
- }
-
复制代码 |
|