Robotická ruka – návod na sestavení

Sestroj si svou vlastní robotickou ruku. Řekneme ti jak na to, máme pro tebe podrobný návod. Kde najdeš součástky k sestavení se dozvíš v článku.

V dnešním článku si ukážeme jak si postavit robota. Co si pod pojmem „robot“ představit? Možností je celá řada – od autíčka, které ti jezdí po pokoji a nenarazí do zdi, až po automatickou linku vyrábějící nějaký výrobek.

My se v našem návodu zaměříme na stavbu robotické ruky, která ti bude přemisťovat věci z místa na místo.

Stavba robotické ruky se může zdát docela složitá, pokud by jsi se do stavby pustil sám bez hotových mechanických součástí. Výrobu takových součástí totiž nezvládne každý. Naštěstí však existují již hotové sady součástí, ze kterých se taková robotická ruka dá pohodlně sestavit.

Co budeme ke stavbě potřebovat:

  1. Arduino UNO
  2. Servo shield pro Arduino UNO
  3. Stavebnici robotické ruky
  4. Napájecí zdroj 5V/3A pro napájení servomotorů
  5. microUSB adaptér
  6. 4ks 10k potenciometrů
  7. Vodiče na propojování

Jelikož servo shield neumí z napájecího zdroje pro servomotory napájet i Arduino, je potřeba ještě pro něj zajistit zvlášť napájení. Pro jednoduchost v našem článku budeme Arduino napájet z počítače přes USB.

Robotická ruka – mechanické sestavení

Jak robotickou ruku pomocí stavebnice sestavit si můžeš prohlédnout na těchto vidích:

Zapojení

Jako první připájej na microUSB adaptér dva vodiče na piny VBUS a GND. Na VBUS např. vodič červený a na GND vodič černý a zapoj je do dvoupinové šroubovací svorkovnice na servo shieldu. Červený VBUS do svorky označené V+ a černý GND do svorky označené GND. Na zkoušku můžeš do microUSB konektoru připojit napájecí zdroj. Na shieldu se ti rozsvítí LEDka označená V+. Pokud nesvítí, zkontroluj správné zapojení a zda ti funguje samotný zdroj. Pokud LEDka svítí, je zapojení v pořádku a můžeš zdroj odpojit a nasunout shield na Arduino UNO. Pokud je vše v pořádku, tak po připojení Arduina do USB počítače se na shieldu rozsvítí LEDka označená VCC. Pokud teď připojíš i napájecí zdroj měly by na shieldu svítit obě LEDky – VCC i V+.

Arduino i napájecí zdroj pro shield můžeš odpojit a budeš zapojovat jednotlivé kabely od servomotorů do shieldu.

Na shieldu jsou k tomuto účelu osazeny pinové konektory označené 015. Jeden konektor má vždy 3piny označené jako PWM, V+ a GND. Pin PWM slouží pro přenos ovládacího signálu pro servomotor, piny V+ a GND slouží pro napájení servomotoru. Svým rozložením souhlasí se zapojením konektoru u servomotoru, takže není nutné jakékoli přepojování. Stačí konektor servomotoru zapojit do konektoru na shieldu. Je potřeba dbát na správnou orientaci konektoru. Konektor servomotoru se zapojuje vždy tak, aby krajní oranžový vodič servomotoru byl zapojen do pinu označeném na shieldu jako PWM. Potom jsou správně zapojeny i ostatní vodiče – prostřední červený = V+ a krajní hnědý = GND.

Servomotory můžeš zapojit například takto: horní servomotor na kleštích do konektoru označeném jako 0, servomotor pod ním do konektoru 1, další pod ním do konektoru 2, pak 3, 4 a poslední spodní, přišroubovaný na základně, do konektoru 5.

Software

Nejdříve je potřeba doinstalovat do Arduino IDE knihovnu pro komunikaci s obvodem PCA9685, který je osazen na servo shieldu, a který přes sběrnici I2C na svých výstupech ovládá připojené servomotory.

V našem příkladu budeme používat knihovnu PWM Servo Driver Library od Adafruit. Jak doinstalovat knihovny si můžeš přečíst v našem článku Instalace knihoven do Arduino IDE.

Nyní se můžeš pustit do programu, kterým svoji sestavenou robotickou ruku rozpohybuješ. Zde vyvstává otázka, čím takovou robotickou ruku ovládat? Možností je opět mnoho. Můžeš připojit k analogovým pinům Arduina potenciometry a podle nastavení konkrétního potenciometru řídit polohu daného servomotoru, nebo můžeš k pinům připojit moduly joysticku, tlačítka, nebo k Arduinu připojit Bluetooth modul a ovládat robotickou ruku z aplikace v mobilním telefonu. Nebo lze pozice jednotlivých servomotorů ruky řídit pomocí sériového portu z počítače. Ne všechny možnosti jsou vhodné pro začátečníka, jako například komunikace po sériovém portu. Tady je již potřeba větší znalosti programování sériové komunikace.

V našem příkladu pro svoji jednoduchost použijeme ovládání potenciometry. Budeme k tomu potřebovat 4ks potenciometrů s odporem 10k. Jeden krajní vývod potenciometrů(u všech vždy ten stejný) připoj k +5V Arduina, druhý krajní pak k GND. Jednotlivé prostřední vývody potenciometrů pak připoj postupně k analogovým pinům Arduina A0, A1, A2 a A3. Na těchto pinech budeš mít napěťové úrovně v rozsahu 0-5V, které pak budeš číst za běhu programu a podle nich řídit polohu servomotorů.

V následujícím kódu ti ukážeme, jak to celé naprogramovat.

#include <Wire.h>  // Nacteni knihovny pro praci s I2C
#include <Adafruit_PWMServoDriver.h>  // Nacteni knihovny pro praci se servo shieldem PCA9685

Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();  // Vytvoreni objektu pwm pro praci se servo shieldem

#define SERVOMIN  320 // Hodnota odpovidajici natoceni serva do polohy 0°
#define SERVOMAX  490 // Hodnota odpovidajici natoceni serva do polohy 180°
#define SERVO_FREQ 50 // Nastaveni frekvence PWM pro servomotor - 50Hz

// Prirazeni vystupnich pinu k jednotlivym servomotorum
#define SERVO1 0  // Servomotor 1 pripojen na vystup 0
#define SERVO2 1  // Servomotor 2 pripojen na vystup 1
#define SERVO3 2  // Servomotor 3 pripojen na vystup 2
#define SERVO4 3  // Servomotor 4 pripojen na vystup 3
#define SERVO5 4  // Servomotor 5 pripojen na vystup 4
#define SERVO6 5  // Servomotor 6 pripojen na vystup 5

// Prirazeni ovladacich potenciometru ke vstupnim pinum Arduina
#define POT1 A0  // Potenciometr 1 pripojen na analogovy vstup A0
#define POT2 A1  // Potenciometr 2 pripojen na analogovy vstup A1
#define POT3 A2  // Potenciometr 3 pripojen na analogovy vstup A2
#define POT4 A3  // Potenciometr 4 pripojen na analogovy vstup A3

void setup() {
  pwm.begin();  // Start komunikace se servo shieledem
  pwm.setOscillatorFrequency(25000000);  // Kalibrace vnitrniho ocilatoru cipu PCA9685
  pwm.setPWMFreq(SERVO_FREQ);  // Nastaveni frekvence PWM

  delay(10);
}

void loop() {
  int P1 = analogRead(POT1);  // Nacte hodnotu na analogovem pinu, ktera odpovida aktualni poloze natoceni potenciometru v rozsahu 0-1023
  P1 = mMap(P1, 0, 1023, SERVOMIN, SERVOMAX);  // Premapuje rozsah z analogoveho pinu 0-1023 na rozsah ovladani servomotoru SERVOMIN-SERVOMAX
  pwm.setPWM(SERVO1, 0, P1);  // Nastavi hodnotu pro servomotor a ten se podle ni natoci do pozadovane polohy 0-180°

  int P2 = analogRead(POT2);  // Nacte hodnotu na analogovem pinu, ktera odpovida aktualni poloze natoceni potenciometru v rozsahu 0-1023
  P2 = mMap(P2, 0, 1023, SERVOMIN, SERVOMAX);  // Premapuje rozsah z analogoveho pinu 0-1023 na rozsah ovladani servomotoru SERVOMIN-SERVOMAX
  pwm.setPWM(SERVO2, 0, P2);  // Nastavi hodnotu pro servomotor a ten se podle ni natoci do pozadovane polohy 0-180°

  int P3 = analogRead(POT3);  // Nacte hodnotu na analogovem pinu, ktera odpovida aktualni poloze natoceni potenciometru v rozsahu 0-1023
  P3 = mMap(P3, 0, 1023, SERVOMIN, SERVOMAX);  // Premapuje rozsah z analogoveho pinu 0-1023 na rozsah ovladani servomotoru SERVOMIN-SERVOMAX
  pwm.setPWM(SERVO3, 0, P3);  // Nastavi hodnotu pro servomotor a ten se podle ni natoci do pozadovane polohy 0-180°

  int P4 = analogRead(POT4);  // Nacte hodnotu na analogovem pinu, ktera odpovida aktualni poloze natoceni potenciometru v rozsahu 0-1023
  P4 = mMap(P4, 0, 1023, SERVOMIN, SERVOMAX);  // Premapuje rozsah z analogoveho pinu 0-1023 na rozsah ovladani servomotoru SERVOMIN-SERVOMAX
  pwm.setPWM(SERVO4, 0, P4);  // Nastavi hodnotu pro servomotor a ten se podle ni natoci do pozadovane polohy 0-180°
}

// Funkce pro premapovani jednoho rozsahu do druheho.
// Originalni funkce map() nedava vzdy spravne vysledky
long mMap(long x, long in_min, long in_max, long out_min, long out_max)
{
  long in_size = in_max - in_min;
  long out_size = out_max - out_min;
  if( abs(in_size) > abs(out_size) )
  {
    if( in_size < 0 ) in_size--; else in_size++;
    if( out_size < 0 ) out_size--; else out_size++;
  }
  return (x - in_min) * (out_size) / (in_size) + out_min;
}

Pozorný čtenář si jistě všiml, že máme 6 servomotorů, ale jen 4 potenciometry. Dva servomotory tedy nebudou v tomto příkladu ovládány pomocí potenciometrů. Je to z toho důvodu, že Arduino UNO má na posledních analogových pinech A4 a A5 namapovánu sběrnici I2C a tak nelze v tomto případě tyto piny použít jako analogové. Ovládání zbylých dvou serv je tedy nutné vyřešit jiným způsobem.

Sdílet článek

4 Responses

  1. Dobrý den, mám problém s funkčností zadaného programu. A nevím si rady, kde by mohla být chyba. Přiznám se, Arduino UNO i shield je zakoupený z Číny. Zkoušel jsem váš program i zkušební z knihovny Adafruit a také nic. Nejsem nijak moc znalí, učím se za chodu. Když jsem měl servo zapojené přímo k UNO a zkusil jsem svůj vlastní program, tak všechna serva fungovala, ale jakmile jsem připojil k shieldu, tak nekomunikuje. Byl bych moc rád, kdyby jste měl/i nějaký nápad, čím to může být, jestli je to ovlivněno tím, kde jsem to koupil, protože jsem zjistil, že UNO je clon a ne originál, tak jak by tyto faktory na to mohli mít vliv.
    Předem děkuji z aodpověď

  2. Zdravím. Mám problém se spojením shield PCA9685 a Arduina UNO.
    V návodu píšete „Pokud LEDka shieldu označená V+ svítí, je zapojení v pořádku a můžeš zdroj odpojit a nasunout shield na Arduino UNO. Pokud je vše v pořádku, tak po připojení Arduina do USB počítače se na shieldu rozsvítí LEDka označená VCC.“ Mě se za žádných okolnosti VCC LED nedosvítí a shiedl nefunguje. Můžete mě poradit, kde je chyba? Díky za odpověď

    1. Dobrý den,

      zkuste propojit kapkou cínu propojku 5V – VCC Select na desce shieldu. Je možné, že některé verze shieldu ji nemusí mít z výroby propojenu.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Mohlo by se také líbit