最近买了块16路PWM舵机驱动板,测试后做个总结。
舵机原理网上资料很多就不详细介绍了,一般以9g舵机为例,一个20ms的周期内通过0.5ms到2.5ms的脉冲宽度控制舵机角度。
板子为16通道12bit PWM舵机驱动,用2个引脚通过I2C就可以驱动16个舵机。
修改例子为可以通过串口设置舵机角度
1 #include <Wire.h>
2 #include <Adafruit_PWMServoDriver.h>
3
4 //默认地址 0x40
5 Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
6
7 //9g舵机 高电平宽度在20ms内通过控制脉冲宽度范围0.5ms~2.5ms
8 #define SERVOMIN 102 // this is the 'minimum' pulse length count (out of 4096) 0度
9 #define SERVOMAX 512 // this is the 'maximum' pulse length count (out of 4096) 180度
10
11 void setup() {
12 Serial.begin(9600);
13 Serial.println("16 channel Servo test!");
14 pwm.begin();
15 pwm.setPWMFreq(50); //频率 50Hz,最高60Hz
16 }
17
18 void setServoPulse(uint8_t n, double pulse) {
19 double pulselength;
20 pulselength = 1000000; // 1,000,000 us per second
21 pulselength /= 50; // 50 Hz
22 Serial.print(pulselength); Serial.println(" us per period");
23 pulselength /= 4096; // 12 bits of resolution
24 Serial.print(pulselength); Serial.println(" us per bit");
25 pulse *= 1000;
26 pulse /= pulselength;
27 Serial.println(pulse);
28 pwm.setPWM(n, 0, pulse);
29 }
30 //设置9g舵机角度
31 void servo_9g_write(uint8_t n,int Angle)
32 {
33 double pulse = Angle;
34 pulse = pulse/90 + 0.5;
35 setServoPulse(n,pulse);//0到180度映射为0.5到2.5ms
36 }
37 void loop()
38 {
39 unsigned char serialRead;
40 if (Serial.available() > 0)
41 {
42 serialRead = Serial.read();
43 servo_9g_write(0,serialRead);//控制第一路度数
44 }
45 }