Driver servomotorů je výstupní modul pro Arduino. Tento modul obsahuje integrovaný obvod PCA9685, který má 16 kanálů s funkcí PWM. Díky tomu tedy můžeme řídit z tohoto modulu až 16 připojených servomotorů s PWM rozlišením 12 bitů. Na modulu se nachází na vrchní straně napájecí konektor pro externí zdroj napětí pro serva, dále je na spodní straně 16 konektorů pro připojení serv a po bocích piny pro připojení modulu k mikrokontroléru. Na horní straně modulu se ale také nachází pájecí plošky označené jako A0-A5, které slouží pro nastavení I2C adresy. Můžeme totiž za sebou propojovat více těchto PCA9685 modulů a díky 6b adrese to může být až 64 modulů (a díky tomu až 1024 serv!).
Pro napájení řídící elektroniky se používá pin VCC, na který se připojuje napětí 5 Voltů. Pro řízení servomotorů pak slouží pin V+ (pin na bocích a zároveň na 2pin šroubovacím konektoru), který zvládá napětí v rozsahu 5-12 Voltů, ale toto napětí je nutné zvolit podle použitých servomotorů. Komunikace mezi driverem a Arduinem probíhá po sběrnici I2C.
Pro úspěšné propojení modulu PCA9685 a Arduino desky stačí zapojit celkem 4 vodiče. Propojíme VCC s 5V Arduina, SDA s pinem A4, SCL s pinem A5 a GND se zemí Arduina. Pro piny SDA a SCL musíme vybrat vždy vyhrazené I2C piny na námi vybrané desce, u Arduino UNO jsou to právě piny A4 a A5. A já jsem také propojil pin V+ s 5V Arduina, protože pro test jsem použil pouze jeden servomotor a vím, že to Arduino zvládne. Pro více motorů by ale už bylo zapotřebí použít externí napájecí zdroj.
Pro úspěšné nahrání uvedeného ukázkového kódu je nutné stáhnout a naimportovat knihovnu PWMServoDriver, návod, jak na to, je uveden zde.
Ukázkový kód obsahuje na svém začátku připojení potřebných knihoven společně s vytvořením objektu modulu z knihovny, u kterého zadáváme v závorce adresu modulu, kdy ve výchozím stavu je to adresa 0x40.
V podprogramu setup zahájíme komunikaci po sériové lince a poté začneme komunikovat s driverem. A jako další krok nastavíme výchozí PWM frekvenci na 60 Hz.
V nekonečné smyčce loop jsem uvedl pár příkladů, jak pracovat se připojenými servy. V prvním příkazu tedy vidíme nastavení nultého kanálu (první konektor, číslování je od nuly), přičemž nastavujeme jeho koncovou polohu na 150. Zde je nutné si u Vašich servomotorů vyzkoušet, jaké hodnoty dorazů budou fungovat u různých serv. V dalších dvou ukázkách je nastavení kanálu 1 a 2 na různé hodnoty a u kanálu 3 byly použity dvě for smyčky pro různé nastavení poloh. Vidíme, že první for smyčka prochází hodnoty od 150 do 450 a po ní následuje krátká pauza. Poté projdeme podobnou smyčku, akorát budeme klesat z hodnoty 450 na hodnotu 150 a poté opět počkáme krátký čas před novým během smyčky.
// Driver servomotorů PC9685 // připojení potřebných knihoven #include <Wire.h> #include <Adafruit_PWMServoDriver.h> // vytvoření objektu driveru z knihovny // se zadanou výchozí adresou 0x40 Adafruit_PWMServoDriver driverPCA = Adafruit_PWMServoDriver(0x40); void setup() { // zahájení komunikace po sériové lince Serial.begin(9600); // zahájení komunikace s driverem driverPCA.begin(); // nastavení výchozí PWM frekvence na 60Hz driverPCA.setPWMFreq(60); } void loop() { // nastavení PWM signálu na: // servo kanál "0", // počáteční poloha "0", // koncová poloha "150" driverPCA.setPWM(0, 0, 150); // servo "1", koncová poloha "300" driverPCA.setPWM(1, 0, 300); // servo "2", koncová poloha "450" driverPCA.setPWM(2, 0, 450); // servo "3", postupně projdeme ve smyčce // polohy 150 až 450 for (int delkaPulzu = 150; delkaPulzu < 450; delkaPulzu++) { driverPCA.setPWM(3, 0, delkaPulzu); } // pauza mezi pohyby delay(500); // servo "3", postupně projdeme ve smyčce // polohy 450 až 150 for (int delkaPulzu = 450; delkaPulzu > 150; delkaPulzu--) { driverPCA.setPWM(3, 0, delkaPulzu); } // pauza před novým během smyčky delay(500); }
Po nahrání ukázkového kódu do Arduino desky s připojeným servo driverem si můžeme postupně vyzkoušet všechny 4 ovládané kanály. Kanály 0 až 2 vždy pouze staticky nastaví servomotor do dané polohy, ale při připojení serva na kanál 3 můžeme pozorovat pravidelné hýbání osičky mezi nastavenými koncovými polohami 150 a 450.
Driver servomotorů PCA9685 je zajímavým doplňkem pro Arduino. Umožňuje nám připojit až 16 serv přes pouhé 2 vodiče sběrnice I2C. A při použití 64 modulů to už dává až 1024 servomotorů. Použití modulu může být v malém počtu serv například pro různé roboty či vozítka, ale při větším počtu by mohlo pomoci například ve výrobních zařízeních a podobně. Jeho výhodou je pak oddělené napájení pro serva a elektroniku, kdy podle použitých servomotorů můžeme použít i vyšší napětí až 12 Voltů.
Seznam použitých komponent:
https://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html
https://dratek.cz/arduino/1686-modulovy-driver-servo-motoru-pro-arduino-pca9685-16-kanalu-12-bit-pwm-1501231841.html
https://dratek.cz/arduino/897-arduino-servo-motor-1420669476.html