Keyestudio 16 Kanallı Servo Sürücü Kartı / Arduino için 12-BIT PWM-12C Arayüzü ile
16-kanal 12-bit PWM Servo Sürücü - I2C Arayüzü
Tanıtım
Karizmatik bir robot yapmak, belki bir altı-ayaklı robot veya belki sadece hareketli parçaları olan bir sanat eseri yapmak istiyorsunuz. Ya da belki de hassas PWM çıkışlı çok sayıda LED kullanmak istiyorsunuz. O zaman mikrodenetleyicinizin sınırlı sayıda PWM çıkışı olduğunu fark edersiniz! Peki ne yapabilirsiniz? Pes edebilir veya bu kullanışlı PWM ve Servo sürücü breakout kartı alabilirsin.
Bu çipi gördüğünüzde, bunun mükemmel bir eklenti olacağını hemen anlarsınız. Sadece iki pin kullanarak, 16 serbest çalışan PWM çıkışını kontrol eder! Bu breakout karttan maksimum 62 adet zincirleme bağlayarak 992 PWM çıkışını kontrol edebilirsiniz (çok görkemli olacağına hiç şüphe yok).
Dahili saate sahip i2c kontrollü PWM sürücüsüdür. Böylelikle, TLC5940 ailesinden farklı olarak tamamen serbest çalışabilir ki bu, mikrodenetleyicinizi bağlayıp, sürekli sinyal göndermeniz gerekmediği anlamına gelir!
5V uyumludur, yani 3.3V'luk bir mikrodenetleyiciden kontrol edebilirsiniz ve 6V çıkışa kadar güvenle sürebilirsiniz (bu, 3.4 + ileri gerilimli beyaz veya mavi LED'leri kontrol etmek istediğinizde iyidir)
6 adres seçme pini sayesinde bunlardan 62'sini tek bir i2c veriyoluna, toplam 992 çıkışa bağlayabilirsiniz, ki bu çok fazla servo veya LED kontrolü demektir.
Ayarlanabilir frekans PWM, yaklaşık 1,6 KHz'e kadardır.
Her çıkış için 12 bit çözünürlük sunar. Servolar için bu, 60Hz güncelleme hızında yaklaşık 4μs çözünürlük demektir.
Yapılandırılabilir itme-çekme veya açık kollektör çıkışı
Tüm çıkışları hızla devre dışı bırakmak için çıkış etkinleştirme pini
Bu sevimli çipi bir kaç güzel ekstrayla bir breakout karta koyduk.
Güç girişi için terminal bloğu (veya kenardaki 0,1 inçlik kesimleri kullanabilirsiniz)
Terminal bloğu girişinde ters kutup koruması
Yeşil renk güç-iyi LED'i
4'lü gruplar halinde 3 pinli konnektörler, böylece bir seferde 16 servoyu takabilirsiniz (Servo soketler 0,1 inç'ten biraz daha geniştir, böylece yan yana en fazla 4 tane takabilirsiniz)
"Zincirleme yapılabilen" tasarım
ihtiyaç halinde V+ hattına büyük bir kapasitör yerleştirmek için bir nokta
Tüm çıkış hatlarında LED'lerin sürüşünü basitleştirmek ve koruma amaçlı 220 ohm direnç
6 adres seçme pini için lehim köprüleri
Özellikler
- Boyutlar (başlık veya terminal bloğu bağlantısız iken) (2.5 inç x 1 inç x 0.1 inç) (62.5mm x 25.4mm x 3mm)
- Ağırlık (3x4 başlık ve klemens ile): 9 gram
- Bu anakart/yonga, 0x60-0x80 arasında, jumper ile seçilebilen I2C 7-bit adresini kullanır
Bağlantı Şeması
Örnek Kod
https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
#include#include // 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(servonum, 0, pulselen); } delay(500); for (uint16_t pulselen = SERVOMAX; pulselen > SERVOMIN; pulselen--) { pwm.setPWM(servonum, 0, pulselen); } delay(500); servonum ++; if (servonum > 15) servonum = 0; }