arduino超声波传感器控制舵机旋转-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: 1042912609

[未解决] arduino超声波传感器控制舵机旋转

[复制链接]
发表于 2019-5-20 09:10 | 显示全部楼层
刘大大 发表于 2018-6-3 09:03
可不可以帮我写一下这个程序 是好多次都没成功

你好,我现在也在弄这个东西,请问你有程序码?能不能发给我看下?谢谢
发表于 2019-5-20 09:11 | 显示全部楼层
你好,我现在也在弄这个东西,请问你有程序码?能不能发给我看下?谢谢
发表于 2019-8-16 15:24 | 显示全部楼层
整个贴都没有
我来吧
[mw_shl_code=arduino,true]#include <Arduino.h>
#include <Servo.h>
Servo l;
int trig = A0;
int echo = A1;
float cs;
unsigned int tems;
int main(void)
{
  Serial.begin(9600);
  l.attach(9);
  pinMode(A0,OUTPUT);
  pinMode(echo,INPUT);
  while(true)
  {
    digitalWrite(trig,0);
    delayMicroseconds(2);
    digitalWrite(trig,1);
    delayMicroseconds(10);
    digitalWrite(trig,0);
    tems = pulseIn(echo,1);
    cs = (float)tems/58.2;
    Serial.print(cs);
    Serial.println();
    if(cs<5)
    {
      l.write(90);
    }else{
      l.write(0);
    }
  }
}
[/mw_shl_code]
发表于 2019-8-16 15:26 | 显示全部楼层
iaoeiia4869 发表于 2017-5-24 15:48
你好!我也正在写一个类似的程序,试着用超声波测距后用if语句控制舵机运行,但怎样都不成功,请问能不能把 ...

https://github.com/guochao2299/AutoSonicScan/tree/Version1
这个有啊
发表于 2019-8-16 15:32 | 显示全部楼层
刘大大 发表于 2018-6-3 09:03
可不可以帮我写一下这个程序 是好多次都没成功

[mw_shl_code=arduino,true]#include <Servo.h>

#define RESET_COMMAND "RESET"
#define DISTINCE_COMMAND "DIST"
#define AUTO_COMMAND "AUTO"
#define A_ANGLE_COMMAND "AANGLE"
#define DISTINCE_COMMAND_D "DT:"
#define DISTINCE_COMMAND_A "AG:"
#define DISTINCE_COMMAND_A_ROUND_END "ROUNDEND"
#define AANGLE_LENGTH 6
#define SPLIT_CHAR ';'
#define RECEIVE_STAGE 0   // 接收命令阶段
#define EXECUTE_STAGE 1   // 执行命令阶段
#define OBSERVE_STAGE 2   // 观察阶段

#define ORIGIN_POS 0
#define MAX_CHARS 49

Servo myservo;  // create servo object to control a servo
// a maximum of eight servo objects can be created

int pos = 0;    // variable to store the servo position
int posstep = 1;

const int TrigPin = 3;
const int EchoPin = 2;

int servopin = 9;
int currentStage;
char buffer[MAX_CHARS + 1];
int charIndex = 0;

float distance;

void setup()
{
  Serial.begin(9600);
  Serial.flush();

  currentStage = RECEIVE_STAGE;

  myservo.attach(servopin);  // attaches the servo on pin 9 to the servo object
  myservo.write(ORIGIN_POS);// 舵机复位

  pinMode(TrigPin, OUTPUT);
  pinMode(EchoPin, INPUT);

  Serial.println("Ready");
}

void loop()
{
  //Serial.print("loop:currentStage=");
  //Serial.println(currentStage);

  switch (currentStage)
  {
    case RECEIVE_STAGE:
      ReceiveCommand();
      break;

    case EXECUTE_STAGE:
      currentStage = RECEIVE_STAGE;
      if (strcmp(buffer, RESET_COMMAND) == 0)
      {
        ResetDJ();
      }
      else if (strcmp(buffer, AUTO_COMMAND) == 0)
      {
        AutoTurn();
        currentStage = OBSERVE_STAGE;
      }
      else if (strcmp(buffer, DISTINCE_COMMAND) == 0)
      {
        DistanceDect();
      }
      else if (strncmp(buffer, A_ANGLE_COMMAND, AANGLE_LENGTH) == 0)
      {
        char* pInt = &buffer[AANGLE_LENGTH + 1];
        AAngle(atoi(pInt));
      }
      break;

    case OBSERVE_STAGE:
      if (Serial.available() > 0)
      {
        currentStage = RECEIVE_STAGE;
      }
      else
      {
        AutoTurn();
      }

      break;
  }
}

void ReceiveCommand()
{
  if (Serial.available() > 0)
  {
    char ch = Serial.read();

    //Serial.print("received char is ");
    //Serial.println(ch);

    if ((charIndex < MAX_CHARS) && (ch != SPLIT_CHAR))
    {
      buffer[charIndex++] = ch;
    }
    else
    {
      buffer[charIndex] = 0;
      charIndex = 0;
      currentStage = EXECUTE_STAGE;

      Serial.print("received command is ");
      Serial.println(buffer);
    }
  }
}
void ResetDJ()
{
  myservo.write(ORIGIN_POS);
}

void AAngle(int angle)
{
  myservo.write(angle);
}

void AutoTurn()
{
  pos += posstep;
  myservo.write(pos);              // tell servo to go to position in variable 'pos'
  delay(15);                       // waits 15ms for the servo to reach the position

  DistanceDect();

  if (pos == 0)
  {
    posstep = 1;
    Serial.println(DISTINCE_COMMAND_A_ROUND_END);
  }
  else if (pos == 180)
  {
    posstep = -1;
    Serial.println(DISTINCE_COMMAND_A_ROUND_END);
  }

  //Serial.print("AutoTrun:pos=");
  //Serial.println(pos);
}

void DistanceDect()
{
  // 产生一个10us的高脉冲去触发TrigPin
  digitalWrite(TrigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(TrigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(TrigPin, LOW);
  // 检测脉冲宽度,并计算出距离
  distance = pulseIn(EchoPin, HIGH) / 58.00;  
  Serial.println(String("")+DISTINCE_COMMAND_D+distance+DISTINCE_COMMAND_A + myservo.read());
}[/mw_shl_code]
发表于 2019-10-10 17:12 来自手机 | 显示全部楼层
超声波传感器探测到物体距离小于30厘米时,舵机开始旋转,转到90度后停止,当物体离开30厘米范围之外。舵机从90度转回来,求这楼主怎么解决的,具体代码,怎么搞
发表于 2019-11-15 23:34 来自手机 | 显示全部楼层
请问还有这个代码吗,我也再弄不太对,可以发一下吗
发表于 2021-7-9 14:18 | 显示全部楼层
请问您当时做的这个项目是如何用超声波模块的数据使得舵机做出设定动作的?谢谢
发表于 2021-7-10 18:58 | 显示全部楼层
李不坏 发表于 2019-5-20 09:11
你好,我现在也在弄这个东西,请问你有程序码?能不能发给我看下?谢谢

//仅供参考,我没有实际调试
#include<Servo.h>
Servo myServo;
int distance()//定义超声波测距函数
{
  digitalWrite(2,0);//trigPin在D2
  delayMicroseconds(2);
  digitalWrite(2,1);
  delayMicroseconds(10);
  digitalWrite(2,0);
  return pulseIn(3,1)/58;//echoPin在D3
  delay(100);//间隔100ms测距一次
}
int a;//定义变量a存储舵机角度
void setup() {
  pinMode(2,OUTPUT);
  pinMode(3,INPUT);
  myServo.attach(4);//舵机接在D4
  Serial.begin(9600);
  myServo.write(0);//给舵机写入初始角度0度
}

void loop() {
  Serial.println(distance());//打印障碍物距离
  if(distance()<=30)//如果障碍物在30cm以内
  {
   
    a++;
    if(a>=90)//如果舵机大于等于90度,舵机停留在90度
    {
      a=90;
    }
    myServo.write(a);
    delay(100);
  }
  else//如果障碍物在30cm以上
  {
    a--;
    if(a<=0)
    {
      a=0;
    }
    myServo.write(a);
    delay(100);
  }

}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-29 03:43 , Processed in 0.102416 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表