你想做一個很酷的機器人,也許想做一個六足的行走機器人,或者只是一件藝術品帶有許多移動部件。你可能還想用精確的PWM輸出驅動許多LED指示燈。
然後你意識到你的單片機的PWM輸出數量有限!接下來將要怎麼做呢?你可以放棄或你能用這個方便的PWM伺服驅動器小板。
簡介:
這是一個採用i2c通信 ,內置了PWM驅動器和一個時鐘。這意味著,這將和TLC5940系列有很大不同。你不需要不斷發送信號佔用你的單片機!
它是5V的兼容,這意味著你還可以用3.3V單片機控制並且安全地驅動到6V輸出(當你想控制白色或藍色指示燈用3.4+正電壓也是可以的)
6地址選擇引腳使你可以把62個驅動板掛在單個i2c總線上,總共有992路PWM輸出。那將是非常龐大的資源。
約1.6Khz可調頻PWM輸出
為步進電機準備輸出12位分辨率,這意味著在60Hz的更新率能夠達到4us分辨率
可配置的推拉輸出或開路輸出
輸出使能引腳能夠快速禁用所有輸出
特性:
※ PCA9685芯片被包裹在小板的中央
※ 電源輸入端子
※ 綠色電源指示燈
※ 在4組3針連接器中方便你一次插入16個伺服電機(伺服電機的插頭稍寬於0.1",所以你可以放4對0.1"的接頭)
※ 接線板上輸入的反向極性保護
※ 級聯設計
※ V+線上放置一個大電容(在某些場合你會需要) 外圍輸入最大電壓取決於這個10V1000uf的電容
※ 所有PWM輸出線上都放一個220歐姆系列電阻器來保護他們,並能輕易的驅動LED。
完整範例程式
#include <Wire.h> #include <Adafruit_PWMServoDriver.h> // called this way, it uses the default address 0x40 Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); // you can also call it with a different address you want //Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41); // Depending on your servo make, the pulse width min and max may vary, you // want these to be as small/large as possible without hitting the hard stop // for max range. You'll have to tweak them as necessary to match the servos you // have! #define SERVOMIN 150 // this is the 'minimum' pulse length count (out of 4096) #define SERVOMAX 600 // this is the 'maximum' pulse length count (out of 4096) // our servo # counter //uint8_t servonum = 0; void setup() { Serial.begin(9600); Serial.println("16 channel Servo test!"); pwm.begin(); pwm.setPWMFreq(60); // Analog servos run at ~60 Hz updates } // you can use this function if you'd like to set the pulse length in seconds // e.g. setServoPulse(0, 0.001) is a ~1 millisecond pulse width. its not precise! void setServoPulse(uint8_t n, double pulse) { double pulselength; pulselength = 1000000; // 1,000,000 us per second pulselength /= 60; // 60 Hz Serial.print(pulselength); Serial.println(" us per period"); pulselength /= 4096; // 12 bits of resolution Serial.print(pulselength); Serial.println(" us per bit"); pulse *= 1000; pulse /= pulselength; Serial.println(pulse); pwm.setPWM(n, 0, pulse); } void loop() { // Drive each servo one at a time //Serial.println(servonum); for (uint16_t pulselen = SERVOMIN; pulselen < SERVOMAX; pulselen++) { pwm.setPWM(0, 0, pulselen); pwm.setPWM(1, 0, pulselen); pwm.setPWM(2, 0, pulselen); pwm.setPWM(3, 0, pulselen); pwm.setPWM(4, 0, pulselen); pwm.setPWM(5, 0, pulselen); pwm.setPWM(6, 0, pulselen); pwm.setPWM(7, 0, pulselen); pwm.setPWM(8, 0, pulselen); pwm.setPWM(9, 0, pulselen); pwm.setPWM(10, 0, pulselen); pwm.setPWM(11, 0, pulselen); pwm.setPWM(12, 0, pulselen); pwm.setPWM(13, 0, pulselen); pwm.setPWM(14, 0, pulselen); } delay(500); for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) { pwm.setPWM(0, 0, pulselen); pwm.setPWM(0, 0, pulselen); pwm.setPWM(1, 0, pulselen); pwm.setPWM(2, 0, pulselen); pwm.setPWM(3, 0, pulselen); pwm.setPWM(4, 0, pulselen); pwm.setPWM(5, 0, pulselen); pwm.setPWM(6, 0, pulselen); pwm.setPWM(7, 0, pulselen); pwm.setPWM(8, 0, pulselen); pwm.setPWM(9, 0, pulselen); pwm.setPWM(10, 0, pulselen); pwm.setPWM(11, 0, pulselen); pwm.setPWM(12, 0, pulselen); pwm.setPWM(13, 0, pulselen); pwm.setPWM(14, 0, pulselen); } delay(500);
×