#include <Servo.h>
Servo base, Esc, rArm, servoMotor; //建立个电机对象
int dataIndex = 0;
const int TrigPin = 2; //发射型号(前超声波)
int EchoPin = 3; //接收信号
const int TrigPin2 = 4; //倒车超声波
int EchoPin2 = 5;
float cm; //前车车距
float cm2; //倒车测距
int leftLed = 7;
int ledwatingtime = 3000;
int pos = 0;// 该变量用与存储舵机角度位置
int pos2 = 0;//该变量保存Esc电调数值
int read_ahead;//实际距离读取
unsigned int S;;//距离存储
int PIN_SENSOR = 7; //红外臂章模块 倒车时候使用
void setup() {
Serial.begin(9600);
pinMode(TrigPin,OUTPUT);
pinMode(EchoPin,INPUT);
range(); //执行测距函数
servoMotor.write(100);
delay(600);
rArm.attach(10); // rArm 伺服电机连接引脚10 电机代号'r'
Esc.attach(9);
Serial.println("Esc.attach(9)");// ESCm 电调连接引脚9 电机代号'f'
Serial.println("Esc.write(90");
Esc.write(90); // 电调初始值,90到180前进,90-10后退
servoMotor.attach(6);
Serial.println("servoMotor.write (100)");// 舵机连接引脚6 电机代号'c'
servoMotor.write (100); // 舵机初始值,一百90-100中间
Serial.begin(9600);
Serial.println("wating.");
delay(1000);
Serial.println("1.");
delay(1000);
Serial.println("2.");
delay(1000);
Serial.println("3.");
delay(1000);
Serial.println("check motor.");
servoMotor.write(120);
delay(100);
servoMotor.write(20);
delay(100);
servoMotor.write(160);
delay(100);
Serial.println("for(pos = 0; pos < 180; pos += 1);");
{
for(pos = 0; pos < 170; pos += 1);
}
Serial.println(pos);
servoMotor.write(pos);
delay(5000);
servoMotor.write (100);
{
for(pos = 170; pos>=1; pos-=1);
}
Serial.println(pos);
servoMotor.write (100);
Esc.write(100);
delay(2000);
delay(5000);
}
void loop() { //超声波测距控制部分,前进时
//发一个10ms的高脉冲去触发TrigPin
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
cm = pulseIn(EchoPin, HIGH) / 58.0; //算成厘米
cm = (int(cm * 100.0)) / 100.0; //保留两位小数
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(1000);
if( cm >20) {
Esc.write(100);
servoMotor.write (50);
}else{
Esc.write(90);
servoMotor.write (100);
}
delay(1000);
//发一个10ms的高脉冲去触发TrigPin2 // 倒车测距)
digitalWrite(TrigPin2, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin2, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin2, LOW);
cm2 = pulseIn(EchoPin2, HIGH) / 58.0; //算成厘米
cm2 = (int(cm * 100.0)) / 100.0; //保留两位小数
Serial.print(cm2);
Serial.print("cm2");
Serial.println();
delay(1000);
//串口口控制部分调试
if (Serial.available()) { // 检查串口缓存是否有数据等待传输
char servoName = Serial.read(); //获取电机指令中电机编号信息
Serial.print("servoName = ");
Serial.print(servoName);
Serial.print(" , ");
int data = Serial.parseInt(); //获取电机指令中电机角度信息
switch(servoName){ //根据电机指令中电机信息决定对哪一个电机进行角度设置
case 'b': // 电机指令b,设置base电机角度
base.write(data);
Serial.print("Set base servo value: ");
Serial.println(data);
break;
case 'r': // 电机指令r,设置rArm电机角度
rArm.write(data);
Serial.print("Set rArm servo value: ");
Serial.println(data);
break;
case 'e': // 电调指令f,设置电调形成
Esc.write(data);
Serial.print("Set fArm servo value: ");
Serial.println(data);
break;
case 'd': // 舵机指令c,设置遥控车左右角度
servoMotor.write(data);
Serial.print("Set claw servo value: ");
Serial.println(data);
break;
}
}
}
void range() //测距函数
{
digitalWrite(TrigPin,LOW);
delayMicroseconds(2); //延时2微秒
digitalWrite(TrigPin,HIGH);
delayMicroseconds(20);
digitalWrite(TrigPin,LOW);
int distance = pulseIn(EchoPin,HIGH); //读取高电平时间
distance = distance/58; //按照公式计算
S = distance; //把值赋给S
delay(500);
Serial.println(S); //向串口发送S的值,可以在显示器上显示距离
if (S<30){
tone(12,800,50);
delay(50); //延时
}
}
以上代码是控制2个超声波测距,和2个电机的代码,
loop函数里面包含了,我需要好的2个控制方法,
一个串口控制,最上面是自动循环模式,,
问题我现在不知道怎么把串口部分,和自动循环模式,区分开,,
说的简单点就是,用串口调试的时候,模式进入串口模式
不用串口的时候,进入自动循环模式,或者进入其他模式
Servo base, Esc, rArm, servoMotor; //建立个电机对象
int dataIndex = 0;
const int TrigPin = 2; //发射型号(前超声波)
int EchoPin = 3; //接收信号
const int TrigPin2 = 4; //倒车超声波
int EchoPin2 = 5;
float cm; //前车车距
float cm2; //倒车测距
int leftLed = 7;
int ledwatingtime = 3000;
int pos = 0;// 该变量用与存储舵机角度位置
int pos2 = 0;//该变量保存Esc电调数值
int read_ahead;//实际距离读取
unsigned int S;;//距离存储
int PIN_SENSOR = 7; //红外臂章模块 倒车时候使用
void setup() {
Serial.begin(9600);
pinMode(TrigPin,OUTPUT);
pinMode(EchoPin,INPUT);
range(); //执行测距函数
servoMotor.write(100);
delay(600);
rArm.attach(10); // rArm 伺服电机连接引脚10 电机代号'r'
Esc.attach(9);
Serial.println("Esc.attach(9)");// ESCm 电调连接引脚9 电机代号'f'
Serial.println("Esc.write(90");
Esc.write(90); // 电调初始值,90到180前进,90-10后退
servoMotor.attach(6);
Serial.println("servoMotor.write (100)");// 舵机连接引脚6 电机代号'c'
servoMotor.write (100); // 舵机初始值,一百90-100中间
Serial.begin(9600);
Serial.println("wating.");
delay(1000);
Serial.println("1.");
delay(1000);
Serial.println("2.");
delay(1000);
Serial.println("3.");
delay(1000);
Serial.println("check motor.");
servoMotor.write(120);
delay(100);
servoMotor.write(20);
delay(100);
servoMotor.write(160);
delay(100);
Serial.println("for(pos = 0; pos < 180; pos += 1);");
{
for(pos = 0; pos < 170; pos += 1);
}
Serial.println(pos);
servoMotor.write(pos);
delay(5000);
servoMotor.write (100);
{
for(pos = 170; pos>=1; pos-=1);
}
Serial.println(pos);
servoMotor.write (100);
Esc.write(100);
delay(2000);
delay(5000);
}
void loop() { //超声波测距控制部分,前进时
//发一个10ms的高脉冲去触发TrigPin
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
cm = pulseIn(EchoPin, HIGH) / 58.0; //算成厘米
cm = (int(cm * 100.0)) / 100.0; //保留两位小数
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(1000);
if( cm >20) {
Esc.write(100);
servoMotor.write (50);
}else{
Esc.write(90);
servoMotor.write (100);
}
delay(1000);
//发一个10ms的高脉冲去触发TrigPin2 // 倒车测距)
digitalWrite(TrigPin2, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin2, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin2, LOW);
cm2 = pulseIn(EchoPin2, HIGH) / 58.0; //算成厘米
cm2 = (int(cm * 100.0)) / 100.0; //保留两位小数
Serial.print(cm2);
Serial.print("cm2");
Serial.println();
delay(1000);
//串口口控制部分调试
if (Serial.available()) { // 检查串口缓存是否有数据等待传输
char servoName = Serial.read(); //获取电机指令中电机编号信息
Serial.print("servoName = ");
Serial.print(servoName);
Serial.print(" , ");
int data = Serial.parseInt(); //获取电机指令中电机角度信息
switch(servoName){ //根据电机指令中电机信息决定对哪一个电机进行角度设置
case 'b': // 电机指令b,设置base电机角度
base.write(data);
Serial.print("Set base servo value: ");
Serial.println(data);
break;
case 'r': // 电机指令r,设置rArm电机角度
rArm.write(data);
Serial.print("Set rArm servo value: ");
Serial.println(data);
break;
case 'e': // 电调指令f,设置电调形成
Esc.write(data);
Serial.print("Set fArm servo value: ");
Serial.println(data);
break;
case 'd': // 舵机指令c,设置遥控车左右角度
servoMotor.write(data);
Serial.print("Set claw servo value: ");
Serial.println(data);
break;
}
}
}
void range() //测距函数
{
digitalWrite(TrigPin,LOW);
delayMicroseconds(2); //延时2微秒
digitalWrite(TrigPin,HIGH);
delayMicroseconds(20);
digitalWrite(TrigPin,LOW);
int distance = pulseIn(EchoPin,HIGH); //读取高电平时间
distance = distance/58; //按照公式计算
S = distance; //把值赋给S
delay(500);
Serial.println(S); //向串口发送S的值,可以在显示器上显示距离
if (S<30){
tone(12,800,50);
delay(50); //延时
}
}
以上代码是控制2个超声波测距,和2个电机的代码,
loop函数里面包含了,我需要好的2个控制方法,
一个串口控制,最上面是自动循环模式,,
问题我现在不知道怎么把串口部分,和自动循环模式,区分开,,
说的简单点就是,用串口调试的时候,模式进入串口模式
不用串口的时候,进入自动循环模式,或者进入其他模式