舵机如何实现手动控制+自动控制

舵机如何实现手动控制+自动控制

一只舵机,用模块+编程后实现手动+自动控制

1、手动控制:K1 2 3 4 四个点动开关控制,对应45/90/135/180度
例如:
点击开关K1,【从0转到45度,停留1秒后返回0度】,往返模式
这个模式我在 T宝买了个模块,可以实现,但是不带定时循环功能

img

2、定时循环控制
例如:
接通开关K5,【从0转到45度,停留1秒后返回0度】,30秒后重复动作
接通开关K6,【从0转到45度,停留1秒后返回0度】,60秒后重复动作
有取消控制键

舵机是SG90或者MG90S 5V供电

要求模块 T宝可以买到,体积越小越好,稳定可靠芯,

编程好源码发我,指导复制写入,我自己可以复制几个,指导我接线。

写个单片机程序控制就是了,你那个模块也是,STC的51做的。
模块可以就用这个,你把原理图发出来看看,根据原理图重新写程序就行。
更简单的,你跟店家提要求,让店家改一下。如果这个模块是店家自己做的,那改起来很简单

手动控制
使用4个点动开关(K1、K2、K3、K4)来控制舵机的位置,其中每个开关都对应一个角度值。下面是一个控制舵机的基本代码示例:

#include <Servo.h> // 舵机库

Servo myservo; // 创建舵机实例
int pos = 0; // 初始位置为0

void setup() {
  myservo.attach(9); // 将舵机连接到数字引脚9
}

void loop() {
  if (digitalRead(K1) == HIGH) { // 如果 K1 开关被按下
    myservo.write(45); // 舵机移动到 45 度位置
    delay(1000); // 停留 1 秒钟
    myservo.write(0); // 舵机回到原位
  }
  else if (digitalRead(K2) == HIGH) { // 如果 K2 开关被按下
    myservo.write(90); // 舵机移动到 90 度位置
    delay(1000); // 停留 1 秒钟
    myservo.write(0); // 舵机回到原位
  }
  else if (digitalRead(K3) == HIGH) { // 如果 K3 开关被按下
    myservo.write(135); // 舵机移动到 135 度位置
    delay(1000); // 停留 1 秒钟
    myservo.write(0); // 舵机回到原位
  }
  else if (digitalRead(K4) == HIGH) { // 如果 K4 开关被按下
    myservo.write(180); // 舵机移动到 180 度位置
    delay(1000); // 停留 1 秒钟
    myservo.write(0); // 舵机回到原位
  }
}

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
实现上述功能,我们需要一个Microcontroller(如Arduino、Raspberry Pi等)来控制舵机的运动,并使用一些电子元件(如按钮、继电器、Jumper wires等)来实现手动和自动控制。

对于舵机的控制,我们可以使用PWM信号来控制其旋转角度。我们需要将舵机的信号线连接到Microcontroller的PWM引脚上,并使用相应的PWM库函数来控制PWM信号频率和占空比。

以下是手动+自动控制的实现方案:

  1. 手动控制:

使用4个点动开关K1~K4来控制舵机的旋转角度,我们需要将开关接到Microcontroller的数字引脚上,并将其设置为输入模式。当开关被按下时,数字引脚会改变电平值,我们可以使用相应的数字输入库函数来读取这些引脚的状态。

例如,按下开关K1可以使舵机从0度旋转到45度,停留1秒后返回0度,我们可以使用以下的伪代码实现:

#include <Servo.h> // 引入舵机库

Servo myservo; // 定义一个舵机对象
int angle = 0; // 初始化舵机角度为0

void setup() {
  myservo.attach(9); // 将PWM信号引脚连接到9号数字引脚
  pinMode(K1, INPUT); // 设置开关K1连接的引脚为输入模式
}

void loop() {
  if(digitalRead(K1) == HIGH) { // 如果开关K1被按下
    for(angle = 0; angle < 45; angle++) { // 将舵机从0度旋转到45度
      myservo.write(angle);
      delay(15); // 等待舵机稳定
    }
    delay(1000); // 停留1秒
    for(angle = 45; angle > 0; angle--) { // 将舵机从45度旋转到0度
      myservo.write(angle);
      delay(15);
    }
  }
}
  1. 自动控制:

我们可以使用定时循环来控制舵机的自动旋转。为了能够实现定时循环控制舵机,我们需要在Microcontroller上加入一个实时时钟RTC(如DS1307、DS3231等),使用RTC库函数来获取当前时间,并设置定时循环的时间间隔。

我们可以使用两个Jumper wires将RTC的时钟和数据引脚连接到Microcontroller,并使用相应的RTC库函数来获取当前时间。当我们接通开关K5时,舵机从0度旋转到45度,停留1秒后返回0度,并在30秒后重复这个动作;当我们接通开关K6时,舵机从0度旋转到45度,停留1秒后返回0度,并在60秒后重复这个动作。

以下是伪代码:

#include <Servo.h> // 引入舵机库
#include <Wire.h> // 引入RTC连接库
#include <RTClib.h> // 引入RTC库

RTC_DS1307 rtc; // 定义RTC对象
Servo myservo; // 定义一个舵机对象
int angle = 0;

void setup() {
  myservo.attach(9); // 将PWM信号引脚连接到9号数字引脚
  pinMode(K5, INPUT); // 设置开关K5连接的引脚为输入模式
  pinMode(K6, INPUT); // 设置开关K6连接的引脚为输入模式
  
  Wire.begin(); // 初始化Wire
  rtc.begin(); // 初始化RTC
  if(!rtc.isrunning()) { // 如果RTC未运行
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // 则根据编译时间来初始化RTC
  }
}

void loop() {
  DateTime now = rtc.now(); // 获取当前时间
  if(digitalRead(K5) == HIGH) { // 如果开关K5被按下
    if(now.second() % 30 == 0) { // 如果当前时间是30的倍数秒
      for(angle = 0; angle < 45; angle++) { // 将舵机从0度旋转到45度
        myservo.write(angle);
        delay(15);
      }
      delay(1000); // 停留1秒
      for(angle = 45; angle > 0; angle--) { // 将舵机从45度旋转到0度
        myservo.write(angle);
        delay(15);
      }
    }
  }
  if(digitalRead(K6) == HIGH) { // 如果开关K6被按下
    if(now.second() % 60 == 0) { // 如果当前时间是60的倍数秒
      for(angle = 0; angle < 45; angle++) { // 将舵机从0度旋转到45度
        myservo.write(angle);
        delay(15);
      }
      delay(1000); // 停留1秒
      for(angle = 45; angle > 0; angle--) { // 将舵机从45度旋转到0度
        myservo.write(angle);
        delay(15);
      }
    }
  }
}

以上仅为伪代码,具体实现可能需要根据硬件连接和实际需要进行修改。希望对您有所帮助。
如果我的回答解决了您的问题,请采纳!

引用chatGPT作答,首先,您需要一个能够控制舵机的模块,如Arduino UNO、ESP8266、ESP32等等。在这里,我将使用Arduino UNO进行说明。

接下来,您需要一个舵机,如SG90或MG90S。这些舵机可以通过三根线(红色代表正极,棕色代表负极,橙色代表信号)连接到Arduino UNO板子上。红色线连接到+5V,棕色线连接到GND,橙色线连接到数字引脚,例如引脚9。

您还需要四个点动开关,一个接通开关,一个取消控制键,一个面包板和一些杜邦线。

接线方式如下:

SG90舵机:

红色线连接到+5V
棕色线连接到GND
橙色线连接到数字引脚9
点动开关:

K1:一端连接到数字引脚2,另一端连接到GND
K2:一端连接到数字引脚3,另一端连接到GND
K3:一端连接到数字引脚4,另一端连接到GND
K4:一端连接到数字引脚5,另一端连接到GND
接通开关:

K5:一端连接到数字引脚6,另一端连接到GND
K6:一端连接到数字引脚7,另一端连接到GND
取消控制键:

K7:一端连接到数字引脚8,另一端连接到GND
注意:确保舵机的电源和信号线不会被点动开关和其他电路干扰,建议使用面包板进行连接。
接线完成后,您可以使用以下代码实现手动和自动控制。请注意,以下代码仅供参考,您需要根据自己的需要进行修改和调整。

#include <Servo.h> // 引入舵机库

Servo myservo;  // 创建舵机对象

int angle = 0; // 初始角度为0度

int switchPin1 = 2; // K1点动开关所连接的数字引脚
int switchPin2 = 3; // K2点动开关所连接的数字引脚
int switchPin3 = 4; // K3点动开关所连接的数字引脚
int switchPin4 = 5; // K4点动开关所连接的数字引脚

int onSwitchPin1 = 6; // K5接通开关所连接的数字引脚
int onSwitchPin2 = 7; // K6接通开关所连接的数字引脚

int cancelPin = 8; // 取消控制键所连接的数字引脚

int interval1 = 30000; // K5控制的舵机转动间隔时间(单位:毫秒)
int interval2 = 60000;
void setup() {
myservo.attach(9); // 将舵机信号线连接到数字引脚9
pinMode(switchPin1, INPUT_PULLUP); // 将K1点动开关所连接的数字引脚设为输入模式,并启用内部上拉电阻
pinMode(switchPin2, INPUT_PULLUP); // 将K2点动开关所连接的数字引脚设为输入模式,并启用内部上拉电阻
pinMode(switchPin3, INPUT_PULLUP); // 将K3点动开关所连接的数字引脚设为输入模式,并启用内部上拉电阻
pinMode(switchPin4, INPUT_PULLUP); // 将K4点动开关所连接的数字引脚设为输入模式,并启用内部上拉电阻
pinMode(onSwitchPin1, INPUT_PULLUP); // 将K5接通开关所连接的数字引脚设为输入模式,并启用内部上拉电阻
pinMode(onSwitchPin2, INPUT_PULLUP); // 将K6接通开关所连接的数字引脚设为输入模式,并启用内部上拉电阻
pinMode(cancelPin, INPUT_PULLUP); // 将取消控制键所连接的数字引脚设为输入模式,并启用内部上拉电阻
}

void loop() {
// 手动控制
if (digitalRead(switchPin1) == LOW) { // 检测到K1点动开关按下
myservo.write(45); // 舵机转动到45度
delay(1000); // 停留1秒
myservo.write(0); // 舵机转动回0度
delay(1000); // 停留1秒
}
if (digitalRead(switchPin2) == LOW) { // 检测到K2点动开关按下
myservo.write(90); // 舵机转动到90度
delay(1000); // 停留1秒
myservo.write(0); // 舵机转动回0度
delay(1000); // 停留1秒
}
if (digitalRead(switchPin3) == LOW) { // 检测到K3点动开关按下
myservo.write(135); // 舵机转动到135度
delay(1000); // 停留1秒
myservo.write(0); // 舵机转动回0度
delay(1000); // 停留1秒
}
if (digitalRead(switchPin4) == LOW) { // 检测到K4点动开关按下
myservo.write(180); // 舵机转动到180度
delay(1000); // 停留1秒
myservo.write(0); // 舵机转动回0度
delay(1000); // 停留1秒
}

// 自动控制
if (digitalRead(onSwitchPin1) == LOW) { // 检测开关1是否被按下
  int delayTime = 1000; // 停留时间
  int repeatTime = 30000; // 重复时间
  while (true) {
    myservo.write(45); // 舵机转到45度
    delay(delayTime); // 停留1秒
    myservo.write(0); // 舵机返回0度
    delay(repeatTime); // 等待30秒后再次执行
  }
} else if (digitalRead(onSwitchPin2) == LOW) { // 检测开关2是否被按下
  int delayTime = 1000; // 停留时间
  int repeatTime = 60000; // 重复时间
  while (true) {
    myservo.write(45); // 舵机转到45度
    delay(delayTime); // 停留1秒
    myservo.write(0); // 舵机返回0度
    delay(repeatTime); // 等待60秒后再次执行
  }
}
// 取消控制
if (digitalRead(cancelPin) == LOW) { // 检测到取消控制键按下
myservo.write(0); // 将舵机转回0度
}
}

其中,使用 digitalRead() 函数检测开关的状态,使用 myservo.write() 函数控制舵机转动的角度。

需要注意的是,在自动控制中,使用 delay() 函数等待一段时间,这期间程序是被阻塞的,无法执行其他任务,因此可能会影响程序的稳定性。如果需要在等待期间执行其他任务,可以考虑使用定时器或者非阻塞延时函数,例如 millis() 函数。

至于接线,一般舵机的接线是三根线,红色线接 5V 电源正极,棕色线接电源负极,橙色线接数字引脚。

实现手动+自动控制,可以通过使用微控制器进行编程来实现。下面是大致的实现方法:

  1. 手动控制部分:使用K1234四个点动开关来控制舵机的方向。点动开关分别连接到微控制器的4个引脚上,编写程序来分别控制舵机的旋转方向。

  2. 自动控制部分:使用微控制器的定时器模块来实现自动控制。根据要求的模式,编写程序来控制舵机从初始位置旋转到指定位置。通过定时器控制停留时间,再控制舵机返回初始位置。

  3. 实现手动和自动控制的切换:通过在程序中设置相应的标志位,当标志位为1时为手动控制,当标志位为0时为自动控制。在程序中加入按键扫描函数,判断按键是手动控制还是自动控制,并设置标志位。

需要注意的是,编程前需要确定舵机的型号和控制方式,并根据具体舵机型号编写程序。同时,在接线时需要注意电压和电流的要求,以免损坏舵机。