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.

Driver servomotorů PCA9685

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.

Driver servomotorů PCA9685

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.

pca9685_servo_driver

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

FB tw

Další podobné články