舵机控制板怎么用(舵机和舵机控制板)

在很多项目中需要用到舵机。比如机器人,伺服系统等方面。步进电机是可以设定转过多少角度,而舵机是可以设定转到的位置,可以说是指哪打哪,Arduino智能小车的前轮转弯系统便是用的这种原理,在工业上机器人上,舵机的应用更是不胜枚举。

舵机控制板怎么用(舵机和舵机控制板)(1)

控制线用于传输角度控制信号。这个角度是由控制信号脉冲的持续时间决定的,这叫做脉冲编码调制(PCM)。舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围,总间隔为2ms。脉冲的宽度将决定马达转动的距离。例如:1.5毫秒的脉冲,电机将转向90度的位置(通常称为中立位置,对于180°舵机来说,就是90°位置)。如果脉冲宽度小于1.5毫秒,那么电机轴向朝向0度方向。如果脉冲宽度大于1.5毫秒,轴向就朝向180度方向。以180度舵机为例,对应的控制关系是这样的:

0.5ms————-0度;

1.0ms————45度;

1.5ms————90度;

2.0ms———–135度;

2.5ms———–180度;

舵机控制板怎么用(舵机和舵机控制板)(2)

接线定义

我们使用的舵机型号为SG90,有三根线,红色的为电源线(5V),棕色的为GND,橙色的为控制线,我们所写的程序都是通过橙色线来传输数据的。

#include <Servo.h> 加载舵机的库函数,必须有

Servo myservo 创建一个控制伺服电机的对象

myservo.attach(9) 让Arduino的引脚9控制舵机

myservo.write(0) 让舵机转到0°的位置,而不是转动0°

当然,这是一个很简单的舵机控制例程,在实际应用中,要注意:

黄色信号线要接在pwm针脚。uno板子上一共有6个pwm,分别是3.5.6.9.10.11.

如果接多个舵机,舵机的电源线应该另行接出,不能全部接到arduino的5v端口,否则电流太大会烧板子。

当我们制作机器人等项目时,动辄舵机要20个以上,但是板子上只有6个pwm,怎么办呢?我们可以使用舵机控制板。

舵机控制板怎么用(舵机和舵机控制板)(3)

舵机控制板怎么用(舵机和舵机控制板)(4)

该板子主控芯片为PCA9685,采用I2C接口与arduino连接。最多可以控制16个舵机。需要使用外部库支持

笔者视频中的爬行机器人、WiFi视频小车的机械爪都用到了舵机控制板。

/*************************************************** 这是16通道PWM和伺服驱动器的一个例子,驱动16个伺服电机 ****************************************************/ #include <Wire.h> //16路舵机控制板头文件 #include <Adafruit_PWMServoDriver.h> //16路舵机控制板头文件 Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();//以这种方式调用,它使用默认地址0x40。 //Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);//也可以用不同的地址调用它 void setServopulse(uint8_t n, double pulse); //以秒为单位设置脉冲长度函数 void pwm_text(); //16路舵机控制板测试函数,效果是来回转动,16路同时 /*根据你的伺服制作,脉冲宽度最小和最大可能变化,你想要这些尽可能小大而不碰到 硬停止,对于最大范围。你必须调整它们以匹配你的伺服系统!*/ #define SERVOMIN 150 //这是“最小”脉冲长度计数(在4096中) #define SERVOMAX 600 //这是“最大”脉冲长度计数(在4096中) void setup() { Serial.begin(9600); Serial.println("16 channel Servo test!"); pwm.begin(); pwm.setPWMFreq(60); //设置频率60Hz 可用50Hz 40-1000//测试对电机的速度没有影响 } /********************主函数********************/ void loop() { pwm_text(); //16路舵机控制板测试函数,效果是来回转动,16路同时 } /********************************************/ void pwm_text(){ //16路舵机控制板测试函数,效果是来回转动,16路同时 //每次驱动一个伺服驱动器 for (uint16_t pulse = SERVOMIN; pulse < SERVOMAX; pulse ) { for(uint8_t channel=0;channel<16;channel ) { pwm.setPWM(channel, 0, pulse); //pulse翻译为脉冲 } } delay(500); for (uint16_t pulse = SERVOMAX; pulse > SERVOMIN; pulse--) { for(uint8_t channel=0;channel<16;channel ) { pwm.setPWM(channel, 0, pulse); //pulse翻译为脉冲 ,实际使用时,也是脉冲值,//不是角度。如果输入角度,舵机不转。一般的换算公式为脉冲=(600-150)/180*角度 } } delay(500); } //如果您想以秒为单位设置脉冲长度,则可以使用此函数。 //例如SET伺服脉冲(0,0.001)是一个1毫秒的脉冲宽度,但不精确! void setServoPulse(uint8_t n, double pulse) //以秒为单位设置脉冲长度函数 { double pulselength;//精度浮点数 pulselength = 1000000; // 1,000,000 us per second 每秒100万 pulselength /= 60; // 60 Hz Serial.print(pulselength); Serial.println(" us per period"); pulselength /= 4096; // 12 bits of resolution 12位分辨率 Serial.print(pulselength); Serial.println(" us per bit"); pulse *= 1000; pulse /= pulselength; Serial.println(pulse); pwm.setPWM(n, 0, pulse); }

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页