#include <Servo.h> Servo myservo; const int trig = 11; const int echo = 10; const int led = 3; void setup() { pinMode(trig, OUTPUT); pinMode(led, OUTPUT); pinMode(echo, INPUT); Serial.begin(9600); myservo.attach(9); } void loop() { digitalWrite(trig, LOW); delayMicroseconds(2); digitalWrite(trig,HIGH); delayMicroseconds(10); digitalWrite(trig, LOW); long duration = pulseIn(echo,HIGH); int distance = duration/58; int angle = map(distance,2,400,15,165); myservo.write(angle); delay(10); if (distance >= 2 && distance <=400){ analogWrite(led,map(distance,2,400,255,0)); } else if(distance < 2) { analogWrite(led,255); } else{ analogWrite(led,0); } Serial.print(distance); Serial.print("cm"); delay(100); }在这个代码中实现舵机转动并且舵机转动不用map()函数
时间: 2024-01-22 19:02:34 浏览: 62
好的,这个代码中使用了map()函数将超声波测距得到的距离映射到舵机需要转动的角度,我们可以将这部分代码改为直接计算舵机需要转动的角度,不需要使用map()函数。
修改后的代码如下:
```
#include <Servo.h>
Servo myservo;
const int trig = 11;
const int echo = 10;
const int led = 3;
void setup() {
pinMode(trig, OUTPUT);
pinMode(led, OUTPUT);
pinMode(echo, INPUT);
Serial.begin(9600);
myservo.attach(9);
}
void loop() {
digitalWrite(trig, LOW);
delayMicroseconds(2);
digitalWrite(trig,HIGH);
delayMicroseconds(10);
digitalWrite(trig, LOW);
long duration = pulseIn(echo,HIGH);
int distance = duration/58;
int angle = 0;
if(distance <= 2){ // 距离小于等于2cm,舵机转动到最小角度
angle = 15;
}else if(distance >= 400){ // 距离大于等于400cm,舵机转动到最大角度
angle = 165;
}else{ // 距离在2cm到400cm之间,计算舵机需要转动到的角度
angle = (distance - 2) * (165 - 15) / (400 - 2) + 15;
}
myservo.write(angle);
delay(10);
if (distance >= 2 && distance <=400){
analogWrite(led,map(distance,2,400,255,0));
}else if(distance < 2){
analogWrite(led,255);
}else{
analogWrite(led,0);
}
Serial.print(distance);
Serial.print("cm");
delay(100);
}
```
在这个代码中,我们使用if语句来确定舵机需要转动到的角度,根据距离的大小计算出来。如果距离小于等于2cm,舵机转动到最小角度(15度);如果距离大于等于400cm,舵机转动到最大角度(165度);如果距离在2cm到400cm之间,通过线性插值计算出舵机需要转动到的角度。这样就不需要使用map()函数了。
阅读全文