掌握线用于传输角度掌握旗子暗记。这个角度是由掌握旗子暗记脉冲的持续韶光决定的,这叫做脉冲编码调制(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度;
接线定义
我们利用的舵机型号为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,怎么办呢?我们可以利用舵机掌握板。
该板子主控芯片为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);}







