一、舵机的基本原理
舵机是一种能够通过控制电子信号来控制机器人或其他机械的角度和角速度的电机。舵机电路核心由一个电机、一组位置传感器和一个控制电路组成。这个组合使得舵机变得非常精确。舵机的控制信号是通过PWM(脉宽调制)来控制的, 即通过改变脉冲宽度的长度。而PWM的周期则由控制电路中的晶振来控制。
当接收到指令后,控制电路会将信号传送给电机。电机会进行转动,并且反馈给不断变化的电压值。位置传感器感受到这个变化并且传递给控制电路。控制电路会将传感器的反馈和目标脉冲信号进行比较处理,确保电机转动到目标角度并且停止。
下面是一个典型的舵机的原理图:
----------------------------- | | MOTOR | | | | | | | V | | | [M1] | | | A | | | | | | | V | | | |-[POT1]-| | | |----|Signal | | | | |-[POT2]-| | | | | +----+-- OUT <------ Control Signal | | | | -----------------------------
舵机的电路图非常简单。首先,舵机需要一个电源来控制电机和控制电路。电机由M1代表,它以正向电流来转动或者以反向电流来回转。我们并不需要知道电机是如何驱动的,但是我们需要知道电机转动的时候,我们需要使用位置反馈(POT1和POT2)来检测位置变化。信号输出的地方由OUT标识
二、如何控制舵机
控制舵机需要几个关键因素。第一个是PWM频率。第二个是占空比,也就是脉冲的宽度。最后,还需考虑单个特定舵机的最小响应时间。
对于各种舵机,都有一个标准的PWM频率。虽然有关5Hz至400Hz的频率都可以被接受,但是实际上,500Hz被视为最适宜的PWM频率。实际上,使用PWM频率太低会降低舵机的响应速度,而使用PWM太高也有些浪费。所以使用500Hz非常合适。
控制舵机的第二个关键因素是脉冲的宽度。这通常在0.5ms至2.5ms之间变化,但是这取决于特定的舵机。故而,控制端(PIN)需要发送一个PWM脉冲,其宽度表示一段特定的角度。例如:1.5ms的脉冲宽度对应着舵机的中心位置。如果你要让舵机转动至最大宽度,它需要被带到其最大值。在达到最大值时,要停止发送脉冲来防止毁坏电机。
名义上,这个脉冲可以变化或者缩短至任何值。但是,为了简单起见,我们通常将舵机控制脉冲的宽度设置在900-2100微秒(μs)之间。
三、如何控制SG90舵机
现在我们已经了解了舵机的原理和如何控制它。让我们来看看如何控制一种具体的舵机。
SG90是一种非常受欢迎的舵机,因为它具有良好的响应速度和较低的功耗,同时价格便宜。在此处,我们将通过Arduino Uno控制此舵机。
在此之前,你需要无损地连接你的设备,如下图所示:
_____________________ | GND VCC | |---. .----| PWM <---- Arduino Uno board | | | | | '-[ Servo ]-' | | | '-------------------'
接下来,让我们来看看如何驱动这个舵机。我们需要简单的代码进行控制。我们可以使用内置的 Servo 库来初始化和控制舵机。
#includeServo myServo; void setup() { // 初始化舵机对象 myServo.attach(9); } void loop() { // 转动舵机至角度0 myServo.write(0); delay(1000); // 转动舵机至角度90 myServo.write(90); delay(1000); // 转动舵机至角度180 myServo.write(180); delay(1000); }
在这个示例程序中,我们在频道9上初始化了 myServo 对象。然后,我们在自定义函数中使用 write() 函数来转动舵机。在每个转动过程中,我们会停留1秒钟,然后再继续。
四、如何控制MG996R舵机
与SG90类似,MG996R也是一种广泛使用的舵机。在此之前,你还需连接你的设备,如下图所示:
_____________________ | GND VCC | |---. .----| PWM <---- Arduino Uno board | | | | | '-[ Servo ]-' | | | '-------------------'
我们还是要使用 Servo 库来初始化和控制舵机。不同之处在于其频率是50 Hz,输入电压为6V-7.2V,并且它需要更长的占空比,通常在1000us至2000us之间变化。下面是该舵机的 Arduino 代码:
#includeServo myServo; void setup() { // 初始化舵机对象 myServo.attach(9); } void loop() { // 转动舵机至角度0 myServo.writeMicroseconds(1000); delay(1000); // 转动舵机至角度90 myServo.writeMicroseconds(1500); delay(1000); // 转动舵机至角度180 myServo.writeMicroseconds(2000); delay(1000); }
在这个示例程序中,我们使用了 writeMicroseconds() 函数,因为 MG996R 舵机的占空比在1000us至2000us之间变化。使用此函数,我们可以精确地控制占空比和舵机转动的位置。
五、小结
通过以上分析,我们可以了解舵机的原理和如何控制它,包括SG90和 MG996R。使用 Servo 库,我们可以方便地初始化和控制舵机。如有更复杂的任务和应用,请根据需要进行进一步定制和优化。